164 lines
4.7 KiB
JavaScript
164 lines
4.7 KiB
JavaScript
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
const supertest = require('supertest');
|
||
|
|
const { compileStrapi, createStrapi } = require('@strapi/core');
|
||
|
|
|
||
|
|
const appRoot = path.resolve(__dirname, '..', '..');
|
||
|
|
const dbFile = path.join(appRoot, '.tmp', 'test.db');
|
||
|
|
|
||
|
|
const ensurePublicPermissions = async (strapi, actions) => {
|
||
|
|
const role = await strapi.db.query('plugin::users-permissions.role').findOne({
|
||
|
|
where: { type: 'public' },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!role) {
|
||
|
|
throw new Error('Public role not found');
|
||
|
|
}
|
||
|
|
|
||
|
|
const permissions = strapi.db.query('plugin::users-permissions.permission');
|
||
|
|
|
||
|
|
for (const action of actions) {
|
||
|
|
const existing = await permissions.findOne({
|
||
|
|
where: { action, role: role.id },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!existing) {
|
||
|
|
await permissions.create({
|
||
|
|
data: {
|
||
|
|
action,
|
||
|
|
role: role.id,
|
||
|
|
enabled: true,
|
||
|
|
},
|
||
|
|
});
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!existing.enabled) {
|
||
|
|
await permissions.update({
|
||
|
|
where: { id: existing.id },
|
||
|
|
data: { enabled: true },
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
describe('checkbox-list custom field (API)', () => {
|
||
|
|
let strapi;
|
||
|
|
let request;
|
||
|
|
|
||
|
|
beforeAll(async () => {
|
||
|
|
process.chdir(appRoot);
|
||
|
|
process.env.NODE_ENV = 'test';
|
||
|
|
process.env.HOST = '127.0.0.1';
|
||
|
|
process.env.PORT = '1339';
|
||
|
|
process.env.STRAPI_DISABLE_ADMIN = 'true';
|
||
|
|
process.env.STRAPI_TELEMETRY_DISABLED = 'true';
|
||
|
|
process.env.DATABASE_FILENAME = '.tmp/test.db';
|
||
|
|
process.env.JWT_SECRET = process.env.JWT_SECRET || 'test-jwt-secret';
|
||
|
|
process.env.ADMIN_JWT_SECRET = process.env.ADMIN_JWT_SECRET || 'test-admin-jwt-secret';
|
||
|
|
process.env.APP_KEYS =
|
||
|
|
process.env.APP_KEYS || 'testKey1,testKey2,testKey3,testKey4';
|
||
|
|
|
||
|
|
if (fs.existsSync(dbFile)) {
|
||
|
|
fs.rmSync(dbFile);
|
||
|
|
}
|
||
|
|
|
||
|
|
const appContext = await compileStrapi();
|
||
|
|
strapi = createStrapi(appContext);
|
||
|
|
strapi.log.level = 'error';
|
||
|
|
|
||
|
|
await strapi.start();
|
||
|
|
|
||
|
|
request = supertest(`http://127.0.0.1:${process.env.PORT}`);
|
||
|
|
|
||
|
|
await ensurePublicPermissions(strapi, [
|
||
|
|
'api::checkbox-item.checkbox-item.find',
|
||
|
|
'api::checkbox-item.checkbox-item.findOne',
|
||
|
|
'api::checkbox-item.checkbox-item.create',
|
||
|
|
'api::checkbox-item.checkbox-item.update',
|
||
|
|
'api::checkbox-item.checkbox-item.delete',
|
||
|
|
]);
|
||
|
|
});
|
||
|
|
|
||
|
|
afterAll(async () => {
|
||
|
|
if (strapi) {
|
||
|
|
await strapi.destroy();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test('creates and reads entries with checkbox list values', async () => {
|
||
|
|
const createResponse = await request.post('/api/checkbox-items').send({
|
||
|
|
data: {
|
||
|
|
title: 'First',
|
||
|
|
choices: ['alpha', 'beta'],
|
||
|
|
choicesRequired: ['alpha'],
|
||
|
|
choicesPrivate: ['secret'],
|
||
|
|
choicesDefault: ['defaultA'],
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
expect([200, 201]).toContain(createResponse.status);
|
||
|
|
const documentId = createResponse.body?.data?.documentId;
|
||
|
|
expect(documentId).toBeTruthy();
|
||
|
|
|
||
|
|
const fetchResponse = await request.get(`/api/checkbox-items/${documentId}`);
|
||
|
|
expect(fetchResponse.status).toBe(200);
|
||
|
|
expect(fetchResponse.body?.data?.choices).toEqual(['alpha', 'beta']);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('enforces required checkbox list field', async () => {
|
||
|
|
const response = await request.post('/api/checkbox-items').send({
|
||
|
|
data: {
|
||
|
|
title: 'Missing required',
|
||
|
|
choices: ['alpha'],
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(response.status).toBe(400);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('applies default values and hides private field', async () => {
|
||
|
|
const createResponse = await request.post('/api/checkbox-items').send({
|
||
|
|
data: {
|
||
|
|
title: 'Defaults',
|
||
|
|
choices: ['beta'],
|
||
|
|
choicesRequired: ['beta'],
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
expect([200, 201]).toContain(createResponse.status);
|
||
|
|
const documentId = createResponse.body?.data?.documentId;
|
||
|
|
expect(documentId).toBeTruthy();
|
||
|
|
|
||
|
|
const fetchResponse = await request.get(`/api/checkbox-items/${documentId}`);
|
||
|
|
expect(fetchResponse.status).toBe(200);
|
||
|
|
|
||
|
|
const data = fetchResponse.body?.data;
|
||
|
|
expect(data?.choicesDefault).toEqual(['defaultA']);
|
||
|
|
expect(data?.choicesPrivate).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
test('updates entries with checkbox list values', async () => {
|
||
|
|
const createResponse = await request.post('/api/checkbox-items').send({
|
||
|
|
data: {
|
||
|
|
title: 'Update me',
|
||
|
|
choices: ['alpha'],
|
||
|
|
choicesRequired: ['alpha'],
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
const documentId = createResponse.body?.data?.documentId;
|
||
|
|
expect(documentId).toBeTruthy();
|
||
|
|
|
||
|
|
const updateResponse = await request.put(`/api/checkbox-items/${documentId}`).send({
|
||
|
|
data: {
|
||
|
|
choices: ['alpha', 'gamma'],
|
||
|
|
choicesRequired: ['alpha'],
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(updateResponse.status).toBe(200);
|
||
|
|
expect(updateResponse.body?.data?.choices).toEqual(['alpha', 'gamma']);
|
||
|
|
});
|
||
|
|
});
|