From ee32dedf61e2d2ab6704fd40eec2a9e436f2114f Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 5 Feb 2026 15:38:25 +0000 Subject: Enhance testing and integration for checkbox-list custom field - Updated Gitea workflow to trigger on pushes to the master branch and refined job configurations for testing and E2E processes. - Added Jest and Playwright configurations for integration and E2E testing. - Introduced new checkbox-item API with corresponding controller, service, and routes. - Created integration tests for the checkbox-list functionality, ensuring proper handling of required fields and default values. - Updated package.json and package-lock.json to include necessary dependencies for testing. --- playground/tests/integration/checkbox-list.test.js | 163 +++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 playground/tests/integration/checkbox-list.test.js (limited to 'playground/tests/integration/checkbox-list.test.js') diff --git a/playground/tests/integration/checkbox-list.test.js b/playground/tests/integration/checkbox-list.test.js new file mode 100644 index 0000000..0bcc402 --- /dev/null +++ b/playground/tests/integration/checkbox-list.test.js @@ -0,0 +1,163 @@ +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']); + }); +}); -- cgit v1.2.3