Add files via upload
This commit is contained in:
35 files changed
+14482
No files matched your search
@@ -0,0 +1,70 @@
|
||||
'use strict';
|
||||
|
||||
const assert = require('node:assert/strict');
|
||||
const fs = require('node:fs');
|
||||
const path = require('node:path');
|
||||
const vm = require('node:vm');
|
||||
|
||||
async function main() {
|
||||
const source = fs.readFileSync(path.join(__dirname, '..', 'source', 'audio_upload_server.cpp'), 'utf8');
|
||||
const script = source.match(/<script>([\s\S]*?)<\/script>/)?.[1];
|
||||
assert.ok(script, 'embedded upload script exists');
|
||||
|
||||
const handlers = {};
|
||||
const elements = new Map();
|
||||
for (const id of ['code', 'pair', 'pairStatus', 'connected', 'uploadPanel', 'track', 'file', 'send', 'status']) {
|
||||
elements.set(id, {
|
||||
value: '', hidden: id === 'connected' || id === 'uploadPanel',
|
||||
className: 'status', textContent: '', files: [], disabled: false,
|
||||
addEventListener(event, handler) { handlers[id + ':' + event] = handler; },
|
||||
});
|
||||
}
|
||||
elements.get('track').value = '0';
|
||||
elements.get('file').files = [{
|
||||
name: 'short.wav', size: 4, arrayBuffer: async () => new ArrayBuffer(4),
|
||||
}];
|
||||
|
||||
const token = 'a'.repeat(64);
|
||||
const requests = [];
|
||||
const fetch = async (url, options) => {
|
||||
requests.push({url, options});
|
||||
if (url === '/api/connect') return {ok: true, text: async () => token};
|
||||
if (url === '/api/upload') return {ok: true, text: async () => 'Received'};
|
||||
if (url === '/api/status') return {ok: true, text: async () => 'imported'};
|
||||
throw new Error('Unexpected request: ' + url);
|
||||
};
|
||||
class AudioContext {
|
||||
async decodeAudioData() {
|
||||
return {
|
||||
length: 1, sampleRate: 48000, numberOfChannels: 1,
|
||||
getChannelData: () => new Float32Array([0]),
|
||||
};
|
||||
}
|
||||
async close() {}
|
||||
}
|
||||
vm.runInNewContext(script, {
|
||||
document: {getElementById: id => elements.get(id)},
|
||||
window: {AudioContext}, fetch, Blob, ArrayBuffer, DataView,
|
||||
setTimeout: callback => callback(),
|
||||
});
|
||||
|
||||
elements.get('code').value = '123456';
|
||||
handlers['code:input']();
|
||||
await new Promise(setImmediate);
|
||||
assert.equal(elements.get('code').value, '123-456');
|
||||
assert.equal(requests[0].url, '/api/connect');
|
||||
assert.equal(requests[0].options.headers.Authorization, 'Bearer 123-456');
|
||||
assert.equal(elements.get('pair').hidden, true);
|
||||
assert.equal(elements.get('connected').hidden, false);
|
||||
assert.match(source, /id="connected"[^>]*>Connected to Nintendo Switch<\/div>/);
|
||||
assert.equal(elements.get('uploadPanel').hidden, false);
|
||||
|
||||
await handlers['send:click']();
|
||||
assert.equal(requests[1].url, '/api/upload');
|
||||
assert.equal(requests[1].options.headers.Authorization, 'Bearer ' + token);
|
||||
assert.equal(requests[2].url, '/api/status');
|
||||
assert.equal(requests[2].options.headers.Authorization, 'Bearer ' + token);
|
||||
assert.equal(elements.get('status').className, 'status ok');
|
||||
}
|
||||
|
||||
main().catch(error => { console.error(error); process.exitCode = 1; });
|
||||
Reference in new issue
Block a user
