Issues (25)

tests/BatchResponseTest.php (3 issues)

1
<?php
2
/**
3
 * Copyright 2017 Facebook, Inc.
4
 *
5
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
6
 * use, copy, modify, and distribute this software in source code or binary
7
 * form for use in connection with the web services and APIs provided by
8
 * Facebook.
9
 *
10
 * As with any software that integrates with the Facebook platform, your use
11
 * of this software is subject to the Facebook Developer Principles and
12
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
13
 * shall be included in all copies or substantial portions of the software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
22
 */
23
namespace Facebook\Tests;
24
25
use Facebook\Application;
26
use Facebook\Request;
27
use Facebook\Response;
28
use Facebook\BatchRequest;
29
use Facebook\BatchResponse;
30
use Facebook\GraphNode\GraphNode;
31
use PHPUnit\Framework\TestCase;
32
33
class BatchResponseTest extends TestCase
34
{
35
    /**
36
     * @var \Facebook\Application
37
     */
38
    protected $app;
39
40
    /**
41
     * @var \Facebook\Request
42
     */
43
    protected $request;
44
45
    protected function setUp()
46
    {
47
        $this->app = new Application('123', 'foo_secret');
48
        $this->request = new Request(
49
            $this->app,
50
            'foo_token',
51
            'POST',
52
            '/',
53
            ['batch' => 'foo'],
54
            'foo_eTag',
55
            'v1337'
56
        );
57
    }
58
59
    public function testASuccessfulJsonBatchResponseWillBeDecoded()
60
    {
61
        $graphResponseJson = '[';
62
        // Single Graph object.
63
        $graphResponseJson .= '{"code":200,"headers":[{"name":"Connection","value":"close"},{"name":"Last-Modified","value":"2013-12-24T00:34:20+0000"},{"name":"Facebook-API-Version","value":"v2.0"},{"name":"ETag","value":"\"fooTag\""},{"name":"Content-Type","value":"text\/javascript; charset=UTF-8"},{"name":"Pragma","value":"no-cache"},{"name":"Access-Control-Allow-Origin","value":"*"},{"name":"Cache-Control","value":"private, no-cache, no-store, must-revalidate"},{"name":"Expires","value":"Sat, 01 Jan 2000 00:00:00 GMT"}],"body":"{\"id\":\"123\",\"name\":\"Foo McBar\",\"updated_time\":\"2013-12-24T00:34:20+0000\",\"verified\":true}"}';
64
        // Paginated list of Graph objects.
65
        $graphResponseJson .= ',{"code":200,"headers":[{"name":"Connection","value":"close"},{"name":"Facebook-API-Version","value":"v1.0"},{"name":"ETag","value":"\"barTag\""},{"name":"Content-Type","value":"text\/javascript; charset=UTF-8"},{"name":"Pragma","value":"no-cache"},{"name":"Access-Control-Allow-Origin","value":"*"},{"name":"Cache-Control","value":"private, no-cache, no-store, must-revalidate"},{"name":"Expires","value":"Sat, 01 Jan 2000 00:00:00 GMT"}],"body":"{\"data\":[{\"id\":\"1337\",\"story\":\"Foo story.\"},{\"id\":\"1338\",\"story\":\"Bar story.\"}],\"paging\":{\"previous\":\"previous_url\",\"next\":\"next_url\"}}"}';
66
        // After POST operation.
67
        $graphResponseJson .= ',{"code":200,"headers":[{"name":"Connection","value":"close"},{"name":"Expires","value":"Sat, 01 Jan 2000 00:00:00 GMT"},{"name":"Cache-Control","value":"private, no-cache, no-store, must-revalidate"},{"name":"Access-Control-Allow-Origin","value":"*"},{"name":"Pragma","value":"no-cache"},{"name":"Content-Type","value":"text\/javascript; charset=UTF-8"},{"name":"Facebook-API-Version","value":"v2.0"}],"body":"{\"id\":\"123_1337\"}"}';
68
        // After DELETE operation.
69
        $graphResponseJson .= ',{"code":200,"headers":[{"name":"Connection","value":"close"},{"name":"Expires","value":"Sat, 01 Jan 2000 00:00:00 GMT"},{"name":"Cache-Control","value":"private, no-cache, no-store, must-revalidate"},{"name":"Access-Control-Allow-Origin","value":"*"},{"name":"Pragma","value":"no-cache"},{"name":"Content-Type","value":"text\/javascript; charset=UTF-8"},{"name":"Facebook-API-Version","value":"v2.0"}],"body":"true"}';
70
        $graphResponseJson .= ']';
71
        $response = new Response($this->request, $graphResponseJson, 200);
72
        $batchRequest = new BatchRequest($this->app, [
73
            new Request($this->app, 'token'),
74
            new Request($this->app, 'token'),
75
            new Request($this->app, 'token'),
76
            new Request($this->app, 'token'),
77
        ]);
78
        $batchResponse = new BatchResponse($batchRequest, $response);
79
80
        $decodedResponses = $batchResponse->getResponses();
81
82
        // Single Graph object.
83
        $this->assertFalse($decodedResponses[0]->isError(), 'Did not expect Response to return an error for single Graph object.');
84
        $this->assertInstanceOf(GraphNode::class, $decodedResponses[0]->getGraphNode());
85
        // Paginated list of Graph objects.
86
        $this->assertFalse($decodedResponses[1]->isError(), 'Did not expect Response to return an error for paginated list of Graph objects.');
87
        $graphEdge = $decodedResponses[1]->getGraphEdge();
88
        $this->assertInstanceOf(GraphNode::class, $graphEdge[0]);
89
        $this->assertInstanceOf(GraphNode::class, $graphEdge[1]);
90
    }
91
92
    public function testABatchResponseCanBeIteratedOver()
93
    {
94
        $graphResponseJson = '[';
95
        $graphResponseJson .= '{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
96
        $graphResponseJson .= ',{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
97
        $graphResponseJson .= ',{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
98
        $graphResponseJson .= ']';
99
        $response = new Response($this->request, $graphResponseJson, 200);
100
        $batchRequest = new BatchRequest($this->app, [
101
            'req_one' => new Request($this->app, 'token'),
102
            'req_two' => new Request($this->app, 'token'),
103
            'req_three' => new Request($this->app, 'token'),
104
        ]);
105
        $batchResponse = new BatchResponse($batchRequest, $response);
106
107
        $this->assertInstanceOf(\IteratorAggregate::class, $batchResponse);
108
109
        foreach ($batchResponse as $key => $responseEntity) {
110
            $this->assertContains($key, ['req_one', 'req_two', 'req_three']);
111
            $this->assertInstanceOf(Response::class, $responseEntity);
112
        }
113
    }
114
115
    public function testTheOriginalRequestCanBeObtainedForEachRequest()
116
    {
117
        $graphResponseJson = '[';
118
        $graphResponseJson .= '{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
119
        $graphResponseJson .= ',{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
120
        $graphResponseJson .= ',{"code":200,"headers":[],"body":"{\"foo\":\"bar\"}"}';
121
        $graphResponseJson .= ']';
122
        $response = new Response($this->request, $graphResponseJson, 200);
123
124
        $requests = [
125
            new Request($this->app, 'foo_token_one', 'GET', '/me'),
126
            new Request($this->app, 'foo_token_two', 'POST', '/you'),
127
            new Request($this->app, 'foo_token_three', 'DELETE', '/123456'),
128
        ];
129
130
        $batchRequest = new BatchRequest($this->app, $requests);
131
        $batchResponse = new BatchResponse($batchRequest, $response);
132
133
        $this->assertInstanceOf(Response::class, $batchResponse[0]);
134
        $this->assertInstanceOf(Request::class, $batchResponse[0]->getRequest());
0 ignored issues
show
The method getRequest() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

134
        $this->assertInstanceOf(Request::class, $batchResponse[0]->/** @scrutinizer ignore-call */ getRequest());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
135
        $this->assertEquals('foo_token_one', $batchResponse[0]->getAccessToken());
136
        $this->assertEquals('foo_token_two', $batchResponse[1]->getAccessToken());
0 ignored issues
show
The method getAccessToken() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

136
        $this->assertEquals('foo_token_two', $batchResponse[1]->/** @scrutinizer ignore-call */ getAccessToken());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
137
        $this->assertEquals('foo_token_three', $batchResponse[2]->getAccessToken());
0 ignored issues
show
The method getAccessToken() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

137
        $this->assertEquals('foo_token_three', $batchResponse[2]->/** @scrutinizer ignore-call */ getAccessToken());

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
138
    }
139
140
    public function testHeadersFromBatchRequestCanBeAccessed()
141
    {
142
        $graphResponseJson = '[';
143
        $graphResponseJson .= '{"code":200,"headers":[{"name":"Facebook-API-Version","value":"v2.0"},{"name":"ETag","value":"\"fooTag\""}],"body":"{\"foo\":\"bar\"}"}';
144
        $graphResponseJson .= ',{"code":200,"headers":[{"name":"Facebook-API-Version","value":"v2.5"},{"name":"ETag","value":"\"barTag\""}],"body":"{\"foo\":\"bar\"}"}';
145
        $graphResponseJson .= ']';
146
        $response = new Response($this->request, $graphResponseJson, 200);
147
148
        $requests = [
149
            new Request($this->app, 'foo_token_one', 'GET', '/me'),
150
            new Request($this->app, 'foo_token_two', 'GET', '/you'),
151
        ];
152
153
        $batchRequest = new BatchRequest($this->app, $requests);
154
        $batchResponse = new BatchResponse($batchRequest, $response);
155
156
        $this->assertEquals('v2.0', $batchResponse[0]->getGraphVersion());
157
        $this->assertEquals('"fooTag"', $batchResponse[0]->getETag());
158
        $this->assertEquals('v2.5', $batchResponse[1]->getGraphVersion());
159
        $this->assertEquals('"barTag"', $batchResponse[1]->getETag());
160
        $this->assertEquals([
161
          'Facebook-API-Version' => 'v2.5',
162
          'ETag' => '"barTag"',
163
        ], $batchResponse[1]->getHeaders());
164
    }
165
}
166