canListTrackingsMock = Mockery::mock(CanListTrackings::class); $this->listsOrderTrackingMock = Mockery::mock(ListsOrderTracking::class); $this->listOrderTrackingLogic = new ListOrderTrackingLogic($this->canListTrackingsMock, $this->listsOrderTrackingMock); } public function tearDown(): void { Mockery::close(); parent::tearDown(); } public function test_logic_with_valid_tracking_number() { // Arrange $trackingNo = '123456789'; $reference = 'X202503131317208'; $orderId = 1; $packingListId = 1; $mockOrder = Mockery::mock('overload:' . Order::class)->makePartial(); $mockOrder->shouldReceive('where') ->with('reference', $trackingNo) ->andReturnSelf(); $mockOrder->shouldReceive('first') ->andReturn($mockOrder); $mockOrder->id = $orderId; $mockOrder->reference = $trackingNo; $mockPackingList = Mockery::mock('overload:' . PackingList::class)->makePartial(); $mockPackingList->id = $packingListId; $mockPackingList->reference = $reference; $mockOrder->shouldReceive('packingLists')->andReturn(collect([$mockPackingList])); Artisan::shouldReceive('call') ->once() ->withArgs(['process-yd-by-traking-no-data-command', ['trackingNo' => $reference]]) ->andReturn(0); $this->listsOrderTrackingMock->shouldReceive('deserializeFilters') ->andReturn(['tracking_no' => $trackingNo]); $this->listsOrderTrackingMock->shouldReceive('execute') ->andReturn(collect([])); $fakeRequest = Request::create('/tracking', 'GET', ['filters' => json_encode(['tracking_no' => Crypt::encryptString($trackingNo)])]); // Act $response = $this->listOrderTrackingLogic->logic($fakeRequest); Log::info("response 1: " . json_encode($response)); // Assert $this->assertInstanceOf(JsonResponse::class, $response); } public function test_logic_with_invalid_tracking_number_for_admin() { // Arrange $user = (object) ['type' => ['ADMIN']]; Auth::shouldReceive('user')->andReturn($user); $this->listsOrderTrackingMock->shouldReceive('deserializeFilters') ->andReturn(['tracking_no' => Crypt::encryptString('invalid')]); $this->listsOrderTrackingMock->shouldReceive('execute') ->andReturn(collect([])); $request = Request::create('/tracking', 'GET', ['filters' => json_encode(['tracking_no' => Crypt::encryptString('invalid')])]); Artisan::shouldReceive('call') ->once() ->withArgs(['process-yd-by-traking-no-data-command', ['trackingNo' => 'invalid']]) ->andReturn(0); // Act $fakeRequest = $this->listOrderTrackingLogic->logic($request); $data = $fakeRequest->getData(true); // returns array // Assert $this->assertTrue(empty($data['original']['payload']['data'])); $this->assertInstanceOf(JsonResponse::class, $fakeRequest); } public function test_it_throws_404_when_decryption_fails_for_non_admin() { // Arrange $user = (object) ['type' => ['REGULAR_USER']]; Auth::shouldReceive('user')->andReturn($user); Crypt::shouldReceive('decryptString')->andThrow(DecryptException::class); $request = Request::create('/tracking', 'GET', ['filters' => json_encode(['tracking_no' => 'test'])]); $this->canListTrackingsMock ->shouldReceive('passes') ->andThrow(new AccessForbiddenException("You don't have permission to perform this action")); // Assert $this->expectException(AccessForbiddenException::class); // Act $this->listOrderTrackingLogic->logic($request); } }