const assert = require('node:assert/strict') const { createServer } = require('node:http') const { nativeImage } = require('electron') const { soundCheckWav } = require('../dist-electron/electron/sound-check.js') module.exports = async ({ evaluate, poll }) => { const requests = [] let scenarioError = false const image = nativeImage.createFromBitmap(Buffer.alloc(4), { width: 1, height: 1 }).toPNG() const server = createServer((request, response) => { requests.push(request.url) request.resume() const send = (value, status = 200) => { response.writeHead(status, { 'Content-Type': 'application/json' }) response.end(JSON.stringify(value)) } const game = { ID: 7, name: 'Materials smoke', status: 'finish', scenario: { ID: 23, image: 'cover.png' } } if (request.url === '/api/auth/login') return send({ accessToken: 'TEST', refreshToken: 'REFRESH' }) if (request.url === '/api/users/me') return send({ user: { roles: ['organizer'] } }) if (request.url === '/api/playlists') return send({ playlists: [] }) if (request.url === '/api/games') return send({ games: [game] }) if (request.url === '/api/games/7') return send({ game }) if (request.url === '/api/games/7/screen-plan') return send({ plan: { steps: [{ mode: 2 }] } }) if (request.url === '/api/games/7/music') return send({ gamePlaylistId: 1, playlists: [{ ID: 1, name: 'Музыка', tracks: Array.from({ length: 13 }, (_, index) => ({ ID: index + 1, name: `Трек ${index}`, filename: `track-${index}.wav` })), }] }) if (request.url === '/api/scenarios/23') return send({ scenario: { ID: 23, image: 'cover.png', story: { background: 'background.png', introduction: { audio: 'intro.wav' } } } }, scenarioError ? 403 : 200) if (request.url.startsWith('/api/files/')) { response.writeHead(200, { 'Content-Type': request.url.endsWith('.png') ? 'image/png' : 'audio/wav' }) response.end(request.url.endsWith('.png') ? image : soundCheckWav) return } send({}, 404) }) await new Promise((resolve, reject) => { server.once('error', reject) server.listen(0, '127.0.0.1', resolve) }) try { const url = `http://127.0.0.1:${server.address().port}` await evaluate(`window.screenBridge.onlineAction(${JSON.stringify({ action: 'login', server: url, email: 'test@example.test', password: 'test-password' })})`) await evaluate('window.screenBridge.onlineAction({ action: "select-game", gameId: 7 })') const result = await evaluate('window.screenBridge.onlineState()') assert.equal(result.materials.length, 16) assert.ok(result.materials.every((m) => m.status === 'ready')) assert.ok(result.materials.some((m) => m.usages.some((u) => u.name === 'Фон'))) assert.ok(result.materials.some((m) => m.usages.some((u) => u.name === 'Вступление'))) assert.equal(result.screenId, null) assert.equal(result.materialsWarning, '') assert.ok(!requests.some((path) => path.startsWith('/api/screens'))) await poll(() => evaluate('document.body.textContent.includes("Материалы — загружено 16 из 16")'), 'all materials before screen connection') scenarioError = true await assert.rejects(evaluate('window.screenBridge.onlineAction({ action: "download", gameId: 7 })'), /Сохранённые материалы/) const incomplete = await evaluate('window.screenBridge.onlineState()') assert.equal(incomplete.materials.length, 16) assert.equal(incomplete.notice, '') await poll(() => evaluate('document.querySelector("[data-testid=materials-warning]")?.textContent.includes("неполный список")'), 'incomplete materials warning') console.log('SCREEN_MATERIALS_PREPARE_PASS') } finally { server.closeAllConnections() await new Promise((resolve) => server.close(resolve)) } }