mirror of
https://github.com/jkingsman/Remote-Terminal-for-MeshCore.git
synced 2026-07-03 08:21:25 +02:00
84 lines
3.1 KiB
TypeScript
84 lines
3.1 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { createChannel, deleteChannel } from '../helpers/api';
|
|
|
|
const REOPEN_LAST_CONVERSATION_KEY = 'remoteterm-reopen-last-conversation';
|
|
const LAST_VIEWED_CONVERSATION_KEY = 'remoteterm-last-viewed-conversation';
|
|
|
|
function escapeRegex(value: string): string {
|
|
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
}
|
|
|
|
test.describe('Reopen last conversation (device-local)', () => {
|
|
let channelName = '';
|
|
let channelKey = '';
|
|
|
|
test.beforeAll(async () => {
|
|
channelName = `#e2ereopen${Date.now().toString().slice(-6)}`;
|
|
const channel = await createChannel(channelName);
|
|
channelKey = channel.key;
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
try {
|
|
await deleteChannel(channelKey);
|
|
} catch {
|
|
// Best-effort cleanup
|
|
}
|
|
});
|
|
|
|
test('reopens last viewed conversation on startup when enabled', async ({ page }) => {
|
|
await page.goto('/');
|
|
await expect(page.getByText('Connected')).toBeVisible();
|
|
await expect.poll(() => new URL(page.url()).hash).toBe('');
|
|
|
|
await page.getByText(channelName, { exact: true }).first().click();
|
|
await expect(
|
|
page.getByPlaceholder(new RegExp(`message\\s+${escapeRegex(channelName)}`, 'i'))
|
|
).toBeVisible();
|
|
|
|
await page.getByRole('button', { name: 'Settings' }).click();
|
|
await page.getByRole('button', { name: /Database & Interface/i }).click();
|
|
await page.getByLabel('Reopen to last viewed channel/conversation').check();
|
|
await page.getByRole('button', { name: 'Back to Chat' }).click();
|
|
|
|
// Fresh launch path without hash should restore the saved conversation.
|
|
await page.goto('/');
|
|
await expect(
|
|
page.getByPlaceholder(new RegExp(`message\\s+${escapeRegex(channelName)}`, 'i'))
|
|
).toBeVisible();
|
|
await expect.poll(() => new URL(page.url()).hash).toBe('');
|
|
});
|
|
|
|
test('clears local storage and falls back to default when disabled', async ({ page }) => {
|
|
await page.goto('/');
|
|
await expect(page.getByText('Connected')).toBeVisible();
|
|
|
|
await page.getByText(channelName, { exact: true }).first().click();
|
|
await expect(
|
|
page.getByPlaceholder(new RegExp(`message\\s+${escapeRegex(channelName)}`, 'i'))
|
|
).toBeVisible();
|
|
|
|
await page.getByRole('button', { name: 'Settings' }).click();
|
|
await page.getByRole('button', { name: /Database & Interface/i }).click();
|
|
|
|
const reopenToggle = page.getByLabel('Reopen to last viewed channel/conversation');
|
|
await reopenToggle.check();
|
|
await reopenToggle.uncheck();
|
|
|
|
const localState = await page.evaluate(
|
|
([enabledKey, lastViewedKey]) => ({
|
|
enabled: localStorage.getItem(enabledKey),
|
|
lastViewed: localStorage.getItem(lastViewedKey),
|
|
}),
|
|
[REOPEN_LAST_CONVERSATION_KEY, LAST_VIEWED_CONVERSATION_KEY]
|
|
);
|
|
expect(localState.enabled).toBeNull();
|
|
expect(localState.lastViewed).toBeNull();
|
|
|
|
await page.getByRole('button', { name: 'Back to Chat' }).click();
|
|
await page.goto('/');
|
|
await expect(page.getByPlaceholder(/message\s+Public/i)).toBeVisible();
|
|
await expect.poll(() => new URL(page.url()).hash).toBe('');
|
|
});
|
|
});
|