diff --git a/packages/dynamics-lib/src/index.js b/packages/dynamics-lib/src/index.js index a55c7a1cd..e896f4665 100644 --- a/packages/dynamics-lib/src/index.js +++ b/packages/dynamics-lib/src/index.js @@ -28,6 +28,7 @@ export * from './queries/concession-proof.queries.js' export * from './queries/pocl-validation-error.queries.js' export * from './queries/recurring-payments.queries.js' export * from './queries/contact.queries.js' +export * from './queries/activity.queries.js' // Framework functionality export * from './client/util.js' diff --git a/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js b/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js new file mode 100644 index 000000000..66290b415 --- /dev/null +++ b/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js @@ -0,0 +1,72 @@ +import { createActivity } from '../activity.queries.js' +import { dynamicsClient } from '../../client/dynamics-client.js' + +jest.mock('dynamics-web-api', () => { + return jest.fn().mockImplementation(() => { + return { + executeUnboundAction: jest.fn() + } + }) +}) + +describe('Activity Service', () => { + describe('createActivity', () => { + const mockResponse = { + '@odata.context': 'https://dynamics.com/api/data/v9.1/defra_CreateRCRActivityResponse', + RCRActivityId: 'abc123', + ReturnStatus: 'success', + SuccessMessage: 'RCR Activity - created successfully', + ErrorMessage: null, + oDataContext: 'https://dynamics.com/api/data/v9.1/defra_CreateRCRActivityResponse' + } + + const errorResponse = { + '@odata.context': 'https://dynamics.com/api/data/v9.1/.defra_CreateRCRActivityResponse', + RCRActivityId: null, + ReturnStatus: 'error', + SuccessMessage: '', + ErrorMessage: 'Failed to create activity', + oDataContext: 'https://dynamics.com/api/data/v9.1/$metadata#Microsoft.Dynamics.CRM.defra_CreateRCRActivityResponse' + } + + it('should call dynamicsClient with correct parameters', async () => { + dynamicsClient.executeUnboundAction.mockResolvedValue(mockResponse) + + await createActivity('contact-identifier-123', 2023) + + expect(dynamicsClient.executeUnboundAction).toHaveBeenCalledWith('defra_CreateRCRActivity', { + ContactId: 'contact-identifier-123', + ActivityStatus: 'STARTED', + Season: 2023 + }) + }) + + it('should return the CRM response correctly', async () => { + dynamicsClient.executeUnboundAction.mockResolvedValue(mockResponse) + + const result = await createActivity('contact-identifier-123', 2024) + + expect(result).toEqual(mockResponse) + }) + + it('should handle error in dynamicsClient response', async () => { + const error = new Error('Failed to create activity') + dynamicsClient.executeUnboundAction.mockRejectedValue(error) + + await expect(createActivity('contact-identifier-123', 2024)).rejects.toThrow('Failed to create activity') + }) + + it('should handle the case where activity creation fails', async () => { + dynamicsClient.executeUnboundAction.mockResolvedValue(errorResponse) + + const result = await createActivity('invalid-contact-id', 2024) + + expect(result).toMatchObject({ + RCRActivityId: null, + ReturnStatus: 'error', + SuccessMessage: '', + ErrorMessage: 'Failed to create activity' + }) + }) + }) +}) diff --git a/packages/dynamics-lib/src/queries/activity.queries.js b/packages/dynamics-lib/src/queries/activity.queries.js new file mode 100644 index 000000000..3a125c6f4 --- /dev/null +++ b/packages/dynamics-lib/src/queries/activity.queries.js @@ -0,0 +1,24 @@ +import { dynamicsClient } from '../client/dynamics-client.js' + +/** + * Creates an RCR Activity in Microsoft Dynamics CRM. + * + * @param {string} contactId - The ID of the contact associated with the activity. + * @param {number} season - The season year for which the activity is being created. + * @returns {Promise} - A promise that resolves to the response from Dynamics CRM. + * @property {string} response.@odata.context - The OData context URL of the response. + * @property {string} response.RCRActivityId - The unique identifier of the created RCR activity. + * @property {string} response.ReturnStatus - The status of the activity creation operation (e.g., 'success'). + * @property {string} response.SuccessMessage - A message indicating successful creation of the activity. + * @property {string|null} response.ErrorMessage - An error message if the activity creation failed, otherwise null. + * @property {string} response.oDataContext - The OData context URL of the response. + */ +export const createActivity = (contactId, season) => { + const request = { + ContactId: contactId, + ActivityStatus: 'STARTED', + Season: season + } + + return dynamicsClient.executeUnboundAction('defra_CreateRCRActivity', request) +}