128 lines
3.2 KiB
JavaScript
128 lines
3.2 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { mkdtempSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import path from 'node:path';
|
|
import { pathToFileURL } from 'node:url';
|
|
import { build } from 'esbuild';
|
|
import { test } from 'vitest';
|
|
|
|
async function loadHelper() {
|
|
const tempDir = mkdtempSync(path.join(tmpdir(), 'pinme-worker-metadata-'));
|
|
const outfile = path.join(tempDir, 'workerMetadata.cjs');
|
|
|
|
await build({
|
|
entryPoints: [path.resolve('bin/utils/workerMetadata.ts')],
|
|
outfile,
|
|
bundle: true,
|
|
platform: 'node',
|
|
format: 'cjs',
|
|
target: 'node18',
|
|
});
|
|
|
|
return import(pathToFileURL(outfile).href);
|
|
}
|
|
|
|
function validMetadata(projectName = 'demo-project') {
|
|
return JSON.stringify({
|
|
main_module: 'worker.js',
|
|
project_name: projectName,
|
|
bindings: [
|
|
{
|
|
type: 'secret_text',
|
|
name: 'API_KEY',
|
|
text: 'real-api-key',
|
|
},
|
|
{
|
|
type: 'plain_text',
|
|
name: 'PROJECT_NAME',
|
|
text: projectName,
|
|
},
|
|
],
|
|
compatibility_date: '2024-01-01',
|
|
});
|
|
}
|
|
|
|
test('validateWorkerMetadataForCreate accepts platform metadata', async () => {
|
|
const { validateWorkerMetadataForCreate } = await loadHelper();
|
|
|
|
assert.doesNotThrow(() => {
|
|
validateWorkerMetadataForCreate(validMetadata(), 'demo-project');
|
|
});
|
|
});
|
|
|
|
test('validateWorkerMetadataForCreate rejects template placeholder metadata', async () => {
|
|
const { validateWorkerMetadataForCreate } = await loadHelper();
|
|
const templateMetadata = JSON.stringify({
|
|
api_key: 'xxx',
|
|
main_module: 'worker.js',
|
|
project_name: 'project_name',
|
|
compatibility_date: '2024-01-01',
|
|
bindings: [
|
|
{
|
|
type: 'secret_text',
|
|
name: 'API_KEY',
|
|
text: 'xxx',
|
|
},
|
|
],
|
|
});
|
|
|
|
assert.throws(
|
|
() => validateWorkerMetadataForCreate(templateMetadata, 'demo-project'),
|
|
/real API_KEY binding/,
|
|
);
|
|
});
|
|
|
|
test('validateWorkerMetadataForCreate rejects flagged API_KEY placeholder', async () => {
|
|
const { validateWorkerMetadataForCreate } = await loadHelper();
|
|
const metadata = JSON.stringify({
|
|
main_module: 'worker.js',
|
|
project_name: 'demo-project',
|
|
bindings: [
|
|
{
|
|
type: 'secret_text',
|
|
name: 'API_KEY',
|
|
text: '__PINME_API_KEY__',
|
|
},
|
|
{
|
|
type: 'plain_text',
|
|
name: 'PROJECT_NAME',
|
|
text: 'demo-project',
|
|
},
|
|
],
|
|
});
|
|
|
|
assert.throws(
|
|
() => validateWorkerMetadataForCreate(metadata, 'demo-project'),
|
|
/real API_KEY binding/,
|
|
);
|
|
});
|
|
|
|
test('validateWorkerMetadataForCreate requires matching PROJECT_NAME binding', async () => {
|
|
const { validateWorkerMetadataForCreate } = await loadHelper();
|
|
const metadata = JSON.stringify({
|
|
main_module: 'worker.js',
|
|
project_name: 'demo-project',
|
|
bindings: [
|
|
{
|
|
type: 'secret_text',
|
|
name: 'API_KEY',
|
|
text: 'real-api-key',
|
|
},
|
|
],
|
|
});
|
|
|
|
assert.throws(
|
|
() => validateWorkerMetadataForCreate(metadata, 'demo-project'),
|
|
/PROJECT_NAME binding/,
|
|
);
|
|
});
|
|
|
|
test('validateWorkerMetadataForCreate rejects invalid JSON', async () => {
|
|
const { validateWorkerMetadataForCreate } = await loadHelper();
|
|
|
|
assert.throws(
|
|
() => validateWorkerMetadataForCreate('{not json', 'demo-project'),
|
|
/valid JSON/,
|
|
);
|
|
});
|