# Copyright 2021 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact: legal@canonical.com
#
# To get in touch with the maintainers, please contact:
# osm-charmers@lists.launchpad.net
##

[tox]
envlist = pep8
skipsdist = True

[testenv]
setenv = VIRTUAL_ENV={envdir}
         PYTHONHASHSEED=0
whitelist_externals = juju
passenv = HOME TERM CS_API_* OS_* AMULET_*
deps = -r{toxinidir}/test-requirements.txt
install_command =
  pip install {opts} {packages}

[testenv:build]
basepython = python3
passenv=HTTP_PROXY HTTPS_PROXY NO_PROXY
setenv = CHARM_LAYERS_DIR = /tmp
         CHARM_INTERFACES_DIR = /tmp/canonical-osm/charms/interfaces/
whitelist_externals = git
                      charm
                      rm
                      mv
commands =
    rm -rf /tmp/canonical-osm /tmp/osm-common
    rm -rf release/
    git clone https://git.launchpad.net/canonical-osm /tmp/canonical-osm
    git clone https://git.launchpad.net/charm-osm-common /tmp/osm-common
    git clone https://git.launchpad.net/interface-mongodb /tmp/canonical-osm/charms/interfaces/mongodb
    charm build . --build-dir /tmp
    mv /tmp/mongodb-k8s/ release/

[testenv:black]
basepython = python3
deps =
    black
    yamllint
    flake8
commands =
    black --check --diff .
    yamllint .
    flake8 reactive/ --max-line-length=88
    flake8 tests/ --max-line-length=88

[testenv:pep8]
basepython = python3
deps=charm-tools
commands = charm-proof

[testenv:func-noop]
basepython = python3
commands =
    true

[testenv:func]
basepython = python3
commands =
    functest-run-suite
    functest-prepare -m mongo-ha
    juju switch mongo-ha
    functest-deploy -m mongo-ha -b ./tests/bundles/mongodb-ha.yaml
    ; functest-test -m mongo-ha
    functest-destroy -m mongo-ha


[testenv:func-smoke]
basepython = python3
commands = functest-run-suite --keep-model --smoke

[testenv:venv]
commands = {posargs}
