diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml index 9fe5caa1b..bab60f83c 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/eslint.yml @@ -22,7 +22,7 @@ jobs: - name: Install SO Dependencies run: apk add --no-cache curl bash git - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} diff --git a/package.json b/package.json index 4ffc4c8e0..31711b25c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "azion-console-kit", - "version": "1.31.4", + "version": "1.31.5", "private": false, "type": "module", "repository": { diff --git a/src/router/routes/edge-dns-routes/index.js b/src/router/routes/edge-dns-routes/index.js index 4b9b6debc..00ae30a5c 100644 --- a/src/router/routes/edge-dns-routes/index.js +++ b/src/router/routes/edge-dns-routes/index.js @@ -1,7 +1,6 @@ import * as EdgeDNSService from '@/services/edge-dns-services' import * as EdgeDNSServiceV4 from '@/services/edge-dns-services/v4' - -import * as EdgeDNSRecordsService from '@/services/edge-dns-records-services' +import * as EdgeDNSRecordsServiceV4 from '@/services/edge-dns-records-services/v4' import * as Helpers from '@/helpers' /** @type {import('vue-router').RouteRecordRaw} */ @@ -56,8 +55,8 @@ export const edgeDnsRoutes = { props: { editEdgeDNSService: EdgeDNSServiceV4.editEdgeDNSService, loadEdgeDNSService: EdgeDNSServiceV4.loadEdgeDNSService, - listRecordsService: EdgeDNSRecordsService.listRecordsService, - deleteRecordsService: EdgeDNSRecordsService.deleteRecordsService, + listRecordsService: EdgeDNSRecordsServiceV4.listRecordsService, + deleteRecordsService: EdgeDNSRecordsServiceV4.deleteRecordsService, clipboardWrite: Helpers.clipboardWrite, updatedRedirect: 'list-edge-dns' }, @@ -80,11 +79,11 @@ export const edgeDnsRoutes = { props: { editEdgeDNSService: EdgeDNSService.editEdgeDNSService, loadEdgeDNSService: EdgeDNSService.loadEdgeDNSService, - listRecordsService: EdgeDNSRecordsService.listRecordsService, - deleteRecordsService: EdgeDNSRecordsService.deleteRecordsService, - createRecordsService: EdgeDNSRecordsService.createRecordsService, - editRecordsService: EdgeDNSRecordsService.editRecordsService, - loadRecordsService: EdgeDNSRecordsService.loadRecordsService, + listRecordsService: EdgeDNSRecordsServiceV4.listRecordsService, + deleteRecordsService: EdgeDNSRecordsServiceV4.deleteRecordsService, + createRecordsService: EdgeDNSRecordsServiceV4.createRecordsService, + editRecordsService: EdgeDNSRecordsServiceV4.editRecordsService, + loadRecordsService: EdgeDNSRecordsServiceV4.loadRecordsService, clipboardWrite: Helpers.clipboardWrite, documentationService: Helpers.documentationCatalog.records }, diff --git a/src/services/edge-dns-records-services/v4/create-records-service.js b/src/services/edge-dns-records-services/v4/create-records-service.js new file mode 100644 index 000000000..f3b5ff25d --- /dev/null +++ b/src/services/edge-dns-records-services/v4/create-records-service.js @@ -0,0 +1,50 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import * as Errors from '@/services/axios/errors' +import { makeEdgeDNSRecordsBaseUrl } from './make-edge-dns-records-base-url' +import { extractApiError } from '@/helpers/extract-api-error' + +export const createRecordsService = async (payload) => { + const adaptPayload = adapt(payload) + + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeEdgeDNSRecordsBaseUrl()}/${payload.edgeDNSID}/records`, + method: 'POST', + body: adaptPayload + }) + + return parseHttpResponse(httpResponse, payload.id) +} + +const adapt = (payload) => { + return { + record_type: payload.selectedRecordType, + policy: payload.selectedPolicy, + entry: payload.name, + answers_list: [payload.value], + ttl: payload.ttl, + description: payload.description, + weight: payload.weight + } +} + +/** + * @param {Object} httpResponse - The HTTP response object. + * @param {Object} httpResponse.body - The response body. + * @param {String} httpResponse.statusCode - The HTTP status code. + * @returns {string} The result message based on the status code. + * @throws {Error} If there is an error with the response. + */ +const parseHttpResponse = (httpResponse, edgeDNSID) => { + switch (httpResponse.statusCode) { + case 201: + return { + feedback: 'Edge DNS Record has been created', + urlToEditView: `/edge-dns/edit/${edgeDNSID}/records/edit/${httpResponse.body.data.id}` + } + case 500: + throw new Errors.InternalServerError().message + default: + const apiError = extractApiError(httpResponse) + throw new Error(apiError).message + } +} diff --git a/src/services/edge-dns-records-services/v4/delete-record-service.js b/src/services/edge-dns-records-services/v4/delete-record-service.js new file mode 100644 index 000000000..7619e6418 --- /dev/null +++ b/src/services/edge-dns-records-services/v4/delete-record-service.js @@ -0,0 +1,30 @@ +import * as Errors from '@/services/axios/errors' +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import { makeEdgeDNSRecordsBaseUrl } from './make-edge-dns-records-base-url' +import { extractApiError } from '@/helpers/extract-api-error' + +export const deleteRecordsService = async ({ recordID, edgeDNSID }) => { + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeEdgeDNSRecordsBaseUrl()}/${edgeDNSID}/records/${recordID}`, + method: 'DELETE' + }) + + return parseHttpResponse(httpResponse) +} + +/** + * @param {Object} httpResponse - The HTTP response object. + * @param {String} httpResponse.statusCode - The HTTP status code. + * @returns {string} The result message based on the status code. + * @throws {Error} If there is an error with the response. + */ +const parseHttpResponse = (httpResponse) => { + switch (httpResponse.statusCode) { + case 200: + return 'Edge DNS Record successfully deleted' + case 500: + throw new Errors.InternalServerError().message + default: + throw new Error(extractApiError(httpResponse)).message + } +} diff --git a/src/services/edge-dns-records-services/v4/edit-records-service.js b/src/services/edge-dns-records-services/v4/edit-records-service.js new file mode 100644 index 000000000..829e243cf --- /dev/null +++ b/src/services/edge-dns-records-services/v4/edit-records-service.js @@ -0,0 +1,46 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import * as Errors from '@/services/axios/errors' +import { makeEdgeDNSRecordsBaseUrl } from './make-edge-dns-records-base-url' +import { extractApiError } from '@/helpers/extract-api-error' + +export const editRecordsService = async (payload) => { + const adaptPayload = adapt(payload) + + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeEdgeDNSRecordsBaseUrl()}/${payload.edgeDNSId}/records/${payload.id}`, + method: 'PUT', + body: adaptPayload + }) + + return parseHttpResponse(httpResponse) +} + +const adapt = (payload) => { + return { + record_type: payload.selectedRecordType, + entry: payload.name, + answers_list: payload.value.split('\n'), + ttl: payload.ttl, + policy: payload.selectedPolicy, + weight: payload.weight, + description: payload.description + } +} + +/** + * @param {Object} httpResponse - The HTTP response object. + * @param {Object} httpResponse.body - The response body. + * @param {String} httpResponse.statusCode - The HTTP status code. + * @returns {string} The result message based on the status code. + * @throws {Error} If there is an error with the response. + */ +const parseHttpResponse = (httpResponse) => { + switch (httpResponse.statusCode) { + case 200: + return 'Edge DNS Record has been updated' + case 500: + throw new Errors.InternalServerError().message + default: + throw new Error(extractApiError(httpResponse)).message + } +} diff --git a/src/services/edge-dns-records-services/v4/index.js b/src/services/edge-dns-records-services/v4/index.js new file mode 100644 index 000000000..a2959a314 --- /dev/null +++ b/src/services/edge-dns-records-services/v4/index.js @@ -0,0 +1,13 @@ +import { createRecordsService } from './create-records-service' +import { listRecordsService } from './list-records-service' +import { loadRecordsService } from './load-record-service' +import { editRecordsService } from './edit-records-service' +import { deleteRecordsService } from './delete-record-service' + +export { + listRecordsService, + createRecordsService, + loadRecordsService, + editRecordsService, + deleteRecordsService +} diff --git a/src/services/edge-dns-records-services/v4/list-records-service.js b/src/services/edge-dns-records-services/v4/list-records-service.js new file mode 100644 index 000000000..e3c4e6c9e --- /dev/null +++ b/src/services/edge-dns-records-services/v4/list-records-service.js @@ -0,0 +1,43 @@ +import { AxiosHttpClientAdapter, parseHttpResponse } from '@/services/axios/AxiosHttpClientAdapter' +import { makeEdgeDNSRecordsBaseUrl } from './make-edge-dns-records-base-url' +import { makeListServiceQueryParams } from '@/helpers/make-list-service-query-params' + +export const listRecordsService = async ({ + search = '', + fields = '', + ordering = 'entry', + page = 1, + pageSize = 10, + id +}) => { + const searchParams = makeListServiceQueryParams({ ordering, fields, page, pageSize, search }) + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeEdgeDNSRecordsBaseUrl()}/${id}/records?${searchParams.toString()}`, + method: 'GET' + }) + + httpResponse = adapt(httpResponse) + return parseHttpResponse(httpResponse) +} + +const adapt = (httpResponse) => { + const isArray = Array.isArray(httpResponse.body.results) + + const parsedRecords = isArray + ? httpResponse.body.results.map((record) => ({ + id: record.id, + name: record.entry, + type: record.record_type, + value: record.answers_list, + ttl: record.ttl, + policy: record.policy, + weight: record.weight, + description: record.description ? record.description : '-' + })) + : [] + return { + count: httpResponse.body.count, + body: parsedRecords, + statusCode: httpResponse.statusCode + } +} diff --git a/src/services/edge-dns-records-services/v4/load-record-service.js b/src/services/edge-dns-records-services/v4/load-record-service.js new file mode 100644 index 000000000..912cbe656 --- /dev/null +++ b/src/services/edge-dns-records-services/v4/load-record-service.js @@ -0,0 +1,33 @@ +import { AxiosHttpClientAdapter, parseHttpResponse } from '@/services/axios/AxiosHttpClientAdapter' +import { makeEdgeDNSRecordsBaseUrl } from './make-edge-dns-records-base-url' + +export const loadRecordsService = async ({ id, edgeDNSId }) => { + let httpResponse = await AxiosHttpClientAdapter.request({ + url: `${makeEdgeDNSRecordsBaseUrl()}/${edgeDNSId}/records/${id}`, + method: 'GET' + }) + + httpResponse = adapt(httpResponse) + + return parseHttpResponse(httpResponse) +} + +const adapt = (httpResponse) => { + const record = httpResponse.body.data + + const parsedRecord = { + id: record.id, + name: record.entry, + selectedRecordType: record.record_type, + value: record.answers_list.join('\n'), + ttl: record.ttl, + selectedPolicy: record.policy, + weight: record.weight, + description: record.description + } + + return { + body: parsedRecord, + statusCode: httpResponse.statusCode + } +} diff --git a/src/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.js b/src/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.js new file mode 100644 index 000000000..365bfd940 --- /dev/null +++ b/src/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.js @@ -0,0 +1,3 @@ +export const makeEdgeDNSRecordsBaseUrl = () => { + return `v4/edge_dns/zones` +} diff --git a/src/templates/list-table-block/with-fetch-ordering-and-pagination.vue b/src/templates/list-table-block/with-fetch-ordering-and-pagination.vue index 9aa7bb8b8..f58c11379 100644 --- a/src/templates/list-table-block/with-fetch-ordering-and-pagination.vue +++ b/src/templates/list-table-block/with-fetch-ordering-and-pagination.vue @@ -674,7 +674,6 @@ const firstPage = 1 firstItemIndex.value = firstPage await reload({ ordering }) - savedOrdering.value = ordering sortFieldValue.value = sortField sortOrderValue.value = sortOrder diff --git a/src/tests/services/edge-dns-records-services/v4/create-records-service.test.js b/src/tests/services/edge-dns-records-services/v4/create-records-service.test.js new file mode 100644 index 000000000..2766245c0 --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/create-records-service.test.js @@ -0,0 +1,106 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import * as Errors from '@/services/axios/errors' +import { createRecordsService } from '@/services/edge-dns-records-services/v4' +import { describe, expect, it, vi } from 'vitest' + +const fixtures = { + recordMock: { + edgeDNSID: '123456', + selectedRecordType: 'A', + selectedPolicy: 'simple', + name: 'test.domain.com', + value: '192.168.0.1', + ttl: 3600, + description: 'Test record', + weight: 10, + id: '789' + } +} + +const makeSut = () => { + const sut = createRecordsService + return { sut } +} + +describe('EdgeDNSRecordsServices', () => { + it('should call API with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 201, + body: { + data: { + id: '123' + } + } + }) + const { sut } = makeSut() + + await sut(fixtures.recordMock) + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v4/edge_dns/zones/${fixtures.recordMock.edgeDNSID}/records`, + method: 'POST', + body: { + record_type: fixtures.recordMock.selectedRecordType, + policy: fixtures.recordMock.selectedPolicy, + entry: fixtures.recordMock.name, + answers_list: [fixtures.recordMock.value], + ttl: fixtures.recordMock.ttl, + description: fixtures.recordMock.description, + weight: fixtures.recordMock.weight + } + }) + }) + + it('should return feedback and URL when successfully creating a record', async () => { + const createdRecordId = '123' + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 201, + body: { + data: { + id: createdRecordId + } + } + }) + const { sut } = makeSut() + + const result = await sut(fixtures.recordMock) + + expect(result).toEqual({ + feedback: 'Edge DNS Record has been created', + urlToEditView: `/edge-dns/edit/${fixtures.recordMock.id}/records/edit/${createdRecordId}` + }) + }) + + it('should throw internal server error when request fails with 500 status code', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 500, + body: { + detail: 'Internal server error' + } + }) + + const { sut } = makeSut() + + const apiErrorResponse = sut(fixtures.recordMock) + const expectedError = new Errors.InternalServerError().message + + expect(apiErrorResponse).rejects.toBe(expectedError) + }) + + it('should throw parsing api error when request fails with non-500 status code', async () => { + const apiErrorMock = { + detail: 'api error message' + } + + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 400, + body: apiErrorMock + }) + + const { sut } = makeSut() + + const apiErrorResponse = sut(fixtures.recordMock) + + expect(apiErrorResponse).rejects.toBe('api error message') + }) +}) diff --git a/src/tests/services/edge-dns-records-services/v4/delete-record-service.test.js b/src/tests/services/edge-dns-records-services/v4/delete-record-service.test.js new file mode 100644 index 000000000..f0a9deb02 --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/delete-record-service.test.js @@ -0,0 +1,83 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import * as Errors from '@/services/axios/errors' +import { deleteRecordsService } from '@/services/edge-dns-records-services/v4/delete-record-service' +import { describe, expect, it, vi } from 'vitest' + +const fixtures = { + edgeDNSID: '550e8400-e29b-41d4-a716-446655440000', + recordID: '123456789' +} + +const makeSut = () => { + const sut = deleteRecordsService + return { sut } +} + +describe('EdgeDNSRecordsServices', () => { + it('should call API with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200 + }) + + const { sut } = makeSut() + await sut({ + edgeDNSID: fixtures.edgeDNSID, + recordID: fixtures.recordID + }) + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v4/edge_dns/zones/${fixtures.edgeDNSID}/records/${fixtures.recordID}`, + method: 'DELETE' + }) + }) + + it('should return a feedback message on successfully deleted', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200 + }) + + const { sut } = makeSut() + const feedback = await sut({ + edgeDNSID: fixtures.edgeDNSID, + recordID: fixtures.recordID + }) + + expect(feedback).toBe('Edge DNS Record successfully deleted') + }) + + it('should throw parsing api error when request fails', async () => { + const apiErrorMock = { + detail: 'api error message' + } + + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 400, + body: apiErrorMock + }) + + const { sut } = makeSut() + + const apiErrorResponse = sut({ + edgeDNSID: fixtures.edgeDNSID, + recordID: fixtures.recordID + }) + + expect(apiErrorResponse).rejects.toBe('api error message') + }) + + it('should throw internal server error when request fails with 500 status code', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 500 + }) + + const { sut } = makeSut() + + const apiErrorResponse = sut({ + edgeDNSID: fixtures.edgeDNSID, + recordID: fixtures.recordID + }) + const expectedError = new Errors.InternalServerError().message + + expect(apiErrorResponse).rejects.toBe(expectedError) + }) +}) diff --git a/src/tests/services/edge-dns-records-services/v4/edit-records-service.test.js b/src/tests/services/edge-dns-records-services/v4/edit-records-service.test.js new file mode 100644 index 000000000..95850c7eb --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/edit-records-service.test.js @@ -0,0 +1,89 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import * as Errors from '@/services/axios/errors' +import { editRecordsService } from '@/services/edge-dns-records-services/v4' +import { describe, expect, it, vi } from 'vitest' + +const fixtures = { + recordMock: { + edgeDNSId: 123456, + id: 789012, + selectedRecordType: 'A', + name: 'test.domain.com', + value: '192.168.1.1\n192.168.1.2', + ttl: 3600, + selectedPolicy: 'simple-round-robin', + weight: 10, + description: 'Test record description' + } +} + +const makeSut = () => { + const sut = editRecordsService + + return { sut } +} + +describe('EdgeDNSRecordsServices', () => { + it('should call API with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200 + }) + const { sut } = makeSut() + + await sut(fixtures.recordMock) + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v4/edge_dns/zones/${fixtures.recordMock.edgeDNSId}/records/${fixtures.recordMock.id}`, + method: 'PUT', + body: { + record_type: fixtures.recordMock.selectedRecordType, + entry: fixtures.recordMock.name, + answers_list: ['192.168.1.1', '192.168.1.2'], + ttl: fixtures.recordMock.ttl, + policy: fixtures.recordMock.selectedPolicy, + weight: fixtures.recordMock.weight, + description: fixtures.recordMock.description + } + }) + }) + + it('should return success message when record is updated', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200 + }) + const { sut } = makeSut() + + const result = await sut(fixtures.recordMock) + + expect(result).toBe('Edge DNS Record has been updated') + }) + + it('should throw internal server error when request fails with 500 status code', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 500, + body: { detail: 'Internal server error' } + }) + const { sut } = makeSut() + + const promise = sut(fixtures.recordMock) + const expectedError = new Errors.InternalServerError().message + + expect(promise).rejects.toBe(expectedError) + }) + + it('should throw API error when request fails with non-500 status code', async () => { + const apiErrorMock = { + detail: 'Invalid record configuration' + } + + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 400, + body: apiErrorMock + }) + const { sut } = makeSut() + + const promise = sut(fixtures.recordMock) + + expect(promise).rejects.toBe('Invalid record configuration') + }) +}) diff --git a/src/tests/services/edge-dns-records-services/v4/list-records-service.test.js b/src/tests/services/edge-dns-records-services/v4/list-records-service.test.js new file mode 100644 index 000000000..209babb4e --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/list-records-service.test.js @@ -0,0 +1,92 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import { listRecordsService } from '@/services/edge-dns-records-services/v4/list-records-service' +import { describe, expect, it, vi } from 'vitest' + +const fixtures = { + zoneId: 1234567890, + dnsRecordMock: { + id: '123', + entry: 'test.domain.com', + record_type: 'A', + answers_list: ['192.168.1.1'], + ttl: 3600, + policy: 'simple', + weight: 10, + description: 'Test DNS record' + } +} + +const makeSut = () => { + const sut = listRecordsService + return { sut } +} + +describe('EdgeDNSRecordsServicesV4', () => { + it('should call api with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { + results: [], + count: 0 + } + }) + + const { sut } = makeSut() + await sut({ + id: fixtures.zoneId + }) + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v4/edge_dns/zones/${fixtures.zoneId}/records?ordering=entry&page=1&page_size=10&fields=&search=`, + method: 'GET' + }) + }) + + it('should parse each dns record correctly', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { + results: [fixtures.dnsRecordMock], + count: 1 + } + }) + + const { sut } = makeSut() + const result = await sut({ + id: fixtures.zoneId + }) + + expect(result).toEqual({ + count: 1, + body: [ + { + id: fixtures.dnsRecordMock.id, + name: fixtures.dnsRecordMock.entry, + type: fixtures.dnsRecordMock.record_type, + value: fixtures.dnsRecordMock.answers_list, + ttl: fixtures.dnsRecordMock.ttl, + policy: fixtures.dnsRecordMock.policy, + weight: fixtures.dnsRecordMock.weight, + description: fixtures.dnsRecordMock.description + } + ] + }) + }) + + it('should return empty array when no results', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: { + results: [], + count: 0 + } + }) + + const { sut } = makeSut() + const result = await sut({ + id: fixtures.zoneId + }) + + expect(result).toEqual([]) + }) +}) diff --git a/src/tests/services/edge-dns-records-services/v4/load-record-service.test.js b/src/tests/services/edge-dns-records-services/v4/load-record-service.test.js new file mode 100644 index 000000000..d928aaf28 --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/load-record-service.test.js @@ -0,0 +1,91 @@ +import { AxiosHttpClientAdapter } from '@/services/axios/AxiosHttpClientAdapter' +import { loadRecordsService } from '@/services/edge-dns-records-services/v4/load-record-service' +import { describe, expect, it, vi } from 'vitest' + +const fixtures = { + edgeDNSId: 123456, + recordMock: { + data: { + id: 789, + entry: 'test.domain.com', + record_type: 'A', + answers_list: ['192.168.0.1', '192.168.0.2'], + ttl: 3600, + policy: 'simple', + weight: 10, + description: 'Test record' + } + } +} + +const makeSut = () => { + const sut = loadRecordsService + return { sut } +} + +describe('EdgeDNSRecordsServices', () => { + it('should call api with correct params', async () => { + const requestSpy = vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: fixtures.recordMock + }) + + const { sut } = makeSut() + await sut({ + edgeDNSId: fixtures.edgeDNSId, + id: fixtures.recordMock.data.id + }) + + expect(requestSpy).toHaveBeenCalledWith({ + url: `v4/edge_dns/zones/${fixtures.edgeDNSId}/records/${fixtures.recordMock.data.id}`, + method: 'GET' + }) + }) + + it('should correctly parse the record data', async () => { + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: fixtures.recordMock + }) + + const { sut } = makeSut() + const result = await sut({ + edgeDNSId: fixtures.edgeDNSId, + id: fixtures.recordMock.data.id + }) + + expect(result).toEqual({ + id: fixtures.recordMock.data.id, + name: fixtures.recordMock.data.entry, + selectedRecordType: fixtures.recordMock.data.record_type, + value: fixtures.recordMock.data.answers_list.join('\n'), + ttl: fixtures.recordMock.data.ttl, + selectedPolicy: fixtures.recordMock.data.policy, + weight: fixtures.recordMock.data.weight, + description: fixtures.recordMock.data.description + }) + }) + + it('should correctly join multiple answers into a single string', async () => { + const mockWithMultipleAnswers = { + ...fixtures.recordMock, + data: { + ...fixtures.recordMock.data, + answers_list: ['192.168.0.1', '192.168.0.2', '192.168.0.3'] + } + } + + vi.spyOn(AxiosHttpClientAdapter, 'request').mockResolvedValueOnce({ + statusCode: 200, + body: mockWithMultipleAnswers + }) + + const { sut } = makeSut() + const result = await sut({ + edgeDNSId: fixtures.edgeDNSId, + id: fixtures.recordMock.data.id + }) + + expect(result.value).toBe('192.168.0.1\n192.168.0.2\n192.168.0.3') + }) +}) diff --git a/src/tests/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.test.js b/src/tests/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.test.js new file mode 100644 index 000000000..f1658e7c7 --- /dev/null +++ b/src/tests/services/edge-dns-records-services/v4/make-edge-dns-records-base-url.test.js @@ -0,0 +1,22 @@ +import { makeEdgeDNSRecordsBaseUrl } from '@/services/edge-dns-records-services/v4/make-edge-dns-records-base-url' +import { assert, describe, it } from 'vitest' + +const makeSut = () => { + const sut = makeEdgeDNSRecordsBaseUrl + + return { + sut + } +} + +describe('EdgeDnsServicesV4', () => { + it('should return the API base url to edge dns service', () => { + const { sut } = makeSut() + const version = 'v4' + const correctApiUrl = `${version}/edge_dns/zones` + + const baseUrl = sut() + + assert.strictEqual(baseUrl, correctApiUrl) + }) +}) diff --git a/src/views/EdgeDNS/EditView.vue b/src/views/EdgeDNS/EditView.vue index 0bfda4906..dad82a64c 100644 --- a/src/views/EdgeDNS/EditView.vue +++ b/src/views/EdgeDNS/EditView.vue @@ -6,7 +6,7 @@ import CreateDrawerBlock from '@templates/create-drawer-block' import EditDrawerBlock from '@templates/edit-drawer-block' import EditFormBlock from '@templates/edit-form-block' - import ListTableNoHeaderBlock from '@templates/list-table-block' + import FetchListTableBlock from '@/templates/list-table-block/with-fetch-ordering-and-pagination' import PageHeadingBlock from '@templates/page-heading-block' import PrimeButton from 'primevue/button' import TabPanel from 'primevue/tabpanel' @@ -56,15 +56,18 @@ const recordListColumns = ref([ { field: 'name', - header: 'Name' + header: 'Name', + sortField: 'entry' }, { field: 'type', - header: 'Type' + header: 'Type', + sortField: 'record_type' }, { field: 'value', header: 'Value', + sortField: 'answers_list', filterPath: 'value.content', type: 'component', component: (columnData) => @@ -72,19 +75,23 @@ }, { field: 'ttl', - header: 'TTL (seconds)' + header: 'TTL (seconds)', + sortField: 'ttl' }, { field: 'policy', - header: 'Policy' + header: 'Policy', + sortField: 'policy' }, { field: 'weight', - header: 'Weight' + header: 'Weight', + sortField: 'weight' }, { field: 'description', - header: 'Description' + header: 'Description', + sortField: 'description' } ]) const RECORD_TYPE_WITHOUT_TTL = 'ANAME' @@ -141,6 +148,17 @@ edgeDNSID: yup.number() }) + const EDGE_DNS_RECORDS_FIELDS = [ + 'id', + 'entry', + 'record_type', + 'answers_list', + 'ttl', + 'policy', + 'weight', + 'description' + ] + const initialValuesCreateRecords = { name: '', selectedRecordType: 'A', @@ -152,6 +170,16 @@ edgeDNSID: route.params.id } + const handleCreatedSuccessfully = () => { + reloadResourcesList() + handleTrackSuccessCreated() + } + + const handleEditedSuccessfully = () => { + reloadResourcesList() + handleTrackSuccessEdit() + } + const reloadResourcesList = () => { if (hasContentToList.value) { listEDNSResourcesRef.value.reload() @@ -178,8 +206,8 @@ .track() } - const listRecordsServiceEdgeDNSDecorator = async () => { - return await props.listRecordsService({ id: edgeDNSID.value }) + const listRecordsServiceEdgeDNSDecorator = async (query) => { + return await props.listRecordsService({ id: edgeDNSID.value, ...query }) } const deleteRecordsServiceEdgeDNSDecorator = async (recordID) => { @@ -408,10 +436,11 @@ }" >