This commit is contained in:
2026-10-23 03:03:06 +07:00
parent 0ca8bc70d2
commit 24ddcdf66b
8 changed files with 300 additions and 5 deletions
+34 -1
View File
@@ -7,13 +7,15 @@ import ts from 'typescript'
import * as vue from 'vue'
import { compileScript, parse } from 'vue/compiler-sfc'
const presentationModule = { exports: {} }
runInNewContext(ts.transpile(readFileSync(new URL('../src/utils/screenPresentation.ts', import.meta.url), 'utf8'), { module: ts.ModuleKind.CommonJS }), { exports: presentationModule.exports, URL, TextEncoder })
function source(name) {
return parse(readFileSync(new URL(`../src/components/${name}.vue`, import.meta.url), 'utf8'))
.descriptor
}
function setup(name, props) {
const script = compileScript(source(name), { id: name })
const context = { exports: {}, require: (name) => (name === 'vue' ? vue : {}) }
const context = { exports: {}, require: (name) => (name === 'vue' ? vue : name === '@/utils/screenPresentation' ? presentationModule.exports : {}) }
runInNewContext(ts.transpile(script.content, { module: ts.ModuleKind.CommonJS }), context)
const events = []
const scope = vue.effectScope()
@@ -110,6 +112,14 @@ assert.equal(
screens.state.thumbnail({ mode: 'SCREEN_MODE_TEXT', text: 'Offline draft' }).text,
'Offline draft',
)
const timerStep = { timerLabel: 'Перерыв', timerType: 'SCREEN_TIMER_TYPE_BREAK' }
screens.state.setTimerType(timerStep, 'SCREEN_TIMER_TYPE_BEFORE_GAME')
assert.equal(timerStep.timerLabel, 'До начала игры')
timerStep.timerLabel = 'Обсуждение'
screens.state.setTimerType(timerStep, 'SCREEN_TIMER_TYPE_UNTIL_END')
assert.equal(timerStep.timerLabel, 'Обсуждение')
assert.equal(presentationModule.exports.validScreenQR('https://example.org'), true)
assert.equal(presentationModule.exports.validScreenQR('javascript:alert(1)'), false)
screens.stop()
function functions(name, names) {
@@ -320,3 +330,26 @@ assert.equal(media.currentTime, 23, 'Polling must not seek the player')
console.log(
'Screen controls: drafts, conflicts, explicit playlist IDs, timer/music controls, errors, stale polls and playback positions passed',
)
const browserTeams = {
state: vue.ref({ gameID: 7 }),
screenId: vue.ref('12'),
accessToken: vue.ref('test-token'),
screenTeamNames: vue.ref(),
lastTeamsLoaded: -Infinity,
screenClient: { GetScreenTeams: async () => ({ teams: [{ name: 'Ястребы' }, { name: 'Агенты' }] }) },
}
runInNewContext(ts.transpile(functions('ScreenPage', ['loadScreenTeams']), { target: ts.ScriptTarget.ES2022 }), browserTeams)
await browserTeams.loadScreenTeams()
assert.deepEqual(Array.from(browserTeams.screenTeamNames.value), ['Агенты', 'Ястребы'])
browserTeams.screenClient.GetScreenTeams = async () => { throw new Error('offline') }
await assert.rejects(browserTeams.loadScreenTeams(), /offline/)
assert.equal(browserTeams.screenTeamNames.value.length, 2)
let resolveTeams
browserTeams.screenClient.GetScreenTeams = () => new Promise(resolve => { resolveTeams = resolve })
const pendingTeams = browserTeams.loadScreenTeams()
browserTeams.state.value.gameID = 8
browserTeams.screenTeamNames.value = undefined
resolveTeams({ teams: [{ name: 'Из прошлой игры' }] })
await pendingTeams
assert.equal(browserTeams.screenTeamNames.value, undefined)