diff --git a/.circleci/config.yml b/.circleci/config.yml index a54b6cbe4e..3cd2888b33 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ orbs: jobs: artifacts: docker: - - image: cimg/python:3.12.1 + - image: cimg/python:3.12.10 auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -31,7 +31,7 @@ jobs: install-dependencies-312: &install-dependencies working_directory: ~/dash docker: - - image: cimg/python:3.12.1-node + - image: cimg/python:3.12.10-node auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -49,7 +49,8 @@ jobs: name: ๐Ÿ Build Component Packages & Update Dependencies/Artifacts command: | python -m venv venv && . venv/bin/activate - pip install --upgrade pip wheel setuptools + pip install "pip<25.0" + pip install --upgrade wheel setuptools set -eo pipefail pip install -e .[ci,dev,testing,celery,diskcache] --progress-bar off pip list | grep dash @@ -89,7 +90,7 @@ jobs: lint-unit-312: &lint-unit working_directory: ~/dash docker: - - image: cimg/python:3.12.1-browsers + - image: cimg/python:3.12.10-browsers auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -175,7 +176,7 @@ jobs: test-312: &test working_directory: ~/dash docker: - - image: cimg/python:3.12.1-browsers + - image: cimg/python:3.12.10-browsers auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -184,11 +185,6 @@ jobs: PERCY_PARALLEL_TOTAL: -1 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: True PYVERSION: python312 - REDIS_URL: redis://localhost:6379 - - image: cimg/redis:6.2.6 - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB parallelism: 3 steps: - checkout: @@ -200,6 +196,7 @@ jobs: sudo apt-get update - run: echo $PYVERSION > ver.txt - run: cat requirements/*.txt > requirements-all.txt + - run: cat requirements-all.txt - restore_cache: key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - browser-tools/install-browser-tools: @@ -212,9 +209,10 @@ jobs: name: ๏ธ๏ธ๐Ÿ—๏ธ Install package command: | . venv/bin/activate + pip install "pip<25" npm ci pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash + pip list - run: name: ๐Ÿงช Run Integration Tests command: | @@ -238,16 +236,11 @@ jobs: PERCY_ENABLE: 0 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: True PYVERSION: python38 - REDIS_URL: redis://localhost:6379 - - image: cimg/redis:6.2.6 - auth: - username: dashautomation - password: $DASH_PAT_DOCKERHUB dcc-lint-unit-312: &dcc-lint-unit working_directory: ~/dash docker: - - image: cimg/python:3.12.1-node + - image: cimg/python:3.12.10-node auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -284,7 +277,7 @@ jobs: dcc-312: &dcc-test working_directory: ~/dash docker: - - image: cimg/python:3.12.1-browsers + - image: cimg/python:3.12.10-browsers auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -345,7 +338,7 @@ jobs: html-312: &html-test working_directory: ~/dash docker: - - image: cimg/python:3.12.1-browsers + - image: cimg/python:3.12.10-browsers auth: username: dashautomation password: $DASH_PAT_DOCKERHUB @@ -411,105 +404,6 @@ jobs: PYVERSION: python38 PERCY_ENABLE: 0 - table-server: &table-server - working_directory: ~/dash - docker: - - image: cimg/python:3.12.1-browsers - environment: - PYVERSION: python312 - PERCY_ENABLE: 1 - PERCY_PARALLEL_TOTAL: -1 - - parallelism: 5 - - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - install-firefox: false - install-geckodriver: false - - attach_workspace: - at: ~/dash - - run: - name: ๏ธ๏ธ๐Ÿ—๏ธ Install package - command: | - . venv/bin/activate - pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash - - run: - name: Inject Percy Environment variables - command: | - echo 'export PERCY_TOKEN="$PERCY_TOKEN"' >> $BASH_ENV - - run: - name: Run tests - command: | - . venv/bin/activate - cd components/dash-table - TESTFILES=$(circleci tests glob "tests/selenium/**/test_*.py" | circleci tests split --split-by=timings) - pytest --nopercyfinalize --junitxml=test-reports/junit_intg.xml --junitprefix="components.dash-table" ${TESTFILES} - - store_artifacts: - path: ~/dash/components/dash-table/test-reports - - store_test_results: - path: ~/dash/components/dash-table/test-reports - - store_artifacts: - path: /tmp/dash_artifacts - - table-unit-test: - working_directory: ~/dash - docker: - - image: cimg/python:3.12.1-browsers - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - steps: - - checkout: - path: ~/dash - - run: - name: Add chrome keys & update. - command: | - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - - sudo apt-get update - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - restore_cache: - key: table-{{ checksum "components/dash-table/package.json" }}-{{ checksum "components/dash-table/package-lock.json" }} - - browser-tools/install-browser-tools: - chrome-version: 120.0.6099.71 - install-firefox: false - install-geckodriver: false - - attach_workspace: - at: ~/dash - - run: - name: ๏ธ๏ธ๐Ÿ—๏ธ Install package and table deps - command: | - . venv/bin/activate - pip install dash-package/dash-package.tar.gz[ci,dev,testing,celery,diskcache] --progress-bar off - pip list | grep dash - cd components/dash-table - npm ci - - save_cache: - key: table-{{ checksum "components/dash-table/package.json" }}-{{ checksum "components/dash-table/package-lock.json" }} - paths: - - components/dash-table/node_modules - - run: - name: Run tests - command: | - . venv/bin/activate - cd components/dash-table - npm run test.unit - table-visual-test: working_directory: ~/dash/components/dash-table docker: @@ -546,45 +440,6 @@ jobs: - store_artifacts: path: storybook-static - table-node: - working_directory: ~/dash - docker: - - image: cimg/python:3.12.1-node - environment: - PYVERSION: python312 - PERCY_ENABLE: 0 - steps: - - checkout: - path: ~/dash - - run: echo $PYVERSION > ver.txt - - run: cat requirements/*.txt > requirements-all.txt - - restore_cache: - key: dep-{{ checksum ".circleci/config.yml" }}-{{ checksum "ver.txt" }}-{{ checksum "requirements-all.txt" }} - - restore_cache: - key: dep-{{ .Branch }}-{{ checksum "components/dash-table/package-lock.json" }}-{{ checksum "components/dash-table/package.json" }} - - run: - name: Install package.json - command: cd components/dash-table && npm ci - - save_cache: - key: dep-{{ .Branch }}-{{ checksum "components/dash-table/package-lock.json" }}-{{ checksum "components/dash-table/package.json" }} - paths: - - components/dash-table/node_modules - - attach_workspace: - at: ~/dash - - run: - name: Install requirements - command: | - . venv/bin/activate - pip install dash-package/dash-package.tar.gz[ci,dev,testing] - - - run: - name: Run eslint - command: | - . venv/bin/activate - cd components/dash-table - npm run lint - when: always - workflows: version: 2 tests: @@ -629,23 +484,13 @@ workflows: requires: - install-dependencies-38 - - table-node: - requires: - - install-dependencies-312 - - table-unit-test: - requires: - - install-dependencies-312 - table-visual-test - - table-server: - requires: - - install-dependencies-312 - percy/finalize_all: requires: - test-312 - dcc-312 - html-312 - - table-server - artifacts: requires: - percy/finalize_all diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000000..42ad62dd83 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,405 @@ +name: Dash Testing + +on: + push: + workflow_dispatch: + +jobs: + + changes_filter: + name: Detect Relevant Path Changes + runs-on: ubuntu-latest + outputs: + # This output will be 'true' if files in the 'table_related_paths' list changed, 'false' otherwise. + table_paths_changed: ${{ steps.filter.outputs.table_related_paths }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Detect changed files for table tests + id: filter # Give an ID to this step to reference its outputs + uses: dorny/paths-filter@v3 + with: + base: ${{ github.ref }} + filters: | + table_related_paths: + - 'components/dash-table/**' + - 'dash/dash-renderer/**' + + build: + name: Build Dash Package + runs-on: ubuntu-latest + outputs: + artifact_name: dash-packages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js for frontend build + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Install NPM dependencies + run: npm ci + + - name: Set up Python for build + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: pip + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + python -m pip install "setuptools<80.0.0" + python -m pip install build wheel + python -m pip install -e .[dev,ci] + + - name: Build Dash + run: npm run build + + - name: Build Dash sdist and wheel + run: | + # This command will invoke hatchling (via hatch_dash.py) which includes building JS assets + python -m build --sdist --wheel + echo "Built packages:" + ls -lhR dist/ + mkdir packages + cp dist/*.whl packages + + - name: Upload Dash packages as artifact + uses: actions/upload-artifact@v4 + with: + name: dash-packages # This name will be used by dependent jobs to download + path: packages/ # Upload the contents of the dist directory + retention-days: 1 # Keep artifact for 1 day (adjust as needed) + + test-typing: + name: Typing Tests + runs-on: ubuntu-latest + needs: build + strategy: + fail-fast: false + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: 'pip' + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + + - name: Build/Setup test components + run: npm run setup-tests.py # TODO build the packages and save them to packages/ in build job + + - name: Run typing tests + run: | + cd tests + pytest compliance/test_typing.py + + background-callbacks: + name: Run Background Callback Tests (Python ${{ matrix.python-version }}) + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.9", "3.12"] + + # Service container for Redis + services: + redis: + image: redis:6 + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + env: + # Set REDIS_URL for your application/tests + # The service 'redis' will be available on localhost (or redis) at port 6379 + REDIS_URL: redis://localhost:6379 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<78.0.0" + python -m pip install "selenium==4.32.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev,celery,diskcache]"' \; + + - name: Install Google Chrome + run: | + sudo apt-get update + # Attempt to install a specific recent, stable version or just google-chrome-stable + # For more deterministic builds, you might consider a specific version if available via apt, + # or using a Docker image with Chrome pre-installed if extreme consistency is needed. + sudo apt-get install -y google-chrome-stable + + - name: Install ChromeDriver + run: | + echo "Determining Chrome version..." + CHROME_BROWSER_VERSION=$(google-chrome --version) + echo "Installed Chrome Browser version: $CHROME_BROWSER_VERSION" + # Extract the major version number (e.g., 124 from "Google Chrome 124.0.6367.207") + CHROME_MAJOR_VERSION=$(echo "$CHROME_BROWSER_VERSION" | cut -f 3 -d ' ' | cut -f 1 -d '.') + echo "Detected Chrome Major version: $CHROME_MAJOR_VERSION" + + # For Chrome 115 and later, use the new Chrome for Testing (CfT) JSON endpoints + if [ "$CHROME_MAJOR_VERSION" -ge 115 ]; then + echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using CfT endpoint..." + # Get the latest known good version of chromedriver for this major Chrome version + CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") + if [ -z "$CHROMEDRIVER_VERSION_STRING" ]; then + echo "Could not automatically find ChromeDriver version for Chrome $CHROME_MAJOR_VERSION via LATEST_RELEASE. Please check CfT endpoints." + # As a fallback, attempt to fetch the known good versions and pick the latest chromedriver. + # This is more complex and might require parsing JSON with jq. + # For simplicity, we'll rely on LATEST_RELEASE_ for now. + # If that fails consistently, you might need a more robust script or a fixed ChromeDriver version. + # Alternative: List all known good versions + # curl -sS "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json" + exit 1 + fi + CHROMEDRIVER_URL="https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/${CHROMEDRIVER_VERSION_STRING}/linux64/chromedriver-linux64.zip" + else + # For older Chrome versions (less common now) + echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using older method..." + CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") + CHROMEDRIVER_URL="https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION_STRING}/chromedriver_linux64.zip" + fi + + echo "Using ChromeDriver version string: $CHROMEDRIVER_VERSION_STRING" + echo "Downloading ChromeDriver from: $CHROMEDRIVER_URL" + + wget -q -O chromedriver.zip "$CHROMEDRIVER_URL" + unzip -o chromedriver.zip -d /tmp/ # Unzip to /tmp + # The zip for CfT often contains a directory like chromedriver-linux64/ + sudo mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver || sudo mv /tmp/chromedriver /usr/local/bin/chromedriver + sudo chmod +x /usr/local/bin/chromedriver + # Add /usr/local/bin to GITHUB_PATH to ensure chromedriver is found + echo "/usr/local/bin" >> $GITHUB_PATH + shell: bash + + - name: Verify Redis connection + run: | + python -c "import redis; r = redis.Redis(host='localhost', port=6379, db=0); r.ping(); print('Successfully connected to Redis!')" + + - name: Run Background Callback Tests + run: | + mkdir bgtests + cp -r tests bgtests/tests + cd bgtests + touch __init__.py + pytest --headless --nopercyfinalize tests/background_callback -v -s + + table-unit: + name: Table Unit/Lint Tests (Python ${{ matrix.python-version }}) + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12"] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages # Must match the name used in the 'build' job's upload step + path: packages/ # Download to a local 'dist' directory + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + + - name: Lint + run: | + cd components/dash-table + npm ci + npm run lint + + - name: Unit + run: | + cd components/dash-table + npm run test.unit + + table-server: + name: Table Server Tests (Group ${{ matrix.test-group }}) + needs: [build, changes_filter] + # Conditional execution: + # OR if the 'changes_filter' job detected changes in 'table_related_paths'. + if: | + (github.event_name == 'push' && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev')) || + needs.changes_filter.outputs.table_paths_changed == 'true' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12"] + test-group: ["1", "2", "3"] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Node.js dependencies + run: npm ci + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + + - name: Download built Dash packages + uses: actions/download-artifact@v4 + with: + name: dash-packages + path: packages/ + + - name: Install Dash packages + run: | + python -m pip install --upgrade pip wheel + python -m pip install "setuptools<80.0.0" + find packages -name dash-*.whl -print -exec sh -c 'pip install "{}[ci,testing,dev]"' \; + pip install pytest-split + + - name: Install Google Chrome + run: | + sudo apt-get update + # Attempt to install a specific recent, stable version or just google-chrome-stable + # For more deterministic builds, you might consider a specific version if available via apt, + # or using a Docker image with Chrome pre-installed if extreme consistency is needed. + sudo apt-get install -y google-chrome-stable + + - name: Install ChromeDriver + run: | + echo "Determining Chrome version..." + CHROME_BROWSER_VERSION=$(google-chrome --version) + echo "Installed Chrome Browser version: $CHROME_BROWSER_VERSION" + # Extract the major version number (e.g., 124 from "Google Chrome 124.0.6367.207") + CHROME_MAJOR_VERSION=$(echo "$CHROME_BROWSER_VERSION" | cut -f 3 -d ' ' | cut -f 1 -d '.') + echo "Detected Chrome Major version: $CHROME_MAJOR_VERSION" + + # For Chrome 115 and later, use the new Chrome for Testing (CfT) JSON endpoints + if [ "$CHROME_MAJOR_VERSION" -ge 115 ]; then + echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using CfT endpoint..." + # Get the latest known good version of chromedriver for this major Chrome version + CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") + if [ -z "$CHROMEDRIVER_VERSION_STRING" ]; then + echo "Could not automatically find ChromeDriver version for Chrome $CHROME_MAJOR_VERSION via LATEST_RELEASE. Please check CfT endpoints." + # As a fallback, attempt to fetch the known good versions and pick the latest chromedriver. + # This is more complex and might require parsing JSON with jq. + # For simplicity, we'll rely on LATEST_RELEASE_ for now. + # If that fails consistently, you might need a more robust script or a fixed ChromeDriver version. + # Alternative: List all known good versions + # curl -sS "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json" + exit 1 + fi + CHROMEDRIVER_URL="https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/${CHROMEDRIVER_VERSION_STRING}/linux64/chromedriver-linux64.zip" + else + # For older Chrome versions (less common now) + echo "Fetching ChromeDriver version for Chrome $CHROME_MAJOR_VERSION using older method..." + CHROMEDRIVER_VERSION_STRING=$(curl -sS "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_MAJOR_VERSION}") + CHROMEDRIVER_URL="https://chromedriver.storage.googleapis.com/${CHROMEDRIVER_VERSION_STRING}/chromedriver_linux64.zip" + fi + + echo "Using ChromeDriver version string: $CHROMEDRIVER_VERSION_STRING" + echo "Downloading ChromeDriver from: $CHROMEDRIVER_URL" + + wget -q -O chromedriver.zip "$CHROMEDRIVER_URL" + unzip -o chromedriver.zip -d /tmp/ # Unzip to /tmp + # The zip for CfT often contains a directory like chromedriver-linux64/ + sudo mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver || sudo mv /tmp/chromedriver /usr/local/bin/chromedriver + sudo chmod +x /usr/local/bin/chromedriver + # Add /usr/local/bin to GITHUB_PATH to ensure chromedriver is found + echo "/usr/local/bin" >> $GITHUB_PATH + shell: bash + + - name: Verify ChromeDriver Installation + run: | + chromedriver --version + + - name: Run Table Server Tests + run: | + cd components/dash-table + pytest --nopercyfinalize --headless --splits 3 --group ${{ matrix.test-group }} diff --git a/.gitignore b/.gitignore index bcfe7ce877..89029448fe 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ ignore .env .venv env/ -venv/ +venv*/ ENV/ env.bak/ venv.bak/ @@ -84,6 +84,7 @@ DESCRIPTION NAMESPACE digest.json VERSION.txt +packages/ # vim *.swp diff --git a/components/dash-core-components/tests/integration/graph/test_graph_responsive.py b/components/dash-core-components/tests/integration/graph/test_graph_responsive.py index 8f5664f4c1..7307d528c5 100644 --- a/components/dash-core-components/tests/integration/graph/test_graph_responsive.py +++ b/components/dash-core-components/tests/integration/graph/test_graph_responsive.py @@ -1,4 +1,5 @@ import pytest +import flaky from dash import Dash, Input, Output, State, dcc, html import plotly.graph_objects as go @@ -137,6 +138,7 @@ def resize(n_clicks, style): assert dash_dcc.get_logs() == [] +@flaky.flaky(max_runs=3) def test_grrs002_graph(dash_dcc): app = Dash(__name__) diff --git a/components/dash-html-components/scripts/data/attributes.json b/components/dash-html-components/scripts/data/attributes.json index 356583979a..b426737bdb 100644 --- a/components/dash-html-components/scripts/data/attributes.json +++ b/components/dash-html-components/scripts/data/attributes.json @@ -248,28 +248,28 @@ "button", "input" ], - "description": "If the button/input is a submit button (e.g. type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner." + "description": "If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the encoding type to use during form submission. If this attribute is specified, it overrides the enctype attribute of the button's form owner." }, "formMethod": { "elements": [ "button", "input" ], - "description": "If the button/input is a submit button (e.g. type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner." + "description": "If the button/input is a submit button (e.g., type=\"submit\"), this attribute sets the submission method to use during form submission (GET, POST, etc.). If this attribute is specified, it overrides the method attribute of the button's form owner." }, "formNoValidate": { "elements": [ "button", "input" ], - "description": "If the button/input is a submit button (e.g. type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner." + "description": "If the button/input is a submit button (e.g., type=\"submit\"), this boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the novalidate attribute of the button's form owner." }, "formTarget": { "elements": [ "button", "input" ], - "description": "If the button/input is a submit button (e.g. type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner." + "description": "If the button/input is a submit button (e.g., type=\"submit\"), this attribute specifies the browsing context (for example, tab, window, or inline frame) in which to display the response that is received after submitting the form. If this attribute is specified, it overrides the target attribute of the button's form owner." }, "headers": { "elements": [ diff --git a/components/dash-html-components/scripts/extract-elements.js b/components/dash-html-components/scripts/extract-elements.js index 4aa4d1b9dd..53f2558af3 100644 --- a/components/dash-html-components/scripts/extract-elements.js +++ b/components/dash-html-components/scripts/extract-elements.js @@ -22,7 +22,8 @@ function extractElements($) { 'noframes', // experimental, don't add yet 'portal', - 'fencedframe' + 'fencedframe', + 'selectedcontent' ]; // `
` is for some reason missing from the reference tables. const addElements = [ diff --git a/components/dash-table/.test_durations b/components/dash-table/.test_durations new file mode 100644 index 0000000000..0954a7e3d1 --- /dev/null +++ b/components/dash-table/.test_durations @@ -0,0 +1,460 @@ +{ + "tests/selenium/test_basic_copy_paste.py::test_tbcp001_copy_paste_callback": 0.00019522494403645396, + "tests/selenium/test_basic_copy_paste.py::test_tbcp002_sorted_copy_paste_callback": 0.00014724500942975283, + "tests/selenium/test_basic_copy_paste.py::test_tbcp003_copy_multiple_rows[False]": 0.0001170769683085382, + "tests/selenium/test_basic_copy_paste.py::test_tbcp003_copy_multiple_rows[True]": 0.00018426397582516074, + "tests/selenium/test_basic_copy_paste.py::test_tbcp004_copy_9_and_10": 2.3618100970052183, + "tests/selenium/test_basic_copy_paste.py::test_tbcp005_copy_multiple_rows_and_columns": 0.0006186750251799822, + "tests/selenium/test_basic_copy_paste.py::test_tbcp006_copy_paste_between_tables": 0.000454101013019681, + "tests/selenium/test_basic_copy_paste.py::test_tbcp007_copy_paste_with_hidden_column": 0.00047546200221404433, + "tests/selenium/test_basic_copy_paste.py::test_tbcp008_copy_paste_between_tables_with_hidden_columns": 0.0004522940143942833, + "tests/selenium/test_basic_copy_paste.py::test_tbcp009_copy_9_and_10_click": 2.334818640956655, + "tests/selenium/test_basic_copy_paste.py::test_tbcp010_copy_from_unselectable_cells_table": 3.64440403500339, + "tests/selenium/test_basic_copy_paste.py::test_tbcp011_copy_double_quotes": 2.099863847019151, + "tests/selenium/test_basic_copy_paste.py::test_tbcp011_copy_multiline": 2.052545247017406, + "tests/selenium/test_basic_operations.py::test_tbst001_get_cell[props0]": 2.7311835610307753, + "tests/selenium/test_basic_operations.py::test_tbst001_get_cell[props1]": 1.7271678000106476, + "tests/selenium/test_basic_operations.py::test_tbst002_select_all_text[props0]": 2.6768361960421316, + "tests/selenium/test_basic_operations.py::test_tbst002_select_all_text[props1]": 1.6827889429987408, + "tests/selenium/test_basic_operations.py::test_tbst003_edit_on_enter[props0]": 2.7179253359208815, + "tests/selenium/test_basic_operations.py::test_tbst003_edit_on_enter[props1]": 3.1697040230501443, + "tests/selenium/test_basic_operations.py::test_tbst004_edit_on_tab[props0]": 2.9788199129980057, + "tests/selenium/test_basic_operations.py::test_tbst004_edit_on_tab[props1]": 3.1577080780407414, + "tests/selenium/test_basic_operations.py::test_tbst005_edit_last_row_on_click_outside[props0]": 3.185404047020711, + "tests/selenium/test_basic_operations.py::test_tbst005_edit_last_row_on_click_outside[props1]": 3.176985738973599, + "tests/selenium/test_basic_operations.py::test_tbst006_focused_arrow_left": 3.188558186928276, + "tests/selenium/test_basic_operations.py::test_tbst007_active_focused_arrow_right": 2.679577363014687, + "tests/selenium/test_basic_operations.py::test_tbst008_active_focused_arrow_up": 2.6878972130361944, + "tests/selenium/test_basic_operations.py::test_tbst009_active_focused_arrow_down": 2.679912735009566, + "tests/selenium/test_basic_operations.py::test_tbst010_active_with_dblclick[props0]": 3.6809552700142376, + "tests/selenium/test_basic_operations.py::test_tbst010_active_with_dblclick[props1]": 3.1547473430400714, + "tests/selenium/test_basic_operations.py::test_tbst011_delete_row[props0]": 2.958765771065373, + "tests/selenium/test_basic_operations.py::test_tbst011_delete_row[props1]": 1.6942474040552042, + "tests/selenium/test_basic_operations.py::test_tbst012_delete_sorted_row[props0]": 3.220703576982487, + "tests/selenium/test_basic_operations.py::test_tbst012_delete_sorted_row[props1]": 2.519949849054683, + "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props0]": 2.191247455019038, + "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props1]": 1.6611916000256315, + "tests/selenium/test_basic_operations.py::test_tbst013_select_row[props2]": 2.180750813044142, + "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props0]": 3.805833949998487, + "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props1]": 2.1639014940010384, + "tests/selenium/test_basic_operations.py::test_tbst014_selected_sorted_row[props2]": 3.7030246410286054, + "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props0]": 3.6779075110098347, + "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props1]": 2.1594175070058554, + "tests/selenium/test_basic_operations.py::test_tbst015_selected_row_respects_sort[props2]": 3.69613198103616, + "tests/selenium/test_basic_operations.py::test_tbst016_delete_cell[props0]": 3.263621886027977, + "tests/selenium/test_basic_operations.py::test_tbst016_delete_cell[props1]": 1.98756921896711, + "tests/selenium/test_basic_operations.py::test_tbst017_delete_cell_updates_while_selected[props0]": 0.00021198397735133767, + "tests/selenium/test_basic_operations.py::test_tbst017_delete_cell_updates_while_selected[props1]": 0.00015217997133731842, + "tests/selenium/test_basic_operations.py::test_tbst018_delete_multiple_cells[props0]": 3.2013827829505317, + "tests/selenium/test_basic_operations.py::test_tbst018_delete_multiple_cells[props1]": 2.340432584984228, + "tests/selenium/test_basic_operations.py::test_tbst019_delete_multiple_cells_while_selected[props0]": 0.0006018630228936672, + "tests/selenium/test_basic_operations.py::test_tbst019_delete_multiple_cells_while_selected[props1]": 0.0005421870155259967, + "tests/selenium/test_basic_operations.py::test_tbst020_sorted_table_delete_cell[props0]": 3.6559230600250885, + "tests/selenium/test_basic_operations.py::test_tbst020_sorted_table_delete_cell[props1]": 2.238027448998764, + "tests/selenium/test_basic_operations.py::test_tbst021_sorted_table_delete_cell_updates_while_selected[props0]": 0.0005888969753868878, + "tests/selenium/test_basic_operations.py::test_tbst021_sorted_table_delete_cell_updates_while_selected[props1]": 0.0004974550101906061, + "tests/selenium/test_basic_operations.py::test_tbst022_sorted_table_delete_multiple_cells[props0]": 4.175277445989195, + "tests/selenium/test_basic_operations.py::test_tbst022_sorted_table_delete_multiple_cells[props1]": 2.195623565989081, + "tests/selenium/test_basic_operations.py::test_tbst023_sorted_table_delete_multiple_cells_while_selected[props0]": 0.000649340043310076, + "tests/selenium/test_basic_operations.py::test_tbst023_sorted_table_delete_multiple_cells_while_selected[props1]": 0.0005274569848552346, + "tests/selenium/test_basic_operations.py::test_tbst024_row_selectable_filter_action": 1.532161755952984, + "tests/selenium/test_column.py::test_colm001_can_delete": 2.5322491909610108, + "tests/selenium/test_column.py::test_colm002_keep_hidden_on_delete": 4.572097742988262, + "tests/selenium/test_column.py::test_colm003_can_clear": 2.5521739520481788, + "tests/selenium/test_column.py::test_colm004_can_hide": 5.094524133019149, + "tests/selenium/test_column.py::test_colm005_dont_clear_hidden": 4.576996338029858, + "tests/selenium/test_column.py::test_colm006_multi_select": 51.61643337405985, + "tests/selenium/test_column.py::test_colm007_single_select": 76.16343968000729, + "tests/selenium/test_column.py::test_colm008_top_row_by_subset": 23.03438583208481, + "tests/selenium/test_column.py::test_colm009_newline_id": 2.315119614941068, + "tests/selenium/test_derived_props.py::test_tdrp001_select_rows": 1.8959960130159743, + "tests/selenium/test_derived_props.py::test_tdrp002_select_cell": 2.8513190529774874, + "tests/selenium/test_derived_props.py::test_tdrp003_select_cells": 2.067663702997379, + "tests/selenium/test_derived_props.py::test_tdrp004_navigate_selected_cells": 3.0031098460312933, + "tests/selenium/test_derived_props.py::test_tdrp005_filtered_and_sorted_row_select": 2.3864269059849903, + "tests/selenium/test_dropdown.py::test_drpd001_no_scroll": 1.7662509219371714, + "tests/selenium/test_edit.py::test_edit001_can_delete_dropdown[props0]": 2.034055811993312, + "tests/selenium/test_edit.py::test_edit001_can_delete_dropdown[props1]": 1.567317212058697, + "tests/selenium/test_edit.py::test_edit002_can_delete_dropown_and_set[props0]": 4.042541190050542, + "tests/selenium/test_edit.py::test_edit002_can_delete_dropown_and_set[props1]": 3.58369900501566, + "tests/selenium/test_edit.py::test_edit003_can_edit_dropdown[props0]": 3.576839070999995, + "tests/selenium/test_edit.py::test_edit003_can_edit_dropdown[props1]": 3.577014662034344, + "tests/selenium/test_edit.py::test_edit004_edit_focused[props0]": 2.0643234290764667, + "tests/selenium/test_edit.py::test_edit004_edit_focused[props1]": 1.5715787120279856, + "tests/selenium/test_editable.py::test_tedi001_loading_on_data_change": 5.623658173950389, + "tests/selenium/test_editable.py::test_tedi002_ready_on_non_data_change": 3.0887748500099406, + "tests/selenium/test_editable.py::test_tedi003_does_not_steal_focus": 3.035281224991195, + "tests/selenium/test_editable.py::test_tedi004_edit_on_non_blocking": 3.5861314330250025, + "tests/selenium/test_editable.py::test_tedi005_prevent_copy_paste_on_blocking": 3.826171776978299, + "tests/selenium/test_editable.py::test_tedi006_allow_copy_paste_on_non_blocking": 4.732877348025795, + "tests/selenium/test_empty.py::test_empt001_clear_": 3.6893790590111166, + "tests/selenium/test_export.py::test_tbex001_table_export_csv[csv-read_csv]": 1.6934574150363915, + "tests/selenium/test_export.py::test_tbex001_table_export_csv[xlsx-read_excel]": 1.6489325300208293, + "tests/selenium/test_filter.py::test_filt001_basic[props0-expect0]": 1.6774216850171797, + "tests/selenium/test_filter.py::test_filt001_basic[props1-expect1]": 1.555854316917248, + "tests/selenium/test_filter.py::test_filt001_basic[props2-expect2]": 1.5620564660639502, + "tests/selenium/test_filter.py::test_filt002_sensitivity[insensitive-None]": 6.046198113937862, + "tests/selenium/test_filter.py::test_filt002_sensitivity[insensitive-sensitive]": 18.517423591925763, + "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None0]": 18.63489165896317, + "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None1]": 18.567635487997904, + "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-None2]": 18.590553184971213, + "tests/selenium/test_filter.py::test_filt002_sensitivity[sensitive-insensitive]": 6.080368667084258, + "tests/selenium/test_filter.py::test_filt003_sensitivity[insensitive-None]": 2.0643330549355596, + "tests/selenium/test_filter.py::test_filt003_sensitivity[insensitive-sensitive]": 14.243360938096885, + "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None0]": 14.04549520398723, + "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None1]": 14.063306336873211, + "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-None2]": 14.08545574103482, + "tests/selenium/test_filter.py::test_filt003_sensitivity[sensitive-insensitive]": 2.0537407429656014, + "tests/selenium/test_filter.py::test_filt004_placeholder[-None-]": 1.551754874002654, + "tests/selenium/test_filter.py::test_filt004_placeholder[None-None-filter data...]": 1.5544508790480904, + "tests/selenium/test_filter.py::test_filt004_placeholder[None-def-def]": 1.5717498479643837, + "tests/selenium/test_filter.py::test_filt004_placeholder[abc-None-abc]": 1.557968818990048, + "tests/selenium/test_filter.py::test_filt004_placeholder[gah-ijk-gah]": 1.879218292015139, + "tests/selenium/test_filter2.py::test_spfi001_can_filter_columns_with_special_characters": 4.059455763956066, + "tests/selenium/test_filter2.py::test_spfi002_handles_hovering": 2.5398884729947895, + "tests/selenium/test_filter2.py::test_spfi003_handles_invalid_queries": 2.3994685130310245, + "tests/selenium/test_filter2.py::test_spfi004_defaults_to_contains_on_text_column": 2.1153930079890415, + "tests/selenium/test_filter2.py::test_spfi005_defaults_to_equal_on_numeric_column": 2.0881739059695974, + "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[<= 5-True]": 2.041939807997551, + "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[<=5-True]": 2.07335260102991, + "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[le 5-True]": 2.0412401650683023, + "tests/selenium/test_filter2.py::test_spfi006_relational_operator_space[le5-False]": 4.043640643008985, + "tests/selenium/test_filter2.py::test_spfi007_invalid_and_valid_no_reset": 2.0428292330470867, + "tests/selenium/test_filter2.py::test_spfi008_reset_updates": 2.6318635680363514, + "tests/selenium/test_formatting.py::test_form001_can_edit_formatted_cells": 2.0698677729815245, + "tests/selenium/test_formatting.py::test_form002_can_copy_formatted_cells": 2.082036539039109, + "tests/selenium/test_header.py::test_head001_renames_only_row[0]": 2.3986330759944394, + "tests/selenium/test_header.py::test_head001_renames_only_row[1]": 2.370070897974074, + "tests/selenium/test_header.py::test_head001_renames_only_row[2]": 2.061278747045435, + "tests/selenium/test_header.py::test_head002_preserves_hidden_columns_on_rename": 4.57496335695032, + "tests/selenium/test_header.py::test_head003_preserves_column_name_on_cancel": 1.582993823045399, + "tests/selenium/test_header.py::test_head004_change_single_row_header": 2.0824087010114454, + "tests/selenium/test_header.py::test_head005_no_warnings_emitted": 1.7279441700084135, + "tests/selenium/test_header.py::test_head006_style_merged_columns": 1.733552248973865, + "tests/selenium/test_markdown.py::test_mark001_header": 2.26767564896727, + "tests/selenium/test_markdown.py::test_mark002_emphasized_text": 2.301611021044664, + "tests/selenium/test_markdown.py::test_mark003_link": 2.275399253005162, + "tests/selenium/test_markdown.py::test_mark004_image": 2.2524119949666783, + "tests/selenium/test_markdown.py::test_mark005_table": 2.349028220982291, + "tests/selenium/test_markdown.py::test_mark006_filter_link_text[/wiki/97]": 3.865964367054403, + "tests/selenium/test_markdown.py::test_mark006_filter_link_text[Learn about 97]": 3.803582806023769, + "tests/selenium/test_markdown.py::test_mark007_filter_image_alt_text": 3.8038285819930024, + "tests/selenium/test_markdown.py::test_mark008_loads_highlightjs": 1.8307973239570856, + "tests/selenium/test_markdown.py::test_mark009_loads_custom_highlightjs": 1.7377096839481965, + "tests/selenium/test_markdown_copy_paste.py::test_tmcp001_copy_markdown_to_text": 0.0007087640115059912, + "tests/selenium/test_markdown_copy_paste.py::test_tmcp002_copy_markdown_to_markdown": 0.0006161439814604819, + "tests/selenium/test_markdown_copy_paste.py::test_tmcp003_copy_text_to_markdown": 0.0002618349390104413, + "tests/selenium/test_markdown_copy_paste.py::test_tmcp004_copy_null_text_to_markdown": 2.5125464380253106, + "tests/selenium/test_markdown_html.py::test_tmdh001_html_not_allowed": 3.5626728490460664, + "tests/selenium/test_markdown_html.py::test_tmdh002_html_allowed": 1.571883146010805, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-None-True]": 1.7322017239639536, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-markdown_options1-True]": 1.6621089070104063, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[False-markdown_options2-False]": 1.7125120229902677, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-None-True]": 1.6753457569284365, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-markdown_options1-True]": 1.6492830160423182, + "tests/selenium/test_markdown_link.py::test_tmdl001_click_markdown_link[True-markdown_options2-False]": 1.62193273199955, + "tests/selenium/test_multiple_tables.py::test_tbmu001_select_row": 2.6223896280280314, + "tests/selenium/test_multiple_tables.py::test_tbmu002_select_column": 2.8685586740029976, + "tests/selenium/test_multiple_tables.py::test_tbmu003_edit_on_enter": 2.5485591259784997, + "tests/selenium/test_multiple_tables.py::test_tbmu004_edit_click_outside": 2.5900718410266563, + "tests/selenium/test_navigation.py::test_navg001_keyboard_through_9_10_cells[props0]": 2.3960530759650283, + "tests/selenium/test_navigation.py::test_navg001_keyboard_through_9_10_cells[props1]": 1.552508738997858, + "tests/selenium/test_navigation.py::test_navg002_keyboard_after_ctrl_copy[props0]": 1.5415158569812775, + "tests/selenium/test_navigation.py::test_navg002_keyboard_after_ctrl_copy[props1]": 1.5496328009758145, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue012-0--1-props0]": 1.579538904945366, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue012-0--1-props1]": 1.5625901719904505, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue013--1-0-props0]": 1.5332143270643428, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue013--1-0-props1]": 1.5375344240455888, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue014-0-1-props0]": 1.6406138020684011, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue014-0-1-props1]": 1.8110565580427647, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue015-1-0-props0]": 1.5880227779853158, + "tests/selenium/test_navigation.py::test_navg003_keyboard_can_move_down[\\ue015-1-0-props1]": 1.6017284750705585, + "tests/selenium/test_navigation.py::test_navg004_keyboard_between_md_and_standard_cells[props0]": 1.5680928359506652, + "tests/selenium/test_navigation.py::test_navg005_unselectable_cells[False]": 1.5565250720246695, + "tests/selenium/test_navigation.py::test_navg005_unselectable_cells[True]": 1.6011834350065328, + "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props0]": 2.0830641929642297, + "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props1]": 2.1012904459494166, + "tests/selenium/test_navigation_keyboard.py::test_knav001_navigate_9_10_cells[props2]": 2.09728444297798, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props0]": 2.1086710880044848, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props1]": 1.5754481309559196, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue012--1-0-props2]": 1.547530350042507, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props0]": 2.0839679809869267, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props1]": 1.5972941380459815, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue013-0--1-props2]": 1.5580657849786803, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props0]": 2.093384423002135, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props1]": 1.7513713689986616, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue014-1-0-props2]": 1.5896643170272, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props0]": 2.1123452989268117, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props1]": 1.5375407279934734, + "tests/selenium/test_navigation_keyboard.py::test_knav002_can_move[\\ue015-0-1-props2]": 1.572929889021907, + "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props0]": 2.115790126088541, + "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props1]": 1.897912970976904, + "tests/selenium/test_navigation_keyboard.py::test_knav003_can_move_after_copy[props2]": 1.614201588963624, + "tests/selenium/test_navigation_keyboard.py::test_knav004_can_move_out_of_viewport": 2.115017563046422, + "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props0]": 2.0756387769943103, + "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props1]": 2.1345110560650937, + "tests/selenium/test_navigation_keyboard.py::test_knav005_can_select_down_twice[props2]": 2.0925943970214576, + "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props0]": 2.0638650019536726, + "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props1]": 1.904237628041301, + "tests/selenium/test_navigation_keyboard.py::test_knav006_can_select_down_then_up[props2]": 1.5682297689490952, + "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props0]": 2.3657625279738568, + "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props1]": 1.596420589950867, + "tests/selenium/test_navigation_keyboard.py::test_knav007_can_select_down_then_right[props2]": 2.081588139932137, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue004-3-2-props0]": 3.1145674609579146, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue004-3-2-props1]": 3.096714415936731, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue007-4-1-props0]": 3.086848213977646, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[\\ue007-4-1-props1]": 3.1072757050278597, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[abc\\ue007-4-1-props0]": 3.251937388908118, + "tests/selenium/test_navigation_keyboard.py::test_knav008_focus_cell_on_enter[abc\\ue007-4-1-props1]": 3.1029497589333914, + "tests/selenium/test_navigation_keyboard.py::test_knav009_arrows_move_caret[props0]": 3.086354337981902, + "tests/selenium/test_navigation_keyboard.py::test_knav009_arrows_move_caret[props1]": 3.1284122969955206, + "tests/selenium/test_navigation_keyboard.py::test_knav010_arrows_do_not_change_focus[props0]": 3.033913452003617, + "tests/selenium/test_navigation_keyboard.py::test_knav010_arrows_do_not_change_focus[props1]": 3.0657146380399354, + "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of dropdown cell-ggg-bbb-False]": 2.102552052005194, + "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of dropdown cell-ggg-bbb-True]": 2.1055639509577304, + "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of label cell-eee-fff-False]": 2.0384477270417847, + "tests/selenium/test_navigation_keyboard_readonly.py::test_kron001_navigate_into[in and out of label cell-eee-fff-True]": 2.0354405969846994, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props0]": 1.818138257949613, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props1]": 1.7360191718908027, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_markdown_mock_data-props2]": 1.835556139005348, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props0]": 1.5770881479838863, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props1]": 1.601589088095352, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mixed_markdown_data-props2]": 1.5894037389662117, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props0]": 2.0797294439398684, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props1]": 1.6205128550063819, + "tests/selenium/test_navigation_mouse.py::test_mnav001_navigate_to_self[generate_mock_data-props2]": 1.5748455480206758, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props0]": 1.890721246949397, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props1]": 1.719519889971707, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_markdown_mock_data-props2]": 1.866913527075667, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props0]": 1.622829166939482, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props1]": 1.626745583023876, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mixed_markdown_data-props2]": 1.5858883350156248, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props0]": 2.065992344985716, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props1]": 1.603917829983402, + "tests/selenium/test_navigation_mouse.py::test_mnav002_navigate_to_other[generate_mock_data-props2]": 1.649450019991491, + "tests/selenium/test_pagination.py::test_tpag001_next_previous[custom]": 1.9597044540569186, + "tests/selenium/test_pagination.py::test_tpag001_next_previous[native]": 1.751728850940708, + "tests/selenium/test_pagination.py::test_tpag002_ops_on_first_page[custom]": 1.5883871620171703, + "tests/selenium/test_pagination.py::test_tpag002_ops_on_first_page[native]": 1.7339834720478393, + "tests/selenium/test_pagination.py::test_tpag003_ops_on_last_page[custom]": 1.7792917489423417, + "tests/selenium/test_pagination.py::test_tpag003_ops_on_last_page[native]": 1.6780518459854648, + "tests/selenium/test_pagination.py::test_tpag004_ops_input_with_enter": 1.7552651860169135, + "tests/selenium/test_pagination.py::test_tpag005_ops_input_with_unfocus": 2.043301481055096, + "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[-1-1]": 1.7733774880180135, + "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[0-1]": 1.711068502976559, + "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[11264-5632]": 1.714881731022615, + "tests/selenium/test_pagination.py::test_tpag006_ops_input_invalid_with_enter[a-1]": 1.7152802539640106, + "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[-1-1]": 1.7348888600827195, + "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[0-1]": 1.7030591209768318, + "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[11264-5632]": 1.7526291820104234, + "tests/selenium/test_pagination.py::test_tpag007_ops_input_invalid_with_unfocus[a-1]": 1.747004259028472, + "tests/selenium/test_pagination.py::test_tpag008_hide_with_single_page[custom]": 3.588203130988404, + "tests/selenium/test_pagination.py::test_tpag008_hide_with_single_page[native]": 3.6205791129614227, + "tests/selenium/test_pagination.py::test_tpag009_hide_with_invalid_page_count": 3.5796678889309987, + "tests/selenium/test_pagination.py::test_tpag010_limits_page": 1.7078331649536267, + "tests/selenium/test_pagination.py::test_tpag011_valid_page": 2.624576616974082, + "tests/selenium/test_readonly_cell.py::test_tbed001_readonly_text[props0]": 4.139177770994138, + "tests/selenium/test_readonly_cell.py::test_tbed001_readonly_text[props1]": 4.689787614042871, + "tests/selenium/test_readonly_cell.py::test_tbed002_readonly_dropdown[props0]": 4.072356187039986, + "tests/selenium/test_readonly_cell.py::test_tbed002_readonly_dropdown[props1]": 3.566327090957202, + "tests/selenium/test_readonly_cell.py::test_tbed003_readonly_copy_paste[props0]": 2.097323977970518, + "tests/selenium/test_readonly_cell.py::test_tbed003_readonly_copy_paste[props1]": 2.07018945296295, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns0-fixed_rows0]": 1.5931375590153039, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns0-fixed_rows1]": 1.6045171629521064, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns1-fixed_rows0]": 1.5809224149561487, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns1-fixed_rows1]": 1.5902175839873962, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns2-fixed_rows0]": 1.5842016559909098, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops0-fixed_columns2-fixed_rows1]": 1.624855300062336, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns0-fixed_rows0]": 1.913718925032299, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns0-fixed_rows1]": 1.5962275000056252, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns1-fixed_rows0]": 2.6455224549863487, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns1-fixed_rows1]": 1.5846513660508208, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns2-fixed_rows0]": 1.6322666719788685, + "tests/selenium/test_scrolling.py::test_scrol001_fixed_alignment[ops1-fixed_columns2-fixed_rows1]": 1.6051405349862762, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns0-fixed_rows0]": 1.6206717789755203, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns0-fixed_rows1]": 1.8615154389990494, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns1-fixed_rows0]": 1.6276237859856337, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns1-fixed_rows1]": 1.5704864610452205, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns2-fixed_rows0]": 1.587076144933235, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops0-fixed_columns2-fixed_rows1]": 1.6029599760076962, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns0-fixed_rows0]": 1.57987266901182, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns0-fixed_rows1]": 2.644929086032789, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns1-fixed_rows0]": 1.6197839549859054, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns1-fixed_rows1]": 1.5825127980206162, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns2-fixed_rows0]": 1.6298021330148913, + "tests/selenium/test_scrolling.py::test_scrol002_edit_navigate[ops1-fixed_columns2-fixed_rows1]": 1.6356841200613417, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props0]": 1.8311817809590138, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props1]": 1.8288544079987332, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_markdown_mock_data-props2]": 1.8273463319637813, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props0]": 1.5578462049597874, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props1]": 1.6590360010741279, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mixed_markdown_data-props2]": 1.6035682789515704, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props0]": 2.130573094007559, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props1]": 1.5732414220110513, + "tests/selenium/test_scrolling2.py::test_scrv001_select_on_scroll[generate_mock_data-props2]": 1.5946487369947135, + "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props0]": 4.114318899984937, + "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props1]": 4.3197436920017935, + "tests/selenium/test_scrolling2.py::test_scrv002_virtualization_keeps_focused[props2]": 3.6209495079820044, + "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props0]": 20.073411491059233, + "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props1]": 20.11529590189457, + "tests/selenium/test_scrolling2.py::test_scrv003_virtualization_keeps_selection[props2]": 20.097759187046904, + "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props0]": 2.0501502850675024, + "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props1]": 2.093722090998199, + "tests/selenium/test_scrolling2.py::test_scrv004_virtualization_can_edit[props2]": 2.0511999239679426, + "tests/selenium/test_sizing.py::test_szng001_widths_on_style_change": 71.14496942597907, + "tests/selenium/test_sizing.py::test_szng002_percentages_result_in_same_widths": 18.607002958015073, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 10.07794211799046, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.8373468210338615, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.904061316978186, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.8531219269498251, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.858829612960108, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.7283235149807297, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.769644562969916, + "tests/selenium/test_sizing_a.py::test_szng003_a_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.8091757880174555, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.856038532918319, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.7866360019543208, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.871415485977195, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.7406971010495909, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.864964381034952, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.744190127006732, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.881391071947291, + "tests/selenium/test_sizing_b.py::test_szng003_b_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.760899214015808, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.838561322016176, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 5.8351284030941315, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.888102094002534, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 5.822712563036475, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.80213569191983, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 5.771967458014842, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.807217922993004, + "tests/selenium/test_sizing_c.py::test_szng003_c_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 5.792492755979765, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 10.119748920958955, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 1.821836304035969, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.841402094985824, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.8240867069689557, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.870760374935344, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.8318506800569594, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.872544030018616, + "tests/selenium/test_sizing_d.py::test_szng003_d_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.770841156016104, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns0]": 9.815168213972356, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows0-fixed_columns1]": 2.050322192022577, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns0]": 9.871639558987226, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers0-fixed_rows1-fixed_columns1]": 1.7815177189768292, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns0]": 9.857073193998076, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows0-fixed_columns1]": 1.7834910029778257, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns0]": 9.79992094100453, + "tests/selenium/test_sizing_e.py::test_szng003_e_on_prop_change[callback_props0-merge_duplicate_headers1-fixed_rows1-fixed_columns1]": 1.7543196750921197, + "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props0]": 126.20336364296963, + "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props1]": 125.70995489502093, + "tests/selenium/test_sizing_x.py::test_szng004_on_focus[props2]": 125.745579469949, + "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props0]": 113.39952140505193, + "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props1]": 113.33263917500153, + "tests/selenium/test_sizing_y.py::test_szng005_on_focus[props2]": 113.40925867302576, + "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props0]": 51.12730318593094, + "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props1]": 51.09857365099015, + "tests/selenium/test_sizing_z.py::test_szng006_on_focus[props2]": 51.09605178702623, + "tests/selenium/test_sort.py::test_sort001_can_sort[props0]": 2.3263084539212286, + "tests/selenium/test_sort.py::test_sort001_can_sort[props1]": 1.5519860989879817, + "tests/selenium/test_sort.py::test_sort001_can_sort[props2]": 1.4928846000111662, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows0]": 2.5540182539843954, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows1]": 2.8680737749673426, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns0-fixed_rows2]": 2.5703997319797054, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows0]": 3.045099287002813, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows1]": 2.5557332699536346, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns1-fixed_rows2]": 2.5622641340014525, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows0]": 3.0470568609889597, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows1]": 3.0656494359718636, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops0-fixed_columns2-fixed_rows2]": 3.092999142012559, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows0]": 2.5833326769643463, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows1]": 2.562386354082264, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns0-fixed_rows2]": 2.58790870802477, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows0]": 3.058700004068669, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows1]": 3.1016814420581795, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns1-fixed_rows2]": 3.1107651529600844, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows0]": 3.0591380239930004, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows1]": 3.3656719640130177, + "tests/selenium/test_tooltip.py::test_ttip001_displays_aligned_tooltip[ops1-fixed_columns2-fixed_rows2]": 3.0942697289283387, + "tests/selenium/test_tooltip.py::test_ttip002_displays_tooltip_content[tooltip_data0-;; 1-1]": 2.039471722964663, + "tests/selenium/test_tooltip.py::test_ttip002_displays_tooltip_content[tooltip_data1-

;; 1-1

]": 2.0159228380071, + "tests/selenium/test_tooltip.py::test_ttip003_tooltip_disappears": 6.090233957045712, + "tests/selenium/test_tooltip.py::test_ttip004_tooltip_applied[tooltip_data0-tooltip_header0-data_expected0-header_expected0]": 13.075488148955628, + "tests/selenium/test_tooltip.py::test_ttip004_tooltip_applied[tooltip_data1-tooltip_header1-data_expected1-header_expected1]": 12.552881294919644, + "tests/selenium/test_tooltip.py::test_ttip004_tooltip_applied[tooltip_data2-tooltip_header2-data_expected2-header_expected2]": 12.595593042031396, + "tests/selenium/test_typed.py::test_type001_can_edit_number_cell_with_number_string": 2.0380840279976837, + "tests/selenium/test_typed.py::test_type002_cannot_edit_number_cell_with_non_number_string": 2.0377475409186445, + "tests/selenium/test_typed.py::test_type003_copy_paste_string_into_number_does_nothing": 2.295130029961001, + "tests/selenium/test_typed.py::test_type004_copy_paste_number_into_number": 2.0616493419511244, + "tests/selenium/test_typed.py::test_type005_can_edit_date": 2.0713767039123923, + "tests/selenium/test_typed.py::test_type006_cannot_edit_date_with_non_date": 2.058805072971154, + "tests/selenium/test_typed.py::test_type007_copy_paste_string_into_date_does_nothing": 2.056875705951825, + "tests/selenium/test_typed.py::test_type008_copy_paste_date_into_date": 2.026815174962394, + "tests/unit/format_test.py::FormatTest::test_complex_and_valid_in_ctor": 0.0015883329906500876, + "tests/unit/format_test.py::FormatTest::test_complex_and_valid_in_fluent": 0.0010213369969278574, + "tests/unit/format_test.py::FormatTest::test_invalid_align_string": 0.0005056930240243673, + "tests/unit/format_test.py::FormatTest::test_invalid_align_type": 0.00019816996064037085, + "tests/unit/format_test.py::FormatTest::test_invalid_decimal_delimiter": 0.00019941700156778097, + "tests/unit/format_test.py::FormatTest::test_invalid_fill_length": 0.00024725100956857204, + "tests/unit/format_test.py::FormatTest::test_invalid_fill_type": 0.0004836120060645044, + "tests/unit/format_test.py::FormatTest::test_invalid_group_delimiter": 0.00020431098528206348, + "tests/unit/format_test.py::FormatTest::test_invalid_group_string": 0.00020953104831278324, + "tests/unit/format_test.py::FormatTest::test_invalid_group_type": 0.00020255899289622903, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_empty": 0.00019853998674079776, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_nested_0": 0.0002004190464504063, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_nested_negative": 0.0002293300349265337, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_nested_type": 0.00023888592841103673, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_single_0": 0.000195117958355695, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_single_negative": 0.0001925859833136201, + "tests/unit/format_test.py::FormatTest::test_invalid_groups_single_type": 0.000212940969504416, + "tests/unit/format_test.py::FormatTest::test_invalid_padding_string": 0.00019389198860153556, + "tests/unit/format_test.py::FormatTest::test_invalid_padding_type": 0.0001892570871859789, + "tests/unit/format_test.py::FormatTest::test_invalid_padding_width_negative": 0.00019927305402234197, + "tests/unit/format_test.py::FormatTest::test_invalid_padding_width_type": 0.00019173399778082967, + "tests/unit/format_test.py::FormatTest::test_invalid_precision_negative": 0.00019806704949587584, + "tests/unit/format_test.py::FormatTest::test_invalid_precision_type": 0.00018656195607036352, + "tests/unit/format_test.py::FormatTest::test_invalid_prefix_number": 0.00020037201466038823, + "tests/unit/format_test.py::FormatTest::test_invalid_prefix_type": 0.00022770505165681243, + "tests/unit/format_test.py::FormatTest::test_invalid_scheme_string": 0.00022164802066981792, + "tests/unit/format_test.py::FormatTest::test_invalid_scheme_type": 0.00019280897686257958, + "tests/unit/format_test.py::FormatTest::test_invalid_sign_string": 0.00018616800662130117, + "tests/unit/format_test.py::FormatTest::test_invalid_sign_type": 0.0002049770555458963, + "tests/unit/format_test.py::FormatTest::test_invalid_symbol_prefix_type": 0.0001911320141516626, + "tests/unit/format_test.py::FormatTest::test_invalid_symbol_string": 0.000208382960408926, + "tests/unit/format_test.py::FormatTest::test_invalid_symbol_suffix": 0.00018762692343443632, + "tests/unit/format_test.py::FormatTest::test_invalid_symbol_type": 0.00020264409249648452, + "tests/unit/format_test.py::FormatTest::test_invalid_trim_string": 0.00019132602028548717, + "tests/unit/format_test.py::FormatTest::test_invalid_trim_type": 0.0001909830025397241, + "tests/unit/format_test.py::FormatTest::test_money_template": 0.0002193970140069723, + "tests/unit/format_test.py::FormatTest::test_percentage_template": 0.00025889097014442086, + "tests/unit/format_test.py::FormatTest::test_valid_align_named": 0.0003155799931846559, + "tests/unit/format_test.py::FormatTest::test_valid_align_string": 0.00024218298494815826, + "tests/unit/format_test.py::FormatTest::test_valid_decimal_delimiter": 0.000208382960408926, + "tests/unit/format_test.py::FormatTest::test_valid_decimal_delimiter_multi_char": 0.00021466502221301198, + "tests/unit/format_test.py::FormatTest::test_valid_fill": 0.00021721801022067666, + "tests/unit/format_test.py::FormatTest::test_valid_group_bool": 0.00021348899463191628, + "tests/unit/format_test.py::FormatTest::test_valid_group_delimitator": 0.0006680539809167385, + "tests/unit/format_test.py::FormatTest::test_valid_group_delimitator_multi_char": 0.00023294403217732906, + "tests/unit/format_test.py::FormatTest::test_valid_group_named": 0.00019391701789572835, + "tests/unit/format_test.py::FormatTest::test_valid_group_string": 0.00019721698481589556, + "tests/unit/format_test.py::FormatTest::test_valid_groups": 0.00020509096793830395, + "tests/unit/format_test.py::FormatTest::test_valid_groups_multi": 0.00018796202493831515, + "tests/unit/format_test.py::FormatTest::test_valid_groups_single": 0.00018948304932564497, + "tests/unit/format_test.py::FormatTest::test_valid_padding_bool": 0.00024948205100372434, + "tests/unit/format_test.py::FormatTest::test_valid_padding_named": 0.00022623100085183978, + "tests/unit/format_test.py::FormatTest::test_valid_padding_string": 0.00022331095533445477, + "tests/unit/format_test.py::FormatTest::test_valid_padding_width": 0.0002175479894503951, + "tests/unit/format_test.py::FormatTest::test_valid_padding_width_0": 0.00020150997443124652, + "tests/unit/format_test.py::FormatTest::test_valid_precision": 0.00022841402096673846, + "tests/unit/format_test.py::FormatTest::test_valid_precision_0": 0.0001895579625852406, + "tests/unit/format_test.py::FormatTest::test_valid_prefix_named": 0.00019766297191381454, + "tests/unit/format_test.py::FormatTest::test_valid_prefix_number": 0.0001852249843068421, + "tests/unit/format_test.py::FormatTest::test_valid_scheme_named": 0.00018368195742368698, + "tests/unit/format_test.py::FormatTest::test_valid_scheme_string": 0.0001859969925135374, + "tests/unit/format_test.py::FormatTest::test_valid_sign_named": 0.00020319095347076654, + "tests/unit/format_test.py::FormatTest::test_valid_sign_string": 0.00019967998377978802, + "tests/unit/format_test.py::FormatTest::test_valid_symbol_named": 0.00018721696687862277, + "tests/unit/format_test.py::FormatTest::test_valid_symbol_prefix": 0.00019963004160672426, + "tests/unit/format_test.py::FormatTest::test_valid_symbol_string": 0.00019298301776871085, + "tests/unit/format_test.py::FormatTest::test_valid_symbol_suffix": 0.00022363499738276005, + "tests/unit/format_test.py::FormatTest::test_valid_trim_boolean": 0.0002107640029862523, + "tests/unit/format_test.py::FormatTest::test_valid_trim_named": 0.000184549018740654, + "tests/unit/format_test.py::FormatTest::test_valid_trim_string": 0.002311697055120021 +} \ No newline at end of file diff --git a/components/dash-table/karma.conf.js b/components/dash-table/karma.conf.js index 0e43a34e6e..c88231c5b3 100644 --- a/components/dash-table/karma.conf.js +++ b/components/dash-table/karma.conf.js @@ -17,7 +17,7 @@ module.exports = config => { 'tests/js-unit/**/*.ts' // *.tsx for React Jsx ], reporters: ["progress"], - browsers: ["Chrome"], + browsers: ["ChromeHeadless"], webpack: require('./webpack.test.config') }); } \ No newline at end of file diff --git a/dash/testing/browser.py b/dash/testing/browser.py index dd07da39ba..3190633086 100644 --- a/dash/testing/browser.py +++ b/dash/testing/browser.py @@ -475,16 +475,13 @@ def _get_wd_options(self): ) if self._headless: - options.headless = True + options.add_argument("--headless") return options def _get_chrome(self): options = self._get_wd_options() - options.set_capability("loggingPrefs", {"browser": "SEVERE"}) - options.set_capability("goog:loggingPrefs", {"browser": "SEVERE"}) - if "DASH_TEST_CHROMEPATH" in os.environ: options.binary_location = os.environ["DASH_TEST_CHROMEPATH"] @@ -498,10 +495,13 @@ def _get_chrome(self): "safebrowsing.disable_download_protection": True, }, ) + options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") options.add_argument("--disable-gpu") - options.add_argument("--remote-debugging-port=9222") + options.add_argument("--remote-debugging-port=0") + + options.set_capability("goog:loggingPrefs", {"browser": "SEVERE"}) chrome = ( webdriver.Remote(command_executor=self._remote_url, options=options) # type: ignore[reportAttributeAccessIssue] @@ -529,7 +529,6 @@ def _get_chrome(self): def _get_firefox(self): options = self._get_wd_options() - options.set_capability("loggingPrefs", {"browser": "SEVERE"}) options.set_capability("marionette", True) options.set_preference("browser.download.dir", self.download_path) diff --git a/package.json b/package.json index cf5f5335a0..83db1c8567 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "private::test.integration-dash": "TESTFILES=$(circleci tests glob \"tests/integration/**/test_*.py\" | circleci tests split --split-by=timings) && pytest --headless --nopercyfinalize --junitxml=test-reports/junit_intg.xml ${TESTFILES}", "private::test.integration-dash-import": "cd tests/integration/dash && python dash_import_test.py", "cibuild": "run-s private::cibuild.*", - "build": "run-s private::build.*", + "build": "run-p private::build.*", "build.sequential": "npm run private::build.jupyterlab && npm run private::build.renderer && npm run private::build.components -- --concurrency 1", "format": "run-s private::format.*", "initialize": "run-s private::initialize.*", diff --git a/requirements/celery.txt b/requirements/celery.txt index 0696a73b3c..cd97a92bad 100644 --- a/requirements/celery.txt +++ b/requirements/celery.txt @@ -1,3 +1,4 @@ # Dependencies used by the CeleryLongCallbackManager -redis>=3.5.3 -celery[redis]>=5.1.2 +redis>=3.5.3,<=5.0.4 +kombu<5.4.0 +celery[redis]>=5.1.2,<5.4.0 diff --git a/tests/integration/background_callback/__init__.py b/tests/background_callback/__init__.py similarity index 100% rename from tests/integration/background_callback/__init__.py rename to tests/background_callback/__init__.py diff --git a/tests/integration/background_callback/app1.py b/tests/background_callback/app1.py similarity index 87% rename from tests/integration/background_callback/app1.py rename to tests/background_callback/app1.py index 2c2b99d6de..4173085933 100644 --- a/tests/integration/background_callback/app1.py +++ b/tests/background_callback/app1.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, dcc, html import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app2.py b/tests/background_callback/app2.py similarity index 90% rename from tests/integration/background_callback/app2.py rename to tests/background_callback/app2.py index f30b0bf078..3fe42ec648 100644 --- a/tests/integration/background_callback/app2.py +++ b/tests/background_callback/app2.py @@ -2,7 +2,7 @@ import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app3.py b/tests/background_callback/app3.py similarity index 91% rename from tests/integration/background_callback/app3.py rename to tests/background_callback/app3.py index fd3d7d2d6a..e1b9acec20 100644 --- a/tests/integration/background_callback/app3.py +++ b/tests/background_callback/app3.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, State, dcc, html import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app4.py b/tests/background_callback/app4.py similarity index 92% rename from tests/integration/background_callback/app4.py rename to tests/background_callback/app4.py index 1e0ec36907..23bb536fdd 100644 --- a/tests/integration/background_callback/app4.py +++ b/tests/background_callback/app4.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, State, dcc, html import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager bg_callback_manager = get_background_callback_manager() handle = bg_callback_manager.handle diff --git a/tests/integration/background_callback/app5.py b/tests/background_callback/app5.py similarity index 93% rename from tests/integration/background_callback/app5.py rename to tests/background_callback/app5.py index 421694f599..bb428f7137 100644 --- a/tests/integration/background_callback/app5.py +++ b/tests/background_callback/app5.py @@ -2,7 +2,7 @@ import time from multiprocessing import Value -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app6.py b/tests/background_callback/app6.py similarity index 95% rename from tests/integration/background_callback/app6.py rename to tests/background_callback/app6.py index 9876a760dd..ed2fda6559 100644 --- a/tests/integration/background_callback/app6.py +++ b/tests/background_callback/app6.py @@ -3,7 +3,7 @@ import time from multiprocessing import Value -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app7.py b/tests/background_callback/app7.py similarity index 95% rename from tests/integration/background_callback/app7.py rename to tests/background_callback/app7.py index a82cc02e2e..d26e798366 100644 --- a/tests/integration/background_callback/app7.py +++ b/tests/background_callback/app7.py @@ -2,7 +2,7 @@ import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager bg_callback_manager = get_background_callback_manager() handle = bg_callback_manager.handle diff --git a/tests/integration/background_callback/app_arbitrary.py b/tests/background_callback/app_arbitrary.py similarity index 93% rename from tests/integration/background_callback/app_arbitrary.py rename to tests/background_callback/app_arbitrary.py index 6ff73d0665..28b4c5faaf 100644 --- a/tests/integration/background_callback/app_arbitrary.py +++ b/tests/background_callback/app_arbitrary.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, html, callback, set_props import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_bg_on_error.py b/tests/background_callback/app_bg_on_error.py similarity index 93% rename from tests/integration/background_callback/app_bg_on_error.py rename to tests/background_callback/app_bg_on_error.py index 5492bf2758..724531f092 100644 --- a/tests/integration/background_callback/app_bg_on_error.py +++ b/tests/background_callback/app_bg_on_error.py @@ -1,5 +1,5 @@ from dash import Dash, Input, Output, html, set_props -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_callback_ctx.py b/tests/background_callback/app_callback_ctx.py similarity index 92% rename from tests/integration/background_callback/app_callback_ctx.py rename to tests/background_callback/app_callback_ctx.py index 3df02a749f..bff1d35121 100644 --- a/tests/integration/background_callback/app_callback_ctx.py +++ b/tests/background_callback/app_callback_ctx.py @@ -2,7 +2,7 @@ from dash import Dash, Input, Output, html, callback, ALL, ctx -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_ctx_cookies.py b/tests/background_callback/app_ctx_cookies.py similarity index 92% rename from tests/integration/background_callback/app_ctx_cookies.py rename to tests/background_callback/app_ctx_cookies.py index a629962137..133b6faf2a 100644 --- a/tests/integration/background_callback/app_ctx_cookies.py +++ b/tests/background_callback/app_ctx_cookies.py @@ -1,6 +1,6 @@ from dash import Dash, Input, Output, html, callback, ctx -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_diff_outputs.py b/tests/background_callback/app_diff_outputs.py similarity index 90% rename from tests/integration/background_callback/app_diff_outputs.py rename to tests/background_callback/app_diff_outputs.py index 1c5ebeba12..063de1b360 100644 --- a/tests/integration/background_callback/app_diff_outputs.py +++ b/tests/background_callback/app_diff_outputs.py @@ -1,6 +1,6 @@ from dash import Dash, Input, Output, html -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_error.py b/tests/background_callback/app_error.py similarity index 95% rename from tests/integration/background_callback/app_error.py rename to tests/background_callback/app_error.py index bcce865ce7..fb931a74a9 100644 --- a/tests/integration/background_callback/app_error.py +++ b/tests/background_callback/app_error.py @@ -5,7 +5,7 @@ from dash.dependencies import Input, Output from dash.exceptions import PreventUpdate -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_page_cancel.py b/tests/background_callback/app_page_cancel.py similarity index 96% rename from tests/integration/background_callback/app_page_cancel.py rename to tests/background_callback/app_page_cancel.py index 28cf191c8f..e19fac47be 100644 --- a/tests/integration/background_callback/app_page_cancel.py +++ b/tests/background_callback/app_page_cancel.py @@ -1,6 +1,6 @@ from dash import Dash, Input, Output, dcc, html, page_container, register_page -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_pattern_matching.py b/tests/background_callback/app_pattern_matching.py similarity index 91% rename from tests/integration/background_callback/app_pattern_matching.py rename to tests/background_callback/app_pattern_matching.py index 0588268bd3..7a1b0be3d9 100644 --- a/tests/integration/background_callback/app_pattern_matching.py +++ b/tests/background_callback/app_pattern_matching.py @@ -1,6 +1,6 @@ from dash import Dash, Input, Output, html, callback, ALL -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_progress_delete.py b/tests/background_callback/app_progress_delete.py similarity index 92% rename from tests/integration/background_callback/app_progress_delete.py rename to tests/background_callback/app_progress_delete.py index f4fb37dfdd..cc989c9552 100644 --- a/tests/integration/background_callback/app_progress_delete.py +++ b/tests/background_callback/app_progress_delete.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, State, html, clientside_callback import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_short_interval.py b/tests/background_callback/app_short_interval.py similarity index 92% rename from tests/integration/background_callback/app_short_interval.py rename to tests/background_callback/app_short_interval.py index a7cd4b014f..5e831fb6a5 100644 --- a/tests/integration/background_callback/app_short_interval.py +++ b/tests/background_callback/app_short_interval.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, html, callback import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_side_update.py b/tests/background_callback/app_side_update.py similarity index 93% rename from tests/integration/background_callback/app_side_update.py rename to tests/background_callback/app_side_update.py index e3f81c3a72..0373bab53c 100644 --- a/tests/integration/background_callback/app_side_update.py +++ b/tests/background_callback/app_side_update.py @@ -1,7 +1,7 @@ from dash import Dash, Input, Output, html, callback import time -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/app_unordered.py b/tests/background_callback/app_unordered.py similarity index 88% rename from tests/integration/background_callback/app_unordered.py rename to tests/background_callback/app_unordered.py index c2e7ed3e68..6171168385 100644 --- a/tests/integration/background_callback/app_unordered.py +++ b/tests/background_callback/app_unordered.py @@ -1,6 +1,6 @@ from dash import Dash, Input, Output, dcc, State, html, callback -from tests.integration.background_callback.utils import get_background_callback_manager +from tests.background_callback.utils import get_background_callback_manager background_callback_manager = get_background_callback_manager() handle = background_callback_manager.handle diff --git a/tests/integration/background_callback/conftest.py b/tests/background_callback/conftest.py similarity index 100% rename from tests/integration/background_callback/conftest.py rename to tests/background_callback/conftest.py diff --git a/tests/integration/background_callback/test_basic_long_callback001.py b/tests/background_callback/test_basic_long_callback001.py similarity index 100% rename from tests/integration/background_callback/test_basic_long_callback001.py rename to tests/background_callback/test_basic_long_callback001.py diff --git a/tests/integration/background_callback/test_basic_long_callback002.py b/tests/background_callback/test_basic_long_callback002.py similarity index 94% rename from tests/integration/background_callback/test_basic_long_callback002.py rename to tests/background_callback/test_basic_long_callback002.py index ee01da6f6f..0a3c1dd315 100644 --- a/tests/integration/background_callback/test_basic_long_callback002.py +++ b/tests/background_callback/test_basic_long_callback002.py @@ -3,7 +3,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback003.py b/tests/background_callback/test_basic_long_callback003.py similarity index 95% rename from tests/integration/background_callback/test_basic_long_callback003.py rename to tests/background_callback/test_basic_long_callback003.py index 6a15bd0ef8..f6194a139e 100644 --- a/tests/integration/background_callback/test_basic_long_callback003.py +++ b/tests/background_callback/test_basic_long_callback003.py @@ -4,7 +4,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback004.py b/tests/background_callback/test_basic_long_callback004.py similarity index 95% rename from tests/integration/background_callback/test_basic_long_callback004.py rename to tests/background_callback/test_basic_long_callback004.py index ec6cf333d8..8b3d646225 100644 --- a/tests/integration/background_callback/test_basic_long_callback004.py +++ b/tests/background_callback/test_basic_long_callback004.py @@ -3,7 +3,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback005.py b/tests/background_callback/test_basic_long_callback005.py similarity index 97% rename from tests/integration/background_callback/test_basic_long_callback005.py rename to tests/background_callback/test_basic_long_callback005.py index 40cb4ce09e..5dabf2c14a 100644 --- a/tests/integration/background_callback/test_basic_long_callback005.py +++ b/tests/background_callback/test_basic_long_callback005.py @@ -3,7 +3,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback006.py b/tests/background_callback/test_basic_long_callback006.py similarity index 98% rename from tests/integration/background_callback/test_basic_long_callback006.py rename to tests/background_callback/test_basic_long_callback006.py index 8771d58067..24121d4e3e 100644 --- a/tests/integration/background_callback/test_basic_long_callback006.py +++ b/tests/background_callback/test_basic_long_callback006.py @@ -4,7 +4,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback007.py b/tests/background_callback/test_basic_long_callback007.py similarity index 95% rename from tests/integration/background_callback/test_basic_long_callback007.py rename to tests/background_callback/test_basic_long_callback007.py index ba9e8043f5..93bbaa2eec 100644 --- a/tests/integration/background_callback/test_basic_long_callback007.py +++ b/tests/background_callback/test_basic_long_callback007.py @@ -3,7 +3,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback008.py b/tests/background_callback/test_basic_long_callback008.py similarity index 96% rename from tests/integration/background_callback/test_basic_long_callback008.py rename to tests/background_callback/test_basic_long_callback008.py index b56b5a32c1..dcd70420f8 100644 --- a/tests/integration/background_callback/test_basic_long_callback008.py +++ b/tests/background_callback/test_basic_long_callback008.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback009.py b/tests/background_callback/test_basic_long_callback009.py similarity index 89% rename from tests/integration/background_callback/test_basic_long_callback009.py rename to tests/background_callback/test_basic_long_callback009.py index 83192fb467..a78e82a203 100644 --- a/tests/integration/background_callback/test_basic_long_callback009.py +++ b/tests/background_callback/test_basic_long_callback009.py @@ -3,7 +3,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback010.py b/tests/background_callback/test_basic_long_callback010.py similarity index 84% rename from tests/integration/background_callback/test_basic_long_callback010.py rename to tests/background_callback/test_basic_long_callback010.py index bc4afc50e2..ff51221a8b 100644 --- a/tests/integration/background_callback/test_basic_long_callback010.py +++ b/tests/background_callback/test_basic_long_callback010.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback011.py b/tests/background_callback/test_basic_long_callback011.py similarity index 85% rename from tests/integration/background_callback/test_basic_long_callback011.py rename to tests/background_callback/test_basic_long_callback011.py index f7f4e80c39..54b7a3a1f8 100644 --- a/tests/integration/background_callback/test_basic_long_callback011.py +++ b/tests/background_callback/test_basic_long_callback011.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback012.py b/tests/background_callback/test_basic_long_callback012.py similarity index 86% rename from tests/integration/background_callback/test_basic_long_callback012.py rename to tests/background_callback/test_basic_long_callback012.py index 7fcb8b0175..acde983d5f 100644 --- a/tests/integration/background_callback/test_basic_long_callback012.py +++ b/tests/background_callback/test_basic_long_callback012.py @@ -3,7 +3,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback013.py b/tests/background_callback/test_basic_long_callback013.py similarity index 82% rename from tests/integration/background_callback/test_basic_long_callback013.py rename to tests/background_callback/test_basic_long_callback013.py index aa38967655..e3f2715286 100644 --- a/tests/integration/background_callback/test_basic_long_callback013.py +++ b/tests/background_callback/test_basic_long_callback013.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback014.py b/tests/background_callback/test_basic_long_callback014.py similarity index 84% rename from tests/integration/background_callback/test_basic_long_callback014.py rename to tests/background_callback/test_basic_long_callback014.py index 05369c4284..927cbe4373 100644 --- a/tests/integration/background_callback/test_basic_long_callback014.py +++ b/tests/background_callback/test_basic_long_callback014.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback015.py b/tests/background_callback/test_basic_long_callback015.py similarity index 84% rename from tests/integration/background_callback/test_basic_long_callback015.py rename to tests/background_callback/test_basic_long_callback015.py index b1e206e349..a4e3cae426 100644 --- a/tests/integration/background_callback/test_basic_long_callback015.py +++ b/tests/background_callback/test_basic_long_callback015.py @@ -2,7 +2,7 @@ import pytest -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback016.py b/tests/background_callback/test_basic_long_callback016.py similarity index 95% rename from tests/integration/background_callback/test_basic_long_callback016.py rename to tests/background_callback/test_basic_long_callback016.py index ebc26bba3d..952a74dae3 100644 --- a/tests/integration/background_callback/test_basic_long_callback016.py +++ b/tests/background_callback/test_basic_long_callback016.py @@ -3,7 +3,7 @@ import pytest from flaky import flaky -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app @pytest.mark.skipif( diff --git a/tests/integration/background_callback/test_basic_long_callback017.py b/tests/background_callback/test_basic_long_callback017.py similarity index 90% rename from tests/integration/background_callback/test_basic_long_callback017.py rename to tests/background_callback/test_basic_long_callback017.py index 1fd5eb2e09..1b6e4dc420 100644 --- a/tests/integration/background_callback/test_basic_long_callback017.py +++ b/tests/background_callback/test_basic_long_callback017.py @@ -1,4 +1,4 @@ -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app def test_lcbc017_long_callback_set_props(dash_duo, manager): diff --git a/tests/integration/background_callback/test_basic_long_callback018.py b/tests/background_callback/test_basic_long_callback018.py similarity index 83% rename from tests/integration/background_callback/test_basic_long_callback018.py rename to tests/background_callback/test_basic_long_callback018.py index 6a53669944..1bf4de8cad 100644 --- a/tests/integration/background_callback/test_basic_long_callback018.py +++ b/tests/background_callback/test_basic_long_callback018.py @@ -1,4 +1,4 @@ -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app def test_lcbc018_background_callback_on_error(dash_duo, manager): diff --git a/tests/integration/background_callback/test_ctx_cookies.py b/tests/background_callback/test_ctx_cookies.py similarity index 82% rename from tests/integration/background_callback/test_ctx_cookies.py rename to tests/background_callback/test_ctx_cookies.py index 84410ad5ae..374a136c12 100644 --- a/tests/integration/background_callback/test_ctx_cookies.py +++ b/tests/background_callback/test_ctx_cookies.py @@ -1,4 +1,4 @@ -from tests.integration.background_callback.utils import setup_background_callback_app +from tests.background_callback.utils import setup_background_callback_app def test_lcbc019_ctx_cookies(dash_duo, manager): diff --git a/tests/integration/background_callback/utils.py b/tests/background_callback/utils.py similarity index 93% rename from tests/integration/background_callback/utils.py rename to tests/background_callback/utils.py index 3498ea7737..c6386f2680 100644 --- a/tests/integration/background_callback/utils.py +++ b/tests/background_callback/utils.py @@ -1,4 +1,5 @@ import os +import sys import shutil import subprocess import tempfile @@ -90,9 +91,11 @@ def setup_background_callback_app(manager_name, app_name): worker = subprocess.Popen( [ + sys.executable, + "-m", "celery", "-A", - f"tests.integration.background_callback.{app_name}:handle", + f"tests.background_callback.{app_name}:handle", "worker", "-P", "prefork", @@ -113,10 +116,11 @@ def setup_background_callback_app(manager_name, app_name): lines.append(line) else: error = "\n".join(lines) + error += f"\nPath: {sys.path}" raise RuntimeError(f"celery failed to start: {error}") try: - yield import_app(f"tests.integration.background_callback.{app_name}") + yield import_app(f"tests.background_callback.{app_name}") finally: # Interval may run one more time after settling on final app state # Sleep for 1 interval of time @@ -135,7 +139,7 @@ def setup_background_callback_app(manager_name, app_name): print(cache_directory) os.environ["DISKCACHE_DIR"] = cache_directory try: - app = import_app(f"tests.integration.background_callback.{app_name}") + app = import_app(f"tests.background_callback.{app_name}") yield app finally: # Interval may run one more time after settling on final app state diff --git a/tests/integration/test_typing.py b/tests/compliance/test_typing.py similarity index 98% rename from tests/integration/test_typing.py rename to tests/compliance/test_typing.py index 58c81ab5c2..030b28b32b 100644 --- a/tests/integration/test_typing.py +++ b/tests/compliance/test_typing.py @@ -6,7 +6,7 @@ import pytest component_template = """ -from dash_generator_test_component_typescript.TypeScriptComponent import TypeScriptComponent +from dash_generator_test_component_typescript import TypeScriptComponent t = TypeScriptComponent({0}) """ @@ -349,10 +349,9 @@ def test_typi001_component_typing(arguments, assertions, tmp_path): ], ) def test_typi002_typing_compliance( - typing_module, prelayout, layout, callback_return, assertions, tmp_path, change_dir + typing_module, prelayout, layout, callback_return, assertions, tmp_path ): codefile = os.path.join(tmp_path, "code.py") - os.chdir(tmp_path) code = format_template_and_save( basic_app_template, codefile, prelayout, layout, callback_return ) diff --git a/tests/integration/callbacks/test_callback_context.py b/tests/integration/callbacks/test_callback_context.py index 1080687a2e..0bce34027c 100644 --- a/tests/integration/callbacks/test_callback_context.py +++ b/tests/integration/callbacks/test_callback_context.py @@ -1,5 +1,6 @@ import json import operator + import pytest from dash import Dash, ALL, Input, Output, html, dcc, callback_context, ctx @@ -61,6 +62,7 @@ def on_click(*args): ) +@pytest.mark.skip(reason="Broken test on circleci, re-enable when migrated to gha") def test_cbcx003_no_callback_context(): for attr in ["inputs", "states", "triggered", "response"]: with pytest.raises(MissingCallbackContextException): @@ -97,7 +99,7 @@ def report_triggered(n): ) -@pytest.mark.DASH1350 +@pytest.mark.skip(reason="Broken test on circleci") def test_cbcx005_grouped_clicks(dash_duo): class context: calls = 0