import { test } from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' // 计分通道页的两个奖牌开关(设计 17 §八第 2 条)与小项页的「该项启用奖牌结算」。 // 项目没有组件测试工具,按仓库既有做法(avg-mode.test.ts)读源码断言接线。 const CHANNELS_SOURCE = readFileSync( new URL('../components/baseData/ChannelsSection.vue', import.meta.url), 'utf8', ) // 新增行的默认值(含「计入单位总分」按小项类型取值)在 channelRows.ts,见 channels-count-to-team.test.ts。 const CHANNEL_ROWS_SOURCE = readFileSync( new URL('../components/baseData/channelRows.ts', import.meta.url), 'utf8', ) const EVENTS_SOURCE = readFileSync( new URL('../components/baseData/SportsEventsSection.vue', import.meta.url), 'utf8', ) test('通道行带两个奖牌开关,缺字段按 true 归一', () => { assert.match(CHANNELS_SOURCE, /countToMedals: normalizeCountToMedals\(channel\.countToMedals\)/) assert.match(CHANNELS_SOURCE, /countToTeamMedals: normalizeCountToTeamMedals\(channel\.countToTeamMedals\)/) assert.match(CHANNELS_SOURCE, /发奖牌/) assert.match(CHANNELS_SOURCE, /个人奖牌并入单位金牌榜/) }) test('两个开关一起序列化进 ScoreChannelInput,scope=team 的值不被清掉', () => { // buildInputs 必须带上两个字段:PUT 是整体替换,漏掉等于把它们重置回默认(发牌)。 assert.match(CHANNELS_SOURCE, /countToMedals: row\.countToMedals/) assert.match(CHANNELS_SOURCE, /countToTeamMedals: row\.countToTeamMedals/) // 「个人奖牌并入单位金牌榜」只在 scope=athlete 的行显示;值本身原样回传。 assert.match(CHANNELS_SOURCE, /v-if="row\.scope === 'athlete'"/) assert.match(CHANNELS_SOURCE, /切换 scope 时不会被清掉/) }) test('新通道默认发奖牌并并入单位榜(与库表默认值一致)', () => { assert.match(CHANNEL_ROWS_SOURCE, /countToMedals: true,\s*\n\s*countToTeamMedals: true,/) }) test('小项编辑有「该项启用奖牌结算」开关,默认开并说清后果', () => { assert.match(EVENTS_SOURCE, /awardMedals: true,/) assert.match(EVENTS_SOURCE, /该项启用奖牌结算/) assert.match(EVENTS_SOURCE, /关闭后该小项只出积分不出奖牌|关闭「该项启用奖牌结算」后,该小项只出积分不出奖牌/) // 编辑已有小项时按当前值回填,不能每次都变成开。 assert.match(EVENTS_SOURCE, /awardMedals: normalizeAwardMedals\(event\.awardMedals\)/) // 保存时带上该字段(PUT 整体替换)。 assert.match(EVENTS_SOURCE, /awardMedals: eventForm\.value\.awardMedals/) }) test('小项页的通道摘要给「已关闭奖牌」的通道加可见徽标', () => { assert.match(EVENTS_SOURCE, /!channel\.countToMedals/) assert.match(EVENTS_SOURCE, /不发奖牌/) assert.match(EVENTS_SOURCE, /!channel\.countToTeamMedals/) assert.match(EVENTS_SOURCE, /个人奖牌不并入单位榜/) })