# Build and dev

**Authelia** is written in Go and comes with a dedicated CLI called
[authelia-scripts](./authelia-scripts.md) which is available after
running `source bootstrap.sh`. This CLI provides many useful tools
to help you during development.

In order to build and contribute to **Authelia**, you need to make
sure Go v1.13, Docker, docker-compose and Node v12 are installed on
your machine.

## Get started

**Authelia** is made of Go application serving the API and a
[React](https://reactjs.org/) application for the portal.

In order to ease development, Authelia uses the concept of [suites] to
run Authelia from source code so that your patches are included. This
is a kind of virtual environment running **Authelia** in a complete
ecosystem (LDAP, Redis, SQL server). Note that Authelia is hotreloaded
in the environment so that your patches are instantly included.

The next command starts the suite called *Standalone*:

    $ authelia-scripts suites setup Standalone

Most of the suites are using docker-compose to bootstrap the
environment. Therefore, you can check the logs of all application
by running the following command on the component you want to
monitor.

    $ docker logs authelia_authelia-backend_1 -f

Then, edit the code and observe how **Authelia** is automatically
reloaded.

### Unit tests

To run the unit tests, run:

    $ authelia-scripts unittest

### Integration tests

Integration tests are located under the `internal/suites` directory
and are based on Selenium. A suite is a combination of environment
and tests. Executing a suite therefore means starting the environment,
running the tests and tearing down the environment. Each step can be
run independantly:

    # List the available suites
    $ authelia-scripts suites list
    Standalone
    DuoPush
    LDAP
    Traefik

    # Start the environment of Standalone suite.
    $ authelia-scripts suites setup Standalone

    # Run the tests related to the currently running suite.
    $ authelia-scripts suites test

    # Tear down the environment
    $ authelia-scripts suites teardown Standalone


In order to test all suites (approx 30 minutes), you need to make
sure there is no currently running suite and then you should run:

    $ authelia-scripts suites test

Also, you don't need to start the suite before testing it. Given
you're not running any suite, just use the following command to
test the *Standalone* suite.

    $ authelia-scripts suites test Standalone

The suite will be spawned, tests will be run and then the suite
will be teared down automatically.


[suites]: ./suites.md
