This commit is contained in:
2026-10-19 00:48:46 +07:00
parent 0f948b316a
commit 5635b8b5b1
13 changed files with 252 additions and 11 deletions
+63
View File
@@ -0,0 +1,63 @@
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))
}
}
+5
View File
@@ -219,6 +219,11 @@ app.whenReady().then(async () => {
(await evaluate('!!window.screenBridge && !!document.querySelector("main.control")')),
'control UI',
)
if (process.argv.includes('--materials-prepare')) {
await require('./materials-prepare-smoke.cjs')({ evaluate, poll })
app.exit(0)
return
}
if (process.argv.includes('--clear-games')) {
await evaluate(`window.screenBridge.selectPackage(${JSON.stringify(offlinePackage.key)})`)
await poll(() => evaluate('!!document.querySelector("[data-testid=clear-games]:not([disabled])")'), 'clear games button')