-
Notifications
You must be signed in to change notification settings - Fork 8
Add integration testing with testcontainers and Playwright #442
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
ac612b2
2d2600e
efbef4c
a02c080
e9e466c
fef992f
582f80c
12bb1f1
1d79015
814b6d2
b903635
eb2aa1c
9340a86
012b8bd
867d4e5
4dc2d3c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,179 @@ | ||
| name: "Integration Tests" | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| pull_request: | ||
| pull_request_review: | ||
| types: [submitted] | ||
| workflow_dispatch: | ||
|
|
||
| env: | ||
| ORIGIN_PORT: 8888 | ||
|
|
||
| jobs: | ||
| integration-tests: | ||
| name: integration tests | ||
| runs-on: ubuntu-latest | ||
| if: >- | ||
| github.event_name == 'push' || | ||
| github.event_name == 'pull_request' || | ||
| github.event_name == 'workflow_dispatch' || | ||
| (github.event_name == 'pull_request_review' && github.event.review.state == 'approved') | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Retrieve Rust version | ||
| id: rust-version | ||
| run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> $GITHUB_OUTPUT | ||
| shell: bash | ||
|
|
||
| - name: Set up Rust toolchain | ||
| uses: actions-rust-lang/setup-rust-toolchain@v1 | ||
| with: | ||
| toolchain: ${{ steps.rust-version.outputs.rust-version }} | ||
| target: wasm32-wasip1 | ||
| cache-shared-key: cargo-${{ runner.os }} | ||
|
|
||
| - name: Get Viceroy cache key | ||
| id: viceroy-rev | ||
| run: echo "sha=$(git ls-remote https://github.com/fastly/Viceroy HEAD | cut -f1)" >> $GITHUB_OUTPUT | ||
|
|
||
| - name: Cache Viceroy binary | ||
| id: cache-viceroy | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: ~/.cargo/bin/viceroy | ||
| key: viceroy-${{ runner.os }}-${{ steps.viceroy-rev.outputs.sha }} | ||
|
|
||
| - name: Install Viceroy | ||
| if: steps.cache-viceroy.outputs.cache-hit != 'true' | ||
| run: cargo install --git https://github.com/fastly/Viceroy viceroy | ||
|
|
||
| - name: Build WASM binary | ||
| run: cargo build --bin trusted-server-fastly --release --target wasm32-wasip1 | ||
| env: | ||
| TRUSTED_SERVER__PUBLISHER__ORIGIN_URL: "http://127.0.0.1:${{ env.ORIGIN_PORT }}" | ||
| TRUSTED_SERVER__PROXY__CERTIFICATE_CHECK: "false" | ||
|
|
||
| - name: Build WordPress test container | ||
| run: | | ||
| docker build -t test-wordpress:latest \ | ||
| crates/integration-tests/fixtures/frameworks/wordpress/ | ||
|
|
||
| - name: Build Next.js test container | ||
| run: | | ||
| docker build -t test-nextjs:latest \ | ||
| crates/integration-tests/fixtures/frameworks/nextjs/ | ||
|
|
||
| - name: Run integration tests | ||
| run: >- | ||
| cargo test | ||
| --manifest-path crates/integration-tests/Cargo.toml | ||
| --target x86_64-unknown-linux-gnu | ||
| -- --include-ignored --test-threads=1 | ||
| env: | ||
| INTEGRATION_ORIGIN_PORT: ${{ env.ORIGIN_PORT }} | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🤔 The Consider extracting the shared setup into a composite action or reusable workflow. |
||
| RUST_LOG: info | ||
|
|
||
| browser-tests: | ||
| name: browser integration tests | ||
| runs-on: ubuntu-latest | ||
| if: >- | ||
| github.event_name == 'push' || | ||
| github.event_name == 'pull_request' || | ||
| github.event_name == 'workflow_dispatch' || | ||
| (github.event_name == 'pull_request_review' && github.event.review.state == 'approved') | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - name: Retrieve Rust version | ||
| id: rust-version | ||
| run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> $GITHUB_OUTPUT | ||
| shell: bash | ||
|
|
||
| - name: Set up Rust toolchain | ||
| uses: actions-rust-lang/setup-rust-toolchain@v1 | ||
| with: | ||
| toolchain: ${{ steps.rust-version.outputs.rust-version }} | ||
| target: wasm32-wasip1 | ||
| cache-shared-key: cargo-${{ runner.os }} | ||
|
|
||
| - name: Get Viceroy cache key | ||
| id: viceroy-rev | ||
| run: echo "sha=$(git ls-remote https://github.com/fastly/Viceroy HEAD | cut -f1)" >> $GITHUB_OUTPUT | ||
|
|
||
| - name: Cache Viceroy binary | ||
| id: cache-viceroy | ||
| uses: actions/cache@v4 | ||
| with: | ||
| path: ~/.cargo/bin/viceroy | ||
| key: viceroy-${{ runner.os }}-${{ steps.viceroy-rev.outputs.sha }} | ||
|
|
||
| - name: Install Viceroy | ||
| if: steps.cache-viceroy.outputs.cache-hit != 'true' | ||
| run: cargo install --git https://github.com/fastly/Viceroy viceroy | ||
|
|
||
| - name: Build WASM binary | ||
| run: cargo build --bin trusted-server-fastly --release --target wasm32-wasip1 | ||
| env: | ||
| TRUSTED_SERVER__PUBLISHER__ORIGIN_URL: "http://127.0.0.1:${{ env.ORIGIN_PORT }}" | ||
| TRUSTED_SERVER__PROXY__CERTIFICATE_CHECK: "false" | ||
|
|
||
| - name: Build WordPress test container | ||
| run: | | ||
| docker build -t test-wordpress:latest \ | ||
| crates/integration-tests/fixtures/frameworks/wordpress/ | ||
|
|
||
| - name: Build Next.js test container | ||
| run: | | ||
| docker build -t test-nextjs:latest \ | ||
| crates/integration-tests/fixtures/frameworks/nextjs/ | ||
|
|
||
| - name: Set up Node.js | ||
| uses: actions/setup-node@v4 | ||
| with: | ||
| node-version: lts/* | ||
|
|
||
| - name: Install Playwright | ||
| working-directory: crates/integration-tests/browser | ||
| run: | | ||
| npm ci | ||
| npx playwright install --with-deps chromium | ||
|
|
||
| - name: Run browser tests (Next.js) | ||
| working-directory: crates/integration-tests/browser | ||
| env: | ||
| WASM_BINARY_PATH: ${{ github.workspace }}/target/wasm32-wasip1/release/trusted-server-fastly.wasm | ||
| INTEGRATION_ORIGIN_PORT: ${{ env.ORIGIN_PORT }} | ||
| VICEROY_CONFIG_PATH: ${{ github.workspace }}/crates/integration-tests/fixtures/configs/viceroy-template.toml | ||
| TEST_FRAMEWORK: nextjs | ||
| run: npx playwright test | ||
|
|
||
| - name: Run browser tests (WordPress) | ||
| working-directory: crates/integration-tests/browser | ||
| env: | ||
| WASM_BINARY_PATH: ${{ github.workspace }}/target/wasm32-wasip1/release/trusted-server-fastly.wasm | ||
| INTEGRATION_ORIGIN_PORT: ${{ env.ORIGIN_PORT }} | ||
| VICEROY_CONFIG_PATH: ${{ github.workspace }}/crates/integration-tests/fixtures/configs/viceroy-template.toml | ||
| TEST_FRAMEWORK: wordpress | ||
| run: npx playwright test | ||
|
|
||
| - name: Upload Playwright HTML report | ||
| uses: actions/upload-artifact@v4 | ||
| if: failure() | ||
| with: | ||
| name: playwright-report | ||
| path: crates/integration-tests/browser/playwright-report/ | ||
| retention-days: 7 | ||
|
|
||
| - name: Upload Playwright traces and screenshots | ||
| uses: actions/upload-artifact@v4 | ||
| if: failure() | ||
| with: | ||
| name: playwright-traces | ||
| path: crates/integration-tests/browser/test-results/ | ||
| retention-days: 7 | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -80,6 +80,12 @@ async fn route_request( | |
|
|
||
| // Match known routes and handle them | ||
| let result = match (method, path.as_str()) { | ||
| // Health check endpoint for integration tests and monitoring. | ||
| // Namespaced to avoid shadowing publisher routes. | ||
| (Method::GET, "/__trusted-server/health") => { | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ❓ This adds a hard intercept for Previously this path fell through to the origin. The Is the intent to keep this in production, or should it be gated behind a build-time flag so it's only active during testing? |
||
| Ok(Response::from_status(200).with_body_text_plain("ok")) | ||
| } | ||
|
|
||
| // Serve the tsjs library | ||
| (Method::GET, path) if path.starts_with("/static/tsjs=") => { | ||
| handle_tsjs_dynamic(&req, integration_registry) | ||
|
|
@@ -176,7 +182,7 @@ fn init_logger() { | |
| .echo_stdout(true) | ||
| .max_level(log::LevelFilter::Debug) | ||
| .build() | ||
| .expect("Failed to build Logger"); | ||
| .expect("should build Logger"); | ||
|
|
||
| fern::Dispatch::new() | ||
| .format(|out, message, record| { | ||
|
|
@@ -194,5 +200,5 @@ fn init_logger() { | |
| }) | ||
| .chain(Box::new(logger) as Box<dyn log::Log>) | ||
| .apply() | ||
| .expect("Failed to initialize logger"); | ||
| .expect("should initialize logger"); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| target/ | ||
| *.rs | ||
| Cargo.toml | ||
| Cargo.lock | ||
| tests/ | ||
| README.md |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🌱
pull_request_reviewtrigger means integration tests re-run on every review submission, even when no code changed. Combined with thepull_requesttrigger, an approval on an existing PR triggers a full redundant run. Consider removing this trigger or usingworkflow_dispatchfor on-demand runs.