mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-09 08:38:13 +00:00
## Summary Logged-out users who open a share link and then sign up/in were not attributed to the share. The `share_id` capture lived in `useSharedWorkflowUrlLoader`, which only runs after `GraphView` mounts — i.e. after the cloud auth guard has already redirected the logged-out user to login. The capture never happened, so `trackAuth` fired without a `share_id`. This moves the capture into the cloud auth guard (`router.beforeEach`), so it runs on the initial navigation before any login redirect. The `share_id` is preserved across the auth round-trip and consumed on auth completion as before. ## Changes - Capture logged-out share attribution in the router guard instead of the share loader, via a new `preserveLoggedOutShareAuthAttribution` util - Extract `isValidShareId` into the shared util and reuse it in the loader (removes the duplicated regex) - Gate capture on `isCloud` (matching the cloud-only consumption); drop the now-dead capture branch from the loader - Make the accepted share-id shape explicit: ASCII alphanumeric start, ASCII alphanumeric/`_.-` after that, max 128 chars ## Notes - Capture no-ops when `share` is absent, so param-less redirects do not clear attribution - If another valid share link is visited before auth completes, the latest valid share replaces the previous attribution - `SHARE` and `SHARE_AUTH` stay separate intentionally: `SHARE` preserves the workflow-loading query, while `SHARE_AUTH` is consumed once by auth telemetry attribution - No behavior change for logged-in users or for share-dialog open/cancel ## Testing - New unit tests for `isValidShareId` and `preserveLoggedOutShareAuthAttribution` (valid/invalid/array/logged-in/boundary cases) - Auth store tests cover `share_id` propagation + consumption across email signup/login, Google, and GitHub - Updated loader and telemetry tests for the relocated capture and `share_id` passthrough - Cloud E2E regression covers logged-out `/?share=abc` redirecting to login after capturing share auth attribution
50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
import { expect } from '@playwright/test'
|
|
import { comfyPageFixture as test } from '@e2e/fixtures/ComfyPage'
|
|
|
|
const APP_URL = process.env.PLAYWRIGHT_TEST_URL || 'http://localhost:8188'
|
|
const SHARE_AUTH_STORAGE_KEY = 'Comfy.PreservedQuery.share_auth'
|
|
|
|
/**
|
|
* Cloud distribution E2E tests.
|
|
*
|
|
* These tests run against the cloud build (DISTRIBUTION=cloud) and verify
|
|
* that cloud-specific behavior is present. In CI, no Firebase auth is
|
|
* configured, so the auth guard redirects to /cloud/login. The tests
|
|
* verify the cloud build loaded correctly by checking for cloud-only
|
|
* routes and elements.
|
|
*/
|
|
test.describe('Cloud distribution UI', { tag: '@cloud' }, () => {
|
|
test('cloud build redirects unauthenticated users to login', async ({
|
|
page
|
|
}) => {
|
|
await page.goto(APP_URL)
|
|
// Cloud build has an auth guard that redirects to /cloud/login.
|
|
// This route only exists in the cloud distribution — it's tree-shaken
|
|
// in the OSS build. Its presence confirms the cloud build is active.
|
|
await expect(page).toHaveURL(/\/cloud\/login/, { timeout: 10_000 })
|
|
})
|
|
|
|
test('preserves share auth attribution before redirecting logged-out users', async ({
|
|
page
|
|
}) => {
|
|
await page.goto(new URL('/?share=abc', APP_URL).toString())
|
|
|
|
await expect(page).toHaveURL(/\/cloud\/login/, { timeout: 10_000 })
|
|
await expect
|
|
.poll(() =>
|
|
page.evaluate(
|
|
(key) => sessionStorage.getItem(key),
|
|
SHARE_AUTH_STORAGE_KEY
|
|
)
|
|
)
|
|
.toBe(JSON.stringify({ share: 'abc' }))
|
|
})
|
|
|
|
test('cloud login page renders sign-in options', async ({ page }) => {
|
|
await page.goto(APP_URL)
|
|
await expect(page).toHaveURL(/\/cloud\/login/, { timeout: 10_000 })
|
|
// Verify cloud-specific login UI is rendered
|
|
await expect(page.getByRole('button', { name: /google/i })).toBeVisible()
|
|
})
|
|
})
|