#
# 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]
basepython = python3.8
ignore_basepython_conflict = true
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_TESTENV = true
    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
allowlist_externals =
    npm
    pkill

[testenv:cypress]
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_TESTENV = true
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    ENABLE_REACT_CRUD_VIEWS = true
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh
commands_post =
    pkill -if "python {envbindir}/flask"

[testenv:cypress-dashboard]
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_TESTENV = true
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    ENABLE_REACT_CRUD_VIEWS = true
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh dashboard
commands_post =
    pkill -if "python {envbindir}/flask"

[testenv:cypress-explore]
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_TESTENV = true
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    ENABLE_REACT_CRUD_VIEWS = true
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh explore
commands_post =
    pkill -if "python {envbindir}/flask"

[testenv:cypress-sqllab]
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_TESTENV = true
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    ENABLE_REACT_CRUD_VIEWS = true
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh sqllab
commands_post =
    pkill -if "python {envbindir}/flask"

[testenv:cypress-sqllab-backend-persist]
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_TESTENV = true
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    ENABLE_REACT_CRUD_VIEWS = true
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset-frontend/cypress_build.sh sqllab
commands_post =
    pkill -if "python {envbindir}/flask"

[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
