-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* initial PoC * preliminary working config * first cut at chromatic tests * first cut at chromatic tests * fix yaml * fix yaml again * use workingDir * adapt playwright example * remove env * fix working directory * fix more paths * fix dir * add playwright setup * accidentally deleted a step * update test * think we don't need home.png right now * remove unused home.png --------- Co-authored-by: Richard Kuo <rkuo@rkuo.com>
- Loading branch information
1 parent
6e83fe3
commit b7de74f
Showing
7 changed files
with
3,609 additions
and
792 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,227 @@ | ||
name: Run Chromatic Tests | ||
concurrency: | ||
group: Run-Chromatic-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }} | ||
cancel-in-progress: true | ||
|
||
on: | ||
merge_group: | ||
pull_request: | ||
branches: | ||
- main | ||
- 'release/**' | ||
|
||
env: | ||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | ||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} | ||
|
||
jobs: | ||
playwright-tests: | ||
# See https://runs-on.com/runners/linux/ | ||
runs-on: [runs-on,runner=8cpu-linux-x64,ram=16,"run-id=${{ github.run_id }}"] | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Set up Python | ||
uses: actions/setup-python@v5 | ||
with: | ||
python-version: '3.11' | ||
cache: 'pip' | ||
cache-dependency-path: | | ||
backend/requirements/default.txt | ||
backend/requirements/dev.txt | ||
backend/requirements/model_server.txt | ||
- run: | | ||
python -m pip install --upgrade pip | ||
pip install --retries 5 --timeout 30 -r backend/requirements/default.txt | ||
pip install --retries 5 --timeout 30 -r backend/requirements/dev.txt | ||
pip install --retries 5 --timeout 30 -r backend/requirements/model_server.txt | ||
- name: Setup node | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 22 | ||
|
||
- name: Install node dependencies | ||
working-directory: ./web | ||
run: npm ci | ||
|
||
- name: Install playwright browsers | ||
working-directory: ./web | ||
run: npx playwright install --with-deps | ||
|
||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v3 | ||
|
||
- name: Login to Docker Hub | ||
uses: docker/login-action@v3 | ||
with: | ||
username: ${{ secrets.DOCKER_USERNAME }} | ||
password: ${{ secrets.DOCKER_TOKEN }} | ||
|
||
# tag every docker image with "test" so that we can spin up the correct set | ||
# of images during testing | ||
|
||
# we use the runs-on cache for docker builds | ||
# in conjunction with runs-on runners, it has better speed and unlimited caching | ||
# https://runs-on.com/caching/s3-cache-for-github-actions/ | ||
# https://runs-on.com/caching/docker/ | ||
# https://github.com/moby/buildkit#s3-cache-experimental | ||
|
||
# images are built and run locally for testing purposes. Not pushed. | ||
|
||
- name: Build Web Docker image | ||
uses: ./.github/actions/custom-build-and-push | ||
with: | ||
context: ./web | ||
file: ./web/Dockerfile | ||
platforms: linux/amd64 | ||
tags: danswer/danswer-web-server:test | ||
push: false | ||
load: true | ||
cache-from: type=s3,prefix=cache/${{ github.repository }}/integration-tests/web-server/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }} | ||
cache-to: type=s3,prefix=cache/${{ github.repository }}/integration-tests/web-server/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max | ||
|
||
- name: Build Backend Docker image | ||
uses: ./.github/actions/custom-build-and-push | ||
with: | ||
context: ./backend | ||
file: ./backend/Dockerfile | ||
platforms: linux/amd64 | ||
tags: danswer/danswer-backend:test | ||
push: false | ||
load: true | ||
cache-from: type=s3,prefix=cache/${{ github.repository }}/integration-tests/backend/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }} | ||
cache-to: type=s3,prefix=cache/${{ github.repository }}/integration-tests/backend/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max | ||
|
||
- name: Build Model Server Docker image | ||
uses: ./.github/actions/custom-build-and-push | ||
with: | ||
context: ./backend | ||
file: ./backend/Dockerfile.model_server | ||
platforms: linux/amd64 | ||
tags: danswer/danswer-model-server:test | ||
push: false | ||
load: true | ||
cache-from: type=s3,prefix=cache/${{ github.repository }}/integration-tests/model-server/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }} | ||
cache-to: type=s3,prefix=cache/${{ github.repository }}/integration-tests/model-server/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max | ||
|
||
- name: Start Docker containers | ||
run: | | ||
cd deployment/docker_compose | ||
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true \ | ||
AUTH_TYPE=basic \ | ||
REQUIRE_EMAIL_VERIFICATION=false \ | ||
DISABLE_TELEMETRY=true \ | ||
IMAGE_TAG=test \ | ||
docker compose -f docker-compose.dev.yml -p danswer-stack up -d | ||
id: start_docker | ||
|
||
- name: Wait for service to be ready | ||
run: | | ||
echo "Starting wait-for-service script..." | ||
docker logs -f danswer-stack-api_server-1 & | ||
start_time=$(date +%s) | ||
timeout=300 # 5 minutes in seconds | ||
while true; do | ||
current_time=$(date +%s) | ||
elapsed_time=$((current_time - start_time)) | ||
if [ $elapsed_time -ge $timeout ]; then | ||
echo "Timeout reached. Service did not become ready in 5 minutes." | ||
exit 1 | ||
fi | ||
# Use curl with error handling to ignore specific exit code 56 | ||
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health || echo "curl_error") | ||
if [ "$response" = "200" ]; then | ||
echo "Service is ready!" | ||
break | ||
elif [ "$response" = "curl_error" ]; then | ||
echo "Curl encountered an error, possibly exit code 56. Continuing to retry..." | ||
else | ||
echo "Service not ready yet (HTTP status $response). Retrying in 5 seconds..." | ||
fi | ||
sleep 5 | ||
done | ||
echo "Finished waiting for service." | ||
- name: Run pytest playwright test init | ||
working-directory: ./backend | ||
env: | ||
PYTEST_IGNORE_SKIP: true | ||
run: pytest -s tests/integration/tests/playwright/test_playwright.py | ||
|
||
- name: Run Playwright tests | ||
working-directory: ./web | ||
run: npx playwright test | ||
|
||
- uses: actions/upload-artifact@v4 | ||
if: always() | ||
with: | ||
# Chromatic automatically defaults to the test-results directory. | ||
# Replace with the path to your custom directory and adjust the CHROMATIC_ARCHIVE_LOCATION environment variable accordingly. | ||
name: test-results | ||
path: ./web/test-results | ||
retention-days: 30 | ||
|
||
# save before stopping the containers so the logs can be captured | ||
- name: Save Docker logs | ||
if: success() || failure() | ||
run: | | ||
cd deployment/docker_compose | ||
docker compose -f docker-compose.dev.yml -p danswer-stack logs > docker-compose.log | ||
mv docker-compose.log ${{ github.workspace }}/docker-compose.log | ||
- name: Upload logs | ||
if: success() || failure() | ||
uses: actions/upload-artifact@v4 | ||
with: | ||
name: docker-logs | ||
path: ${{ github.workspace }}/docker-compose.log | ||
|
||
- name: Stop Docker containers | ||
run: | | ||
cd deployment/docker_compose | ||
docker compose -f docker-compose.dev.yml -p danswer-stack down -v | ||
chromatic-tests: | ||
name: Run Chromatic | ||
needs: playwright-tests | ||
runs-on: [runs-on,runner=8cpu-linux-x64,ram=16,"run-id=${{ github.run_id }}"] | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Setup node | ||
uses: actions/setup-node@v4 | ||
with: | ||
node-version: 22 | ||
|
||
- name: Install node dependencies | ||
working-directory: ./web | ||
run: npm ci | ||
|
||
- name: Download Playwright test results | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: test-results | ||
path: ./web/test-results | ||
|
||
- name: Run Chromatic | ||
uses: chromaui/action@latest | ||
with: | ||
playwright: true | ||
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} | ||
workingDir: ./web | ||
env: | ||
CHROMATIC_ARCHIVE_LOCATION: ./test-results |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,3 +7,4 @@ | |
.vscode/ | ||
*.sw? | ||
/backend/tests/regression/answer_quality/search_test_config.yaml | ||
/web/test-results/ |
18 changes: 18 additions & 0 deletions
18
backend/tests/integration/tests/playwright/test_playwright.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import os | ||
|
||
import pytest | ||
|
||
from tests.integration.common_utils.managers.user import UserManager | ||
from tests.integration.common_utils.test_models import DATestUser | ||
|
||
|
||
@pytest.mark.skipif( | ||
os.getenv("PYTEST_IGNORE_SKIP") is None, | ||
reason="Skipped by default unless env var exists", | ||
) | ||
def test_playwright_setup(reset: None) -> None: | ||
"""Not really a test, just using this to automate setup for playwright tests.""" | ||
|
||
# Creating an admin user (first user created is automatically an admin) | ||
admin_user: DATestUser = UserManager.create(name="admin_user") | ||
assert admin_user |
Oops, something went wrong.