#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

# Remember to start celery workers to run celery tests, e.g.
# celery worker --app=superset.tasks.celery_app:app -Ofair -c 2
[testenv]
commands =
    superset db upgrade
    superset init
    # use -s to be able to use break pointers.
    # no args or tests/* can be passed as an argument to run all tests
    pytest -s {posargs}
deps =
    -rrequirements/testing.txt
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    mysql: SUPERSET__SQLALCHEMY_DATABASE_URI = mysql://mysqluser:mysqluserpassword@localhost/superset?charset=utf8
    postgres: SUPERSET__SQLALCHEMY_DATABASE_URI = postgresql+psycopg2://superset:superset@localhost/test
    sqlite: SUPERSET__SQLALCHEMY_DATABASE_URI = sqlite:////{envtmpdir}/superset.db
    mysql-presto: SUPERSET__SQLALCHEMY_DATABASE_URI = mysql://mysqluser:mysqluserpassword@localhost/superset?charset=utf8
    # docker run -p 8080:8080 --name presto prestosql/presto
    mysql-presto: SUPERSET__SQLALCHEMY_EXAMPLES_URI = presto://localhost:8080/memory/default
    # based on https://github.com/big-data-europe/docker-hadoop
    # clone the repo & run docker-compose up -d to test locally
    mysql-hive: SUPERSET__SQLALCHEMY_DATABASE_URI = mysql://mysqluser:mysqluserpassword@localhost/superset?charset=utf8
    mysql-hive: SUPERSET__SQLALCHEMY_EXAMPLES_URI = hive://localhost:10000/default
    # make sure that directory is accessible by docker
    hive: UPLOAD_FOLDER = /tmp/.superset/app/static/uploads/
usedevelop = true
whitelist_externals =
    npm

[testenv:cypress-dashboard]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh dashboard
deps =
    -rrequirements/testing.txt
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}

[testenv:cypress-explore]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh explore
deps =
    -rrequirements/testing.txt
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}

[testenv:cypress-sqllab]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh sqllab
deps =
    -rrequirements/testing.txt
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}

[testenv:cypress-sqllab-backend-persist]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh sqllab
deps =
    -rrequirements/testing.txt
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config_sqllab_backend_persist
    SUPERSET_HOME = {envtmpdir}

[testenv:eslint]
changedir = {toxinidir}/superset-frontend
commands =
    npm run lint
deps =

[testenv:fossa]
commands =
    {toxinidir}/scripts/fossa.sh
deps =
passenv = *

[testenv:javascript]
commands =
    npm install -g npm@'>=6.5.0'
    {toxinidir}/superset-frontend/js_build.sh
deps =

[testenv:license-check]
commands =
    {toxinidir}/scripts/check_license.sh
passenv = *
whitelist_externals =
    {toxinidir}/scripts/check_license.sh
deps =

[testenv:pre-commit]
commands =
    pre-commit run --all-files
deps =
    -rrequirements/integration.txt
skip_install = true

[testenv:pylint]
commands =
    pylint superset
deps =
    -rrequirements/testing.txt

[testenv:thumbnails]
setenv =
    SUPERSET_CONFIG = tests.superset_test_config_thumbnails
deps =
    -rrequirements/testing.txt

[tox]
envlist =
    cypress-dashboard
    cypress-explore
    cypress-sqllab
    cypress-sqllab-backend-persist
    eslint
    fossa
    javascript
    license-check
    pre-commit
    pylint
skipsdist = true
