feat: dashboard
This commit is contained in:
@@ -170,7 +170,7 @@ async function registerUser(page: Page, user: TestUser): Promise<void> {
|
||||
|
||||
await retryTransientNavigation(() => registerPage.goto());
|
||||
await registerPage.register(user.username, user.displayName, user.password);
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function loginUser(page: Page, user: TestUser): Promise<void> {
|
||||
@@ -178,7 +178,7 @@ async function loginUser(page: Page, user: TestUser): Promise<void> {
|
||||
|
||||
await retryTransientNavigation(() => loginPage.goto());
|
||||
await loginPage.login(user.username, user.password);
|
||||
await expect(page).toHaveURL(/\/(search|room)(\/|$)/, { timeout: 15_000 });
|
||||
await expect(page).toHaveURL(/\/(dashboard|room)(\/|$)/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function logoutUser(page: Page): Promise<void> {
|
||||
@@ -213,7 +213,7 @@ async function expectSavedRoomAndHistory(page: Page, roomName: string, messageTe
|
||||
const messagesPage = new ChatMessagesPage(page);
|
||||
|
||||
await expect(railRoomButton).toBeVisible({ timeout: 20_000 });
|
||||
await page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
const searchRoomButton = getSearchSavedRoomButton(page, roomName);
|
||||
|
||||
await expect(searchRoomButton).toBeVisible({ timeout: 20_000 });
|
||||
@@ -223,10 +223,8 @@ async function expectSavedRoomAndHistory(page: Page, roomName: string, messageTe
|
||||
}
|
||||
|
||||
async function expectBlankSlate(page: Page, hiddenRoomNames: string[]): Promise<void> {
|
||||
const searchPage = new ServerSearchPage(page);
|
||||
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(searchPage.createServerButton).toBeVisible({ timeout: 15_000 });
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
await expect(page.locator('app-server-browser')).toBeVisible({ timeout: 15_000 });
|
||||
|
||||
for (const roomName of hiddenRoomNames) {
|
||||
await expectSavedRoomHidden(page, roomName);
|
||||
@@ -235,15 +233,15 @@ async function expectBlankSlate(page: Page, hiddenRoomNames: string[]): Promise<
|
||||
|
||||
async function expectSavedRoomVisible(page: Page, roomName: string): Promise<void> {
|
||||
await expect(getRailSavedRoomButton(page, roomName)).toBeVisible({ timeout: 20_000 });
|
||||
await page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
await expect(getSearchSavedRoomButton(page, roomName)).toBeVisible({ timeout: 20_000 });
|
||||
}
|
||||
|
||||
async function expectSavedRoomHidden(page: Page, roomName: string): Promise<void> {
|
||||
await expect(getRailSavedRoomButton(page, roomName)).toHaveCount(0);
|
||||
|
||||
if (!page.url().includes('/search')) {
|
||||
await page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
if (!page.url().includes('/servers')) {
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
}
|
||||
|
||||
await expect(getSearchSavedRoomButton(page, roomName)).toHaveCount(0);
|
||||
@@ -254,7 +252,7 @@ function getRailSavedRoomButton(page: Page, roomName: string) {
|
||||
}
|
||||
|
||||
function getSearchSavedRoomButton(page: Page, roomName: string) {
|
||||
return page.locator('app-server-search').getByRole('button', { name: roomName, exact: true });
|
||||
return page.locator('app-server-browser').getByRole('button', { name: roomName, exact: true });
|
||||
}
|
||||
|
||||
async function retryTransientNavigation<T>(navigate: () => Promise<T>, attempts = 4): Promise<T> {
|
||||
|
||||
@@ -249,7 +249,7 @@ async function createSingleClientChatScenario(createClient: () => Promise<Client
|
||||
credentials.password
|
||||
);
|
||||
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
|
||||
return {
|
||||
client,
|
||||
@@ -288,7 +288,7 @@ async function createChatScenario(createClient: () => Promise<Client>): Promise<
|
||||
aliceCredentials.password
|
||||
);
|
||||
|
||||
await expect(alice.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(alice.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
|
||||
await bobRegisterPage.goto();
|
||||
await bobRegisterPage.register(
|
||||
@@ -297,7 +297,7 @@ async function createChatScenario(createClient: () => Promise<Client>): Promise<
|
||||
bobCredentials.password
|
||||
);
|
||||
|
||||
await expect(bob.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(bob.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
|
||||
const aliceSearchPage = new ServerSearchPage(alice.page);
|
||||
|
||||
|
||||
@@ -51,9 +51,9 @@ test.describe('Direct message flow', () => {
|
||||
const scenario = await createDmScenario(createClient);
|
||||
|
||||
await disableLastViewedChatResume(scenario.alice.page);
|
||||
await scenario.alice.page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await expect(scenario.alice.page).toHaveURL(/\/search/, { timeout: 20_000 });
|
||||
await expect(scenario.alice.page.locator('app-server-search')).toBeVisible({ timeout: 20_000 });
|
||||
await scenario.alice.page.goto('/people', { waitUntil: 'domcontentloaded' });
|
||||
await expect(scenario.alice.page).toHaveURL(/\/people/, { timeout: 20_000 });
|
||||
await expect(scenario.alice.page.locator('app-find-people')).toBeVisible({ timeout: 20_000 });
|
||||
await expect(scenario.alice.page.locator('app-user-search-list')).toBeVisible({ timeout: 20_000 });
|
||||
const bobPeopleCard = scenario.alice.page
|
||||
.locator('app-user-search-list [data-testid$="-' + scenario.bobUserId + '"]', { hasText: 'Bob' })
|
||||
@@ -119,7 +119,7 @@ async function registerUser(page: Page, username: string, displayName: string):
|
||||
|
||||
await registerPage.goto();
|
||||
await registerPage.register(username, displayName, 'TestPass123!');
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function openDmFromRoomUserCard(page: Page, displayName: string): Promise<void> {
|
||||
|
||||
@@ -140,7 +140,7 @@ async function registerUser(page: Page, username: string, displayName: string, p
|
||||
|
||||
await registerPage.goto();
|
||||
await registerPage.register(username, displayName, password);
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function installDesktopNotificationSpy(page: Page): Promise<void> {
|
||||
|
||||
@@ -380,7 +380,7 @@ async function registerUser(client: PersistentClient): Promise<void> {
|
||||
|
||||
await retryTransientNavigation(() => registerPage.goto());
|
||||
await registerPage.register(client.user.username, client.user.displayName, client.user.password);
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function joinServerFromSearch(page: Page, serverName: string): Promise<void> {
|
||||
|
||||
@@ -142,11 +142,11 @@ test.describe('Server icon sync', () => {
|
||||
await test.step('Dave has not joined, but discovery loads the icon through a temporary peer sync', async () => {
|
||||
await registerUser(dave);
|
||||
await stripServerIconFromDirectorySearch(dave.page, serverName);
|
||||
await dave.page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await dave.page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
await new ServerSearchPage(dave.page).searchInput.fill(serverName);
|
||||
|
||||
await expectSearchResultIcon(dave.page, serverName, icon.dataUrl);
|
||||
await expect(dave.page).toHaveURL(/\/search/);
|
||||
await expect(dave.page).toHaveURL(/\/servers/);
|
||||
});
|
||||
} finally {
|
||||
await Promise.all(
|
||||
@@ -209,7 +209,7 @@ async function registerUser(client: PersistentClient): Promise<void> {
|
||||
|
||||
await retryTransientNavigation(() => registerPage.goto());
|
||||
await registerPage.register(client.user.username, client.user.displayName, client.user.password);
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
async function joinServerFromSearch(page: Page, serverName: string): Promise<void> {
|
||||
@@ -403,7 +403,7 @@ async function expectRailIcon(page: Page, serverName: string, expectedDataUrl: s
|
||||
}
|
||||
|
||||
async function expectSearchResultIcon(page: Page, serverName: string, expectedDataUrl: string): Promise<void> {
|
||||
const serverCard = page.locator('app-server-search div[title]', { hasText: serverName }).first();
|
||||
const serverCard = page.locator('app-server-browser div[title]', { hasText: serverName }).first();
|
||||
const image = serverCard.locator('[style*="background-image"]').first();
|
||||
|
||||
await expect(serverCard).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
@@ -137,7 +137,7 @@ async function registerUser(page: Page, username: string, displayName: string):
|
||||
|
||||
await registerPage.goto();
|
||||
await registerPage.register(username, displayName, 'TestPass123!');
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 30_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 30_000 });
|
||||
}
|
||||
|
||||
async function installGrantAndActivatePlugin(page: Page, installFromStore: boolean): Promise<void> {
|
||||
|
||||
@@ -15,7 +15,7 @@ test.describe('Plugin manager UI', () => {
|
||||
await test.step('Register user and create server context', async () => {
|
||||
await register.goto();
|
||||
await register.register(`plugin_${suffix}`, 'Plugin Tester', 'TestPass123!');
|
||||
await expect(page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
await search.createServer(`Plugin API Server ${suffix}`, {
|
||||
description: 'Plugin manager UI E2E coverage'
|
||||
});
|
||||
|
||||
@@ -29,14 +29,14 @@ const BOB = { username: `bob_ss_${Date.now()}`, displayName: 'Bob', password: 'T
|
||||
const SERVER_NAME = `SS Test ${Date.now()}`;
|
||||
const VOICE_CHANNEL = 'General';
|
||||
|
||||
/** Register a user and navigate to /search. */
|
||||
/** Register a user and navigate to /dashboard. */
|
||||
async function registerUser(page: import('@playwright/test').Page, user: typeof ALICE) {
|
||||
const registerPage = new RegisterPage(page);
|
||||
|
||||
await registerPage.goto();
|
||||
await expect(registerPage.submitButton).toBeVisible();
|
||||
await registerPage.register(user.username, user.displayName, user.password);
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
}
|
||||
|
||||
/** Both users register -> Alice creates server -> Bob joins. */
|
||||
|
||||
@@ -88,7 +88,7 @@ test.describe('Connectivity warning', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`alice_${suffix}`, 'Alice', 'TestPass123!');
|
||||
await expect(alice.page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(alice.page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
});
|
||||
|
||||
await test.step('Register Bob', async () => {
|
||||
@@ -96,7 +96,7 @@ test.describe('Connectivity warning', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`bob_${suffix}`, 'Bob', 'TestPass123!');
|
||||
await expect(bob.page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(bob.page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
});
|
||||
|
||||
await test.step('Register Charlie', async () => {
|
||||
@@ -104,7 +104,7 @@ test.describe('Connectivity warning', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`charlie_${suffix}`, 'Charlie', 'TestPass123!');
|
||||
await expect(charlie.page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(charlie.page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
});
|
||||
|
||||
// ── Create server and have everyone join ──
|
||||
|
||||
@@ -9,7 +9,7 @@ test.describe('ICE server settings', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`user_${suffix}`, 'IceTestUser', 'TestPass123!');
|
||||
await expect(page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
await page.getByTitle('Settings').click();
|
||||
await expect(page.getByRole('button', { name: 'Network' })).toBeVisible({ timeout: 10_000 });
|
||||
await page.getByRole('button', { name: 'Network' }).click();
|
||||
|
||||
@@ -89,7 +89,7 @@ test.describe('STUN/TURN fallback behaviour', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`alice_${suffix}`, 'Alice', 'TestPass123!');
|
||||
await expect(alice.page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(alice.page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
});
|
||||
|
||||
await test.step('Register Bob', async () => {
|
||||
@@ -97,7 +97,7 @@ test.describe('STUN/TURN fallback behaviour', () => {
|
||||
|
||||
await register.goto();
|
||||
await register.register(`bob_${suffix}`, 'Bob', 'TestPass123!');
|
||||
await expect(bob.page.getByPlaceholder('Search servers and users...')).toBeVisible({ timeout: 30_000 });
|
||||
await expect(bob.page.getByPlaceholder('Search people, servers, or paste an invite...')).toBeVisible({ timeout: 30_000 });
|
||||
});
|
||||
|
||||
await test.step('Alice creates a server', async () => {
|
||||
|
||||
@@ -105,7 +105,7 @@ async function createVoiceScenario(
|
||||
|
||||
await registerPage.goto();
|
||||
await registerPage.register(client.username, client.displayName, USER_PASSWORD);
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 20_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 20_000 });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ test.describe('Direct private calls', () => {
|
||||
|
||||
await test.step('Alice starts a call from the search people card', async () => {
|
||||
await disableLastViewedChatResume(scenario.alice.page);
|
||||
await scenario.alice.page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await scenario.alice.page.goto('/people', { waitUntil: 'domcontentloaded' });
|
||||
await expect(scenario.alice.page.locator('app-user-search-list')).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
const bobPeopleCard = scenario.alice.page.locator(`[data-testid="user-card-${scenario.bobUserId}"]`, { hasText: 'Bob' }).first();
|
||||
@@ -597,12 +597,12 @@ async function registerUser(page: Page, username: string, displayName: string):
|
||||
|
||||
await registerPage.goto();
|
||||
await registerPage.register(username, displayName, USER_PASSWORD);
|
||||
await expect(page).toHaveURL(/\/search/, { timeout: 20_000 });
|
||||
await expect(page).toHaveURL(/\/dashboard/, { timeout: 20_000 });
|
||||
}
|
||||
|
||||
async function startCallFromSearch(page: Page, userId: string, displayName: string): Promise<void> {
|
||||
await disableLastViewedChatResume(page);
|
||||
await page.goto('/search', { waitUntil: 'domcontentloaded' });
|
||||
await page.goto('/people', { waitUntil: 'domcontentloaded' });
|
||||
const peopleCard = page.locator(`[data-testid="user-card-${userId}"]`, { hasText: displayName }).first();
|
||||
|
||||
await expect(peopleCard).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
@@ -136,7 +136,7 @@ test.describe('Mixed signal-config voice', () => {
|
||||
await registerPage.goto();
|
||||
await registerPage.serverSelect.selectOption(registrationEndpointId);
|
||||
await registerPage.register(client.user.username, client.user.displayName, client.user.password);
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 20_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 20_000 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -556,18 +556,13 @@ async function installDeterministicVoiceSettings(page: Page): Promise<void> {
|
||||
}
|
||||
|
||||
async function openSearchView(page: Page): Promise<void> {
|
||||
const searchInput = page.getByPlaceholder('Search servers and users...');
|
||||
|
||||
if (await searchInput.isVisible().catch(() => false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await page.locator('button[title="Create Server"]').click();
|
||||
await expect(searchInput).toBeVisible({ timeout: 20_000 });
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
await expect(page.getByPlaceholder('Search servers...')).toBeVisible({ timeout: 20_000 });
|
||||
}
|
||||
|
||||
async function joinRoomFromSearch(page: Page, roomName: string): Promise<void> {
|
||||
const searchInput = page.getByPlaceholder('Search servers and users...');
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
const searchInput = page.getByPlaceholder('Search servers...');
|
||||
|
||||
await expect(searchInput).toBeVisible({ timeout: 20_000 });
|
||||
await searchInput.fill(roomName);
|
||||
|
||||
@@ -71,7 +71,7 @@ test.describe('Dual-signal multi-user voice', () => {
|
||||
await registerPage.goto();
|
||||
await registerPage.serverSelect.selectOption(PRIMARY_SIGNAL_ID);
|
||||
await registerPage.register(client.user.username, client.user.displayName, client.user.password);
|
||||
await expect(client.page).toHaveURL(/\/search/, { timeout: 20_000 });
|
||||
await expect(client.page).toHaveURL(/\/dashboard/, { timeout: 20_000 });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -319,18 +319,13 @@ async function installDeterministicVoiceSettings(page: Page): Promise<void> {
|
||||
}
|
||||
|
||||
async function openSearchView(page: Page): Promise<void> {
|
||||
const searchInput = page.getByPlaceholder('Search servers and users...');
|
||||
|
||||
if (await searchInput.isVisible().catch(() => false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await page.locator('button[title="Create Server"]').click();
|
||||
await expect(searchInput).toBeVisible({ timeout: 20_000 });
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
await expect(page.getByPlaceholder('Search servers...')).toBeVisible({ timeout: 20_000 });
|
||||
}
|
||||
|
||||
async function joinRoomFromSearch(page: Page, roomName: string): Promise<void> {
|
||||
const searchInput = page.getByPlaceholder('Search servers and users...');
|
||||
await page.goto('/servers', { waitUntil: 'domcontentloaded' });
|
||||
const searchInput = page.getByPlaceholder('Search servers...');
|
||||
|
||||
await expect(searchInput).toBeVisible({ timeout: 20_000 });
|
||||
await searchInput.fill(roomName);
|
||||
|
||||
@@ -64,8 +64,8 @@ test.describe('Full user journey: register -> server -> voice chat', () => {
|
||||
await expect(registerPage.submitButton).toBeVisible();
|
||||
await registerPage.register(ALICE.username, ALICE.displayName, ALICE.password);
|
||||
|
||||
// After registration, app should navigate to /search
|
||||
await expect(alice.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
// After registration, app should navigate to /dashboard
|
||||
await expect(alice.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
});
|
||||
|
||||
await test.step('Bob registers an account', async () => {
|
||||
@@ -75,7 +75,7 @@ test.describe('Full user journey: register -> server -> voice chat', () => {
|
||||
await expect(registerPage.submitButton).toBeVisible();
|
||||
await registerPage.register(BOB.username, BOB.displayName, BOB.password);
|
||||
|
||||
await expect(bob.page).toHaveURL(/\/search/, { timeout: 15_000 });
|
||||
await expect(bob.page).toHaveURL(/\/dashboard/, { timeout: 15_000 });
|
||||
});
|
||||
|
||||
// ── Step 2: Alice creates a server ───────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user