diff --git a/composer.json b/composer.json index 93f71b7..7a4ceee 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,14 @@ "php": ">=5.4.0", "laravel/framework": "4.3.*" }, + "require-dev": { + "behat/behat": "2.5.*", + "phpunit/phpunit": "~4" + }, + "suggest": { + "behat/behat": "Allow to use Behat for testing your Laravel Application/Package", + "phpunit/phpunit": "Allow to use PHPUnit for testing your Laravel Application/Package" + }, "extra": { "branch-alias": { "dev-master": "2.3-dev" diff --git a/docs/changes.md b/docs/changes.md index 2a8df20..364d96f 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -4,7 +4,11 @@ title: Testbench Change Log ## Version 2.2 {#v2-2} -### v2.2.0 {#v2-2} +### v2.2.1@dev {#v2-2-1} + +* Add experimental support for Behat when testing packages without a server + +### v2.2.0 {#v2-2-0} * Bump minimum version to PHP v5.4.0. * Add support for Laravel Framework v4.2. diff --git a/src/Testbench/BehatFeatureContext.php b/src/Testbench/BehatFeatureContext.php new file mode 100644 index 0000000..7984a0e --- /dev/null +++ b/src/Testbench/BehatFeatureContext.php @@ -0,0 +1,49 @@ +setUp(); + } + + /** + * Setup the test environment. + * + * @return void + */ + public function setUp() + { + if (! $this->app) { + $this->refreshApplication(); + } + } + + /** + * Define environment setup. + * + * @param \Illuminate\Foundation\Application $app + * @return void + */ + protected function getEnvironmentSetUp($app) + { + // Define your environment setup. + } +} + diff --git a/src/Testbench/Traits/BehatPHPUnitAssertionsTrait.php b/src/Testbench/Traits/BehatPHPUnitAssertionsTrait.php new file mode 100644 index 0000000..b6b06dd --- /dev/null +++ b/src/Testbench/Traits/BehatPHPUnitAssertionsTrait.php @@ -0,0 +1,207 @@ +client->getResponse(); + + $actual = $response->getStatusCode(); + + return PHPUnit::assertTrue($response->isOk(), 'Expected status code 200, got ' .$actual); + } + + /** + * Assert that the client response has a given code. + * + * @param int $code + * @return void + */ + public function assertResponseStatus($code) + { + return PHPUnit::assertEquals($code, $this->client->getResponse()->getStatusCode()); + } + + /** + * Assert that the response view has a given piece of bound data. + * + * @param string|array $key + * @param mixed $value + * @return void + */ + public function assertViewHas($key, $value = null) + { + if (is_array($key)) { + return $this->assertViewHasAll($key); + } + + $response = $this->client->getResponse(); + + if (! isset($response->original) || ! $response->original instanceof View) { + return PHPUnit::assertTrue(false, 'The response was not a view.'); + } + + if (is_null($value)) { + PHPUnit::assertArrayHasKey($key, $response->original->getData()); + } else { + PHPUnit::assertEquals($value, $response->original->$key); + } + } + + /** + * Assert that the view has a given list of bound data. + * + * @param array $bindings + * @return void + */ + public function assertViewHasAll(array $bindings) + { + foreach ($bindings as $key => $value) { + if (is_int($key)) { + $this->assertViewHas($value); + } else { + $this->assertViewHas($key, $value); + } + } + } + + /** + * Assert that the response view is missing a piece of bound data. + * + * @param string $key + * @return void + */ + public function assertViewMissing($key) + { + $response = $this->client->getResponse(); + + if (! isset($response->original) || ! $response->original instanceof View) { + return PHPUnit::assertTrue(false, 'The response was not a view.'); + } + + PHPUnit::assertArrayNotHasKey($key, $response->original->getData()); + } + + /** + * Assert whether the client was redirected to a given URI. + * + * @param string $uri + * @param array $with + * @return void + */ + public function assertRedirectedTo($uri, $with = array()) + { + $response = $this->client->getResponse(); + + PHPUnit::assertInstanceOf('Illuminate\Http\RedirectResponse', $response); + + PHPUnit::assertEquals($this->app['url']->to($uri), $response->headers->get('Location')); + + $this->assertSessionHasAll($with); + } + + /** + * Assert whether the client was redirected to a given route. + * + * @param string $name + * @param array $parameters + * @param array $with + * @return void + */ + public function assertRedirectedToRoute($name, $parameters = array(), $with = array()) + { + $this->assertRedirectedTo($this->app['url']->route($name, $parameters), $with); + } + + /** + * Assert whether the client was redirected to a given action. + * + * @param string $name + * @param array $parameters + * @param array $with + * @return void + */ + public function assertRedirectedToAction($name, $parameters = array(), $with = array()) + { + $this->assertRedirectedTo($this->app['url']->action($name, $parameters), $with); + } + + /** + * Assert that the session has a given list of values. + * + * @param string|array $key + * @param mixed $value + * @return void + */ + public function assertSessionHas($key, $value = null) + { + if (is_array($key)) { + return $this->assertSessionHasAll($key); + } + + if (is_null($value)) { + PHPUnit::assertTrue($this->app['session.store']->has($key), "Session missing key: $key"); + } else { + PHPUnit::assertEquals($value, $this->app['session.store']->get($key)); + } + } + + /** + * Assert that the session has a given list of values. + * + * @param array $bindings + * @return void + */ + public function assertSessionHasAll(array $bindings) + { + foreach ($bindings as $key => $value) { + if (is_int($key)) { + $this->assertSessionHas($value); + } else { + $this->assertSessionHas($key, $value); + } + } + } + + /** + * Assert that the session has errors bound. + * + * @param string|array $bindings + * @param mixed $format + * @return void + */ + public function assertSessionHasErrors($bindings = array(), $format = null) + { + $this->assertSessionHas('errors'); + + $bindings = (array) $bindings; + + $errors = $this->app['session.store']->get('errors'); + + foreach ($bindings as $key => $value) { + if (is_int($key)) { + PHPUnit::assertTrue($errors->has($value), "Session missing error: $value"); + } else { + PHPUnit::assertContains($value, $errors->get($key, $format)); + } + } + } + + /** + * Assert that the session has old input. + * + * @return void + */ + public function assertHasOldInput() + { + $this->assertSessionHas('_old_input'); + } +} diff --git a/tests/BehatFeatureContextTest.php b/tests/BehatFeatureContextTest.php new file mode 100644 index 0000000..fa4e6a0 --- /dev/null +++ b/tests/BehatFeatureContextTest.php @@ -0,0 +1,26 @@ +createApplication(); + + $this->assertInstanceOf('\Orchestra\Testbench\TestCaseInterface', $stub); + $this->assertInstanceOf('\Illuminate\Foundation\Application', $app); + $this->assertEquals('UTC', date_default_timezone_get()); + $this->assertEquals('testing', $app['env']); + $this->assertInstanceOf('\Illuminate\Config\Repository', $app['config']); + } +} + +class StubFeatureContext extends \Orchestra\Testbench\BehatFeatureContext +{ + +}