89 lines
2.2 KiB
JavaScript
Raw Normal View History

'use strict';
2021-01-04 11:32:43 +01:00
const { omit, get } = require('lodash/fp');
const _ = require('lodash');
const modelsUtils = require('../models');
2020-12-29 16:43:53 +01:00
const { sanitizeEntity } = require('../../../packages/strapi-utils');
2021-01-04 11:32:43 +01:00
const actionRegistry = require('./action-registry');
const createTestBuilder = (options = {}) => {
const { initialState } = options;
2021-01-04 11:32:43 +01:00
const omitActions = omit('actions');
const getDefaultState = () => ({ actions: [], models: [], fixtures: {}, ...initialState });
const state = getDefaultState();
const addAction = (code, ...params) => {
2021-01-04 11:32:43 +01:00
const action = get(code, actionRegistry);
state.actions.push(action(...params));
};
return {
get models() {
2021-01-04 11:32:43 +01:00
return state.models;
},
get fixtures() {
2021-01-04 11:32:43 +01:00
return state.fixtures;
},
sanitizedFixtures(strapi) {
return _.mapValues(this.fixtures, (value, key) => this.sanitizedFixturesFor(key, strapi));
},
sanitizedFixturesFor(modelName, strapi) {
const model = strapi.getModel(modelName);
const fixtures = this.fixturesFor(modelName);
return sanitizeEntity(fixtures, { model });
},
fixturesFor(modelName) {
return this.fixtures[modelName];
},
addContentType(contentType) {
addAction('ct.create', contentType);
return this;
},
addContentTypes(contentTypes, { batch = true } = {}) {
addAction(batch ? 'ct.createBatch' : 'ct.createMany', contentTypes);
return this;
},
addComponent(component) {
addAction('comp.create', component);
return this;
},
2021-01-04 11:32:43 +01:00
addFixtures(model, entries) {
addAction('fixtures.create', model, entries, () => this.fixtures);
return this;
},
async build() {
2021-01-04 11:32:43 +01:00
for (const action of state.actions) {
const newState = await action.build(omitActions(state));
Object.assign(state, newState);
}
},
2021-01-04 11:32:43 +01:00
async cleanup(options = {}) {
const { enableTestDataAutoCleanup = true } = options;
if (enableTestDataAutoCleanup) {
for (const model of state.models.reverse()) {
await modelsUtils.cleanupModel(model.uid || model.modelName);
}
}
for (const action of state.actions.reverse()) {
await action.cleanup();
}
},
};
};
2021-01-04 11:32:43 +01:00
module.exports = { createTestBuilder };