| | |
| | | |
| | | const stack = new Ticket04Stack() |
| | | |
| | | interface StoredCollectorState { |
| | | deviceCode: string |
| | | nextSequence: number |
| | | lastSampledAt: string |
| | | historyRecordCount?: number |
| | | latestMeasurements?: Record<string, unknown>[] |
| | | history?: unknown[] |
| | | } |
| | | |
| | | interface StoredSimulatorState { |
| | | collectors: StoredCollectorState[] |
| | | } |
| | | |
| | | test.beforeAll(async () => stack.start()) |
| | | test.afterAll(async () => stack.stop()) |
| | | |
| | |
| | | test('采集器登记后可观察独立实时与分页历史采样', async ({ page }) => { |
| | | await page.goto(`${stack.backendUrl}/dev/bts-simulator.html`) |
| | | page.once('dialog', dialog => dialog.accept()) |
| | | const simulatorReset = page.waitForResponse(response => response.request().method() === 'POST' |
| | | && response.url().endsWith('/dev/bts-simulator/reset') && response.ok()) |
| | | await page.getByRole('button', { name: '重置模拟器' }).click() |
| | | await simulatorReset |
| | | |
| | | let collector = page.locator('article.device').filter({ has: page.getByRole('heading', { name: 'dev-sim 采集器 1' }) }) |
| | | await expect(collector.getByText('S-01', { exact: true })).toBeVisible() |
| | | await expect(collector.getByText('S-04', { exact: true })).toBeVisible() |
| | | await collector.locator('label').filter({ hasText: '采样间隔(毫秒)' }).locator('input').fill('200') |
| | | const samplingSaved = page.waitForResponse(response => response.request().method() === 'PUT' |
| | | && response.url().endsWith('/dev/bts-simulator/collectors/1/sampling') && response.ok()) |
| | | await collector.getByRole('button', { name: '保存配置' }).click() |
| | | await samplingSaved |
| | | |
| | | collector = page.locator('article.device').filter({ has: page.getByRole('heading', { name: 'dev-sim 采集器 1' }) }) |
| | | await collector.getByLabel('S-01 测量项').fill([ |
| | |
| | | 'negative_potential=-0.116 V', |
| | | 'dynamic_pressure=101.3 kPa', |
| | | ].join('\n')) |
| | | const measurementsSaved = page.waitForResponse(response => response.request().method() === 'PUT' |
| | | && response.url().endsWith('/dev/bts-simulator/collectors/1/channels/S-01') && response.ok()) |
| | | await collector.getByRole('button', { name: '保存测量值' }).first().click() |
| | | await measurementsSaved |
| | | |
| | | collector = page.locator('article.device').filter({ has: page.getByRole('heading', { name: 'dev-sim 采集器 1' }) }) |
| | | await expect(collector.getByLabel('S-01 测量项')).toHaveValue(/dynamic_pressure=101\.3 kPa/) |
| | |
| | | await expect(collector.locator('.collector-output')).toContainText('/ 接收 2026-') |
| | | await collector.getByRole('button', { name: '下载历史' }).click() |
| | | await expect(collector.locator('.collector-output')).toContainText(/历史 \d+ 条 \/ 本页 \d+ 条/) |
| | | |
| | | const mainState = stack.redisCommand('GET', 'dev:bts-simulator:state:v1') |
| | | expect(mainState).not.toMatch(/\\?"history\\?"\s*:/) |
| | | expect(Number(stack.redisCommand( |
| | | 'LLEN', 'dev:bts-simulator:collector-history:v1:dev-sim-collector-1', |
| | | ))).toBeGreaterThan(0) |
| | | |
| | | await login(page) |
| | | await page.goto('/device-collector/new') |
| | |
| | | await expect(collector.getByLabel('S-01 测量项')).toHaveValue(/dynamic_pressure=101\.3 kPa/) |
| | | await collector.getByRole('button', { name: '下载历史' }).click() |
| | | await expect(collector.locator('.collector-output')).toContainText('dev-sim-collector-1') |
| | | expect(Number(stack.redisCommand( |
| | | 'LLEN', 'dev:bts-simulator:collector-history:v1:dev-sim-collector-1', |
| | | ))).toBeGreaterThan(0) |
| | | |
| | | const legacyState = stack.simulatorState<StoredSimulatorState>() |
| | | const legacyCollector = legacyState.collectors[0] |
| | | const legacyRecord = legacyCollector.latestMeasurements?.[0] |
| | | expect(legacyRecord).toBeDefined() |
| | | delete legacyCollector.historyRecordCount |
| | | delete legacyCollector.latestMeasurements |
| | | legacyCollector.history = [legacyRecord] |
| | | await stack.replaceSimulatorStateAndRestart(legacyState) |
| | | |
| | | const migratedState = stack.redisCommand('GET', 'dev:bts-simulator:state:v1') |
| | | expect(migratedState).not.toMatch(/\\?"history\\?"\s*:/) |
| | | expect(Number(stack.redisCommand( |
| | | 'LLEN', 'dev:bts-simulator:collector-history:v1:dev-sim-collector-1', |
| | | ))).toBeGreaterThan(1) |
| | | |
| | | await page.goto(`${stack.backendUrl}/dev/bts-simulator.html`) |
| | | collector = page.locator('article.device').filter({ has: page.getByRole('heading', { name: 'dev-sim 采集器 1' }) }) |
| | | await collector.getByRole('button', { name: '下载历史' }).click() |
| | | await expect(collector.locator('.collector-output')).toContainText('dev-sim-collector-1') |
| | | expect(stack.backendLog()).not.toContain('JSONLargeObjectException') |
| | | |
| | | const commands = await page.locator('#requests .request-command').allTextContents() |
| | | expect(commands.every(command => command === 'getdevinfo' || command === 'inquire')).toBe(true) |