| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859 |
- <?php
- /*
- * This file is part of the php-phantomjs.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace JonnyW\PhantomJs\Tests\Integration;
- use JonnyW\PhantomJs\Test\TestCase;
- use JonnyW\PhantomJs\Client;
- use JonnyW\PhantomJs\DependencyInjection\ServiceContainer;
- /**
- * PHP PhantomJs
- *
- * @author Jon Wenmoth <contact@jonnyw.me>
- */
- class ClientTest extends TestCase
- {
- /**
- * Test filename
- *
- * @var string
- * @access protected
- */
- protected $filename;
- /**
- * Test directory
- *
- * @var string
- * @access protected
- */
- protected $directory;
- /** +++++++++++++++++++++++++++++++++++ **/
- /** ++++++++++++++ TESTS ++++++++++++++ **/
- /** +++++++++++++++++++++++++++++++++++ **/
- /**
- * Test additional procedures can be loaded
- * through chain loader.
- *
- * @access public
- * @return void
- */
- public function testAdditionalProceduresCanBeLoadedThroughChainLoader()
- {
- $content = 'TEST_PROCEDURE';
- $procedure = <<<EOF
- console.log(JSON.stringify({"content": "$content"}, undefined, 4));
- phantom.exit(1);
- EOF;
- $this->writeProcedure($procedure);
- $procedureLoaderFactory = $this->getContainer()->get('procedure_loader_factory');
- $procedureLoader = $procedureLoaderFactory->createProcedureLoader($this->directory);
- $client = $this->getClient();
- $client->setProcedure('test');
- $client->getProcedureLoader()->addLoader($procedureLoader);
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $client->send($request, $response);
- $this->assertSame($content, $response->getContent());
- }
- /**
- * Test syntax exception is thrown if request
- * procedure contains syntax error.
- *
- * @access public
- * @return void
- */
- public function testSyntaxExceptionIsThrownIfRequestProcedureContainsSyntaxError()
- {
- $this->setExpectedException('\JonnyW\PhantomJs\Exception\SyntaxException');
- $content = 'TEST_PROCEDURE';
- $procedure = <<<EOF
- console.log(;
- EOF;
- $this->writeProcedure($procedure);
- $procedureLoaderFactory = $this->getContainer()->get('procedure_loader_factory');
- $procedureLoader = $procedureLoaderFactory->createProcedureLoader($this->directory);
- $client = $this->getClient();
- $client->setProcedure('test');
- $client->getProcedureLoader()->addLoader($procedureLoader);
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $client->send($request, $response);
- }
- /**
- * Test response contains 200 status code if page
- * is successfully loaded.
- *
- * @access public
- * @return void
- */
- public function testResponseContains200StatusCodeIfPageIsSuccessfullyLoaded()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $client->send($request, $response);
- $this->assertEquals(200, $response->getStatus());
- }
- /**
- * Test response contains 200 status code if
- * request URL contains reserved characters.
- *
- * @access public
- * @return void
- */
- public function testResponseContains200StatusCodeIfRequestUrlContainsReservedCharacters()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setRequestData(array(
- 'test1' => 'http://test.com',
- 'test2' => 'A string with an \' ) / # some other invalid [ characters.'
- ));
- $client->send($request, $response);
- $this->assertEquals(200, $response->getStatus());
- }
- /**
- * Test response contains valid body if page is
- * successfully loaded.
- *
- * @access public
- * @return void
- */
- public function testResponseContainsValidBodyIfPageIsSuccessfullyLoaded()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $client->send($request, $response);
- $this->assertContains('PHANTOMJS_DEFAULT_TEST', $response->getContent());
- }
- /**
- * Test response contains console error if a
- * javascript error exists on the page.
- *
- * @access public
- * @return void
- */
- public function testResponseContainsConsoleErrorIfAJavascriptErrorExistsOnThePage()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-console-error.php');
- $client->send($request, $response);
- $console = $response->getConsole();
- $this->assertCount(1, $console);
- $this->assertContains('ReferenceError: Can\'t find variable: invalid', $console[0]['message']);
- }
- /**
- * Test response contains console trace if a
- * javascript error exists on the page.
- *
- * @access public
- * @return void
- */
- public function testResponseContainsConsoleTraceIfAJavascriptErrorExistsOnThePage()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-console-error.php');
- $client->send($request, $response);
- $console = $response->getConsole();
- $this->assertCount(1, $console[0]['trace']);
- }
- /**
- * Test response contains headers.
- *
- * @access public
- * @return void
- */
- public function testResponseContainsHeaders()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-console-error.php');
- $client->send($request, $response);
- $this->assertNotEmpty($response->getHeaders());
- }
-
- /**
- * Test redirect URL is set in response
- * if request is redirected.
- *
- * @access public
- * @return void
- */
- public function testRedirectUrlIsSetInResponseIfRequestIsRedirected()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('https://jigsaw.w3.org/HTTP/300/302.html');
- $client->send($request, $response);
- $this->assertNotEmpty($response->getRedirectUrl());
- }
- /**
- * Test POST request sends request data.
- *
- * @access public
- * @return void
- */
- public function testPostRequestSendsRequestData()
- {
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('POST');
- $request->setUrl('http://jonnyw.kiwi/tests/test-post.php');
- $request->setRequestData(array(
- 'test1' => 'http://test.com',
- 'test2' => 'A string with an \' ) / # some other invalid [ characters.'
- ));
- $client->send($request, $response);
- $this->assertContains(sprintf('<li>test1=%s</li>', 'http://test.com'), $response->getContent());
- $this->assertContains(sprintf('<li>test2=%s</li>', 'A string with an \' ) / # some other invalid [ characters.'), $response->getContent());
- }
- /**
- * Test capture request saves file to
- * to local disk.
- *
- * @access public
- * @return void
- */
- public function testCaptureRequestSavesFileToLocalDisk()
- {
- $this->filename = 'test.jpg';
- $file = ($this->directory . '/' . $this->filename);
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-console-error.php');
- $request->setOutputFile($file);
- $client->send($request, $response);
- $this->assertTrue(file_exists($file));
- }
- /**
- * Test capture request saves file to
- * disk with correct capture dimensions.
- *
- * @access public
- * @return void
- */
- public function testCaptureRequestSavesFileToDiskWithCorrectCaptureDimensions()
- {
- $this->filename = 'test.jpg';
- $file = ($this->directory . '/' . $this->filename);
- $width = 200;
- $height = 400;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setOutputFile($file);
- $request->setCaptureDimensions($width, $height);
- $client->send($request, $response);
- $imageInfo = getimagesize($file);
- $this->assertEquals($width, $imageInfo[0]);
- $this->assertEquals($height, $imageInfo[1]);
- }
- /**
- * Test PDF request saves pdf to
- * to local disk.
- *
- * @access public
- * @return void
- */
- public function testPdfRequestSavesPdfToLocalDisk()
- {
- $this->filename = 'test.pdf';
- $file = ($this->directory . '/' . $this->filename);
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createPdfRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setOutputFile($file);
- $client->send($request, $response);
- $this->assertTrue(file_exists($file));
- }
- /**
- * Test capture request saves file to
- * disk with correct paper size.
- *
- * @access public
- * @return void
- */
- public function testPdfRequestSavesFileToDiskWithCorrectPaperSize()
- {
- $this->filename = 'test.pdf';
- $file = ($this->directory . '/' . $this->filename);
- $width = 20;
- $height = 30;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createPdfRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setOutputFile($file);
- $request->setPaperSize(sprintf('%scm', $width), sprintf('%scm', $height));
- $request->setMargin('0cm');
- $client->send($request, $response);
- $pdf = \ZendPdf\PdfDocument::load($file);
- $pdfWidth = round(($pdf->pages[0]->getWidth() * 0.0352777778));
- $pdfHeight = round(($pdf->pages[0]->getHeight() * 0.0352777778));
- $this->assertEquals($width, $pdfWidth);
- $this->assertEquals($height, $pdfHeight);
- }
- /**
- * Test capture request saves file to
- * disk with correct format size.
- *
- * @access public
- * @return void
- */
- public function testPdfRequestSavesFileToDiskWithCorrectFormatSize()
- {
- $this->filename = 'test.pdf';
- $file = ($this->directory . '/' . $this->filename);
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createPdfRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setOutputFile($file);
- $request->setFormat('A4');
- $request->setMargin('0cm');
- $client->send($request, $response);
- $pdf = \ZendPdf\PdfDocument::load($file);
- $pdfWidth = round(($pdf->pages[0]->getWidth() * 0.0352777778));
- $pdfHeight = round(($pdf->pages[0]->getHeight() * 0.0352777778));
- $this->assertEquals(21, $pdfWidth);
- $this->assertEquals(30, $pdfHeight);
- }
- /**
- * Test capture request saves file to
- * disk with correct orientation.
- *
- * @access public
- * @return void
- */
- public function testPdfRequestSavesFileToDiskWithCorrectOrientation()
- {
- $this->filename = 'test.pdf';
- $file = ($this->directory . '/' . $this->filename);
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createPdfRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setOutputFile($file);
- $request->setFormat('A4');
- $request->setOrientation('landscape');
- $request->setMargin('0cm');
- $client->send($request, $response);
- $pdf = \ZendPdf\PdfDocument::load($file);
- $pdfWidth = round(($pdf->pages[0]->getWidth() * 0.0352777778));
- $pdfHeight = round(($pdf->pages[0]->getHeight() * 0.0352777778));
- $this->assertEquals(30, $pdfWidth);
- $this->assertEquals(21, $pdfHeight);
- }
- /**
- * Test set viewport size sets
- * size of viewport in default
- * request.
- *
- * @access public
- * @return void
- */
- public function testSetViewportSizeSetsSizeOfViewportInDefaultRequest()
- {
- $width = 100;
- $height = 200;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setViewportsize($width, $height);
- $client->send($request, $response);
- $logs = explode("\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Set viewport size ~ width: 100 height: 200');
- $this->assertTrue(($startIndex !== false));
- }
- /**
- * Test set viewport size sets
- * size of viewport in capture
- * request.
- *
- * @access public
- * @return void
- */
- public function testSetViewportSizeSetsSizeOfViewportInCaptureRequest()
- {
- $width = 100;
- $height = 200;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setViewportsize($width, $height);
- $client->send($request, $response);
- $logs = explode("\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Set viewport size ~ width: 100 height: 200');
- $this->assertTrue(($startIndex !== false));
- }
- /**
- * Test delay logs start time
- * in client for default request.
- *
- * @access public
- * @return void
- */
- public function testDelayLogsStartTimeInClientForDefaultRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Delaying page render for');
- $this->assertTrue(($startIndex !== false));
- }
- /**
- * Test delay logs end time
- * in client for default request.
- *
- * @access public
- * @return void
- */
- public function testDelayLogsEndTimeInClientForDefaultRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\n", $client->getLog());
- $endIndex = $this->getLogEntryIndex($logs, 'Rendering page after');
- $this->assertTrue(($endIndex !== false));
- }
- /**
- * Test delay delays page render for
- * specified time for default request.
- *
- * @access public
- * @return void
- */
- public function testDelayDelaysPageRenderForSpecifiedTimeForDefaultRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Delaying page render for');
- $endIndex = $this->getLogEntryIndex($logs, 'Rendering page after');
- $startTime = strtotime(substr($logs[$startIndex], 0 , 19));
- $endTime = strtotime(substr($logs[$endIndex], 0 , 19));
- $this->assertSame(($startTime+$delay), $endTime);
- }
- /**
- * Test delay logs start time
- * in client for capture request.
- *
- * @access public
- * @return void
- */
- public function testDelayLogsStartTimeInClientForCaptureRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Delaying page render for');
- $this->assertTrue(($startIndex !== false));
- }
- /**
- * Test delay logs end time
- * in client for capture request.
- *
- * @access public
- * @return void
- */
- public function testDelayLogsEndTimeInClientForCaptureRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\\n", $client->getLog());
- $endIndex = $this->getLogEntryIndex($logs, 'Rendering page after');
- $this->assertTrue(($endIndex !== false));
- }
- /**
- * Test delay delays page render for
- * specified time for capture request.
- *
- * @access public
- * @return void
- */
- public function testDelayDelaysPageRenderForSpecifiedTimeForCaptureRequest()
- {
- $delay = 1;
- $client = $this->getClient();
- $request = $client->getMessageFactory()->createCaptureRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-capture.php');
- $request->setDelay($delay);
- $client->send($request, $response);
- $logs = explode("\\n", $client->getLog());
- $startIndex = $this->getLogEntryIndex($logs, 'Delaying page render for');
- $endIndex = $this->getLogEntryIndex($logs, 'Rendering page after');
- $startTime = strtotime(substr($logs[$startIndex], 0 , 19));
- $endTime = strtotime(substr($logs[$endIndex], 0 , 19));
- $this->assertSame(($startTime+$delay), $endTime);
- }
- /**
- * Test debug logs debug info to
- * client log.
- *
- * @access public
- * @return void
- */
- public function testDebugLogsDebugInfoToClientLog()
- {
- $client = $this->getClient();
- $client->getEngine()->debug(true);
- $request = $client->getMessageFactory()->createRequest();
- $response = $client->getMessageFactory()->createResponse();
- $request->setMethod('GET');
- $request->setUrl('http://jonnyw.kiwi/tests/test-default.php');
- $client->send($request, $response);
- $this->assertContains('[DEBUG]', $client->getLog());
- }
- /** +++++++++++++++++++++++++++++++++++ **/
- /** ++++++++++ TEST ENTITIES ++++++++++ **/
- /** +++++++++++++++++++++++++++++++++++ **/
- /**
- * Get client instance.
- *
- * @return \JonnyW\PhantomJs\Client
- */
- protected function getClient()
- {
- $serviceContainer = ServiceContainer::getInstance();
- $client = new Client(
- $serviceContainer->get('engine'),
- $serviceContainer->get('procedure_loader'),
- $serviceContainer->get('procedure_compiler'),
- $serviceContainer->get('message_factory')
- );
- return $client;
- }
- /** +++++++++++++++++++++++++++++++++++ **/
- /** ++++++++++++ UTILITIES ++++++++++++ **/
- /** +++++++++++++++++++++++++++++++++++ **/
- /**
- * Set up test environment.
- *
- * @access public
- * @return void
- */
- public function setUp()
- {
- $this->filename = 'test.proc';
- $this->directory = sys_get_temp_dir();
- if (!is_writable($this->directory)) {
- throw new \RuntimeException(sprintf('Test directory must be writable: %s', $this->directory));
- }
- }
- /**
- * Tear down test environment.
- *
- * @access public
- * @return void
- */
- public function tearDown()
- {
- $filename = $this->getFilename();
- if (file_exists($filename)) {
- unlink($filename);
- }
- }
- /**
- * Get test filename.
- *
- * @access public
- * @return string
- */
- public function getFilename()
- {
- return sprintf('%1$s/%2$s', $this->directory, $this->filename);
- }
- /**
- * Write procedure body to file.
- *
- * @access public
- * @param string $data
- * @return string
- */
- public function writeProcedure($procedure)
- {
- $filename = $this->getFilename();
- file_put_contents($filename, $procedure);
- return $filename;
- }
- /**
- * Get log entry index.
- *
- * @access public
- * @param array $logs
- * @param string $search
- * @return int|false
- */
- public function getLogEntryIndex(array $logs, $search)
- {
- foreach ($logs as $index => $log) {
- $pos = stripos($log, $search);
- if ($pos !== false) {
- return $index;
- }
- }
- return false;
- }
- }
|