setIndex(\Codeception\Configuration::dataDir() . '/rest/index.php'); $connectionModule = new \Codeception\Module\UniversalFramework(make_container()); $connectionModule->client = $connector; $connectionModule->_initialize(); $this->module = Stub::make('\Codeception\Module\REST'); $this->module->_inject($connectionModule); $this->module->_initialize(); $this->module->_before(Stub::makeEmpty('\Codeception\Test\Test')); $this->module->client->setServerParameters([ 'SCRIPT_FILENAME' => 'index.php', 'SCRIPT_NAME' => 'index', 'SERVER_NAME' => 'localhost', 'SERVER_PROTOCOL' => 'http' ]); } public function testConflictsWithAPI() { $this->assertInstanceOf('Codeception\Lib\Interfaces\ConflictsWithModule', $this->module); $this->assertEquals('Codeception\Lib\Interfaces\API', $this->module->_conflicts()); } private function setStubResponse($response) { $connectionModule = Stub::make('\Codeception\Module\UniversalFramework', ['_getResponseContent' => $response]); $this->module->_inject($connectionModule); $this->module->_initialize(); $this->module->_before(Stub::makeEmpty('\Codeception\Test\Test')); } public function testBeforeHookResetsVariables() { $this->module->haveHttpHeader('Origin', 'http://www.example.com'); $this->module->sendGET('/rest/user/'); $server = $this->module->client->getInternalRequest()->getServer(); $this->assertArrayHasKey('HTTP_ORIGIN', $server); $this->module->_before(Stub::makeEmpty('\Codeception\Test\Test')); $this->module->sendGET('/rest/user/'); $server = $this->module->client->getInternalRequest()->getServer(); $this->assertArrayNotHasKey('HTTP_ORIGIN', $server); } public function testGet() { $this->module->sendGET('/rest/user/'); $this->module->seeResponseIsJson(); $this->module->seeResponseContains('davert'); $this->module->seeResponseContainsJson(['name' => 'davert']); $this->module->seeResponseCodeIs(200); $this->module->dontSeeResponseCodeIs(404); } public function testPost() { $this->module->sendPOST('/rest/user/', ['name' => 'john']); $this->module->seeResponseContains('john'); $this->module->seeResponseContainsJson(['name' => 'john']); } public function testPut() { $this->module->sendPUT('/rest/user/', ['name' => 'laura']); $this->module->seeResponseContains('davert@mail.ua'); $this->module->seeResponseContainsJson(['name' => 'laura']); $this->module->dontSeeResponseContainsJson(['name' => 'john']); } public function testGrabDataFromResponseByJsonPath() { $this->module->sendGET('/rest/user/'); // simple assoc array $this->assertEquals(['davert@mail.ua'], $this->module->grabDataFromResponseByJsonPath('$.email')); // nested assoc array $this->assertEquals(['Kyiv'], $this->module->grabDataFromResponseByJsonPath('$.address.city')); // nested index array $this->assertEquals(['DavertMik'], $this->module->grabDataFromResponseByJsonPath('$.aliases[0]')); // empty if data not found $this->assertEquals([], $this->module->grabDataFromResponseByJsonPath('$.address.street')); } public function testValidJson() { $this->setStubResponse('{"xxx": "yyy"}'); $this->module->seeResponseIsJson(); $this->setStubResponse('{"xxx": "yyy", "zzz": ["a","b"]}'); $this->module->seeResponseIsJson(); $this->module->seeResponseEquals('{"xxx": "yyy", "zzz": ["a","b"]}'); } public function testInvalidJson() { $this->setExpectedException('PHPUnit\Framework\ExpectationFailedException'); $this->setStubResponse('{xxx = yyy}'); $this->module->seeResponseIsJson(); } public function testValidXml() { $this->setStubResponse(''); $this->module->seeResponseIsXml(); $this->setStubResponse('John'); $this->module->seeResponseIsXml(); $this->module->seeResponseEquals('John'); } public function testXmlResponseEquals() { $this->setStubResponse(''); $this->module->seeResponseIsXml(); $this->module->seeXmlResponseEquals(''); } public function testInvalidXml() { $this->setExpectedException('PHPUnit\Framework\ExpectationFailedException'); $this->setStubResponse('John'); $this->module->seeResponseIsXml(); } public function testSeeInJsonResponse() { $this->setStubResponse( '{"ticket": {"title": "Bug should be fixed", "user": {"name": "Davert"}, "labels": null}}' ); $this->module->seeResponseIsJson(); $this->module->seeResponseContainsJson(['name' => 'Davert']); $this->module->seeResponseContainsJson(['user' => ['name' => 'Davert']]); $this->module->seeResponseContainsJson(['ticket' => ['title' => 'Bug should be fixed']]); $this->module->seeResponseContainsJson(['ticket' => ['user' => ['name' => 'Davert']]]); $this->module->seeResponseContainsJson(['ticket' => ['labels' => null]]); } public function testSeeInJsonCollection() { $this->setStubResponse( '[{"user":"Blacknoir","age":"42","tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->seeResponseIsJson(); $this->module->seeResponseContainsJson(['tags' => ['web-dev', 'java']]); $this->module->seeResponseContainsJson(['user' => 'John Doe', 'age' => 27]); $this->module->seeResponseContainsJson([['user' => 'John Doe', 'age' => 27]]); $this->module->seeResponseContainsJson( [['user' => 'Blacknoir', 'age' => 42], ['user' => 'John Doe', 'age' => "27"]] ); } public function testArrayJson() { $this->setStubResponse( '[{"id":1,"title": "Bug should be fixed"},{"title": "Feature should be implemented","id":2}]' ); $this->module->seeResponseContainsJson(['id' => 1]); } public function testDontSeeInJson() { $this->setStubResponse('{"ticket": {"title": "Bug should be fixed", "user": {"name": "Davert"}}}'); $this->module->seeResponseIsJson(); $this->module->dontSeeResponseContainsJson(['name' => 'Davet']); $this->module->dontSeeResponseContainsJson(['user' => ['name' => 'Davet']]); $this->module->dontSeeResponseContainsJson(['user' => ['title' => 'Bug should be fixed']]); } public function testApplicationJsonIncludesJsonAsContent() { $this->module->haveHttpHeader('Content-Type', 'application/json'); $this->module->sendPOST('/', ['name' => 'john']); /** @var $request \Symfony\Component\BrowserKit\Request **/ $request = $this->module->client->getRequest(); $this->assertContains('application/json', $request->getServer()); $server = $request->getServer(); $this->assertEquals('application/json', $server['HTTP_CONTENT_TYPE']); $this->assertJson($request->getContent()); $this->assertEmpty($request->getParameters()); } public function testApplicationJsonIncludesObjectSerialized() { $this->module->haveHttpHeader('Content-Type', 'application/json'); $this->module->sendPOST('/', new JsonSerializedItem()); /** @var $request \Symfony\Component\BrowserKit\Request **/ $request = $this->module->client->getRequest(); $this->assertContains('application/json', $request->getServer()); $this->assertJson($request->getContent()); } public function testGetApplicationJsonNotIncludesJsonAsContent() { $this->module->haveHttpHeader('Content-Type', 'application/json'); $this->module->sendGET('/', ['name' => 'john']); /** @var $request \Symfony\Component\BrowserKit\Request **/ $request = $this->module->client->getRequest(); $this->assertNull($request->getContent()); $this->assertContains('john', $request->getParameters()); } public function testUrlIsFull() { $this->module->sendGET('/api/v1/users'); /** @var $request \Symfony\Component\BrowserKit\Request **/ $request = $this->module->client->getRequest(); $this->assertEquals('http://localhost/api/v1/users', $request->getUri()); } public function testSeeHeaders() { $response = new \Symfony\Component\BrowserKit\Response("", 200, [ 'Cache-Control' => ['no-cache', 'no-store'], 'Content_Language' => 'en-US' ]); $this->module->client->mockResponse($response); $this->module->sendGET('/'); $this->module->seeHttpHeader('Cache-Control'); $this->module->seeHttpHeader('content_language', 'en-US'); $this->module->seeHttpHeader('Content-Language', 'en-US'); $this->module->dontSeeHttpHeader('Content-Language', 'en-RU'); $this->module->dontSeeHttpHeader('Content-Language1'); $this->module->seeHttpHeaderOnce('Content-Language'); $this->assertEquals('en-US', $this->module->grabHttpHeader('Content-Language')); $this->assertEquals('no-cache', $this->module->grabHttpHeader('Cache-Control')); $this->assertEquals(['no-cache', 'no-store'], $this->module->grabHttpHeader('Cache-Control', false)); } public function testSeeHeadersOnce() { $this->shouldFail(); $response = new \Symfony\Component\BrowserKit\Response("", 200, [ 'Cache-Control' => ['no-cache', 'no-store'], ]); $this->module->client->mockResponse($response); $this->module->sendGET('/'); $this->module->seeHttpHeaderOnce('Cache-Control'); } public function testSeeResponseJsonMatchesXpath() { $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->seeResponseIsJson(); $this->module->seeResponseJsonMatchesXpath('//user'); } public function testSeeResponseJsonMatchesJsonPath() { $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->seeResponseJsonMatchesJsonPath('$[*].user'); $this->module->seeResponseJsonMatchesJsonPath('$[1].tags'); } public function testDontSeeResponseJsonMatchesJsonPath() { $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->dontSeeResponseJsonMatchesJsonPath('$[*].profile'); } public function testDontSeeResponseJsonMatchesXpath() { $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->dontSeeResponseJsonMatchesXpath('//status'); } public function testDontSeeResponseJsonMatchesXpathFails() { $this->shouldFail(); $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->dontSeeResponseJsonMatchesXpath('//user'); } /** * @Issue https://github.com/Codeception/Codeception/issues/2775 */ public function testSeeResponseJsonMatchesXPathWorksWithAmpersand() { $this->setStubResponse('{ "product":[ { "category":[ { "comment":"something & something" } ] } ] }'); $this->module->seeResponseIsJson(); $this->module->seeResponseJsonMatchesXpath('//comment'); } public function testSeeResponseJsonMatchesJsonPathFails() { $this->shouldFail(); $this->setStubResponse( '[{"user":"Blacknoir","age":27,"tags":["wed-dev","php"]},' . '{"user":"John Doe","age":27,"tags":["web-dev","java"]}]' ); $this->module->seeResponseIsJson(); $this->module->seeResponseJsonMatchesJsonPath('$[*].profile'); } public function testStructuredJsonPathAndXPath() { $this->setStubResponse( '{ "store": {"book": [{ "category": "reference", "author": "Nigel Rees", ' . '"title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", ' . '"title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", ' . '"title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", ' . '"author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", ' . '"price": 22.99 } ], "bicycle": {"color": "red", "price": 19.95 } } }' ); $this->module->seeResponseIsJson(); $this->module->seeResponseJsonMatchesXpath('//book/category'); $this->module->seeResponseJsonMatchesJsonPath('$..book'); $this->module->seeResponseJsonMatchesJsonPath('$.store.book[2].author'); $this->module->dontSeeResponseJsonMatchesJsonPath('$.invalid'); $this->module->dontSeeResponseJsonMatchesJsonPath('$.store.book.*.invalidField'); } public function testApplicationJsonSubtypeIncludesObjectSerialized() { $this->module->haveHttpHeader('Content-Type', 'application/resource+json'); $this->module->sendPOST('/', new JsonSerializedItem()); /** @var $request \Symfony\Component\BrowserKit\Request **/ $request = $this->module->client->getRequest(); $this->assertContains('application/resource+json', $request->getServer()); $this->assertJson($request->getContent()); } public function testJsonTypeMatches() { $this->setStubResponse('{"xxx": "yyy", "user_id": 1}'); $this->module->seeResponseMatchesJsonType(['xxx' => 'string', 'user_id' => 'integer:<10']); $this->module->dontSeeResponseMatchesJsonType(['xxx' => 'integer', 'user_id' => 'integer:<10']); } public function testJsonTypeMatchesWithJsonPath() { $this->setStubResponse('{"users": [{ "name": "davert"}, {"id": 1}]}'); $this->module->seeResponseMatchesJsonType(['name' => 'string'], '$.users[0]'); $this->module->seeResponseMatchesJsonType(['id' => 'integer'], '$.users[1]'); $this->module->dontSeeResponseMatchesJsonType(['id' => 'integer'], '$.users[0]'); } public function testMatchJsonTypeFailsWithNiceMessage() { $this->setStubResponse('{"xxx": "yyy", "user_id": 1}'); try { $this->module->seeResponseMatchesJsonType(['zzz' => 'string']); $this->fail('it had to throw exception'); } catch (PHPUnit\Framework\AssertionFailedError $e) { $this->assertEquals('Key `zzz` doesn\'t exist in {"xxx":"yyy","user_id":1}', $e->getMessage()); } } public function testDontMatchJsonTypeFailsWithNiceMessage() { $this->setStubResponse('{"xxx": "yyy", "user_id": 1}'); try { $this->module->dontSeeResponseMatchesJsonType(['xxx' => 'string']); $this->fail('it had to throw exception'); } catch (PHPUnit\Framework\AssertionFailedError $e) { $this->assertEquals('Unexpectedly response matched: {"xxx":"yyy","user_id":1}', $e->getMessage()); } } public function testSeeResponseIsJsonFailsWhenResponseIsEmpty() { $this->shouldFail(); $this->setStubResponse(''); $this->module->seeResponseIsJson(); } public function testSeeResponseIsJsonFailsWhenResponseIsInvalidJson() { $this->shouldFail(); $this->setStubResponse('{'); $this->module->seeResponseIsJson(); } public function testSeeResponseJsonMatchesXpathCanHandleResponseWithOneElement() { $this->setStubResponse('{"success": 1}'); $this->module->seeResponseJsonMatchesXpath('//success'); } public function testSeeResponseJsonMatchesXpathCanHandleResponseWithTwoElements() { $this->setStubResponse('{"success": 1, "info": "test"}'); $this->module->seeResponseJsonMatchesXpath('//success'); } public function testSeeResponseJsonMatchesXpathCanHandleResponseWithOneSubArray() { $this->setStubResponse('{"array": {"success": 1}}'); $this->module->seeResponseJsonMatchesXpath('//array/success'); } public function testSeeBinaryResponseEquals() { $data = base64_decode('/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k='); $this->setStubResponse($data); $this->module->seeBinaryResponseEquals(md5($data)); } public function testDontSeeBinaryResponseEquals() { $data = base64_decode('/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k='); $this->setStubResponse($data); $this->module->dontSeeBinaryResponseEquals('024f615102cdb3c8c7cf75cdc5a83d15'); } public function testAmDigestAuthenticatedThrowsExceptionWithFunctionalModules() { $this->setExpectedException('\Codeception\Exception\ModuleException', 'Not supported by functional modules'); $this->module->amDigestAuthenticated('username', 'password'); } protected function shouldFail() { $this->setExpectedException('PHPUnit\Framework\AssertionFailedError'); } } class JsonSerializedItem implements JsonSerializable { public function jsonSerialize() { return array("hello" => "world"); } }