test: Add 8 people voice tests
This commit is contained in:
@@ -19,13 +19,65 @@ export class ChatRoomPage {
|
||||
|
||||
/** Click a voice channel by name in the channels sidebar to join voice. */
|
||||
async joinVoiceChannel(channelName: string) {
|
||||
const channelButton = this.page.locator('app-rooms-side-panel')
|
||||
.getByRole('button', { name: channelName, exact: true });
|
||||
const channelButton = this.getVoiceChannelButton(channelName);
|
||||
|
||||
if (await channelButton.count() === 0) {
|
||||
await this.refreshRoomMetadata();
|
||||
}
|
||||
|
||||
if (await channelButton.count() === 0) {
|
||||
// Second attempt - metadata might still be syncing
|
||||
await this.page.waitForTimeout(2_000);
|
||||
await this.refreshRoomMetadata();
|
||||
}
|
||||
|
||||
await expect(channelButton).toBeVisible({ timeout: 15_000 });
|
||||
await channelButton.click();
|
||||
}
|
||||
|
||||
/** Creates a voice channel if it is not already present in the current room. */
|
||||
async ensureVoiceChannelExists(channelName: string) {
|
||||
const channelButton = this.getVoiceChannelButton(channelName);
|
||||
|
||||
if (await channelButton.count() > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.refreshRoomMetadata();
|
||||
|
||||
// Wait a bit longer for Angular to render the channel list after refresh
|
||||
try {
|
||||
await expect(channelButton).toBeVisible({ timeout: 5_000 });
|
||||
return;
|
||||
} catch {
|
||||
// Channel genuinely doesn't exist - create it
|
||||
}
|
||||
|
||||
await this.openCreateVoiceChannelDialog();
|
||||
|
||||
try {
|
||||
await this.createChannel(channelName);
|
||||
} catch {
|
||||
// If the dialog didn't close (e.g. duplicate name validation), dismiss it
|
||||
const dialog = this.page.locator('app-confirm-dialog');
|
||||
|
||||
if (await dialog.isVisible()) {
|
||||
const cancelButton = dialog.getByRole('button', { name: 'Cancel' });
|
||||
const closeButton = dialog.getByRole('button', { name: 'Close dialog' });
|
||||
|
||||
if (await cancelButton.isVisible()) {
|
||||
await cancelButton.click();
|
||||
} else if (await closeButton.isVisible()) {
|
||||
await closeButton.click();
|
||||
}
|
||||
|
||||
await expect(dialog).not.toBeVisible({ timeout: 5_000 }).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
await expect(channelButton).toBeVisible({ timeout: 15_000 });
|
||||
}
|
||||
|
||||
/** Click a text channel by name in the channels sidebar to switch chat rooms. */
|
||||
async joinTextChannel(channelName: string) {
|
||||
const channelButton = this.getTextChannelButton(channelName);
|
||||
@@ -100,6 +152,11 @@ export class ChatRoomPage {
|
||||
return this.voiceControls.locator('button:has(ng-icon[name="lucideMic"]), button:has(ng-icon[name="lucideMicOff"])').first();
|
||||
}
|
||||
|
||||
/** Get the deafen toggle button inside voice controls. */
|
||||
get deafenButton() {
|
||||
return this.voiceControls.locator('button:has(ng-icon[name="lucideHeadphones"])').first();
|
||||
}
|
||||
|
||||
/** Get the disconnect/hang-up button (destructive styled). */
|
||||
get disconnectButton() {
|
||||
return this.voiceControls.locator('button:has(ng-icon[name="lucidePhoneOff"])').first();
|
||||
@@ -112,10 +169,9 @@ export class ChatRoomPage {
|
||||
|
||||
/** Get the count of voice users listed under a voice channel. */
|
||||
async getVoiceUserCountInChannel(channelName: string): Promise<number> {
|
||||
const channelSection = this.page.locator('app-rooms-side-panel')
|
||||
.getByRole('button', { name: channelName })
|
||||
.locator('..');
|
||||
const userAvatars = channelSection.locator('app-user-avatar');
|
||||
// The voice channel button is inside a wrapper div; user avatars are siblings within that wrapper
|
||||
const channelWrapper = this.getVoiceChannelButton(channelName).locator('xpath=ancestor::div[1]');
|
||||
const userAvatars = channelWrapper.locator('app-user-avatar');
|
||||
|
||||
return userAvatars.count();
|
||||
}
|
||||
@@ -154,9 +210,11 @@ export class ChatRoomPage {
|
||||
}
|
||||
|
||||
private getTextChannelButton(channelName: string): Locator {
|
||||
const channelPattern = new RegExp(`#\\s*${escapeRegExp(channelName)}$`, 'i');
|
||||
return this.channelsSidePanel.locator(`button[data-channel-type="text"][data-channel-name="${channelName}"]`).first();
|
||||
}
|
||||
|
||||
return this.channelsSidePanel.getByRole('button', { name: channelPattern }).first();
|
||||
private getVoiceChannelButton(channelName: string): Locator {
|
||||
return this.channelsSidePanel.locator(`button[data-channel-type="voice"][data-channel-name="${channelName}"]`).first();
|
||||
}
|
||||
|
||||
private async createTextChannelThroughComponent(channelName: string): Promise<void> {
|
||||
@@ -384,7 +442,3 @@ export class ChatRoomPage {
|
||||
await this.page.waitForTimeout(500);
|
||||
}
|
||||
}
|
||||
|
||||
function escapeRegExp(value: string): string {
|
||||
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ import {
|
||||
export class ServerSearchPage {
|
||||
readonly searchInput: Locator;
|
||||
readonly createServerButton: Locator;
|
||||
readonly railCreateServerButton: Locator;
|
||||
readonly searchCreateServerButton: Locator;
|
||||
readonly settingsButton: Locator;
|
||||
|
||||
// Create server dialog
|
||||
@@ -21,7 +23,9 @@ export class ServerSearchPage {
|
||||
|
||||
constructor(private page: Page) {
|
||||
this.searchInput = page.getByPlaceholder('Search servers...');
|
||||
this.createServerButton = page.getByRole('button', { name: 'Create New Server' });
|
||||
this.railCreateServerButton = page.locator('button[title="Create Server"]');
|
||||
this.searchCreateServerButton = page.getByRole('button', { name: 'Create New Server' });
|
||||
this.createServerButton = this.searchCreateServerButton;
|
||||
this.settingsButton = page.locator('button[title="Settings"]');
|
||||
|
||||
// Create dialog elements
|
||||
@@ -39,8 +43,20 @@ export class ServerSearchPage {
|
||||
await this.page.goto('/search');
|
||||
}
|
||||
|
||||
async createServer(name: string, options?: { description?: string; topic?: string }) {
|
||||
await this.createServerButton.click();
|
||||
async createServer(name: string, options?: { description?: string; topic?: string; sourceId?: string }) {
|
||||
if (!await this.serverNameInput.isVisible()) {
|
||||
if (await this.searchCreateServerButton.isVisible()) {
|
||||
await this.searchCreateServerButton.click();
|
||||
} else {
|
||||
await this.railCreateServerButton.click();
|
||||
|
||||
if (!await this.serverNameInput.isVisible()) {
|
||||
await expect(this.searchCreateServerButton).toBeVisible({ timeout: 10_000 });
|
||||
await this.searchCreateServerButton.click();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await expect(this.serverNameInput).toBeVisible();
|
||||
await this.serverNameInput.fill(name);
|
||||
|
||||
@@ -52,6 +68,10 @@ export class ServerSearchPage {
|
||||
await this.serverTopicInput.fill(options.topic);
|
||||
}
|
||||
|
||||
if (options?.sourceId) {
|
||||
await this.signalEndpointSelect.selectOption(options.sourceId);
|
||||
}
|
||||
|
||||
await this.dialogCreateButton.click();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user