UNPKG

@gv-sh/specgen-server

Version:

SpecGen Server - API for Speculative Fiction Generator

253 lines (208 loc) 8.76 kB
/* global describe, test, expect, beforeAll */ const { request, createTestCategory, cleanDatabase, initDatabase } = require('./setup'); describe('Parameter API Tests', () => { let categoryId; let parameterId; // Setup beforeAll(async () => { // Make sure database file exists and is valid JSON await initDatabase(); await cleanDatabase(); // Create a test category const category = await createTestCategory(); categoryId = category.id; }); test('GET /api/parameters - Should return all parameters', async () => { const response = await request.get('/api/parameters'); expect(response.status).toBe(200); expect(response.body).toHaveProperty('success', true); expect(response.body).toHaveProperty('data'); expect(Array.isArray(response.body.data)).toBe(true); }); test('GET /api/parameters?categoryId - Should filter by category', async () => { const response = await request.get(`/api/parameters?categoryId=${categoryId}`); expect(response.status).toBe(200); expect(response.body).toHaveProperty('success', true); expect(response.body).toHaveProperty('data'); expect(Array.isArray(response.body.data)).toBe(true); // Verify that remaining parameters belong to the specified category response.body.data.forEach(param => { expect(param.categoryId).toBe(categoryId); }); }); test('POST /api/parameters - Should create a dropdown parameter', async () => { const newParameter = { name: 'Character Type', type: 'Dropdown', visibility: 'Basic', categoryId: categoryId, required: true, values: [ { label: 'Hero' }, { label: 'Villain' }, { label: 'Sidekick' } ] }; const response = await request.post('/api/parameters').send(newParameter); expect(response.status).toBe(201); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id'); expect(response.body.data).toHaveProperty('name', newParameter.name); expect(response.body.data).toHaveProperty('type', newParameter.type); expect(response.body.data).toHaveProperty('required', true); expect(response.body.data).toHaveProperty('values'); expect(Array.isArray(response.body.data.values)).toBe(true); expect(response.body.data.values.length).toBe(3); // Save parameter ID for later tests parameterId = response.body.data.id; }); test('POST /api/parameters - Should create a slider parameter', async () => { const newParameter = { name: 'Story Length', type: 'Slider', visibility: 'Basic', categoryId: categoryId, required: false, config: { min: 100, max: 10000, step: 100 } }; const response = await request.post('/api/parameters').send(newParameter); expect(response.status).toBe(201); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id'); expect(response.body.data).toHaveProperty('name', newParameter.name); expect(response.body.data).toHaveProperty('type', newParameter.type); expect(response.body.data).toHaveProperty('required', false); expect(response.body.data).toHaveProperty('config'); expect(response.body.data.config).toHaveProperty('min', 100); expect(response.body.data.config).toHaveProperty('max', 10000); }); test('POST /api/parameters - Should create a toggle switch parameter', async () => { const newParameter = { name: 'Happy Ending', type: 'Toggle Switch', visibility: 'Basic', categoryId: categoryId, required: false, values: { on: 'Yes', off: 'No' } }; const response = await request.post('/api/parameters').send(newParameter); expect(response.status).toBe(201); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id'); expect(response.body.data).toHaveProperty('name', newParameter.name); expect(response.body.data).toHaveProperty('type', newParameter.type); expect(response.body.data).toHaveProperty('required', false); expect(response.body.data).toHaveProperty('values'); expect(response.body.data.values).toHaveProperty('on', 'Yes'); expect(response.body.data.values).toHaveProperty('off', 'No'); }); test('GET /api/parameters/:id - Should return a specific parameter', async () => { // Skip if we don't have a valid parameterId if (!parameterId) { console.warn('Skipping test - no valid parameterId'); return; } const response = await request.get(`/api/parameters/${parameterId}`); expect(response.status).toBe(200); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id', parameterId); expect(response.body.data).toHaveProperty('name', 'Character Type'); }); test('PUT /api/parameters/:id - Should update a parameter', async () => { // Skip if we don't have a valid parameterId if (!parameterId) { console.warn('Skipping test - no valid parameterId'); return; } const updateData = { name: 'Updated Character Type', visibility: 'Advanced', required: false }; const response = await request.put(`/api/parameters/${parameterId}`).send(updateData); expect(response.status).toBe(200); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id', parameterId); expect(response.body.data).toHaveProperty('name', updateData.name); expect(response.body.data).toHaveProperty('visibility', updateData.visibility); expect(response.body.data).toHaveProperty('required', false); }); test('POST /api/parameters - Should validate required fields', async () => { const invalidParameter = { // Missing 'name' field type: 'Dropdown', visibility: 'Basic', categoryId: categoryId }; const response = await request.post('/api/parameters').send(invalidParameter); expect(response.status).toBe(400); expect(response.body).toHaveProperty('success', false); expect(response.body).toHaveProperty('error'); }); test('POST /api/parameters - Should validate parameter type', async () => { const invalidParameter = { name: 'Invalid Type', type: 'InvalidType', // Invalid type visibility: 'Basic', categoryId: categoryId }; const response = await request.post('/api/parameters').send(invalidParameter); expect(response.status).toBe(400); expect(response.body).toHaveProperty('success', false); expect(response.body).toHaveProperty('error'); }); test('POST /api/parameters - Should use default value for required field', async () => { const newParameter = { name: 'Default Required Parameter', type: 'Dropdown', visibility: 'Basic', categoryId: categoryId, // Not specifying required field values: [ { label: 'Option 1' }, { label: 'Option 2' } ] }; const response = await request.post('/api/parameters').send(newParameter); expect(response.status).toBe(201); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('id'); expect(response.body.data).toHaveProperty('required', false); // Should default to false }); test('DELETE /api/parameters/:id - Should delete a parameter', async () => { // First create a parameter specifically for deletion const newParameter = { name: 'Parameter To Delete', type: 'Dropdown', visibility: 'Basic', categoryId: categoryId, required: true, values: [ { label: 'Delete 1' }, { label: 'Delete 2' } ] }; const createResponse = await request.post('/api/parameters').send(newParameter); if (createResponse.status !== 201 || !createResponse.body.data || !createResponse.body.data.id) { console.warn('Skipping delete test - failed to create test parameter'); return; } const deleteId = createResponse.body.data.id; // Now delete it const response = await request.delete(`/api/parameters/${deleteId}`); expect(response.status).toBe(200); expect(response.body).toHaveProperty('success', true); expect(response.body.data).toHaveProperty('deletedParameter'); expect(response.body.data.deletedParameter).toHaveProperty('id', deleteId); // Verify it's gone const verifyResponse = await request.get(`/api/parameters/${deleteId}`); expect(verifyResponse.status).toBe(404); }); });