143 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace App\Tests\Unit\Service\Remote;
 | 
						|
 | 
						|
use App\Entity\Remote\Brilo\Users\Address;
 | 
						|
use App\Entity\Remote\Brilo\Users\AddressGeo;
 | 
						|
use App\Entity\Remote\Brilo\Users\Company;
 | 
						|
use App\Entity\Remote\Brilo\Users\User;
 | 
						|
use App\Service\Remote\BriloApiUsers;
 | 
						|
use App\Service\Remote\BriloRemoteApiException;
 | 
						|
use App\Tests\Common\LoggerTrait;
 | 
						|
use PHPUnit\Framework\TestCase;
 | 
						|
use Symfony\Component\HttpClient\MockHttpClient;
 | 
						|
use Symfony\Component\HttpClient\Response\JsonMockResponse;
 | 
						|
use Symfony\Component\Serializer\SerializerInterface;
 | 
						|
 | 
						|
class BriloApiUsersTest extends TestCase
 | 
						|
{
 | 
						|
    use LoggerTrait;
 | 
						|
 | 
						|
    private const array API_USER_LIST = [
 | 
						|
        [
 | 
						|
            "id" => 0,
 | 
						|
            "name" => "Leanne Graham",
 | 
						|
            "username" => "Bret",
 | 
						|
            "email" => "Sincere@april.biz",
 | 
						|
            "address" => [
 | 
						|
                "street" => "Kulas Light",
 | 
						|
                "suite" => "Apt. 555",
 | 
						|
                "city" => "Gwenborough",
 | 
						|
                "zipcode" => "92997-3874",
 | 
						|
                "geo" => [
 | 
						|
                    "lat" => "-38.3159",
 | 
						|
                    "lng" => "80.1496"
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            "phone" => "0-770-736-8031 x56442",
 | 
						|
            "website" => "hildegard.org",
 | 
						|
            "company" => [
 | 
						|
                "name" => "Romaguera-Crona",
 | 
						|
                "catchPhrase" => "Multi-layered client-server neural-net",
 | 
						|
                "bs" => "harness real-time e-markets"
 | 
						|
            ],
 | 
						|
        ],
 | 
						|
        [
 | 
						|
            "id" => 1,
 | 
						|
            "name" => "Ervin Howell",
 | 
						|
            "username" => "Antonette",
 | 
						|
            "email" => "Shanna@melissa.tv",
 | 
						|
            "address" => [
 | 
						|
                "street" => "Victor Plains",
 | 
						|
                "suite" => "Suite 878",
 | 
						|
                "city" => "Wisokyburgh",
 | 
						|
                "zipcode" => "90565-7771",
 | 
						|
                "geo" => [
 | 
						|
                    "lat" => "-44.9509",
 | 
						|
                    "lng" => "-35.4618"
 | 
						|
                ]
 | 
						|
            ],
 | 
						|
            "phone" => "009-692-6593 x09125",
 | 
						|
            "website" => "anastasia.net",
 | 
						|
            "company" => [
 | 
						|
                "name" => "Deckow-Crist",
 | 
						|
                "catchPhrase" => "Proactive didactic contingency",
 | 
						|
                "bs" => "synergize scalable supply-chains"
 | 
						|
            ],
 | 
						|
            "nonExistentKey" => "value"
 | 
						|
        ]
 | 
						|
    ];
 | 
						|
 | 
						|
    public function testUserListSuccess(): void
 | 
						|
    {
 | 
						|
        $testUserList = $this->buildTestUserList();
 | 
						|
        $serializer = $this->createMock(SerializerInterface::class);
 | 
						|
        $serializer
 | 
						|
            ->expects($this->once())
 | 
						|
            ->method('deserialize')
 | 
						|
            ->with(
 | 
						|
                json_encode(self::API_USER_LIST),
 | 
						|
                User::class . '[]',
 | 
						|
                'json'
 | 
						|
            )->willReturn($testUserList);
 | 
						|
 | 
						|
        $response =  new JsonMockResponse(self::API_USER_LIST);
 | 
						|
        $mockedClient = new MockHttpClient($response);
 | 
						|
        $briloApiUsers = new BriloApiUsers($mockedClient, $this->getLogger(), $serializer, 'http://nonexistent.local');
 | 
						|
        $this->assertEquals($testUserList, $briloApiUsers->getUsers());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testInvalidHttpCodeReturned(): void
 | 
						|
    {
 | 
						|
        $serializer = $this->createMock(SerializerInterface::class);
 | 
						|
        $serializer
 | 
						|
            ->expects($this->never())
 | 
						|
            ->method('deserialize');
 | 
						|
 | 
						|
        $response =  new JsonMockResponse(self::API_USER_LIST, [
 | 
						|
            'http_code' => 401,
 | 
						|
        ]);
 | 
						|
        $mockedClient = new MockHttpClient(function () use ($response) {
 | 
						|
            return $response;
 | 
						|
        });
 | 
						|
        $this->expectException(BriloRemoteApiException::class);
 | 
						|
        $briloApiUsers = new BriloApiUsers($mockedClient, $this->getLogger(), $serializer, 'http://nonexistent.local');
 | 
						|
        $briloApiUsers->getUsers();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return User[]
 | 
						|
     */
 | 
						|
    private function buildTestUserList(): array
 | 
						|
    {
 | 
						|
        // convert self::API_USER_LIST to User[]
 | 
						|
        return array_map(function ($userData) {
 | 
						|
            return new User(
 | 
						|
                $userData['id'],
 | 
						|
                $userData['name'],
 | 
						|
                $userData['username'],
 | 
						|
                $userData['email'],
 | 
						|
                $userData['phone'],
 | 
						|
                $userData['website'],
 | 
						|
                new Address(
 | 
						|
                    $userData['address']['street'],
 | 
						|
                    $userData['address']['suite'],
 | 
						|
                    $userData['address']['city'],
 | 
						|
                    $userData['address']['zipcode'],
 | 
						|
                    new AddressGeo(
 | 
						|
                        $userData['address']['geo']['lat'],
 | 
						|
                        $userData['address']['geo']['lng']
 | 
						|
                    )
 | 
						|
                ),
 | 
						|
                new Company(
 | 
						|
                    $userData['company']['name'],
 | 
						|
                    $userData['company']['catchPhrase'],
 | 
						|
                    $userData['company']['bs']
 | 
						|
                )
 | 
						|
            );
 | 
						|
        }, self::API_USER_LIST);
 | 
						|
    }
 | 
						|
}
 |