feat(tests): create useCase for UsersInServices

This commit is contained in:
vbuglov 2024-03-07 14:47:21 +03:00
parent a14fd56955
commit b5b3c616dc
27 changed files with 1048 additions and 724 deletions

View File

@ -1,5 +1,5 @@
import {get, post, put, remove} from './apiHelpers.js' import {get, post, put, remove} from './apiHelpers.js'
import {convertList} from '@helpers/adapter/adapter.js' import {convertList, convertObject} from '@helpers/adapter/adapter.js'
import {devUsersList} from './StaticData.js' import {devUsersList} from './StaticData.js'
/** /**
@ -8,15 +8,22 @@ import {devUsersList} from './StaticData.js'
* @param {Number} id * @param {Number} id
*/ */
const adapter_config = {
id: "id",
first_name: "firstName",
last_name: "lastName",
email: "email",
role: "role",
}
class Users { class Users {
/** /**
* Класс управления роутерами * Класс управления роутерами
* @param {String} apiAddr - path to service * @param {String} apiAddr - path to service
* @param {Object | undefined} adapter_config - oldKey: newKey
* @param {Object | undefined} params - Конфиг настроек * @param {Object | undefined} params - Конфиг настроек
* @param {'prod' | 'test'} params.mode - Конфиг настроек * @param {'prod' | 'test'} params.mode - Конфиг настроек
*/ */
constructor(apiAddr, adapter_config = {}, params = {mode: 'prod'}) { constructor(apiAddr, params = {mode: 'prod'}) {
this.apiAddr = apiAddr this.apiAddr = apiAddr
this.config = adapter_config this.config = adapter_config
this.mode = params.mode this.mode = params.mode
@ -28,7 +35,7 @@ class Users {
* @param {'prod' | 'dev'} params.mode - Конфиг настроек * @param {'prod' | 'dev'} params.mode - Конфиг настроек
* @returns {Promise<*[]> | *[]} * @returns {Promise<*[]> | *[]}
*/ */
async getUsers(params) { async getUsers(params = {mode: 'prod'}) {
if (params.mode === "dev") { if (params.mode === "dev") {
return devUsersList return devUsersList
} }
@ -41,9 +48,9 @@ class Users {
* *
* @param {Number} id - Сервис id, если id не указан, отображается список всех роутеров * @param {Number} id - Сервис id, если id не указан, отображается список всех роутеров
* @param {'dev' | 'prod'} mode - Сервис id, если id не указан, отображается список всех роутеров * @param {'dev' | 'prod'} mode - Сервис id, если id не указан, отображается список всех роутеров
* @returns {Promise<*[]>} * @returns {Promise<Array<User>> | any}
*/ */
async getUsersBySiteId(id, mode) { async getUsersByServiceId(id, mode) {
if (mode === "dev") { if (mode === "dev") {
return devUsersList return devUsersList
} }
@ -55,33 +62,33 @@ class Users {
/** /**
* *
* @param {User} userData * @param {User} userData
* @returns {Promise<void>} * @returns {Promise<Object>}
*/ */
async createUser(userData) { async createUser(userData) {
const newUser = await post(`${this.apiAddr}/users`, userData) const newUser = await post(`${this.apiAddr}/users`, userData)
return newUser return convertObject(newUser, {config: this.config})
} }
/** /**
* *
* @param {User} userData * @param {User} userData
* @returns {Promise<void>} * @returns {Promise<Object>}
*/ */
async updateUser(userData) { async updateUser(userData) {
const updatedUserData = {...userData} const updatedUserData = {...userData}
delete updatedUserData.id delete updatedUserData.id
const newUser = await put(`${this.apiAddr}/users/${userData.id}`, updatedUserData) const newUser = await put(`${this.apiAddr}/users/${userData.id}`, updatedUserData)
return newUser return convertObject(newUser, {config: this.config})
} }
/** /**
* *
* @param {Number} userId - Сервис id, если id не указан, отображается список всех роутеров * @param {Number} userId - Сервис id, если id не указан, отображается список всех роутеров
* @returns {Promise<*[]>} * @returns {Promise<Object>}
*/ */
async removeUser(userId) { async removeUser(userId) {
const removedUser = await remove(`${this.apiAddr}/users/${userId}`) const removedUser = await remove(`${this.apiAddr}/users/${userId}`)
return removedUser return convertObject(removedUser, {config: this.config})
} }

View File

@ -94,7 +94,6 @@ export default {
}, },
methods: { methods: {
makeTable () { makeTable () {
console.log(Tabulator)
this.table = new Tabulator(this.$refs[this.refId], this.getConfig()) this.table = new Tabulator(this.$refs[this.refId], this.getConfig())
}, },
getConfig () { getConfig () {

View File

@ -9,6 +9,12 @@ import {mapGetters} from 'vuex'
export default { export default {
name: 'UsersManager', name: 'UsersManager',
components: {ModuleContainer, UsersTable, UsersEditor, ManagerTitle, VButton}, components: {ModuleContainer, UsersTable, UsersEditor, ManagerTitle, VButton},
props: {
serviceOfUsers: {
type: Object,
default: () => ({})
}
},
data() { data() {
return { return {
componentState: 'view' // view | create | select componentState: 'view' // view | create | select
@ -26,6 +32,7 @@ export default {
}, },
openUserPanelOfSelect() { openUserPanelOfSelect() {
this.componentState = 'select' this.componentState = 'select'
this.serviceOfUsers.fetchUsersOffSite()
}, },
closeUserPanel() { closeUserPanel() {
this.componentState = 'view' this.componentState = 'view'
@ -36,10 +43,10 @@ export default {
<template> <template>
<div <div
class="grid gap-4" class="grid grid-cols-12 gap-4"
:class="`${gridCols}`" :class="`${gridCols}`"
> >
<ModuleContainer> <ModuleContainer :class="[{'col-span-12': componentState === 'view', 'col-span-4': componentState !== 'view' }]">
<ManagerTitle class="mb-4"> <ManagerTitle class="mb-4">
<template #title> <template #title>
<span>Список пользователей</span> <span>Список пользователей</span>
@ -48,12 +55,14 @@ export default {
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<VButton <VButton
color="blue" color="blue"
test-id="toggle-new-user"
@click="openUserPanelOfCreate" @click="openUserPanelOfCreate"
> >
Добавить пользователя Создать пользователя
</VButton> </VButton>
<VButton <VButton
color="purple" color="purple"
test-id="toggle-add-user"
@click="openUserPanelOfSelect" @click="openUserPanelOfSelect"
> >
Добавить существующего Добавить существующего
@ -63,8 +72,11 @@ export default {
</ManagerTitle> </ManagerTitle>
<UsersTable :usersList="usersList" /> <UsersTable :usersList="usersList" />
</ModuleContainer> </ModuleContainer>
<ModuleContainer v-if="componentState === 'create'"> <ModuleContainer
<ManagerTitle> v-if="componentState === 'create'"
class="col-span-8"
>
<ManagerTitle test-id="new-user-container">
<template #title> <template #title>
<span>Создать пользователя</span> <span>Создать пользователя</span>
</template> </template>
@ -80,7 +92,10 @@ export default {
</ManagerTitle> </ManagerTitle>
<UsersEditor /> <UsersEditor />
</ModuleContainer> </ModuleContainer>
<ModuleContainer v-if="componentState === 'select'"> <ModuleContainer
v-if="componentState === 'select'"
class="col-span-8"
>
<ManagerTitle> <ManagerTitle>
<template #title> <template #title>
<span>Выбрать пользователя</span> <span>Выбрать пользователя</span>

View File

@ -11,11 +11,10 @@ export default {
}, },
}, },
data() { data() {
const editItem = (item) => this.editItem(item); const editItem = (item) => this.editItem(item)
const deleteItem = (item) => this.deleteItem(item)
const deleteItem = (item) => this.deleteItem(item);
return { return {
rerenderStep: 3,
columns: [ columns: [
{ {
field: "id", field: "id",
@ -44,15 +43,33 @@ export default {
{ {
title: "Actions", title: "Actions",
formatter: (cell) => { formatter: (cell) => {
return `<button @click="editItem(${cell.getRow().getIndex()})">Edit</button> const record = cell.getRow().getData();
<button @click="deleteItem(${cell.getRow().getIndex()})">Delete</button>`; const id = record.id;
return `
<button action="edit" class="text-white mr-2 text-xs bg-blue-700 hover:bg-blue-800 focus:outline-none focus:ring-4 focus:ring-blue-300 font-medium rounded-full text-sm px-3 py-2 text-center mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-900">
<i action="edit" class="ri-pencil-line"></i>
</button>
<input action="toggle-remove" type="checkbox" id="remove-option-${id}" value="" class="hidden peer" required="">
<label for="remove-option-${id}" class="peer-checked:hidden cursor-pointer inline-text text-white text-xs bg-red-700 hover:bg-red-800 focus:outline-none focus:ring-4 focus:ring-red-300 font-medium rounded-full text-sm px-3 py-2 text-center mb-2 dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-900"
>
<i class="ri-delete-bin-line"></i>
</label>
<label action="remove" for="remove-option-${id}" class="hidden cursor-pointer mr-2 peer-checked:flex text-white text-xs bg-red-700 hover:bg-red-800 focus:outline-none focus:ring-4 focus:ring-red-300 font-medium rounded-full text-sm px-3 py-2 text-center mb-2 dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-900"
>
<i action="remove" class="ri-check-line"></i>
</label>
<label action="close-remove" for="remove-option-${id}" class="hidden cursor-pointer peer-checked:flex text-white text-xs bg-gray-700 hover:bg-gray-800 focus:outline-none focus:ring-4 focus:ring-gray-300 font-medium rounded-full text-sm px-3 py-2 text-center mb-2 dark:bg-gray-600 dark:hover:bg-gray-700 dark:focus:ring-gray-900">
<i class="ri-close-line"></i>
</label>
`;
}, },
cellClick: function(e, cell) { cellClick: function(e, cell) {
// Handle the click event and call Vue methods const action = e.target.getAttribute('action');
const action = e.target.textContent.toLowerCase();
if (action === 'edit') { if (action === 'edit') {
editItem(cell.getRow().getData()); editItem(cell.getRow().getData());
} else if (action === 'delete') { } else if (action === 'remove') {
deleteItem(cell.getRow().getData()); deleteItem(cell.getRow().getData());
} }
}, },
@ -66,7 +83,7 @@ export default {
deleteItem(item) { deleteItem(item) {
console.log('Delete item:', item); console.log('Delete item:', item);
}, },
}, }
} }
</script> </script>

View File

@ -58,10 +58,12 @@ export default {
<SiteList <SiteList
:serviceOfUsers="serviceOfServices" :serviceOfUsers="serviceOfServices"
:caseOfUsersInService="caseOfUsersInService" :caseOfUsersInService="caseOfUsersInService"
:selectSite="selectSite"
/> />
<SiteManager <SiteManager
v-if="selectedSiteState === 'active'" v-if="selectedSiteState === 'active'"
:serviceOfUsers="serviceOfUsers" :serviceOfUsers="serviceOfUsers"
:caseOfUsersInService="caseOfUsersInService"
/> />
</div> </div>
</template> </template>

View File

@ -9,6 +9,10 @@ class ServiceOfServices {
this.store.dispatch('services/saveServices', services) this.store.dispatch('services/saveServices', services)
return services return services
} }
async getSelectedService() {
return this.store.getters['services/selectedService']
}
} }
export default ServiceOfServices export default ServiceOfServices

View File

@ -1,5 +1,38 @@
class UsersOfServices { class UsersOfServices {
constructor() { constructor(adapter, store) {
this.adapter = adapter
this.store = store
}
/**
*
* @param {Array} users
* @returns {Promise<Array>}
*/
async saveSiteUsers(users) {
await this.store.dispatch('users/saveSiteUsers', users)
return users
}
/**
*
* @param {Array} users
* @returns {Promise<Array>}
*/
async saveUsersWithoutSite(users) {
await this.store.dispatch('users/saveUsersWithoutSite', users)
return users
}
/**
*
* @param serviceId
* @returns {Promise<void>}
*/
async fetchUsersByService(serviceId) {
const users = await this.adapter.getUsersByServiceId(serviceId)
await this.saveSiteUsers(users)
return users
} }
} }

View File

@ -61,8 +61,7 @@ const actions = {
const newRoute = {"path": null, "role": null, id: -1} const newRoute = {"path": null, "role": null, id: -1}
state.newRoute = newRoute state.newRoute = newRoute
}, },
createNewRoute: ({state}, payload) => { createNewRoute: ({state}) => {
console.log(payload)
state.newRoute = null state.newRoute = null
}, },
stopAddingRoute: ({state}) => { stopAddingRoute: ({state}) => {

View File

@ -4,6 +4,19 @@ class UsersInService {
this.serviceOfServices = serviceOfServices this.serviceOfServices = serviceOfServices
} }
async fetchUsersByService() {
const selectedService = this.serviceOfServices.getSelectedService()
if (!selectedService) {
console.error('fetchUsersByService: Service not found')
return []
}
this.serviceOfUsers.fetchUsersByService(selectedService.id)
}
async fetchUsersWithoutService() {
}
} }
export default UsersInService export default UsersInService

View File

@ -1,11 +1,59 @@
import {describe, expect, test} from "vitest"; import {describe, expect, test, vi} from "vitest";
import AdapterOfUsers from '@adapters/adapterOfUsers/Users' import AdapterOfUsers from '@adapters/adapterOfUsers/Users'
import axios from "axios";
import {apiUser, appUser} from '@mocks/users.js'
vi.mock('axios')
describe('test for AdapterOfUsers', () => { describe('test for AdapterOfUsers', () => {
test('init', () => { const adapterOfUsers = new AdapterOfUsers('http://localhost:8080')
const adapterOfUsers = new AdapterOfUsers('http://localhost:8080')
test('init', () => {
expect(adapterOfUsers).toBeDefined() expect(adapterOfUsers).toBeDefined()
}) })
test('getUsersBySiteId', async () => {
axios.get.mockResolvedValue({
data: [apiUser],
})
const users = await adapterOfUsers.getUsersByServiceId(1)
expect(users).toEqual([appUser])
})
test('getUsers', async () => {
axios.get.mockResolvedValue({
data: [apiUser],
})
const users = await adapterOfUsers.getUsers()
expect(users).toEqual([appUser])
})
test('updateUser', async () => {
axios.put.mockResolvedValue({
data: apiUser,
})
const user = await adapterOfUsers.updateUser(appUser)
expect(user).toEqual(appUser)
})
test('createUser', async () => {
axios.post.mockResolvedValue({
data: apiUser,
})
const user = await adapterOfUsers.createUser()
expect(user).toEqual(appUser)
})
test('removeUser', async () => {
axios.delete.mockResolvedValue({
data: apiUser,
})
const user = await adapterOfUsers.removeUser(appUser.id)
expect(user).toEqual(appUser)
})
}) })

View File

@ -0,0 +1,23 @@
import {appUser} from "@mocks/users.js";
class AdapterOfUsers {
constructor() {
}
// eslint-disable-next-line no-unused-vars
async getUsersByServiceId() {
return [appUser]
}
}
class AdapterOfServices {
constructor() {
}
}
const adapterOfUsers = new AdapterOfUsers()
const adapterOfServices = new AdapterOfServices()
export {
adapterOfUsers,
adapterOfServices}

View File

View File

@ -0,0 +1,17 @@
const apiUser = {
id: 1,
first_name: 'user1',
last_name: 'user1',
email: 'test@gmail.com',
role: 'user',
}
const appUser = {
id: 1,
firstName: 'user1',
lastName: 'user1',
email: 'test@gmail.com',
role: 'user',
}
export {apiUser, appUser}

View File

@ -59,6 +59,7 @@ describe('tests for ServiceOfServices', () => {
const serviceOfServices = new ServiceOfServices(adapterOfServices, store) const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
await serviceOfServices.fetchServicesList() await serviceOfServices.fetchServicesList()
const usersList = store.getters['services/servicesList'] const usersList = store.getters['services/servicesList']
expect(usersList).toEqual([{id: 1, name: 'service1'}, {id: 2, name: 'service2'}]) expect(usersList).toEqual([{id: 1, name: 'service1'}, {id: 2, name: 'service2'}])

View File

@ -1,18 +0,0 @@
import {describe, expect, test} from "vitest";
import ServiceOfUsers from '@services/serviceOfUsers/Users.js'
class AdapterOfUsers {
constructor() {
}
}
describe('test for ServiceOfUsers', () => {
test('init', () => {
const adapterOfUsers = new AdapterOfUsers()
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers)
expect(serviceOfUsers).toBeDefined()
})
})

View File

@ -0,0 +1,71 @@
import {createStore} from "vuex";
import {appUser} from "@mocks/users.js";
class AdapterOfUsers {
constructor() {
}
getUsersList() {
return [appUser]
}
getUsersByServiceId() {
return [appUser]
}
}
const users = {
namespaced: true,
state: {
siteUsers: [],
usersWithoutSite: [],
},
mutations: {
setSiteUsers(state, users) {
state.siteUsers = users
},
setUsersWithoutSite(state, users) {
state.usersWithoutSite = users
},
},
getters: {
siteUsers: state => {
return state.siteUsers
},
usersWithoutSite: state => {
return state.usersWithoutSite
}
},
actions: {
resetStore({state}) {
state.siteUsers = []
},
saveSiteUsers({commit}, users) {
commit('setSiteUsers', users)
},
saveUsersWithoutSite({commit}, users) {
commit('setUsersWithoutSite', users)
}
},
}
const services = {
namespaced: true,
getters: {
selectedService: () => {
return {id: 1, name: 'service1'}
}
},
}
const store = createStore({
modules: {
users,
services
},
})
const adapterOfUsers = new AdapterOfUsers()
export {adapterOfUsers, store}

View File

@ -0,0 +1,36 @@
import {describe, expect, test, beforeEach} from "vitest";
import ServiceOfUsers from '@services/serviceOfUsers/Users.js'
import {adapterOfUsers, store} from './MockData.js'
import {appUser} from '@mocks/users.js'
describe('test for ServiceOfUsers', () => {
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers, store)
beforeEach( async() => {
await store.dispatch('users/resetStore')
})
test('init', () => {
expect(serviceOfUsers).toBeDefined()
})
test('saveSiteUsers', async () => {
await serviceOfUsers.saveSiteUsers([appUser])
const storeUsers = store.getters['users/siteUsers']
expect(storeUsers).toEqual([appUser])
})
test('saveUsersWithoutSite', async () => {
await serviceOfUsers.saveUsersWithoutSite([appUser])
const storeUsers = store.getters['users/usersWithoutSite']
expect(storeUsers).toEqual([appUser])
})
test('fetchUsersByService', async () => {
const serviceId = 1
await serviceOfUsers.fetchUsersByService(serviceId)
const storeUsers = store.getters['users/siteUsers']
expect(storeUsers).toEqual([appUser])
})
})

View File

@ -1,106 +0,0 @@
import {describe, expect, test, beforeEach} from "vitest";
import CaseOfUsersInService from '@useCases/CaseOfUsersInService.js'
import {createStore} from 'vuex'
class ServiceOfUsers {
constructor(adapter, store) {
this.adapter = adapter
this.store = store
}
}
class ServiceOfServices {
constructor(adapter, store) {
this.adapter = adapter
this.store = store
}
}
class AdapterOfUsers {
constructor() {
}
// eslint-disable-next-line no-unused-vars
async getUsersListByServiceId(serviceId) {
return [{id: 1, name: 'user1'}, {id: 2, name: 'user2'}]
}
}
class AdapterOfServices {
constructor() {
}
}
describe('tests for caseOfUsersInService', () => {
const store = createStore({
modules: {
services: {
namespaced: true,
state: {
services: [],
},
mutations: {
setServices(state, services) {
state.services = services
},
},
actions: {
resetStore({state}) {
state.services = []
},
saveServices({commit}, services) {
commit('setServices', services)
}
},
},
users: {
namespaced: true,
state: {
siteUsersList: [],
},
mutations: {
setSiteUsersList(state, users) {
state.users = users
},
},
actions: {
resetStore({state}) {
state.siteUsersList = []
},
saveUsers({commit}, users) {
commit('setSiteUsersList', users)
}
},
},
},
})
const adapterOfUsers = new AdapterOfUsers()
const adapterOfServices = new AdapterOfServices()
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers, store)
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
beforeEach( async() => {
await store.dispatch('services/resetStore')
await store.dispatch('users/resetStore')
})
test('init', () => {
const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
expect(caseOfUsersInService).toBeDefined()
})
// test('selectServiceAndFetchRoutes', async () => {
// const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
//
// await caseOfUsersInService.selectServiceAndFetchRoutes(1)
//
// const selectedService = store.getters['services/selectedService']
// const usersList = store.getters['users/siteUsersList']
//
// expect(selectedService).toEqual({id: 1, name: 'service1'})
// expect(usersList).toEqual([{id: 1, name: 'user1'}, {id: 2, name: 'user2'}])
// })
})

View File

@ -0,0 +1,31 @@
import {describe, expect, test, beforeEach} from "vitest";
import CaseOfUsersInService from '@useCases/CaseOfUsersInService.js'
import {serviceOfUsers, serviceOfServices, store} from './MockData.js'
import {appUser} from '@mocks/users.js'
describe('tests for caseOfUsersInService', () => {
beforeEach( async() => {
await store.dispatch('services/resetStore')
await store.dispatch('users/resetStore')
})
const caseOfUsersInService = new CaseOfUsersInService(serviceOfUsers, serviceOfServices)
test('init', () => {
expect(caseOfUsersInService).toBeDefined()
})
test('fetchUsersByService', async () => {
await caseOfUsersInService.fetchUsersByService()
const storeUsers = store.getters['users/siteUsers']
expect(storeUsers).toEqual([appUser])
})
// test('fetchUsersWithoutService', async () => {
// await caseOfUsersInService.fetchUsersWithoutService()
// const storeUsers = store.getters['users/usersWithoutSite']
// expect(storeUsers).toEqual([appUser])
// })
})

View File

@ -0,0 +1,76 @@
import {createStore} from "vuex";
import {adapterOfUsers, adapterOfServices} from "@mocks/adapters.js";
import ServiceOfUsers from "@services/serviceOfUsers/Users";
import ServiceOfServices from "@services/serviceOfServices/Services";
const services = {
namespaced: true,
state: {
services: [],
},
mutations: {
setServices(state, services) {
state.services = services
},
},
getters: {
selectedService: () => {
return {id: 1, name: 'service1'}
}
},
actions: {
resetStore({state}) {
state.services = []
},
saveServices({commit}, services) {
commit('setServices', services)
}
},
}
const users = {
namespaced: true,
state: {
siteUsers: [],
usersWithoutSite: [],
},
mutations: {
setSiteUsers(state, users) {
state.siteUsers = users
},
setUsersWithoutSite(state, users) {
state.usersWithoutSite = users
},
},
getters: {
siteUsers: state => {
return state.siteUsers
},
usersWithoutSite: state => {
return state.usersWithoutSite
}
},
actions: {
resetStore({state}) {
state.siteUsers = []
},
saveSiteUsers({commit}, users) {
commit('setSiteUsers', users)
},
saveUsersWithoutSite({commit}, users) {
commit('setUsersWithoutSite', users)
}
},
}
const store = createStore({
modules: {
services,
users,
},
})
const serviceOfUsers = new ServiceOfUsers(adapterOfUsers, store)
const serviceOfServices = new ServiceOfServices(adapterOfServices, store)
export {serviceOfUsers, serviceOfServices, store}

View File

@ -2,7 +2,6 @@ import {test, describe, expect, vi } from 'vitest'
import { mount} from '@vue/test-utils' import { mount} from '@vue/test-utils'
import VTabulator from '@molecules/Tabulator/VTabulator.vue'; import VTabulator from '@molecules/Tabulator/VTabulator.vue';
describe("tests VTabulator component", () => { describe("tests VTabulator component", () => {
vi.mock('tabulator-tables', () => { vi.mock('tabulator-tables', () => {

View File

@ -1,4 +0,0 @@
class Tabulator {
}
export default Tabulator;

View File

@ -0,0 +1,50 @@
import {createStore} from "vuex";
const users = {
namespaced: true,
state: {
usersOffSite: [],
},
mutations: {
setUsersOffSite(state, users) {
state.usersOffSite = users
}
},
getters: {
usersOffSite: state => {
return state.usersOffSite
}
},
actions: {
resetStore({state}) {
state.notIncludedSiteUsersList = []
},
saveUsersOffSite({commit}, users) {
console.log(users)
commit('setUsersOffSite', users)
}
},
}
const store = createStore({
plugins: [],
modules: {
users
},
})
class ServiceOfUsers {
constructor(adapter, store) {
this.adapter = adapter
this.store = store
}
async fetchUsersOffSite() {
const usersList = [{id: 1, name: 'user1'}, {id: 2, name: 'user2'}]
this.store.dispatch('users/saveUsersOffSite', usersList)
}
}
const serviceOfUsers = new ServiceOfUsers({}, store)
export {store, serviceOfUsers}

View File

@ -1,21 +1,13 @@
import { mount} from '@vue/test-utils' import { mount} from '@vue/test-utils'
import { expect, test, describe, vi, beforeEach } from 'vitest' import { expect, test, describe, vi, beforeEach } from 'vitest'
import UsersManager from '@organisms/UsersManager/UsersManager.vue'; import UsersManager from '@organisms/UsersManager/UsersManager.vue';
import { createStore } from 'vuex'
import {store as services} from '@/store/modules/services';
import {store as users} from '@/store/modules/users';
import axios from "axios"; import axios from "axios";
import {store, serviceOfUsers} from './StaticMocks.js'
vi.mock('axios') vi.mock('axios')
describe("tests SitesManagerPage component mounted with vuex", () => { describe("tests SitesManagerPage component mounted with vuex", () => {
const store = createStore({
plugins: [],
modules: {
services,
users
},
})
vi.mock('tabulator-tables', () => { vi.mock('tabulator-tables', () => {
const mockTabulator = vi.fn().mockImplementation(() => ({ const mockTabulator = vi.fn().mockImplementation(() => ({
@ -26,7 +18,6 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
beforeEach(async () => { beforeEach(async () => {
store.dispatch('users/resetStore') store.dispatch('users/resetStore')
store.dispatch('services/resetStore')
const mockData = [ const mockData = [
{ {
@ -55,12 +46,13 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
test('test UsersManager mounted with vuex', async () => { test('test UsersManager mounted with vuex', async () => {
const wrapper = mount(UsersManager, { const wrapper = mount(UsersManager, {
global: { global: {
plugins: [store] plugins: [store],
props: {
serviceOfUsers
}
} }
}) })
console.log(wrapper.html())
const componentState = wrapper.vm.componentState const componentState = wrapper.vm.componentState
const gridCols = wrapper.vm.gridCols const gridCols = wrapper.vm.gridCols
expect(componentState).toBe('view') expect(componentState).toBe('view')
@ -71,6 +63,9 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
const wrapper = mount(UsersManager, { const wrapper = mount(UsersManager, {
global: { global: {
plugins: [store] plugins: [store]
},
props: {
serviceOfUsers
} }
}) })
@ -82,7 +77,7 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
let wrapperHtml = wrapper.html() let wrapperHtml = wrapper.html()
expect(componentState).toBe('create') expect(componentState).toBe('create')
expect(gridCols).toBe('grid-cols-2') expect(gridCols).toBe('grid-cols-2')
expect(wrapperHtml).toContain("Создать пользователя") expect(wrapperHtml).toContain("new-user-container")
await wrapper.vm.openUserPanelOfSelect() await wrapper.vm.openUserPanelOfSelect()
wrapperHtml = wrapper.html() wrapperHtml = wrapper.html()
@ -100,7 +95,7 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
expect(componentState).toBe('view') expect(componentState).toBe('view')
expect(gridCols).toBe('grid-cols-1') expect(gridCols).toBe('grid-cols-1')
expect(wrapperHtml).not.toContain("Выбрать пользователя") expect(wrapperHtml).not.toContain("Выбрать пользователя")
expect(wrapperHtml).not.toContain("Создать пользователя") expect(wrapperHtml).not.toContain("new-user-container")
}) })
test('test UsersManager select user button', async () => { test('test UsersManager select user button', async () => {
@ -108,14 +103,22 @@ describe("tests SitesManagerPage component mounted with vuex", () => {
shallow: true, shallow: true,
global: { global: {
plugins: [store] plugins: [store]
},
props: {
serviceOfUsers
} }
}) })
wrapper.vm.openUserPanelOfSelect() await wrapper.vm.openUserPanelOfSelect()
const usersOffSite = store.getters['users/usersOffSite']
const componentState = wrapper.vm.componentState const componentState = wrapper.vm.componentState
const gridCols = wrapper.vm.gridCols const gridCols = wrapper.vm.gridCols
expect(componentState).toBe('select') expect(componentState).toBe('select')
expect(gridCols).toBe('grid-cols-2') expect(gridCols).toBe('grid-cols-2')
expect(usersOffSite).toEqual([{id: 1, name: 'user1'}, {id: 2, name: 'user2'}])
}) })
}) })

View File

@ -11,6 +11,7 @@ describe("tests UsersManagerUsersTable component", () => {
expect(wrapper.exists()).toBe(true) expect(wrapper.exists()).toBe(true)
}) })
}) })

View File

@ -15,10 +15,11 @@ export default defineConfig({
'@molecules': fileURLToPath(new URL('./src/components/2_molecules', import.meta.url)), '@molecules': fileURLToPath(new URL('./src/components/2_molecules', import.meta.url)),
'@organisms': fileURLToPath(new URL('./src/components/3_organisms', import.meta.url)), '@organisms': fileURLToPath(new URL('./src/components/3_organisms', import.meta.url)),
'@pages': fileURLToPath(new URL('./src/components/5_pages', import.meta.url)), '@pages': fileURLToPath(new URL('./src/components/5_pages', import.meta.url)),
'@router': fileURLToPath(new URL('/src/router/index.js', import.meta.url)), '@router': fileURLToPath(new URL('./src/router/index.js', import.meta.url)),
'@adapters': fileURLToPath(new URL('/src/adapters', import.meta.url)), '@adapters': fileURLToPath(new URL('./src/adapters', import.meta.url)),
'@services': fileURLToPath(new URL('/src/services', import.meta.url)), '@services': fileURLToPath(new URL('./src/services', import.meta.url)),
'@useCases': fileURLToPath(new URL('/src/useCases', import.meta.url)), '@useCases': fileURLToPath(new URL('./src/useCases', import.meta.url)),
'@mocks': fileURLToPath(new URL('./tests/mocks', import.meta.url)),
} }
}, },
test: { test: {

File diff suppressed because it is too large Load Diff