# Copyright 2019 Canonical Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#     Unless required by applicable law or agreed to in writing, software
#     distributed under the License is distributed on an "AS IS" BASIS,
#     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#     See the License for the specific language governing permissions and
#     limitations under the License.

# Tox (http://tox.testrun.org/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.

[tox]
envlist = py3,lint,integration
skipsdist=True

[pytest]
markers =
    serial: mark a test that must run by itself

[testenv]
basepython=python3
usedevelop=True

# for testing with other python versions
commands = py.test --ignore modules/ --ignore tests/charms/ --tb native -ra -v -s -n auto -k 'not integration' -m 'not serial' {posargs}
passenv =
    HOME
    VCA_PATH
    VCA_HOST
    VCA_PORT
    VCA_USER
    VCA_SECRET
    LXD_HOST
    LXD_SECRET
    VCA_CACERT
    # These are needed so executing `charm build` succeeds
    TERM
    TERMINFO
deps =
    mock
    pyyaml
    pytest
    pytest-asyncio
    pytest-xdist
    pytest-assume
    paramiko
    pylxd

[testenv:py3]
# default tox env, excludes integration and serial tests
commands =
    pytest --ignore modules/ --ignore tests/charms/ --tb native -ra -v -n auto -k 'not integration' -m 'not serial' {posargs}

[testenv:lint]
envdir = {toxworkdir}/py3
commands =
    flake8 --ignore E501,E402 --exclude tests/charms/builds,tests/charms/deps {posargs} n2vc tests
deps =
    flake8

[testenv:integration]
envdir = {toxworkdir}/py3
commands = py.test --ignore modules/  --ignore tests/charms/ --tb native -ra -v -s -n 1 -k 'integration' -m 'serial' {posargs}

[testenv:build]
deps =
    stdeb
    setuptools-version-command
commands = python3 setup.py --command-packages=stdeb.command bdist_deb
