mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-16 09:36:16 -08:00
test(asr): [PKG-ASR-01] freeze published interfaces and source contracts
This commit is contained in:
1 parent
3b016970f2
commit
a22586a172
16 files changed
+543
-7
No files matched your search
@@ -0,0 +1,31 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { execFileSync } from 'node:child_process'
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { archiveFiles, ensureArchive, hash, readMember, refactorDir } from './releases.mjs'
|
||||
|
||||
export async function verifyAsrContract() {
|
||||
const baseline = JSON.parse(fs.readFileSync(path.join(refactorDir, 'baselines/asr-release.json'), 'utf8'))
|
||||
const archives = new Map()
|
||||
for (const release of [baseline.release, ...baseline.previous]) {
|
||||
const archive = await ensureArchive(release)
|
||||
assert.deepEqual(archiveFiles(archive), Object.keys(release.files).sort())
|
||||
for (const [file, expected] of Object.entries(release.files))
|
||||
assert.equal(hash(readMember(archive, file)), expected, `${release.version}/${file}`)
|
||||
assert.deepEqual(JSON.parse(readMember(archive, 'package/package.json')), release.manifest)
|
||||
for (const field of ['main', 'module', 'types', 'legacy'])
|
||||
assert(Object.hasOwn(release.files, `package/${release.manifest[field].replace(/^\.\//, '')}`))
|
||||
const core = release.historicalCore
|
||||
const source = execFileSync('git', ['show', `${core.commit}:${core.file}`], { encoding: 'utf8' }).replaceAll('\r\n', '\n')
|
||||
assert.equal(hash(source), core.sha256LF)
|
||||
assert.equal(JSON.parse(source).version, core.version)
|
||||
archives.set(release.version, archive)
|
||||
}
|
||||
const sources = new Map()
|
||||
for (const [file, expected] of Object.entries(baseline.source)) {
|
||||
const source = execFileSync('git', ['show', `${baseline.sourceCommit}:${file}`], { encoding: 'utf8' }).replaceAll('\r\n', '\n')
|
||||
assert.equal(hash(source), expected, file)
|
||||
sources.set(file, source)
|
||||
}
|
||||
return { baseline, archives, sources }
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { Buffer } from 'node:buffer'
|
||||
// eslint-disable-next-line test/no-import-node-test -- Frozen published package evidence uses the repository runner.
|
||||
import test from 'node:test'
|
||||
import { verifyAsrContract } from './asr-contract.mjs'
|
||||
import { readMember } from './releases.mjs'
|
||||
|
||||
const { baseline, archives, sources } = await verifyAsrContract()
|
||||
const releases = [baseline.release, ...baseline.previous]
|
||||
test('ASR verifies both releases, twelve archive members, nine Git inputs and historical core references', () => {
|
||||
assert.deepEqual(releases.map(r => r.version), ['2.1.0', '2.0.0'])
|
||||
assert.equal(releases.reduce((n, r) => n + Object.keys(r.files).length, 0), 12)
|
||||
assert.equal(sources.size, 9)
|
||||
assert.deepEqual(releases.map(r => r.historicalCore.version), ['5.3.1', '5.3.1-beta.1'])
|
||||
for (const release of releases) {
|
||||
assert.equal(release.manifest.peerDependencies, undefined)
|
||||
assert.equal(release.manifest.engines, undefined)
|
||||
}
|
||||
})
|
||||
test('ASR old declarations describe void callback/stop despite runtime consuming returned text and returning a Promise', () => {
|
||||
for (const release of releases) {
|
||||
const types = readMember(archives.get(release.version), 'package/types/artplayer-plugin-asr.d.ts').toString()
|
||||
assert.match(types, /onAudioChunk\?: \(chunk: AudioChunk\) => void \| Promise<void>/)
|
||||
assert.match(types, /stop: \(\) => void/)
|
||||
assert.match(types, /export default artplayerPluginAsr/)
|
||||
assert.match(types, /option\?: AsrPluginOption/)
|
||||
}
|
||||
})
|
||||
test('ASR actual published ESM exposes a lazy default factory without requiring a browser', async () => {
|
||||
for (const release of releases) {
|
||||
const source = readMember(archives.get(release.version), 'package/dist/artplayer-plugin-asr.mjs')
|
||||
const module = await import(`data:text/javascript;base64,${Buffer.from(source).toString('base64')}`)
|
||||
assert.deepEqual(Object.keys(module), ['default'])
|
||||
assert.equal(typeof module.default(), 'function')
|
||||
}
|
||||
})
|
||||
test('ASR source ships an inline Worklet; network transcription is caller-owned example behavior', () => {
|
||||
const source = sources.get('packages/artplayer-plugin-asr/src/index.js')
|
||||
assert.match(source, /registerProcessor\('recorder-processor'/)
|
||||
assert.doesNotMatch(source, /\bfetch\(|new WebSocket\(/)
|
||||
const demo = sources.get('docs/assets/example/asr.js')
|
||||
assert.match(demo, /await fetch\(api\)/)
|
||||
assert.match(demo, /new WebSocket\(url\)/)
|
||||
for (const release of releases)
|
||||
assert(!Object.keys(release.files).some(file => /worklet|worker|\.wasm/.test(file)))
|
||||
})
|
||||
Reference in new issue
Block a user