Added new feature for document export, including API contracts, data model, implementation plan, and tests. Updated related configurations and instructions.

This commit is contained in:
2026-03-10 16:25:09 -05:00
parent 2acb04ad76
commit bf6f2eebd6
22 changed files with 2856 additions and 64 deletions

View File

@@ -0,0 +1,127 @@
/**
* Unit Tests: Format Selection Logic
*
* Tests the selectExportFormat helper function
* Verifies priority ordering: Markdown > HTML > PDF
*/
import { describe, it } from 'node:test';
import assert from 'node:assert';
// Load helper functions using vm.Script pattern (similar to proxy.js)
import { readFileSync } from 'fs';
import { Script } from 'vm';
// Create VM context with required globals
const vmContext = {
crypto: globalThis.crypto,
console: console
};
// Load googleDriveAdapterHelper.js
const helperCode = readFileSync('./src/globalVariables/googleDriveAdapterHelper.js', 'utf8');
const wrappedCode = `(function() {\n${helperCode}\n})()`;
const script = new Script(wrappedCode);
const helpers = script.runInNewContext(vmContext);
describe('Format Selection', () => {
describe('selectExportFormat', () => {
it('should prioritize text/x-markdown over other formats', () => {
const exportLinks = {
'text/x-markdown': 'https://example.com/export?format=md',
'text/html': 'https://example.com/export?format=html',
'application/pdf': 'https://example.com/export?format=pdf'
};
const result = helpers.selectExportFormat(exportLinks);
assert.strictEqual(result.contentType, 'text/x-markdown');
assert.strictEqual(result.extension, 'md');
assert.strictEqual(result.url, 'https://example.com/export?format=md');
});
it('should select text/html when markdown is unavailable', () => {
const exportLinks = {
'text/html': 'https://example.com/export?format=html',
'application/pdf': 'https://example.com/export?format=pdf'
};
const result = helpers.selectExportFormat(exportLinks);
assert.strictEqual(result.contentType, 'text/html');
assert.strictEqual(result.extension, 'html');
assert.strictEqual(result.url, 'https://example.com/export?format=html');
});
it('should select application/pdf when markdown and html are unavailable', () => {
const exportLinks = {
'application/pdf': 'https://example.com/export?format=pdf'
};
const result = helpers.selectExportFormat(exportLinks);
assert.strictEqual(result.contentType, 'application/pdf');
assert.strictEqual(result.extension, 'pdf');
assert.strictEqual(result.url, 'https://example.com/export?format=pdf');
});
it('should return null when no supported formats are available', () => {
const exportLinks = {
'text/plain': 'https://example.com/export?format=txt',
'application/json': 'https://example.com/export?format=json'
};
const result = helpers.selectExportFormat(exportLinks);
assert.strictEqual(result, null);
});
it('should return null when exportLinks is null', () => {
const result = helpers.selectExportFormat(null);
assert.strictEqual(result, null);
});
it('should return null when exportLinks is undefined', () => {
const result = helpers.selectExportFormat(undefined);
assert.strictEqual(result, null);
});
it('should return null when exportLinks is empty object', () => {
const result = helpers.selectExportFormat({});
assert.strictEqual(result, null);
});
it('should respect priority order even when formats appear in different order', () => {
const exportLinks = {
'application/pdf': 'https://example.com/export?format=pdf',
'text/x-markdown': 'https://example.com/export?format=md',
'text/html': 'https://example.com/export?format=html'
};
const result = helpers.selectExportFormat(exportLinks);
// Should still select Markdown despite PDF being first in object
assert.strictEqual(result.contentType, 'text/x-markdown');
});
});
describe('EXPORT_FORMATS constant', () => {
it('should define correct priority order', () => {
assert.ok(Array.isArray(helpers.EXPORT_FORMATS));
assert.strictEqual(helpers.EXPORT_FORMATS.length, 3);
// Verify order: Markdown > HTML > PDF
assert.strictEqual(helpers.EXPORT_FORMATS[0].mimeType, 'text/x-markdown');
assert.strictEqual(helpers.EXPORT_FORMATS[0].extension, 'md');
assert.strictEqual(helpers.EXPORT_FORMATS[1].mimeType, 'text/html');
assert.strictEqual(helpers.EXPORT_FORMATS[1].extension, 'html');
assert.strictEqual(helpers.EXPORT_FORMATS[2].mimeType, 'application/pdf');
assert.strictEqual(helpers.EXPORT_FORMATS[2].extension, 'pdf');
});
});
});