Weblate testsuite and continuous integration
--------------------------------------------

Testsuites exist for most of the current code, increase coverage by adding testcases for any new
functionality, and verify that it works.

.. _ci-tests:

Continuous integration
++++++++++++++++++++++

Current test results can be found on `GitHub Actions`_ and coverage is reported
on `Codecov`_.

.. _GitHub Actions: https://github.com/WeblateOrg/weblate/actions
.. _Codecov: https://app.codecov.io/gh/WeblateOrg/weblate/

There are several jobs to verify different aspects:

* Unit tests
* Documentation build and external links
* Migration testing from all supported releases
* Code linting
* Setup verification (ensures that generated dist files do not miss anything and can be tested)

The configuration for the CI is in :file:`.github/workflows` directory. It
heavily uses helper scripts stored in :file:`ci` directory. The scripts can be
also executed manually, but they require several environment variables, mostly
defining Django settings file to use and database connection. The example
definition of that is in :file:`scripts/test-database.sh`:

.. literalinclude:: ../../scripts/test-database.sh
   :language: sh

The simple execution can look like:

.. code-block:: sh

   . scripts/test-database.sh
   ./ci/run-migrate
   ./ci/run-test
   ./ci/run-docs

.. _local-tests:

Local testing
+++++++++++++

To run a testsuite locally, use:

.. code-block:: sh

    DJANGO_SETTINGS_MODULE=weblate.settings_test ./manage.py test

.. hint::

   You will need a database (PostgreSQL) server to be used for tests. By
   default Django creates separate database to run tests with ``test_`` prefix,
   so in case your settings is configured to use ``weblate``, the tests will
   use ``test_weblate`` database. See :ref:`database-setup` for setup
   instructions.

The :file:`weblate/settings_test.py` is used in CI environment as well (see
:ref:`ci-tests`) and can be tuned using environment variables:

.. literalinclude:: ../../scripts/test-database.sh
   :language: sh

Prior to running tests you should collect static files as some tests rely on them being present:

.. code-block:: sh

    DJANGO_SETTINGS_MODULE=weblate.settings_test ./manage.py collectstatic

You can also specify individual tests to run:

.. code-block:: sh

    DJANGO_SETTINGS_MODULE=weblate.settings_test ./manage.py test weblate.gitexport

.. hint::

   The tests can also be executed inside developer docker container, see :ref:`dev-docker`.

.. seealso::

    See :doc:`django:topics/testing/index` for more info on running and
    writing tests for Django.
