testSettingManualRefreshToken()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4286
cc 1
eloc 5
nc 1
nop 0
1
<?php
2
3
namespace CommerceGuys\Guzzle\Oauth2\Tests\GrantType;
4
5
use CommerceGuys\Guzzle\Oauth2\GrantType\ClientCredentials;
6
use CommerceGuys\Guzzle\Oauth2\GrantType\RefreshToken;
7
use CommerceGuys\Guzzle\Oauth2\Oauth2Subscriber;
8
use CommerceGuys\Guzzle\Oauth2\Tests\TestBase;
9
10
class OAuth2SubscriberTest extends TestBase
11
{
12
    public function testSubscriberRetriesRequestOn401()
13
    {
14
        $subscriber = new Oauth2Subscriber(new ClientCredentials($this->getClient(), [
15
            'client_id' => 'test',
16
            'client_secret' => 'testSecret',
17
        ]));
18
        $client = $this->getClient([
19
            'defaults' => [
20
                'subscribers' => [$subscriber],
21
                'auth' => 'oauth2',
22
            ],
23
        ]);
24
        $response = $client->get('api/collection');
25
        $this->assertEquals(200, $response->getStatusCode());
26
    }
27
28
    public function testSubscriberUsesRefreshToken()
29
    {
30
        $credentials = [
31
            'client_id' => 'test',
32
            'client_secret' => 'testSecret',
33
        ];
34
35
        $accessTokenGrantType = new ClientCredentials(
36
            $this->getClient([], ['tokenExpires' => 0]),
37
            $credentials
38
        );
39
40
        $subscriber = new Oauth2Subscriber(
41
            $accessTokenGrantType,
42
            new RefreshToken($this->getClient(), $credentials)
43
        );
44
        $subscriber->setRefreshToken('testRefreshToken');
45
        $client = $this->getClient([
46
            'defaults' => [
47
                'subscribers' => [$subscriber],
48
                'auth' => 'oauth2',
49
            ],
50
        ]);
51
52
        // Initially, the access token should be expired. After the first API
53
        // call, the subscriber will use the refresh token to get a new access
54
        // token.
55
        $this->assertTrue($accessTokenGrantType->getToken()->isExpired());
56
57
        $response = $client->get('api/collection');
58
59
        // Now, the access token should be valid.
60
        $this->assertFalse($subscriber->getAccessToken()->isExpired());
61
        $this->assertEquals(200, $response->getStatusCode());
62
63
        // Also, the refresh token should have changed.
64
        $newRefreshToken = $subscriber->getRefreshToken();
65
        $this->assertEquals('testRefreshTokenFromServer', $newRefreshToken->getToken());
66
    }
67
68
    public function testNewRefreshTokenStoredAfterError()
69
    {
70
        $credentials = [
71
            'client_id' => 'test',
72
            'client_secret' => 'testSecret',
73
        ];
74
75
        $accessTokenGrantType = new ClientCredentials($this->getClient(), $credentials);
76
77
        $subscriber = new Oauth2Subscriber(
78
            $accessTokenGrantType,
79
            new RefreshToken($this->getClient(), $credentials)
80
        );
81
82
        // Use a access token that isn't expired on the client side, but
83
        // the server thinks is expired. This should trigger the onError event
84
        // in the subscriber, forcing it to try the refresh token grant type.
85
        $subscriber->setAccessToken('testInvalidAccessToken');
86
        $subscriber->setRefreshToken('testRefreshToken');
87
        $client = $this->getClient([
88
            'defaults' => [
89
                'subscribers' => [$subscriber],
90
                'auth' => 'oauth2',
91
            ],
92
        ]);
93
94
        $response = $client->get('api/collection');
95
96
        // Now, the access token should be valid.
97
        $this->assertFalse($subscriber->getAccessToken()->isExpired());
98
        $this->assertEquals(200, $response->getStatusCode());
99
100
        // Also, the refresh token should have changed.
101
        $newRefreshToken = $subscriber->getRefreshToken();
102
        $this->assertEquals('testRefreshTokenFromServer', $newRefreshToken->getToken());
103
    }
104
105
    public function testSettingManualAccessToken()
106
    {
107
        $subscriber = new Oauth2Subscriber();
108
        $client = $this->getClient([
109
            'defaults' => [
110
                'subscribers' => [$subscriber],
111
                'auth' => 'oauth2',
112
                'exceptions' => false,
113
            ],
114
        ]);
115
116
        // Set a valid token.
117
        $subscriber->setAccessToken('testToken');
118
        $this->assertEquals($subscriber->getAccessToken()->getToken(), 'testToken');
119
        $this->assertFalse($subscriber->getAccessToken()->isExpired());
120
        $response = $client->get('api/collection');
121
        $this->assertEquals(200, $response->getStatusCode());
122
123
        // Set an invalid token.
124
        $subscriber->setAccessToken('testInvalidToken');
125
        $response = $client->get('api/collection');
126
        $this->assertEquals(401, $response->getStatusCode());
127
128
        // Set an expired token.
129
        $subscriber->setAccessToken('testToken', 'bearer', 500);
130
        $this->assertNull($subscriber->getAccessToken());
131
    }
132
133
    public function testSettingManualRefreshToken()
134
    {
135
        $subscriber = new Oauth2Subscriber();
136
        $subscriber->setRefreshToken('testRefreshToken');
137
        $this->assertEquals('refresh_token', $subscriber->getRefreshToken()->getType());
138
        $this->assertEquals('testRefreshToken', $subscriber->getRefreshToken()->getToken());
139
    }
140
}
141