diff --git a/packages/backend/src/controllers/internal/api/v1/forms/create-form-submission.ee.test.js b/packages/backend/src/controllers/internal/api/v1/forms/create-form-submission.ee.test.js index da6b24ba..d30e5b9f 100644 --- a/packages/backend/src/controllers/internal/api/v1/forms/create-form-submission.ee.test.js +++ b/packages/backend/src/controllers/internal/api/v1/forms/create-form-submission.ee.test.js @@ -26,13 +26,15 @@ describe('POST /internal/api/v1/forms/:formId', () => { parameters: { fields: [ { - key: 'name', - type: 'string', + fieldName: 'email', + fieldKey: 'email', + fieldType: 'string', required: true, }, { - key: 'email', - type: 'string', + fieldName: 'name', + fieldKey: 'name', + fieldType: 'string', required: true, }, ], diff --git a/packages/backend/src/controllers/internal/api/v1/forms/get-form.ee.test.js b/packages/backend/src/controllers/internal/api/v1/forms/get-form.ee.test.js new file mode 100644 index 00000000..47504478 --- /dev/null +++ b/packages/backend/src/controllers/internal/api/v1/forms/get-form.ee.test.js @@ -0,0 +1,73 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import request from 'supertest'; +import Crypto from 'crypto'; +import app from '../../../../../app.js'; +import { createUser } from '../../../../../../test/factories/user.js'; +import { createFlow } from '../../../../../../test/factories/flow.js'; +import { createStep } from '../../../../../../test/factories/step.js'; +import * as license from '../../../../../helpers/license.ee.js'; +import getFormMock from '../../../../../../test/mocks/rest/internal/api/v1/forms/get-form.ee.js'; + +describe('GET /internal/api/v1/forms/:formId', () => { + let currentUser, flow, formStep; + + beforeEach(async () => { + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + + currentUser = await createUser(); + flow = await createFlow({ userId: currentUser.id }); + + formStep = await createStep({ + flowId: flow.id, + appKey: 'forms', + key: 'form', + type: 'trigger', + parameters: { + fields: [ + { + fieldKey: 'email', + fieldName: 'email', + fieldType: 'string', + required: true, + }, + { + fieldKey: 'name', + fieldName: 'name', + fieldType: 'string', + required: true, + }, + ], + }, + }); + }); + + it('should return form data when trigger step is forms', async () => { + const response = await request(app) + .get(`/internal/api/v1/forms/${flow.id}`) + .expect(200); + + const expectedPayload = getFormMock(flow, formStep); + + expect(response.body).toStrictEqual(expectedPayload); + }); + + it('should return 400 for invalid trigger step', async () => { + await formStep.$query().patch({ appKey: 'github' }); + + const response = await request(app) + .get(`/internal/api/v1/forms/${flow.id}`) + .expect(400); + + expect(response.body.errors).toStrictEqual({ + general: ['Invalid trigger step'], + }); + }); + + it('should return 404 for non-existent form', async () => { + const nonExistentFormId = Crypto.randomUUID(); + + await request(app) + .get(`/internal/api/v1/forms/${nonExistentFormId}`) + .expect(404); + }); +}); diff --git a/packages/backend/src/serializers/form.ee.js b/packages/backend/src/serializers/form.ee.js index 30f6a1e2..47c1cc7d 100644 --- a/packages/backend/src/serializers/form.ee.js +++ b/packages/backend/src/serializers/form.ee.js @@ -1,11 +1,10 @@ -import stepSerializer from './step.js'; import slugify from 'slugify'; const formSerializer = (form) => { const formData = { id: form.id, name: form.name, - fields: form.steps[0].parameters.fields.map((parameter) => ({ + fields: form?.steps[0]?.parameters?.fields?.map((parameter) => ({ fieldKey: slugify(parameter.fieldName, { lower: true, strict: true, diff --git a/packages/backend/test/mocks/rest/internal/api/v1/forms/get-form.ee.js b/packages/backend/test/mocks/rest/internal/api/v1/forms/get-form.ee.js new file mode 100644 index 00000000..eb9f9f5c --- /dev/null +++ b/packages/backend/test/mocks/rest/internal/api/v1/forms/get-form.ee.js @@ -0,0 +1,24 @@ +const getFormMock = (flow, formStep) => { + const data = { + id: flow.id, + name: flow.name, + fields: formStep?.parameters?.fields?.map((field) => ({ + fieldKey: field.fieldKey, + fieldName: field.fieldName, + fieldType: field.fieldType, + })), + }; + + return { + data, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'Flow', + }, + }; +}; + +export default getFormMock;