Completed
Push — master ( eac57c...9ff768 )
by Laurens
02:04
created

AccessTokenFactoryTest::getGuzzleClient()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 20
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 15
nc 1
nop 5
1
<?php
2
3
declare(strict_types=1);
4
5
namespace LauLamanApps\iZettleApi\Tests\Unit\Client;
6
7
use DateTime;
8
use GuzzleHttp\Client as GuzzleClient;
9
use LauLamanApps\iZettleApi\Client\AccessToken;
10
use LauLamanApps\iZettleApi\Client\AccessTokenFactory;
11
use Mockery;
12
use PHPUnit\Framework\TestCase;
13
14
/**
15
 * @small
16
 */
17
final class AccessTokenFactoryTest extends TestCase
18
{
19
    const CLIENT_ID = 'clientId';
20
    const CLIENT_SECRET = 'clientSecret';
21
22
    /**
23
     * @test
24
     */
25
    public function getFromUserLogin(): void
26
    {
27
        $accessToken = 'accessToken';
28
        $refreshToken = 'refreshToken';
29
        $expiresIn = 7200;
30
        $username ='username';
31
        $password ='password';
32
        $options = [
33
            'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
34
            'form_params' => [
35
                'grant_type' => AccessTokenFactory::API_ACCESS_TOKEN_PASSWORD_GRANT,
36
                'client_id' => self::CLIENT_ID,
37
                'client_secret' => self::CLIENT_SECRET,
38
                'username' => $username,
39
                'password' => $password
40
            ],
41
        ];
42
43
        $guzzleClientMock = $this->getGuzzleClient(
44
            AccessTokenFactory::API_ACCESS_TOKEN_REQUEST_URL,
45
            $options,
46
            $accessToken,
47
            $expiresIn,
48
            $refreshToken
49
        );
50
51
        $accessTokenFactory =  new AccessTokenFactory($guzzleClientMock, self::CLIENT_ID, self::CLIENT_SECRET);
52
        $accessTokenObject =  $accessTokenFactory->getFromUserLogin($username, $password);
53
54
        self::assertSame($accessToken, $accessTokenObject->getToken());
55
        self::assertSame($refreshToken, $accessTokenObject->getRefreshToken());
56
        self::assertEquals(
57
            (new DateTime($expiresIn . ' second'))->format('Y-m-d H:i:s'),
58
            $accessTokenObject->getExpires()->format('Y-m-d H:i:s')
59
        );
60
    }
61
62
    /**
63
     * @test
64
     */
65
    public function refresh(): void
66
    {
67
        $oldAccessToken = new AccessToken('accessToken', new DateTime(), 'refreshToken');
68
        $newAccessToken = 'accessToken2';
69
        $newRefreshToken = 'refreshToken2';
70
        $newExpiresIn = 7200;
71
72
        $options = [
73
            'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
74
            'form_params' => [
75
                'grant_type' => AccessTokenFactory::API_ACCESS_TOKEN_REFRESH_TOKEN_GRANT,
76
                'client_id' => self::CLIENT_ID,
77
                'client_secret' => self::CLIENT_SECRET,
78
                'refresh_token' => $oldAccessToken->getRefreshToken(),
79
            ],
80
        ];
81
82
        $guzzleClientMock = $this->getGuzzleClient(
83
            AccessTokenFactory::API_ACCESS_TOKEN_REQUEST_URL,
84
            $options,
85
            $newAccessToken,
86
            $newExpiresIn,
87
            $newRefreshToken
88
        );
89
90
        $accessTokenFactory =  new AccessTokenFactory($guzzleClientMock, self::CLIENT_ID, self::CLIENT_SECRET);
91
        $accessTokenObject =  $accessTokenFactory->refresh($oldAccessToken);
92
93
        self::assertSame($newAccessToken, $accessTokenObject->getToken());
94
        self::assertSame($newRefreshToken, $accessTokenObject->getRefreshToken());
95
        self::assertEquals(
96
            (new DateTime($newExpiresIn . ' second'))->format('Y-m-d H:i:s'),
97
            $accessTokenObject->getExpires()->format('Y-m-d H:i:s')
98
        );
99
    }
100
101
    private function getGuzzleClient(
102
        string $url,
103
        array $options,
104
        string $accessToken,
105
        int $expiresIn,
106
        string $refreshToken
107
    ): GuzzleClient {
108
        $guzzleClientMock = Mockery::mock(GuzzleClient::class);
109
        $guzzleClientMock->shouldReceive('request')->withArgs(['POST', $url, $options])->andReturnSelf();
110
        $guzzleClientMock->shouldReceive('getBody')->andReturnSelf();
111
        $guzzleClientMock->shouldReceive('getContents')->andReturn(json_encode(
112
            [
113
                'access_token' => $accessToken,
114
                'expires_in' => $expiresIn,
115
                'refresh_token' => $refreshToken
116
            ]
117
        ));
118
119
        return $guzzleClientMock;
120
    }
121
}
122