import {expect, test, describe, vi, beforeEach} from "vitest" import AdapterOfServices from '@adapters/adapterOfServices/Services' import ServiceOfServices from '@services/serviceOfServices/Services.js' import {addedService, updatedService, removedNewService, deletedService} from '@services/serviceOfServices/helpers.js' import { createStore } from 'vuex' import {store as services} from "@/store/modules/services" import axios from "axios"; vi.mock('axios') const defaultServices = [ { "id": 1, "created_at": "2024-03-06T17:31:31.948355541+03:00", "updated_at": "2024-03-06T17:31:31.948355541+03:00", "deleted_at": null, "name": "jsonplaceholder.typicode.com", "port": 9965, "proxy_ip": "172.25.78.153", "site_ip": "https://jsonplaceholder.typicode.com/", "internet_uri": "localhost", "description": "localhost", "is_online": true }, { "id": 2, "created_at": "2024-03-07T11:43:51.026265459+03:00", "updated_at": "2024-03-07T13:35:12.506368972+03:00", "deleted_at": null, "name": "new 2", "port": 4548, "proxy_ip": "172.25.78.151", "site_ip": "172.25.78.151", "internet_uri": "", "description": "new site 2", "is_online": true }, { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "new 3", "port": 2527, "proxy_ip": "172.25.78.151", "site_ip": "172.25.78.151", "internet_uri": "", "description": "new site 3...", "is_online": true } ] const resServices = [ { "id": 1, "createdAt": "2024-03-06T17:31:31.948355541+03:00", "updatedAt": "2024-03-06T17:31:31.948355541+03:00", "deletedAt": null, "name": "jsonplaceholder.typicode.com", "port": 9965, "proxyIp": "172.25.78.153", "deviceIp": "https://jsonplaceholder.typicode.com/", "internetUri": "localhost", "description": "localhost", "isOnline": true }, { "id": 2, "createdAt": "2024-03-07T11:43:51.026265459+03:00", "updatedAt": "2024-03-07T13:35:12.506368972+03:00", "deletedAt": null, "name": "new 2", "port": 4548, "proxyIp": "172.25.78.151", "deviceIp": "172.25.78.151", "internetUri": "", "description": "new site 2", "isOnline": true }, { "id": 3, "createdAt": "2024-03-07T11:43:51.027148541+03:00", "updatedAt": "2024-03-07T13:35:24.919273428+03:00", "deletedAt": null, "name": "new 3", "port": 2527, "proxyIp": "172.25.78.151", "deviceIp": "172.25.78.151", "internetUri": "", "description": "new site 3...", "isOnline": true } ] describe("tests services store with vuex", () => { const store = createStore({ plugins: [], modules: { services }, }) beforeEach(() => { store.dispatch('services/resetStore') }) const adapterOfServices = new AdapterOfServices(import.meta.env.VITE_API_ADDR) const serviceOfServices = new ServiceOfServices(adapterOfServices, store) axios.get.mockResolvedValue({ data: defaultServices, }) test('Upload services', async () => { const services = store.getters['services/services'] expect(services).toEqual([]) // empty services array of store await serviceOfServices.fetchServices() const uploadServices = store.getters['services/services'] expect(uploadServices).toEqual(resServices) // full services array of store }) test('Added new service layout to services of store', async () => { const expectedserviceData = {"port": "", "name": "", id: -1} await serviceOfServices.addNewServiceLayout() const selectedService = store.getters['services/selectedService'] const services = store.getters['services/services'] expect( { selectedService, services } ).toEqual({ selectedService: expectedserviceData, services: [expectedserviceData] }) }) test('Added new service to services of store', async () => { const newService = { id: 4, created_at: "2024-03-07T11:43:51.027148541+03:00", updated_at: "2024-03-07T13:35:24.919273428+03:00", deleted_at: null, name: 'test add new service', port: 2534, device_ip: '172.25.78.151', proxy_ip: '172.25.78.151', internet_uri: '', description: 'test add new service description', is_online: true } store.commit('services/setServices', resServices) const updatedServices = addedService(newService, store.getters['services/services']) store.commit('services/setServices', updatedServices) const services = store.getters['services/services'] expect(services[0].name).toEqual('test add new service') expect(services[0].description).toEqual('test add new service description') expect(services[0].port).toEqual(2534) }) test('Selected service - for edit fields values in this service', async () => { const editedService = { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "new 3", "port": 2527, "proxy_ip": "172.25.78.151", "device_ip": "172.25.78.151", "internet_uri": "", "description": "new site 3...", "is_online": true } await serviceOfServices.selectService(editedService) const selectedService = store.getters['services/selectedService'] expect(selectedService).toEqual(editedService) }) test('Set isSaveData - if need save service', async () => { const isSaveData = store.getters['services/isSaveData'] expect(isSaveData).toEqual(false) // default value is false await serviceOfServices.setIsSaveServices(true) const isSaveDataChanged = store.getters['services/isSaveData'] expect(isSaveDataChanged).toEqual(true) // if need save service - true }) test('Edited fields values in selected service of store', async () => { const selectedForEditService = { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "new 3", "port": 2527, "proxy_ip": "172.25.78.151", "device_ip": "172.25.78.151", "internet_uri": "", "description": "new site 3...", "is_online": true } await serviceOfServices.selectService(selectedForEditService) await serviceOfServices.editSelectedService({key: 'name', value: 'edited test name'}).then(async () => { await serviceOfServices.editSelectedService({key: 'port', value: 5555}).then(async () => { await serviceOfServices.editSelectedService({key: 'description', value: 'edited description field'}) }) }) const selectedService = store.getters['services/selectedService'] expect(selectedService.name).toEqual('edited test name') expect(selectedService.port).toEqual(5555) expect(selectedService.description).toEqual('edited description field') }) test('Updated services in store after editing selected service', async () => { const editedService = { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "edited and updated test service", "port": 3436, "proxy_ip": "172.25.78.151", "device_ip": "172.25.78.151", "internet_uri": "", "description": "edited and updated test service description", "is_online": true } store.commit('services/setServices', resServices) const defaultServices = store.getters['services/services'] const forEditService = defaultServices.find(service => service.id === 3) expect(forEditService.name).toEqual('new 3') // default value expect(forEditService.description).toEqual('new site 3...') // default value expect(forEditService.port).toEqual(2527) // default value const updatedServices = updatedService(editedService, defaultServices) store.commit('services/setServices', updatedServices) const services = store.getters['services/services'] const editedServiceStore = services.find(service => service.id === 3) expect(editedServiceStore.name).toEqual('edited and updated test service') expect(editedServiceStore.description).toEqual('edited and updated test service description') expect(editedServiceStore.port).toEqual(3436) }) test('Canceled selected service in store', async () => { const selectedForEditService = { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "new 3", "port": 2527, "proxy_ip": "172.25.78.151", "device_ip": "172.25.78.151", "internet_uri": "", "description": "new site 3...", "is_online": true } await serviceOfServices.selectService(selectedForEditService) const selectedService = store.getters['services/selectedService'] expect(selectedService.name).not.toBe(null) // Service is selected expect(selectedService.id).toEqual(3) // Service is selected expect(selectedService.name).toEqual('new 3') // Service is selected await serviceOfServices.cancelSelectedService(3) const cancelSelectedService = store.getters['services/selectedService'] expect(cancelSelectedService).toBe(null) // Canceled selected Service }) test('Updated services in store after deleting new service with only layout', async () => { store.commit('services/setServices', resServices) await serviceOfServices.addNewServiceLayout() const servicesWithNewServiceLayout = store.getters['services/services'] const forDeleteService = servicesWithNewServiceLayout.find(service => service.id === -1) expect(forDeleteService).toBeDefined() // before delete service const updatedServices = removedNewService(servicesWithNewServiceLayout) store.commit('services/setServices', updatedServices) const services = store.getters['services/services'] const deletedServiceStore = services.find(service => service.id === -1) expect(deletedServiceStore).toBeUndefined() // after delete service }) test('Updated services in store after deleting selected service', async () => { const deleteServiceId = 3 store.commit('services/setServices', resServices) const defaultServices = store.getters['services/services'] const forDeleteService = defaultServices.find(service => service.id === 3) expect(forDeleteService).toBeDefined() // before delete service const updatedServices = deletedService(deleteServiceId, defaultServices) store.commit('services/setServices', updatedServices) const services = store.getters['services/services'] const deletedServiceStore = services.find(service => service.id === 3) expect(deletedServiceStore).toBeUndefined() // after delete service }) test('Reset store', async () => { const selectedForEditService = { "id": 3, "created_at": "2024-03-07T11:43:51.027148541+03:00", "updated_at": "2024-03-07T13:35:24.919273428+03:00", "deleted_at": null, "name": "new 3", "port": 2527, "proxy_ip": "172.25.78.151", "device_ip": "172.25.78.151", "internet_uri": "", "description": "new site 3...", "is_online": true } await serviceOfServices.selectService(selectedForEditService) const selectedService = store.getters['services/selectedService'] expect(selectedService.name).not.toBe(null) // Service is selected expect(selectedService.id).toEqual(3) // Service is selected expect(selectedService.name).toEqual('new 3') // Service is selected await serviceOfServices.addNewServiceLayout() const services = store.getters['services/services'] expect(services.name).not.toStrictEqual([]) // Not empty services expect(services[0].id).toEqual(-1) // New Service await serviceOfServices.resetStore() const resetSelectedService = store.getters['services/selectedService'] const resetServices = store.getters['services/services'] expect(resetSelectedService).toBe(null) // After reset store expect(resetServices).toStrictEqual([]) // After reset store }) })