Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
599f3ae
Add campaigns Playwright API tests and shared apiError helper
devkiran Aug 15, 2026
8e0207a
Remove Vitest campaigns tests superseded by Playwright API specs
devkiran Aug 15, 2026
91d8b17
Update playwright.yaml
devkiran Aug 15, 2026
512c0c1
Update campaigns.spec.ts
devkiran Aug 17, 2026
47a2f03
Update playwright.yaml
devkiran Aug 17, 2026
b2d7092
Merge branch 'main' into playwright-campaigns-api-tests
devkiran Aug 17, 2026
41e37e1
Use QStash local-dev server in Playwright CI.
devkiran Aug 17, 2026
60a18d9
return 400 for invalid Stripe customer IDs when listing invoices
pepeladeira Aug 18, 2026
9401437
Merge branch 'main' into playwright-campaigns-api-tests
devkiran Aug 19, 2026
ca14191
Cover partner tags, trigger condition arrays, and template variables …
devkiran Aug 19, 2026
8075f9f
Move send-campaign workflow coverage to Playwright API tests.
devkiran Aug 19, 2026
33f49a7
Drop unused campaign e2e routes and share Playwright API conversion h…
devkiran Aug 19, 2026
9e748b7
Run campaign workflow tests via cron and real lead tracking.
devkiran Aug 19, 2026
70d7a60
Simplify send-campaign workflow Playwright tests with a campaign sess…
devkiran Aug 19, 2026
47915b3
Setup TB local
devkiran Aug 19, 2026
554eff5
Update playwright.config.ts
devkiran Aug 19, 2026
8100a09
round percentage sale commissions to the nearest cent
pepeladeira Aug 19, 2026
d88207b
Merge branch 'main' into fix-invalid-stripe-customer-id
devkiran Aug 19, 2026
8e09dcf
code improvements
pepeladeira Aug 19, 2026
afa411b
playwright tests
pepeladeira Aug 19, 2026
be1774b
Merge branch 'main' into fix-invalid-stripe-customer-id
pepeladeira Aug 19, 2026
c95ab9e
Merge branch 'main' into playwright-campaigns-api-tests
steven-tey Aug 19, 2026
0637ba7
Merge pull request #4335 from dubinc/playwright-campaigns-api-tests
steven-tey Aug 19, 2026
3e6a28a
crossProgram → networkActivity
steven-tey Aug 19, 2026
da54530
fallback to programUrlDomain if no additionalLinks
steven-tey Aug 19, 2026
af200e5
queue partner cleanup when Stripe Connect is missing
pepeladeira Aug 19, 2026
4b38bae
Merge pull request #4367 from dubinc/import-cleanup-without-stripe
steven-tey Aug 19, 2026
d47c943
Lay out bank requirements warning alert horizontally
cursoragent Aug 19, 2026
aa49ed5
Merge pull request #4368 from dubinc/cursor/bank-requirements-alert-h…
steven-tey Aug 19, 2026
0abdb92
Merge pull request #4352 from dubinc/fix-invalid-stripe-customer-id
steven-tey Aug 19, 2026
443cfbb
Merge branch 'main' into sale-commission-rounding
steven-tey Aug 19, 2026
a80e4d0
finalize tests
steven-tey Aug 19, 2026
af1b082
Merge pull request #4366 from dubinc/sale-commission-rounding
steven-tey Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions .agents/skills/playwright-api-tests/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,6 @@ import { expect } from "@playwright/test";
import { randomName } from "../../utils";
import { test, type ApiClient } from "../fixtures";

test.describe.configure({
mode: "parallel",
});

async function createThing(
api: ApiClient,
overrides: Record<string, unknown> = {},
Expand Down Expand Up @@ -98,7 +94,7 @@ test("POST /things", async ({ api }) => {
| Rule | Detail |
| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| Import `test` from `../fixtures` | Provides `api`, `workspace`, and `program` |
| `test.describe.configure({ mode: "parallel" })` | At top of every API spec file |
| Serial only when tests share state | API project is `fullyParallel: true`. Do not add `mode: "parallel"`. Use `test.describe.configure({ mode: "serial" })` only when tests in a file/describe share state (e.g. domains, seeded pagination) |
| Cleanup in `finally` | Create → assert → always delete created rows |
| Unique names/ids | Use `randomName` / `randomCustomer` / `randomPartnerEmail` from `../../utils` — never fixed colliding names |
| Assert status + body | Prefer `toStrictEqual` / `toEqual` on full shapes; use `expect.any(String)` for ids/timestamps |
Expand Down
77 changes: 68 additions & 9 deletions .github/workflows/playwright.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
e2e:
permissions:
contents: read
timeout-minutes: 20
timeout-minutes: 30
runs-on: ubuntu-latest

env:
Expand All @@ -32,19 +32,20 @@ jobs:
E2E_PARTNER_EMAIL: "partner1@dub-internal-test.com"
E2E_PARTNER_PASSWORD: "password"

TINYBIRD_API_KEY: "xx"
TINYBIRD_API_URL: "xx"
# TINYBIRD_API_KEY / TINYBIRD_API_URL are set after Tinybird Local is ready

# serverless-redis-http (SRH) — must match jobs.e2e.services.srh env
SRH_TOKEN: "e2e_srh_token"
UPSTASH_REDIS_REST_URL: "http://127.0.0.1:8079"
UPSTASH_REDIS_REST_TOKEN: "e2e_srh_token"
UPSTASH_VECTOR_REST_URL: "https://sensible-camel-xxxx.upstash.io"
UPSTASH_VECTOR_REST_TOKEN: "xx"
QSTASH_URL: "https://qstash-us-east-1.upstash.io"
QSTASH_TOKEN: "xx"
QSTASH_CURRENT_SIGNING_KEY: "xx"
QSTASH_NEXT_SIGNING_KEY: "xx"

# QStash local-dev (User 1) — must match jobs.e2e Start QStash step
QSTASH_URL: "http://127.0.0.1:8080"
QSTASH_TOKEN: "eyJVc2VySUQiOiJkZWZhdWx0VXNlciIsIlBhc3N3b3JkIjoiZGVmYXVsdFBhc3N3b3JkIn0="
QSTASH_CURRENT_SIGNING_KEY: "sig_7kYjw48mhY7kAjqNGcy6cr29RJ6r"
QSTASH_NEXT_SIGNING_KEY: "sig_5ZB6DVzB1wjE8S6rZ7eenA8Pdnhs"

# RESEND_API_KEY must be unset so emails route through SMTP to MailHog
SMTP_HOST: "localhost"
Expand Down Expand Up @@ -104,6 +105,14 @@ jobs:
ports:
- 8079:80

# Classic .datasource/.pipe project; COMPATIBILITY_MODE is required
tinybird:
image: tinybirdco/tinybird-local:latest
env:
COMPATIBILITY_MODE: "1"
ports:
- 7181:7181

steps:
- name: Check out code
uses: actions/checkout@v4
Expand All @@ -119,6 +128,52 @@ jobs:
-mysql-no-pass \
-mysql-addr=127.0.0.1

- name: Start QStash dev server
run: |
docker run -d --name qstash-dev \
--network host \
public.ecr.aws/upstash/qstash:latest \
qstash dev
for i in $(seq 1 30); do
if curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080 | grep -qE '^[0-9]{3}$'; then
echo "QStash is up"
exit 0
fi
sleep 1
done
docker logs qstash-dev
exit 1

- name: Configure Tinybird Local
working-directory: packages/tinybird
run: |
TOKEN=""
for i in $(seq 1 90); do
TOKEN=$(curl -sf http://127.0.0.1:7181/tokens | jq -r '.workspace_admin_token // empty' || true)
if [ -n "$TOKEN" ]; then
echo "Tinybird Local is up"
break
fi
sleep 2
done
if [ -z "$TOKEN" ]; then
echo "Tinybird Local did not become ready on :7181"
exit 1
fi

echo "::add-mask::$TOKEN"
{
echo "TINYBIRD_API_KEY<<EOF"
echo "$TOKEN"
echo "EOF"
echo "TINYBIRD_API_URL=http://127.0.0.1:7181"
} >> "$GITHUB_ENV"

python3 -m venv /tmp/tinybird-cli
/tmp/tinybird-cli/bin/pip install tinybird-cli
/tmp/tinybird-cli/bin/tb --host http://127.0.0.1:7181 --token "$TOKEN" auth
/tmp/tinybird-cli/bin/tb push --force --yes datasources/*.datasource

- name: Setup pnpm
uses: pnpm/action-setup@v3

Expand Down Expand Up @@ -157,6 +212,10 @@ jobs:
- name: Build application
run: pnpm turbo build --filter=web

- name: Run Playwright tests
- name: Run Playwright API tests
working-directory: apps/web
run: pnpm test:e2e --project=api

- name: Run Playwright UI tests
working-directory: apps/web
run: pnpm test:e2e
run: pnpm test:e2e --project=partners --project=workspaces --project=chromium-workspace
109 changes: 0 additions & 109 deletions apps/web/app/(ee)/api/e2e/enrollments/route.ts

This file was deleted.

78 changes: 0 additions & 78 deletions apps/web/app/(ee)/api/e2e/notification-emails/route.ts

This file was deleted.

47 changes: 0 additions & 47 deletions apps/web/app/(ee)/api/e2e/trigger-workflow/[workflowId]/route.ts

This file was deleted.

5 changes: 2 additions & 3 deletions apps/web/app/(ee)/api/e2e/workflows/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,18 @@ import { prisma } from "@/lib/prisma";
import { NextResponse } from "next/server";
import { assertE2EWorkspace } from "../guard";

// GET /api/e2e/workflows - Find workflow by bountyId, campaignId, or groupId
// GET /api/e2e/workflows - Find workflow by bountyId or groupId
export const GET = withWorkspace(async ({ workspace, searchParams }) => {
assertE2EWorkspace(workspace);

const programId = getDefaultProgramIdOrThrow(workspace);

const { bountyId, campaignId, groupId } = searchParams;
const { bountyId, groupId } = searchParams;

const workflow = await prisma.workflow.findFirst({
where: {
programId,
...(bountyId && { bounty: { id: bountyId } }),
...(campaignId && { campaign: { id: campaignId } }),
...(groupId && { partnerGroup: { id: groupId } }),
},
select: {
Expand Down
Loading
Loading