stackpress
Version:
Incept is a content management framework.
222 lines (211 loc) • 8.85 kB
JavaScript
;
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');
});
`) : ''}
`) : ''}
});
`)
});
}
}
;