This commit is contained in:
gili8420 2026-08-14 00:01:49 +09:00
commit b43955e0d9
162 changed files with 15425 additions and 0 deletions

68
tests/e2e/flights.spec.ts Normal file
View file

@ -0,0 +1,68 @@
import { test, expect, type Page } from '@playwright/test';
const PUBLIC_ID = '550e8400-e29b-41d4-a716-446655440000'; // "ЯКС-1", public
const UNLISTED_ID = '550e8400-e29b-41d4-a716-446655440001'; // "Тестовый", unlisted
const PRIVATE_ID = '550e8400-e29b-41d4-a716-446655440002'; // "Секретный", admin-owned
async function login(page: Page, user: string, pass: string) {
await page.goto('/login/');
await page.fill('#lg-username', user);
await page.fill('#lg-password', pass);
await page.click('button[type=submit]');
await expect(page.getByTestId('nav-menu')).toBeVisible();
}
test('the public flight list is reachable without signing in', async ({ page }) => {
await page.goto('/flights/');
await expect(page.getByTestId('flights-list')).toBeVisible();
// Only public flights are listed — unlisted and private ones are not.
await expect(page.getByTestId('flights-list')).toContainText('ЯКС-1');
await expect(page.getByTestId('flights-list')).not.toContainText('Тестовый');
await expect(page.getByTestId('flights-list')).not.toContainText('Секретный');
});
test('a shared flight link opens anonymously and streams telemetry', async ({ page }) => {
await page.goto(`/track/${PUBLIC_ID}/`);
await expect(page.getByTestId('track-name')).toHaveText('ЯКС-1');
// History loads, then the socket takes over — no session involved.
await expect(page.getByTestId('track-readout')).toBeVisible({ timeout: 15000 });
await expect(page.getByTestId('track-status')).toContainText(/на связи|live/i, {
timeout: 15000
});
});
test('an unlisted flight opens by link but is absent from the list', async ({ page }) => {
await page.goto(`/track/${UNLISTED_ID}/`);
await expect(page.getByTestId('track-name')).toHaveText('Тестовый');
});
test('a private flight is not readable by others', async ({ page }) => {
// Anonymous: hidden.
await page.goto(`/track/${PRIVATE_ID}/`);
await expect(page.getByTestId('track-error')).toBeVisible();
// A signed-in non-owner: still hidden.
await login(page, 'demo', 'demo');
await page.goto(`/track/${PRIVATE_ID}/`);
await expect(page.getByTestId('track-error')).toBeVisible();
});
test('the owner sees a private flight and can change its tier', async ({ page }) => {
await login(page, 'admin', 'admin');
await page.goto(`/track/${PRIVATE_ID}/`);
await expect(page.getByTestId('track-name')).toHaveText('Секретный');
// Owners get the privacy control; it takes effect immediately.
const privacy = page.getByTestId('track-privacy');
await expect(privacy).toHaveValue('private');
await privacy.selectOption('public');
await expect(page.getByTestId('track-card')).toContainText(/публичный|public/i);
// Now it shows up on the public map, and reverting hides it again.
await page.goto('/flights/');
await expect(page.getByTestId('flights-list')).toContainText('Секретный');
await page.goto(`/track/${PRIVATE_ID}/`);
await page.getByTestId('track-privacy').selectOption('private');
await page.goto('/flights/');
await expect(page.getByTestId('flights-list')).not.toContainText('Секретный');
});