Files

164 lines
4.7 KiB
JavaScript
Raw Permalink Normal View History

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']);
});
});