summaryrefslogtreecommitdiff
path: root/lib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php')
-rwxr-xr-xlib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php381
1 files changed, 381 insertions, 0 deletions
diff --git a/lib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php b/lib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php
new file mode 100755
index 0000000..cef0586
--- /dev/null
+++ b/lib/facebook-graph-sdk/tests/FacebookBatchRequestTest.php
@@ -0,0 +1,381 @@
+<?php
+/**
+ * Copyright 2014 Facebook, Inc.
+ *
+ * You are hereby granted a non-exclusive, worldwide, royalty-free license to
+ * use, copy, modify, and distribute this software in source code or binary
+ * form for use in connection with the web services and APIs provided by
+ * Facebook.
+ *
+ * As with any software that integrates with the Facebook platform, your use
+ * of this software is subject to the Facebook Developer Principles and
+ * Policies [http://developers.facebook.com/policy/]. This copyright notice
+ * shall be included in all copies or substantial portions of the software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+namespace Facebook\Tests;
+
+use Facebook\Facebook;
+use Facebook\FacebookApp;
+use Facebook\FacebookRequest;
+use Facebook\FacebookBatchRequest;
+use Facebook\FileUpload\FacebookFile;
+
+class FacebookBatchRequestTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var FacebookApp
+ */
+ private $app;
+
+ public function setUp()
+ {
+ $this->app = new FacebookApp('123', 'foo_secret');
+ }
+
+ public function testABatchRequestWillInstantiateWithTheProperProperties()
+ {
+ $batchRequest = new FacebookBatchRequest($this->app, [], 'foo_token', 'v0.1337');
+
+ $this->assertSame($this->app, $batchRequest->getApp());
+ $this->assertEquals('foo_token', $batchRequest->getAccessToken());
+ $this->assertEquals('POST', $batchRequest->getMethod());
+ $this->assertEquals('', $batchRequest->getEndpoint());
+ $this->assertEquals('v0.1337', $batchRequest->getGraphVersion());
+ }
+
+ public function testEmptyRequestWillFallbackToBatchDefaults()
+ {
+ $request = new FacebookRequest();
+
+ $this->createBatchRequest()->addFallbackDefaults($request);
+
+ $this->assertRequestContainsAppAndToken($request, $this->app, 'foo_token');
+ }
+
+ public function testRequestWithTokenOnlyWillFallbackToBatchDefaults()
+ {
+ $request = new FacebookRequest(null, 'bar_token');
+
+ $this->createBatchRequest()->addFallbackDefaults($request);
+
+ $this->assertRequestContainsAppAndToken($request, $this->app, 'bar_token');
+ }
+
+ public function testRequestWithAppOnlyWillFallbackToBatchDefaults()
+ {
+ $customApp = new FacebookApp('1337', 'bar_secret');
+ $request = new FacebookRequest($customApp);
+
+ $this->createBatchRequest()->addFallbackDefaults($request);
+
+ $this->assertRequestContainsAppAndToken($request, $customApp, 'foo_token');
+ }
+
+ /**
+ * @expectedException \Facebook\Exceptions\FacebookSDKException
+ */
+ public function testWillThrowWhenNoThereIsNoAppFallback()
+ {
+ $batchRequest = new FacebookBatchRequest();
+
+ $batchRequest->addFallbackDefaults(new FacebookRequest(null, 'foo_token'));
+ }
+
+ /**
+ * @expectedException \Facebook\Exceptions\FacebookSDKException
+ */
+ public function testWillThrowWhenNoThereIsNoAccessTokenFallback()
+ {
+ $request = new FacebookBatchRequest();
+
+ $request->addFallbackDefaults(new FacebookRequest($this->app));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testAnInvalidTypeGivenToAddWillThrow()
+ {
+ $request = new FacebookBatchRequest();
+
+ $request->add('foo');
+ }
+
+ public function testAddingRequestsWillBeFormattedInAnArrayProperly()
+ {
+ $requests = [
+ null => new FacebookRequest(null, null, 'GET', '/foo'),
+ 'my-second-request' => new FacebookRequest(null, null, 'POST', '/bar', ['foo' => 'bar']),
+ 'my-third-request' => new FacebookRequest(null, null, 'DELETE', '/baz')
+ ];
+
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add($requests[null]);
+ $batchRequest->add($requests['my-second-request'], 'my-second-request');
+ $batchRequest->add($requests['my-third-request'], 'my-third-request');
+
+ $formattedRequests = $batchRequest->getRequests();
+
+ $this->assertRequestsMatch($requests, $formattedRequests);
+ }
+
+ public function testANumericArrayOfRequestsCanBeAdded()
+ {
+ $requests = [
+ new FacebookRequest(null, null, 'GET', '/foo'),
+ new FacebookRequest(null, null, 'POST', '/bar', ['foo' => 'bar']),
+ new FacebookRequest(null, null, 'DELETE', '/baz'),
+ ];
+
+ $formattedRequests = $this->createBatchRequestWithRequests($requests)->getRequests();
+
+ $this->assertRequestsMatch($requests, $formattedRequests);
+ }
+
+ public function testAnAssociativeArrayOfRequestsCanBeAdded()
+ {
+ $requests = [
+ 'req-one' => new FacebookRequest(null, null, 'GET', '/foo'),
+ 'req-two' => new FacebookRequest(null, null, 'POST', '/bar', ['foo' => 'bar']),
+ 'req-three' => new FacebookRequest(null, null, 'DELETE', '/baz'),
+ ];
+
+ $formattedRequests = $this->createBatchRequestWithRequests($requests)->getRequests();
+
+ $this->assertRequestsMatch($requests, $formattedRequests);
+ }
+
+ public function testRequestsCanBeInjectedIntoConstructor()
+ {
+ $requests = [
+ new FacebookRequest(null, null, 'GET', '/foo'),
+ new FacebookRequest(null, null, 'POST', '/bar', ['foo' => 'bar']),
+ new FacebookRequest(null, null, 'DELETE', '/baz'),
+ ];
+
+ $batchRequest = new FacebookBatchRequest($this->app, $requests, 'foo_token');
+ $formattedRequests = $batchRequest->getRequests();
+
+ $this->assertRequestsMatch($requests, $formattedRequests);
+ }
+
+ /**
+ * @expectedException \Facebook\Exceptions\FacebookSDKException
+ */
+ public function testAZeroRequestCountWithThrow()
+ {
+ $batchRequest = new FacebookBatchRequest($this->app, [], 'foo_token');
+
+ $batchRequest->validateBatchRequestCount();
+ }
+
+ /**
+ * @expectedException \Facebook\Exceptions\FacebookSDKException
+ */
+ public function testMoreThanFiftyRequestsWillThrow()
+ {
+ $batchRequest = $this->createBatchRequest();
+
+ $this->createAndAppendRequestsTo($batchRequest, 51);
+
+ $batchRequest->validateBatchRequestCount();
+ }
+
+ public function testLessOrEqualThanFiftyRequestsWillNotThrow()
+ {
+ $batchRequest = $this->createBatchRequest();
+
+ $this->createAndAppendRequestsTo($batchRequest, 50);
+
+ $batchRequest->validateBatchRequestCount();
+ }
+
+ /**
+ * @dataProvider requestsAndExpectedResponsesProvider
+ */
+ public function testBatchRequestEntitiesProperlyGetConvertedToAnArray($request, $expectedArray)
+ {
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add($request, 'foo_name');
+
+ $requests = $batchRequest->getRequests();
+ $batchRequestArray = $batchRequest->requestEntityToBatchArray($requests[0]['request'], $requests[0]['name']);
+
+ $this->assertEquals($expectedArray, $batchRequestArray);
+ }
+
+ public function requestsAndExpectedResponsesProvider()
+ {
+ $headers = $this->defaultHeaders();
+ $apiVersion = Facebook::DEFAULT_GRAPH_VERSION;
+
+ return [
+ [
+ new FacebookRequest(null, null, 'GET', '/foo', ['foo' => 'bar']),
+ [
+ 'headers' => $headers,
+ 'method' => 'GET',
+ 'relative_url' => '/' . $apiVersion . '/foo?foo=bar&access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ 'name' => 'foo_name',
+ ],
+ ],
+ [
+ new FacebookRequest(null, null, 'POST', '/bar', ['bar' => 'baz']),
+ [
+ 'headers' => $headers,
+ 'method' => 'POST',
+ 'relative_url' => '/' . $apiVersion . '/bar',
+ 'body' => 'bar=baz&access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ 'name' => 'foo_name',
+ ],
+ ],
+ [
+ new FacebookRequest(null, null, 'DELETE', '/bar'),
+ [
+ 'headers' => $headers,
+ 'method' => 'DELETE',
+ 'relative_url' => '/' . $apiVersion . '/bar?access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ 'name' => 'foo_name',
+ ],
+ ],
+ ];
+ }
+
+ public function testBatchRequestsWithFilesGetConvertedToAnArray()
+ {
+ $request = new FacebookRequest(null, null, 'POST', '/bar', [
+ 'message' => 'foobar',
+ 'source' => new FacebookFile(__DIR__ . '/foo.txt'),
+ ]);
+
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add($request, 'foo_name');
+
+ $requests = $batchRequest->getRequests();
+
+ $attachedFiles = $requests[0]['attached_files'];
+
+ $batchRequestArray = $batchRequest->requestEntityToBatchArray(
+ $requests[0]['request'],
+ $requests[0]['name'],
+ $attachedFiles
+ );
+
+ $this->assertEquals([
+ 'headers' => $this->defaultHeaders(),
+ 'method' => 'POST',
+ 'relative_url' => '/' . Facebook::DEFAULT_GRAPH_VERSION . '/bar',
+ 'body' => 'message=foobar&access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ 'name' => 'foo_name',
+ 'attached_files' => $attachedFiles,
+ ], $batchRequestArray);
+ }
+
+ public function testPreppingABatchRequestProperlySetsThePostParams()
+ {
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add(new FacebookRequest(null, 'bar_token', 'GET', '/foo'), 'foo_name');
+ $batchRequest->add(new FacebookRequest(null, null, 'POST', '/bar', ['foo' => 'bar']));
+ $batchRequest->prepareRequestsForBatch();
+
+ $params = $batchRequest->getParams();
+
+ $expectedHeaders = json_encode($this->defaultHeaders());
+ $version = Facebook::DEFAULT_GRAPH_VERSION;
+ $expectedBatchParams = [
+ 'batch' => '[{"headers":' . $expectedHeaders . ',"method":"GET","relative_url":"\\/' . $version . '\\/foo?access_token=bar_token&appsecret_proof=2ceec40b7b9fd7d38fff1767b766bcc6b1f9feb378febac4612c156e6a8354bd","name":"foo_name"},'
+ . '{"headers":' . $expectedHeaders . ',"method":"POST","relative_url":"\\/' . $version . '\\/bar","body":"foo=bar&access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9"}]',
+ 'include_headers' => true,
+ 'access_token' => 'foo_token',
+ 'appsecret_proof' => 'df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ ];
+ $this->assertEquals($expectedBatchParams, $params);
+ }
+
+ public function testPreppingABatchRequestProperlyMovesTheFiles()
+ {
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add(new FacebookRequest(null, 'bar_token', 'GET', '/foo'), 'foo_name');
+ $batchRequest->add(new FacebookRequest(null, null, 'POST', '/me/photos', [
+ 'message' => 'foobar',
+ 'source' => new FacebookFile(__DIR__ . '/foo.txt'),
+ ]));
+ $batchRequest->prepareRequestsForBatch();
+
+ $params = $batchRequest->getParams();
+ $files = $batchRequest->getFiles();
+
+ $attachedFiles = implode(',', array_keys($files));
+
+ $expectedHeaders = json_encode($this->defaultHeaders());
+ $version = Facebook::DEFAULT_GRAPH_VERSION;
+ $expectedBatchParams = [
+ 'batch' => '[{"headers":' . $expectedHeaders . ',"method":"GET","relative_url":"\\/' . $version . '\\/foo?access_token=bar_token&appsecret_proof=2ceec40b7b9fd7d38fff1767b766bcc6b1f9feb378febac4612c156e6a8354bd","name":"foo_name"},'
+ . '{"headers":' . $expectedHeaders . ',"method":"POST","relative_url":"\\/' . $version . '\\/me\\/photos","body":"message=foobar&access_token=foo_token&appsecret_proof=df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9","attached_files":"' . $attachedFiles . '"}]',
+ 'include_headers' => true,
+ 'access_token' => 'foo_token',
+ 'appsecret_proof' => 'df4256903ba4e23636cc142117aa632133d75c642bd2a68955be1443bd14deb9',
+ ];
+ $this->assertEquals($expectedBatchParams, $params);
+ }
+
+ private function assertRequestContainsAppAndToken(FacebookRequest $request, FacebookApp $expectedApp, $expectedToken)
+ {
+ $app = $request->getApp();
+ $token = $request->getAccessToken();
+
+ $this->assertSame($expectedApp, $app);
+ $this->assertEquals($expectedToken, $token);
+ }
+
+ private function defaultHeaders()
+ {
+ $headers = [];
+ foreach (FacebookRequest::getDefaultHeaders() as $name => $value) {
+ $headers[] = $name . ': ' . $value;
+ }
+
+ return $headers;
+ }
+
+ private function createAndAppendRequestsTo(FacebookBatchRequest $batchRequest, $number)
+ {
+ for ($i = 0; $i < $number; $i++) {
+ $batchRequest->add(new FacebookRequest());
+ }
+ }
+
+ private function createBatchRequest()
+ {
+ return new FacebookBatchRequest($this->app, [], 'foo_token');
+ }
+
+ private function createBatchRequestWithRequests(array $requests)
+ {
+ $batchRequest = $this->createBatchRequest();
+ $batchRequest->add($requests);
+
+ return $batchRequest;
+ }
+
+ private function assertRequestsMatch($requests, $formattedRequests)
+ {
+ $expectedRequests = [];
+ foreach ($requests as $name => $request) {
+ $expectedRequests[] = [
+ 'name' => $name,
+ 'request' => $request
+ ];
+ }
+ $this->assertEquals($expectedRequests, $formattedRequests);
+ }
+}