Symfony/BDD example 06: error 404

3 January 2015

This is the final example in the first Symfony/BDD series. It demonstrates how to create and test error pages.

##1. Background

I assume that you have already read:

In this example we will customize the messages for:

##2. Introductory step

###2.1. Start the project

Create a new directory and clone my Symfony Standard repository:

# Host OS
$ mkdir symfony-bdd-example-06-error404
$ cd symfony-bdd-example-06-error404
$ git clone git@github.com:by-examples/symfony-standard.git .

###2.2. Create a starting point for the project

Create a new orphan branch that starts at the tag Symfony Standard v2.6.1:

# Host OS
$ git checkout --orphan 2.6.1/symfony-bdd-example-06-error404 v2.6.1

Commit your change:

# Host OS
$ git add -A
$ git commit -m "Symfony Standard 2.6.1"

###2.3. Customize the project

Introduce the following changes in your project:

# Host OS
$ git cherry-pick origin/2.6.1/Gitignore
$ git cherry-pick origin/2.6.1/Cleanup
$ git cherry-pick origin/2.6.1/Vagrant
$ git cherry-pick origin/2.6.1/Speedup
$ git cherry-pick origin/2.6.1/Behat
$ git cherry-pick origin/2.6.1/BehatInitialization

###2.4. Install the dependencies

Boot the VM with:

# Host OS
$ vagrant up
$ vagrant ssh

and run:

# Guest OS
$ composer install -o

When this is done, commit you changes with:

# Host OS
$ git add -A
$ git commit -m "Updated dependencies"

##3. Run Behat - project is GREEN

Now, try to run:

# Guest OS
$ bin/behat

You will get the output similar to:

No scenarios
No steps
0m0.03s (9.00Mb)

The project is GREEN.

GREEN

##4. Error 404 test - the project is RED

Create features/error.feature file with the following contents:

Feature: I would like to...

    Scenario: The Page was not found!
      Given I am on "some/page/that/does/not/exist"
       Then the response status code should be 404
        And I should see "Hey, this beautiful page is yet to be created!"

    Scenario: Serious problem in the application
      Given I am on "/action/with/exception"
       Then the response status code should be 500
        And I should see "We are very sorry, but there was a serious error in the application!"

Run Behat:

# Guest OS
$ bin/behat

The project is RED.

RED

Commit the test:

# Host OS
$ git add -A
$ git commit -m "[BDD:RED] tests for error 404 and error 500"

##5. Customized views

Create the file:

app/Resources/TwigBundle/views/Exception/error404.html.twig

The contents of the file can look like this:

{% extends 'base.html.twig' %}

{% block title %}
    The page does not exists!
{% endblock title %}

{% block body %}
    <h2>The page does not exists!</h2>
    <p>
        Hey, this beautiful page is yet to be created!
    </p>
{% endblock body %}

Create the file:

app/Resources/TwigBundle/views/Exception/error500.html.twig

with the following contents:

{% extends 'base.html.twig' %}

{% block title %}
    An error occured!
{% endblock title %}

{% block body %}
    <h2>An error occured!</h2>
    <p>
        We are very sorry, but there was a serious error in the application!
    </p>
{% endblock body %}

Finally, add a new action in src/AppBundle/Controller/DefaultController.php:

/**
 * @Route("/action/with/exception")
 */
public function actionWithExceptionAction()
{
    throw new \RuntimeException('Ups...');
}

##6. Run the tests

Clear the cache:

# Guest OS
$ php app/console cache:clear --env=prod

and run the tests:

# Guest OS
$ bin/behat

The project is GREEN.

GREEN

Commit your changes with:

# Host OS
$ git add -A
$ git commit -m "[BDD:GREEN] code for error 404 and error 500 tests"

##7. Visit app with your browser

Run web browser and visit:

http://localhost:8880/a/b/c
http://localhost:8880/app_dev.php/a/b/c

http://localhost:8880/action/with/exception
http://localhost:8880/app_dev.php/action/with/exception

##8. Remove unnecessary commits

Remove unnecessary commits from your repository:

$ git remote rm origin
$ git branch -D 2.7
$ git tag | xargs git tag -d
$ git reflog expire --all --expire=now
$ git prune
$ git gc

Now your repository contains only the commits that you have authored working on this example.

##9. The Example

You will find the source code of the example on GitHub.

For the instruction how to run the example refer to README.md file.

Fork me on GitHub