# Unit tests

### Setup your environment for tests

The framework used is PHPUnit; it can be installed with Composer, which is a dependency management tool.

Regarding Composer, you can either use:

- a system-wide version, e.g. installed through your distro's package manager
- a local version, downloadable here

#### Sample usage

    # system-wide version
    $ composer install
    $ composer update

    # local version
    $ php composer.phar self-update
    $ php composer.phar install
    $ php composer.phar update

#### Install Shaarli dev dependencies

    $ cd /path/to/shaarli
    $ composer update

#### Install and enable Xdebug to generate PHPUnit coverage reports

For Debian-based distros:

    $ aptitude install php5-xdebug

For ArchLinux:

    $ pacman -S xdebug

Then add the following line to `/etc/php/php.ini`:

    zend_extension=xdebug.so

#### Run unit tests

Successful test suite:

    $ make test

    -------
    PHPUNIT
    -------
    PHPUnit 4.6.9 by Sebastian Bergmann and contributors.

    Configuration read from /home/virtualtam/public_html/shaarli/phpunit.xml

    ....................................

    Time: 759 ms, Memory: 8.25Mb

    OK (36 tests, 65 assertions)

Test suite with failures and errors:

    $ make test
    -------
    PHPUNIT
    -------
    PHPUnit 4.6.9 by Sebastian Bergmann and contributors.

    Configuration read from /home/virtualtam/public_html/shaarli/phpunit.xml

    E..FF...............................

    Time: 802 ms, Memory: 8.25Mb

    There was 1 error:

    1) LinkDBTest::testConstructLoggedIn
    Missing argument 2 for LinkDB::__construct(), called in /home/virtualtam/public_html/shaarli/tests/Link\
    DBTest.php on line 79 and defined

    /home/virtualtam/public_html/shaarli/application/LinkDB.php:58
    /home/virtualtam/public_html/shaarli/tests/LinkDBTest.php:79

    --

    There were 2 failures:

    1) LinkDBTest::testCheckDBNew
    Failed asserting that two strings are equal.
    --- Expected
    +++ Actual
    @@ @@
    -'e3edea8ea7bb50be4bcb404df53fbb4546a7156e'
    +'85eab0c610d4f68025f6ed6e6b6b5fabd4b55834'

    /home/virtualtam/public_html/shaarli/tests/LinkDBTest.php:121

    2) LinkDBTest::testCheckDBLoad
    Failed asserting that two strings are equal.
    --- Expected
    +++ Actual
    @@ @@
    -'e3edea8ea7bb50be4bcb404df53fbb4546a7156e'
    +'85eab0c610d4f68025f6ed6e6b6b5fabd4b55834'

    /home/virtualtam/public_html/shaarli/tests/LinkDBTest.php:133

    FAILURES!
    Tests: 36, Assertions: 63, Errors: 1, Failures: 2.

#### Test results and coverage

By default, PHPUnit will run all suitable tests found under the `tests` directory.

Each test has 3 possible outcomes:

- `.` - success
- `F` - failure: the test was run but its results are invalid
- the code does not behave as expected
- dependencies to external elements: globals, session, cache...
- `E` - error: something went wrong and the tested code has crashed
- typos in the code, or in the test code
- dependencies to missing external elements

If Xdebug has been installed and activated, two coverage reports will be generated:

- a summary in the console
- a detailed HTML report with metrics for tested code
- to open it in a web browser: `firefox coverage/index.html &`