feat: Response mobile layout support v1
All checks were successful
Queue Release Build / prepare (push) Successful in 1m6s
Deploy Web Apps / deploy (push) Successful in 7m35s
Queue Release Build / build-windows (push) Successful in 29m57s
Queue Release Build / build-linux (push) Successful in 46m28s
Queue Release Build / finalize (push) Successful in 49s
All checks were successful
Queue Release Build / prepare (push) Successful in 1m6s
Deploy Web Apps / deploy (push) Successful in 7m35s
Queue Release Build / build-windows (push) Successful in 29m57s
Queue Release Build / build-linux (push) Successful in 46m28s
Queue Release Build / finalize (push) Successful in 49s
This commit is contained in:
@@ -39,7 +39,6 @@ test.describe('Plugin API multi-user runtime', () => {
|
||||
await closeSettingsModal(scenario.bob.page);
|
||||
await expect(soundboardComposerButton(scenario.bob.page)).toBeVisible({ timeout: 20_000 });
|
||||
await expect(scenario.bob.page.getByText(SOUND_BOARD_TEXT, { exact: true })).toBeVisible({ timeout: 20_000 });
|
||||
await expect(scenario.bob.page.getByTestId('e2e-plugin-owned-dom')).toHaveAttribute('data-plugin-owner', 'e2e.all-api-plugin');
|
||||
});
|
||||
|
||||
await test.step('Alice opens the plugin soundboard modal and plays a sound to voice', async () => {
|
||||
@@ -150,7 +149,7 @@ async function installGrantAndActivatePlugin(page: Page, installFromStore: boole
|
||||
await page.getByLabel('Plugin source manifest URL').fill(PLUGIN_SOURCE_URL);
|
||||
await page.getByRole('button', { name: 'Add Source' }).click();
|
||||
await expect(page.getByRole('heading', { name: PLUGIN_TITLE })).toBeVisible({ timeout: 20_000 });
|
||||
await page.getByRole('button', { exact: true, name: /^(Install|Install to Server)$/ }).click();
|
||||
await page.locator('article', { hasText: PLUGIN_TITLE }).getByRole('button', { exact: true, name: /^(Install|Install to Server)$/ }).click();
|
||||
await expect(page.getByRole('dialog', { name: PLUGIN_TITLE })).toBeVisible({ timeout: 10_000 });
|
||||
await page.getByRole('button', { name: 'Install and Activate' }).click();
|
||||
await expect(page.locator('article', { hasText: PLUGIN_TITLE }).getByText('Installed')).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
@@ -33,9 +33,11 @@ test.describe('Plugin manager UI', () => {
|
||||
await page.getByLabel('Plugin source manifest URL').fill('http://localhost:4200/plugins/e2e-plugin-source.json');
|
||||
await page.getByRole('button', { name: 'Add Source' }).click();
|
||||
await expect(page.getByRole('heading', { name: 'E2E All API Plugin' })).toBeVisible({ timeout: 15_000 });
|
||||
await page.getByRole('button', { name: 'Readme' }).click();
|
||||
const pluginCard = page.locator('article', { hasText: 'E2E All API Plugin' });
|
||||
|
||||
await pluginCard.getByRole('button', { name: 'Readme' }).click();
|
||||
await expect(page.getByText('Fixture plugin for Playwright coverage.')).toBeVisible({ timeout: 10_000 });
|
||||
await page.getByRole('button', { exact: true, name: /^(Install|Install to Server)$/ }).click();
|
||||
await pluginCard.getByRole('button', { exact: true, name: /^(Install|Install to Server)$/ }).click();
|
||||
const installDialog = page.getByRole('dialog', { name: 'E2E All API Plugin' });
|
||||
|
||||
await expect(installDialog).toBeVisible({ timeout: 10_000 });
|
||||
|
||||
@@ -90,10 +90,7 @@ test.describe('Direct private calls', () => {
|
||||
})
|
||||
.toBeGreaterThan(0);
|
||||
|
||||
await scenario.bob.page.getByRole('button', { name: 'Open private call' }).click();
|
||||
await expect(scenario.bob.page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
await scenario.bob.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await expect(scenario.bob.page.getByRole('button', { name: 'Leave call' })).toBeVisible({ timeout: 20_000 });
|
||||
await answerIncomingCall(scenario.bob.page);
|
||||
await expect(scenario.bob.page.locator('[data-testid^="server-rail-call-"]')).toHaveCount(1, { timeout: 20_000 });
|
||||
|
||||
await expect
|
||||
@@ -176,10 +173,7 @@ test.describe('Direct private calls', () => {
|
||||
})
|
||||
.toBeGreaterThan(0);
|
||||
|
||||
await charlie.page.getByRole('button', { name: 'Open private call' }).click();
|
||||
await expect(charlie.page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
await charlie.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await expect(charlie.page.getByRole('button', { name: 'Leave call' })).toBeVisible({ timeout: 20_000 });
|
||||
await answerIncomingCall(charlie.page);
|
||||
await expect(charlie.page.locator('app-private-call aside app-dm-chat').getByText(privateOnlyMessage)).toHaveCount(0);
|
||||
|
||||
await waitForConnectedPeerCount(scenario.alice.page, 2, 45_000);
|
||||
@@ -345,12 +339,7 @@ test.describe('Direct private calls', () => {
|
||||
})
|
||||
.toBeGreaterThan(charliePlayCountBeforeGroupCall);
|
||||
|
||||
await scenario.bob.page
|
||||
.getByRole('button', { name: 'Open private call' })
|
||||
.last()
|
||||
.click();
|
||||
|
||||
await scenario.bob.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await answerIncomingCall(scenario.bob.page);
|
||||
await expect
|
||||
.poll(async () => await getActiveCallAudioLoops(scenario.bob.page), {
|
||||
timeout: 10_000,
|
||||
@@ -358,12 +347,7 @@ test.describe('Direct private calls', () => {
|
||||
})
|
||||
.toBe(0);
|
||||
|
||||
await scenario.charlie.page
|
||||
.getByRole('button', { name: 'Open private call' })
|
||||
.last()
|
||||
.click();
|
||||
|
||||
await scenario.charlie.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await answerIncomingCall(scenario.charlie.page);
|
||||
await expect
|
||||
.poll(async () => await getActiveCallAudioLoops(scenario.charlie.page), {
|
||||
timeout: 10_000,
|
||||
@@ -378,10 +362,7 @@ test.describe('Direct private calls', () => {
|
||||
|
||||
await test.step('Alice starts a private call and Bob joins', async () => {
|
||||
await startCallFromSearch(scenario.alice.page, scenario.bobUserId, 'Bob');
|
||||
await scenario.bob.page.getByRole('button', { name: 'Open private call' }).click();
|
||||
await expect(scenario.bob.page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
await scenario.bob.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await expect(scenario.bob.page.getByRole('button', { name: 'Leave call' })).toBeVisible({ timeout: 20_000 });
|
||||
await answerIncomingCall(scenario.bob.page);
|
||||
|
||||
await waitForConnectedPeerCount(scenario.alice.page, 1, 45_000);
|
||||
await waitForConnectedPeerCount(scenario.bob.page, 1, 45_000);
|
||||
@@ -413,12 +394,11 @@ test.describe('Direct private calls', () => {
|
||||
|
||||
await test.step('Caller leaving before answer clears recipient call route and rail icon', async () => {
|
||||
await startCallFromSearch(scenario.alice.page, scenario.bobUserId, 'Bob');
|
||||
await scenario.bob.page.getByRole('button', { name: 'Open private call' }).click();
|
||||
await expect(scenario.bob.page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
await expect(incomingCallDialog(scenario.bob.page)).toBeVisible({ timeout: 20_000 });
|
||||
|
||||
await scenario.alice.page.getByRole('button', { name: 'Leave call' }).click();
|
||||
await expect(scenario.alice.page).toHaveURL(/\/dm\//, { timeout: 20_000 });
|
||||
await expect(scenario.bob.page).toHaveURL(/\/dm\//, { timeout: 20_000 });
|
||||
await expect(incomingCallDialog(scenario.bob.page)).toHaveCount(0, { timeout: 20_000 });
|
||||
await expect(scenario.bob.page.getByRole('button', { name: 'Open private call' })).toHaveCount(0);
|
||||
await expect(scenario.bob.page.locator('[data-testid^="server-rail-call-"]')).toHaveCount(0);
|
||||
await expect
|
||||
@@ -431,9 +411,7 @@ test.describe('Direct private calls', () => {
|
||||
|
||||
await test.step('Leaving an answered call clears local ringing and returns to DM', async () => {
|
||||
await startCallFromSearch(scenario.alice.page, scenario.bobUserId, 'Bob');
|
||||
await scenario.bob.page.getByRole('button', { name: 'Open private call' }).click();
|
||||
await scenario.bob.page.getByRole('button', { name: 'Join call' }).click();
|
||||
await expect(scenario.bob.page.getByRole('button', { name: 'Leave call' })).toBeVisible({ timeout: 20_000 });
|
||||
await answerIncomingCall(scenario.bob.page);
|
||||
|
||||
await scenario.bob.page.getByRole('button', { name: 'Leave call' }).click();
|
||||
await expect(scenario.bob.page).toHaveURL(/\/dm\//, { timeout: 20_000 });
|
||||
@@ -633,6 +611,30 @@ async function startCallFromSearch(page: Page, userId: string, displayName: stri
|
||||
await expect(page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
}
|
||||
|
||||
function incomingCallDialog(page: Page) {
|
||||
return page.getByRole('dialog', { name: /is calling/ });
|
||||
}
|
||||
|
||||
async function answerIncomingCall(page: Page): Promise<void> {
|
||||
const dialog = incomingCallDialog(page);
|
||||
|
||||
if (await dialog.isVisible({ timeout: 5_000 }).catch(() => false)) {
|
||||
await dialog.getByRole('button', { name: 'Answer' }).click();
|
||||
} else {
|
||||
await page.getByRole('button', { name: 'Open private call' }).last().click();
|
||||
await expect(page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
|
||||
const joinButton = page.getByRole('button', { name: 'Join call' });
|
||||
|
||||
if (await joinButton.isVisible({ timeout: 5_000 }).catch(() => false)) {
|
||||
await joinButton.click();
|
||||
}
|
||||
}
|
||||
|
||||
await expect(page).toHaveURL(/\/call\//, { timeout: 20_000 });
|
||||
await expect(page.getByRole('button', { name: 'Leave call' })).toBeVisible({ timeout: 20_000 });
|
||||
}
|
||||
|
||||
async function getCurrentUserId(page: Page): Promise<string> {
|
||||
return await page.evaluate(() => localStorage.getItem('metoyou_currentUserId') ?? '');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user