UNPKG

stackpress

Version:

Incept is a content management framework.

222 lines (211 loc) 8.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = generate; const helpers_js_1 = require("../../helpers.js"); const samples = [ { slug: 'foo-bar', string: 'foobar', number: 123, boolean: true, date: new Date(), array: ['foo', 'bar'], object: { foo: 'bar' } }, { slug: 'bar-foo', string: 'barfoo', number: 321, boolean: false, date: new Date(), array: ['bar', 'foo'], object: { bar: 'foo' } }, { slug: 'foo-zoo', string: 'foozoo', number: 123, boolean: true, date: new Date(), array: ['foo', 'zoo'], object: { foo: 'zoo' } }, { slug: 'bar-zoo', string: 'barzoo', number: 321, boolean: false, date: new Date(), array: ['bar', 'zoo'], object: { bar: 'zoo' } } ]; function generate(directory, registry) { const models = Array.from(registry.model.values()); const order = (0, helpers_js_1.sequence)(models); for (const model of order.reverse()) { const dependents = model.relations .filter(column => column.model) .map(column => { var _a, _b; return ({ foreign: (_a = column.relation) === null || _a === void 0 ? void 0 : _a.parent.key, local: (_b = column.relation) === null || _b === void 0 ? void 0 : _b.child.key, model: column.model }); }); const inputs = samples.map(sample => { const input = {}; model.fields.forEach(column => { const type = column.multiple ? 'array' : column.type === 'Json' ? 'object' : column.type === 'Hash' ? 'object' : column.type === 'Object' ? 'object' : column.type === 'Number' ? 'number' : column.type === 'Boolean' ? 'boolean' : column.type === 'Date' ? 'date' : 'string'; input[column.name] = sample[type]; }); return input; }); const source = directory.createSourceFile(`${model.name}/tests/events.ts`, '', { overwrite: true }); source.addImportDeclaration({ isTypeOnly: true, moduleSpecifier: '@stackpress/ingest', namedImports: ['HttpServer'] }); source.addImportDeclaration({ moduleSpecifier: 'mocha', namedImports: ['describe', 'it'] }); source.addImportDeclaration({ moduleSpecifier: 'chai', namedImports: ['expect'] }); source.addFunction({ isDefaultExport: true, name: `${model.title}EventTests`, parameters: [{ name: 'server', type: 'HttpServer' }], statements: (` describe('${model.title} Events', async () => { before(async () => { await server.resolve('${model.lower}-purge'); }); ${dependents.length > 0 ? (` const dependents: Record<string, any[]> = {}; before(async () => { ${dependents.map(dependent => { const name = dependent.local.name; const event = `'${dependent.model.lower}-search'`; return `dependents.${name} = ((await server.resolve(${event})).results as any[]) || [];`; }).join('\n')} }); `) : ''} it('should create ${model.title}', async () => { ${dependents.length > 0 ? (` const ids: Record<string, any> = {}; ${dependents.map(dependent => { const local = dependent.local.name; const foreign = dependent.foreign.name; return `ids.${local} = dependents.${local}[0].${foreign};`; }).join('\n')} const input = Object.assign({}, ${JSON.stringify(inputs[0])}, ids); `) : `const input = ${JSON.stringify(inputs[0])};`} const actual = await server.resolve('${model.lower}-create', input); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); ${dependents.length < 2 ? (` it('should batch ${model.title}', async () => { const rows = ${JSON.stringify(inputs.slice(2))}; ${dependents.map(dependent => { const local = dependent.local.name; const foreign = dependent.foreign.name; return ` rows[0].${local} = dependents.${local}[2].${foreign}; rows[1].${local} = dependents.${local}[3].${foreign}; `; }).join('\n')} const actual = await server.resolve('${model.lower}-batch', { rows }); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); `) : ''} it('should search ${model.title}', async () => { const actual = await server.resolve('${model.lower}-search'); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); expect(Array.isArray(actual.results)).to.be.true; }); ${model.ids.length ? (` it('should get ${model.title}', async () => { const response = await server.resolve('${model.lower}-search'); const row = response.results?.[0]; const key = '${model.ids[0].name}'; const value = row[key]; const actual = await server.resolve('${model.lower}-get', { key, value }); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); it('should get ${model.title} with ids', async () => { const response = await server.resolve('${model.lower}-search'); const row = response.results?.[0]; const ids = { ${model.ids.map(column => `${column.name}: row.${column.name}`).join(', ')} }; const actual = await server.resolve('${model.lower}-detail', ids); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); it('should update ${model.title}', async () => { const response = await server.resolve('${model.lower}-search'); const row = response.results?.[0]; const ids = { ${model.ids.map(column => `${column.name}: row.${column.name}`).join(', ')} }; const input: Partial<Record<string, any>> = ${JSON.stringify(inputs[1])}; Object.keys(ids).forEach(key => { delete input[key]; }); ${dependents.map(dependent => `delete input.${dependent.local.name};`).join('\n')} const actual = await server.resolve( '${model.lower}-update', { ...ids, ...input } ); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); it('should remove ${model.title}', async () => { const response = await server.resolve('${model.lower}-search'); const row = response.results?.[0]; const ids = { ${model.ids.map(column => `${column.name}: row.${column.name}`).join(', ')} }; const actual = await server.resolve('${model.lower}-remove', ids); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); ${model.active ? (` it('should restore ${model.title}', async () => { const response = await server.resolve( '${model.lower}-search', { filter: { ${model.active.name}: -1 } } ); const row = response.results?.[0]; const ids = { ${model.ids.map(column => `${column.name}: row.${column.name}`).join(', ')} }; const actual = await server.resolve('${model.lower}-restore', ids); expect(actual.code).to.equal(200); expect(actual.status).to.equal('OK'); }); `) : ''} `) : ''} }); `) }); } } ;