diff --git a/src/services/network-lists-services/create-network-list-service.js b/src/services/network-lists-services/create-network-list-service.js index b093a54e8..74cd53c93 100644 --- a/src/services/network-lists-services/create-network-list-service.js +++ b/src/services/network-lists-services/create-network-list-service.js @@ -21,6 +21,19 @@ const adapt = (payload) => { } } +/** + * @param {Object} body - The response body. + * @returns {string} The result message based on the status code. + */ +const extractApiError = (body) => { + for (const keyError of Object.keys(body)) { + const errorValue = Array.isArray(body[keyError]) ? body[keyError][0] : body[keyError] + if (typeof errorValue === 'string') return errorValue + if (typeof errorValue === 'object' && errorValue.message) return errorValue.message[0] + } + return '' +} + /** * @param {Object} httpResponse - The HTTP response object. * @param {Object} httpResponse.body - The response body. @@ -36,7 +49,7 @@ const parseHttpResponse = (httpResponse) => { urlToEditView: `/network-lists/edit/${httpResponse.body.results.id}` } case 400: - const apiError = httpResponse.body.results[0] + const apiError = extractApiError(httpResponse.body) throw new Error(apiError).message case 401: throw new Errors.InvalidApiTokenError().message diff --git a/src/services/network-lists-services/edit-network-list-service.js b/src/services/network-lists-services/edit-network-list-service.js index 9b38b7aed..8396c7411 100644 --- a/src/services/network-lists-services/edit-network-list-service.js +++ b/src/services/network-lists-services/edit-network-list-service.js @@ -27,6 +27,19 @@ const adapt = (payload) => { } } +/** + * @param {Object} body - The response body. + * @returns {string} The result message based on the status code. + */ +const extractApiError = (body) => { + for (const keyError of Object.keys(body)) { + const errorValue = Array.isArray(body[keyError]) ? body[keyError][0] : body[keyError] + if (typeof errorValue === 'string') return errorValue + if (typeof errorValue === 'object' && errorValue.message) return errorValue.message[0] + } + return '' +} + /** * @param {Object} httpResponse - The HTTP response object. * @param {Object} httpResponse.body - The response body. @@ -39,7 +52,7 @@ const parseHttpResponse = (httpResponse) => { case 202: return 'Your network list has been edited' case 400: - const apiError = httpResponse.body.results[0] + const apiError = extractApiError(httpResponse.body) throw new Error(apiError).message case 401: throw new Errors.InvalidApiTokenError().message diff --git a/src/tests/services/network-lists-services/create-network-list-service.test.js b/src/tests/services/network-lists-services/create-network-list-service.test.js index 12b08437d..de6a2d616 100644 --- a/src/tests/services/network-lists-services/create-network-list-service.test.js +++ b/src/tests/services/network-lists-services/create-network-list-service.test.js @@ -60,7 +60,7 @@ describe('NetworkListsServices', () => { expect(data.feedback).toBe('Your network list has been created') }) - it('Should return an API error for an 40 error status', async () => { + it('Should return an API error for an 400 error status with a array of errors', async () => { const apiErrorMock = 'Network name "IP" is already in use on this account' vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ statusCode: 400, @@ -75,6 +75,21 @@ describe('NetworkListsServices', () => { expect(feedbackMessage).rejects.toThrow(apiErrorMock) }) + it('Should return an API error for an 400 error status with a single string error', async () => { + const apiErrorMock = 'Network name "IP" is already in use on this account' + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 400, + body: { + error: apiErrorMock + } + }) + const { sut } = makeSut() + + const feedbackMessage = sut(fixtures.networkMock) + + expect(feedbackMessage).rejects.toThrow(apiErrorMock) + }) + it.each([ { statusCode: 401, diff --git a/src/tests/services/network-lists-services/edit-network-list-service.test.js b/src/tests/services/network-lists-services/edit-network-list-service.test.js index 809d69a5f..2d043c870 100644 --- a/src/tests/services/network-lists-services/edit-network-list-service.test.js +++ b/src/tests/services/network-lists-services/edit-network-list-service.test.js @@ -51,7 +51,7 @@ describe('NetworkListsServices', () => { expect(feedbackMessage).toBe('Your network list has been edited') }) - it('Should return an API error for an 400 error status', async () => { + it('Should return an API error for an 400 error status with a array of errors', async () => { const apiErrorMock = 'Network name "IP" is already in use on this account' vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ statusCode: 400, @@ -66,6 +66,21 @@ describe('NetworkListsServices', () => { expect(feedbackMessage).rejects.toThrow(apiErrorMock) }) + it('Should return an API error for an 400 error status with a single string error', async () => { + const apiErrorMock = 'Network name "IP" is already in use on this account' + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 400, + body: { + error: apiErrorMock + } + }) + const { sut } = makeSut() + + const feedbackMessage = sut(fixtures.networkMock) + + expect(feedbackMessage).rejects.toThrow(apiErrorMock) + }) + it.each([ { statusCode: 401, diff --git a/src/views/NetworkLists/CreateView.vue b/src/views/NetworkLists/CreateView.vue index 6a77bf972..9017acc84 100644 --- a/src/views/NetworkLists/CreateView.vue +++ b/src/views/NetworkLists/CreateView.vue @@ -66,7 +66,7 @@ const handleTrackCreation = () => { tracker.product.productCreated({ - productName: 'Network Lists' + productName: 'Network List' }) } @@ -74,7 +74,7 @@ const { fieldName, message } = handleTrackerError(error) tracker.product .failedToCreate({ - productName: 'Network Lists', + productName: 'Network List', errorType: 'api', fieldName: fieldName.trim(), errorMessage: message diff --git a/src/views/NetworkLists/EditView.vue b/src/views/NetworkLists/EditView.vue index 21840eeb9..4725480ad 100644 --- a/src/views/NetworkLists/EditView.vue +++ b/src/views/NetworkLists/EditView.vue @@ -74,7 +74,7 @@ const handleTrackSuccessEdit = () => { tracker.product .productEdited({ - productName: 'Network Lists' + productName: 'Network List' }) .track() } @@ -82,7 +82,7 @@ const { fieldName, message } = handleTrackerError(error) tracker.product .failedToEdit({ - productName: 'Network Lists', + productName: 'Network List', errorType: 'api', fieldName: fieldName.trim(), errorMessage: message diff --git a/src/views/NetworkLists/ListView.vue b/src/views/NetworkLists/ListView.vue index 081e2a969..6ecf74347 100644 --- a/src/views/NetworkLists/ListView.vue +++ b/src/views/NetworkLists/ListView.vue @@ -77,13 +77,13 @@ const handleCreateTrackEvent = () => { tracker.product.clickToCreate({ - productName: 'Network Lists' + productName: 'Network List' }) } const handleTrackEditEvent = () => { tracker.product.clickToEdit({ - productName: 'Network Lists' + productName: 'Network List' }) }