#7058 LeftMenu vitest #1153
|
@ -41,7 +41,6 @@ const filteredItems = computed(() => {
|
||||||
return locale.includes(normalizedSearch);
|
return locale.includes(normalizedSearch);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const filteredPinnedModules = computed(() => {
|
const filteredPinnedModules = computed(() => {
|
||||||
if (!search.value) return pinnedModules.value;
|
if (!search.value) return pinnedModules.value;
|
||||||
const normalizedSearch = search.value
|
const normalizedSearch = search.value
|
||||||
|
@ -72,7 +71,7 @@ watch(
|
||||||
items.value = [];
|
items.value = [];
|
||||||
getRoutes();
|
getRoutes();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true },
|
||||||
);
|
);
|
||||||
|
|
||||||
function findMatches(search, item) {
|
function findMatches(search, item) {
|
||||||
|
@ -104,33 +103,40 @@ function addChildren(module, route, parent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRoutes() {
|
function getRoutes() {
|
||||||
if (props.source === 'main') {
|
const handleRoutes = {
|
||||||
const modules = Object.assign([], navigation.getModules().value);
|
main: getMainRoutes,
|
||||||
|
card: getCardRoutes,
|
||||||
for (const item of modules) {
|
};
|
||||||
const moduleDef = routes.find(
|
try {
|
||||||
(route) => toLowerCamel(route.name) === item.module
|
handleRoutes[props.source]();
|
||||||
);
|
} catch (error) {
|
||||||
if (!moduleDef) continue;
|
throw new Error(`Method is not defined`);
|
||||||
item.children = [];
|
|
||||||
|
|
||||||
addChildren(item.module, moduleDef, item.children);
|
|
||||||
}
|
|
||||||
|
|
||||||
items.value = modules;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
function getMainRoutes() {
|
||||||
|
const modules = Object.assign([], navigation.getModules().value);
|
||||||
|
|
||||||
if (props.source === 'card') {
|
for (const item of modules) {
|
||||||
const currentRoute = route.matched[1];
|
const moduleDef = routes.find(
|
||||||
const currentModule = toLowerCamel(currentRoute.name);
|
(route) => toLowerCamel(route.name) === item.module,
|
||||||
let moduleDef = routes.find(
|
|
||||||
(route) => toLowerCamel(route.name) === currentModule
|
|
||||||
);
|
);
|
||||||
|
if (!moduleDef) continue;
|
||||||
|
item.children = [];
|
||||||
|
|
||||||
if (!moduleDef) return;
|
addChildren(item.module, moduleDef, item.children);
|
||||||
if (!moduleDef?.menus) moduleDef = betaGetRoutes();
|
|
||||||
addChildren(currentModule, moduleDef, items.value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
items.value = modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCardRoutes() {
|
||||||
|
const currentRoute = route.matched[1];
|
||||||
|
const currentModule = toLowerCamel(currentRoute.name);
|
||||||
|
let moduleDef = routes.find((route) => toLowerCamel(route.name) === currentModule);
|
||||||
|
|
||||||
|
if (!moduleDef) return;
|
||||||
|
if (!moduleDef?.menus) moduleDef = betaGetRoutes();
|
||||||
|
addChildren(currentModule, moduleDef, items.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function betaGetRoutes() {
|
function betaGetRoutes() {
|
||||||
|
@ -223,9 +229,16 @@ const searchModule = () => {
|
||||||
</template>
|
</template>
|
||||||
<template v-for="(item, index) in filteredItems" :key="item.name">
|
<template v-for="(item, index) in filteredItems" :key="item.name">
|
||||||
<template
|
<template
|
||||||
v-if="search ||item.children && !filteredPinnedModules.has(item.name)"
|
v-if="
|
||||||
|
search ||
|
||||||
|
(item.children && !filteredPinnedModules.has(item.name))
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<LeftMenuItem :item="item" group="modules" :class="search && index === 0 ? 'searched' : ''">
|
<LeftMenuItem
|
||||||
|
:item="item"
|
||||||
|
group="modules"
|
||||||
|
:class="search && index === 0 ? 'searched' : ''"
|
||||||
|
>
|
||||||
<template #side>
|
<template #side>
|
||||||
<QBtn
|
<QBtn
|
||||||
v-if="item.isPinned === true"
|
v-if="item.isPinned === true"
|
||||||
|
@ -342,7 +355,7 @@ const searchModule = () => {
|
||||||
.header {
|
.header {
|
||||||
color: var(--vn-label-color);
|
color: var(--vn-label-color);
|
||||||
}
|
}
|
||||||
.searched{
|
.searched {
|
||||||
background-color: var(--vn-section-hover-color);
|
background-color: var(--vn-section-hover-color);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
import { vi, describe, expect, it, beforeAll } from 'vitest';
|
import { vi, describe, expect, it, beforeAll, beforeEach, afterEach } from 'vitest';
|
||||||
import { createWrapper, axios } from 'app/test/vitest/helper';
|
import { createWrapper, axios } from 'app/test/vitest/helper';
|
||||||
import Leftmenu from 'components/LeftMenu.vue';
|
import Leftmenu from 'components/LeftMenu.vue';
|
||||||
|
import * as vueRouter from 'vue-router';
|
||||||
import { useNavigationStore } from 'src/stores/useNavigationStore';
|
import { useNavigationStore } from 'src/stores/useNavigationStore';
|
||||||
|
|
||||||
|
let vm;
|
||||||
|
let navigation;
|
||||||
|
|
||||||
vi.mock('src/router/modules', () => ({
|
vi.mock('src/router/modules', () => ({
|
||||||
default: [
|
default: [
|
||||||
{
|
{
|
||||||
|
@ -21,6 +24,16 @@ vi.mock('src/router/modules', () => ({
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
name: 'CustomerMain',
|
name: 'CustomerMain',
|
||||||
|
meta: {
|
||||||
|
menu: 'Customer',
|
||||||
|
menuChildren: [
|
||||||
|
{
|
||||||
|
name: 'CustomerCreditContracts',
|
||||||
|
title: 'creditContracts',
|
||||||
|
icon: 'vn:solunion',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'list',
|
path: 'list',
|
||||||
|
@ -28,6 +41,13 @@ vi.mock('src/router/modules', () => ({
|
||||||
meta: {
|
meta: {
|
||||||
title: 'list',
|
title: 'list',
|
||||||
icon: 'view_list',
|
icon: 'view_list',
|
||||||
|
menuChildren: [
|
||||||
|
{
|
||||||
|
name: 'CustomerCreditContracts',
|
||||||
|
title: 'creditContracts',
|
||||||
|
icon: 'vn:solunion',
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -44,51 +64,325 @@ vi.mock('src/router/modules', () => ({
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}));
|
}));
|
||||||
|
vi.spyOn(vueRouter, 'useRoute').mockReturnValue({
|
||||||
describe('Leftmenu', () => {
|
matched: [
|
||||||
let vm;
|
{
|
||||||
let navigation;
|
path: '/',
|
||||||
beforeAll(() => {
|
redirect: {
|
||||||
vi.spyOn(axios, 'get').mockResolvedValue({
|
name: 'Dashboard',
|
||||||
data: [],
|
|
||||||
});
|
|
||||||
|
|
||||||
vm = createWrapper(Leftmenu, {
|
|
||||||
propsData: {
|
|
||||||
source: 'main',
|
|
||||||
},
|
},
|
||||||
}).vm;
|
name: 'Main',
|
||||||
|
meta: {},
|
||||||
navigation = useNavigationStore();
|
props: {
|
||||||
navigation.fetchPinned = vi.fn().mockReturnValue(Promise.resolve(true));
|
default: false,
|
||||||
navigation.getModules = vi.fn().mockReturnValue({
|
},
|
||||||
value: [
|
children: [
|
||||||
{
|
{
|
||||||
name: 'customer',
|
path: '/dashboard',
|
||||||
title: 'customer.pageTitles.customers',
|
name: 'Dashboard',
|
||||||
icon: 'vn:customer',
|
meta: {
|
||||||
module: 'customer',
|
title: 'dashboard',
|
||||||
|
icon: 'dashboard',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/customer',
|
||||||
|
redirect: {
|
||||||
|
name: 'CustomerMain',
|
||||||
|
},
|
||||||
|
name: 'Customer',
|
||||||
|
meta: {
|
||||||
|
title: 'customers',
|
||||||
|
icon: 'vn:client',
|
||||||
|
moduleName: 'Customer',
|
||||||
|
keyBinding: 'c',
|
||||||
|
menu: 'customer',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
query: {},
|
||||||
|
params: {},
|
||||||
|
meta: { moduleName: 'mockName' },
|
||||||
|
path: 'mockName/1',
|
||||||
|
name: 'Customer',
|
||||||
|
});
|
||||||
|
function mount(source = 'main') {
|
||||||
|
vi.spyOn(axios, 'get').mockResolvedValue({
|
||||||
|
data: [],
|
||||||
|
});
|
||||||
|
const wrapper = createWrapper(Leftmenu, {
|
||||||
|
propsData: {
|
||||||
|
source,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
navigation = useNavigationStore();
|
||||||
|
navigation.fetchPinned = vi.fn().mockReturnValue(Promise.resolve(true));
|
||||||
|
navigation.getModules = vi.fn().mockReturnValue({
|
||||||
|
value: [
|
||||||
|
{
|
||||||
|
name: 'customer',
|
||||||
|
title: 'customer.pageTitles.customers',
|
||||||
|
icon: 'vn:customer',
|
||||||
|
module: 'customer',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('getRoutes', () => {
|
||||||
|
afterEach(() => vi.clearAllMocks());
|
||||||
|
const getRoutes = vi.fn().mockImplementation((props, getMethodA, getMethodB) => {
|
||||||
|
const handleRoutes = {
|
||||||
|
methodA: getMethodA,
|
||||||
|
methodB: getMethodB,
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
handleRoutes[props.source]();
|
||||||
|
} catch (error) {
|
||||||
|
throw Error('Method not defined');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const getMethodA = vi.fn();
|
||||||
|
const getMethodB = vi.fn();
|
||||||
|
const fn = (props) => getRoutes(props, getMethodA, getMethodB);
|
||||||
|
|
||||||
|
it('should call getMethodB when source is card', () => {
|
||||||
|
let props = { source: 'methodB' };
|
||||||
|
fn(props);
|
||||||
|
|
||||||
|
expect(getMethodB).toHaveBeenCalled();
|
||||||
|
expect(getMethodA).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
it('should call getMethodA when source is main', () => {
|
||||||
|
let props = { source: 'methodA' };
|
||||||
|
fn(props);
|
||||||
|
|
||||||
|
expect(getMethodA).toHaveBeenCalled();
|
||||||
|
expect(getMethodB).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call getMethodA when source is not exists or undefined', () => {
|
||||||
jsegarra marked this conversation as resolved
Outdated
|
|||||||
|
let props = { source: 'methodC' };
|
||||||
|
expect(() => fn(props)).toThrowError('Method not defined');
|
||||||
|
|
||||||
|
expect(getMethodA).not.toHaveBeenCalled();
|
||||||
|
expect(getMethodB).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Leftmenu as card', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
vm = mount('card').vm;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get routes for card source', async () => {
|
||||||
|
vm.getRoutes();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe('Leftmenu as main', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vm = mount().vm;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should initialize with default props', () => {
|
||||||
|
expect(vm.source).toBe('main');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should filter items based on search input', async () => {
|
||||||
|
vm.search = 'cust';
|
||||||
jorgep marked this conversation as resolved
Outdated
jorgep
commented
Estaría bien crear un test que devuelva algún resultado, mockea otra para comprobar que solo te va a devolver esa. Estaría bien crear un test que devuelva algún resultado, mockea otra para comprobar que solo te va a devolver esa.
jsegarra
commented
He usado cust para que compruebe customer He usado cust para que compruebe customer
|
|||||||
|
await vm.$nextTick();
|
||||||
|
expect(vm.filteredItems[0].name).toEqual('customer');
|
||||||
|
expect(vm.filteredItems[0].module).toEqual('customer');
|
||||||
|
});
|
||||||
|
it('should filter items based on search input', async () => {
|
||||||
|
vm.search = 'Rou';
|
||||||
|
await vm.$nextTick();
|
||||||
|
expect(vm.filteredItems).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return pinned items', () => {
|
||||||
|
vm.items = [
|
||||||
|
{ name: 'Item 1', isPinned: false },
|
||||||
|
{ name: 'Item 2', isPinned: true },
|
||||||
|
];
|
||||||
|
expect(vm.pinnedModules).toEqual(
|
||||||
|
new Map([['Item 2', { name: 'Item 2', isPinned: true }]]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should find matches in routes', () => {
|
||||||
|
const search = 'child1';
|
||||||
|
const item = {
|
||||||
|
children: [
|
||||||
|
{ name: 'child1', children: [] },
|
||||||
|
{ name: 'child2', children: [] },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const matches = vm.findMatches(search, item);
|
||||||
|
expect(matches).toEqual([{ name: 'child1', children: [] }]);
|
||||||
|
});
|
||||||
|
it('should not proceed if event is already prevented', async () => {
|
||||||
|
const item = { module: 'testModule', isPinned: false };
|
||||||
|
const event = {
|
||||||
|
preventDefault: vi.fn(),
|
||||||
|
stopPropagation: vi.fn(),
|
||||||
|
defaultPrevented: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
await vm.togglePinned(item, event);
|
||||||
|
|
||||||
|
expect(event.preventDefault).not.toHaveBeenCalled();
|
||||||
|
expect(event.stopPropagation).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call quasar.notify with success message', async () => {
|
||||||
|
const item = { module: 'testModule', isPinned: false };
|
||||||
|
const event = {
|
||||||
|
preventDefault: vi.fn(),
|
||||||
|
stopPropagation: vi.fn(),
|
||||||
|
defaultPrevented: false,
|
||||||
|
};
|
||||||
|
const response = { data: { id: 1 } };
|
||||||
|
|
||||||
|
vi.spyOn(axios, 'post').mockResolvedValue(response);
|
||||||
|
vi.spyOn(vm.quasar, 'notify');
|
||||||
|
|
||||||
|
await vm.togglePinned(item, event);
|
||||||
|
|
||||||
|
expect(vm.quasar.notify).toHaveBeenCalledWith({
|
||||||
|
message: 'Data saved',
|
||||||
|
type: 'positive',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return a proper formated object with two child items', async () => {
|
it('should handle a single matched route with a menu', () => {
|
||||||
const expectedMenuItem = [
|
const route = {
|
||||||
{
|
matched: [{ meta: { menu: 'customer' } }],
|
||||||
children: null,
|
};
|
||||||
name: 'CustomerList',
|
|
||||||
title: 'globals.pageTitles.list',
|
const result = vm.betaGetRoutes();
|
||||||
icon: 'view_list',
|
|
||||||
},
|
expect(result.meta.menu).toEqual(route.matched[0].meta.menu);
|
||||||
{
|
});
|
||||||
children: null,
|
it('should get routes for main source', () => {
|
||||||
name: 'CustomerCreate',
|
vm.props.source = 'main';
|
||||||
title: 'globals.pageTitles.createCustomer',
|
vm.getRoutes();
|
||||||
icon: 'vn:addperson',
|
expect(navigation.getModules).toHaveBeenCalled();
|
||||||
},
|
});
|
||||||
];
|
|
||||||
const firstMenuItem = vm.items[0];
|
it('should find direct child matches', () => {
|
||||||
expect(firstMenuItem.children).toEqual(expect.arrayContaining(expectedMenuItem));
|
const search = 'child1';
|
||||||
|
const item = {
|
||||||
|
children: [{ name: 'child1' }, { name: 'child2' }],
|
||||||
|
};
|
||||||
|
const result = vm.findMatches(search, item);
|
||||||
|
expect(result).toEqual([{ name: 'child1' }]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should find nested child matches', () => {
|
||||||
|
const search = 'child3';
|
||||||
|
const item = {
|
||||||
|
children: [
|
||||||
|
{ name: 'child1' },
|
||||||
|
{
|
||||||
|
name: 'child2',
|
||||||
|
children: [{ name: 'child3' }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const result = vm.findMatches(search, item);
|
||||||
|
expect(result).toEqual([{ name: 'child3' }]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('normalize', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
vm = mount('card').vm;
|
||||||
|
});
|
||||||
|
it('should normalize and lowercase text', () => {
|
||||||
|
const input = 'ÁÉÍÓÚáéíóú';
|
||||||
|
const expected = 'aeiouaeiou';
|
||||||
|
expect(vm.normalize(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty string', () => {
|
||||||
|
const input = '';
|
||||||
|
const expected = '';
|
||||||
|
expect(vm.normalize(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle text without diacritics', () => {
|
||||||
|
const input = 'hello';
|
||||||
|
const expected = 'hello';
|
||||||
|
expect(vm.normalize(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle mixed text', () => {
|
||||||
|
const input = 'Héllo Wórld!';
|
||||||
jorgep marked this conversation as resolved
Outdated
jorgep
commented
En estos tests, solo veo que compruebes que la función haya sido llamada, no se debería comprobar si navigation ha cambiado? En estos tests, solo veo que compruebes que la función haya sido llamada, no se debería comprobar si navigation ha cambiado?
jorgep
commented
El test no comprueba que se ha añadido el item, solo que la función addMenuItem ha sido llamada. Quitar test y comprobar si se han añadido en los tests de useNavigationStore. El test no comprueba que se ha añadido el item, solo que la función addMenuItem ha sido llamada. Quitar test y comprobar si se han añadido en los tests de useNavigationStore.
|
|||||||
|
const expected = 'hello world!';
|
||||||
|
expect(vm.normalize(input)).toBe(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
jsegarra marked this conversation as resolved
Outdated
jsegarra
commented
OMG OMG
|
|||||||
|
describe('addChildren', () => {
|
||||||
|
const module = 'testModule';
|
||||||
|
beforeEach(() => {
|
||||||
|
vm = mount().vm;
|
||||||
|
vi.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should add menu items to parent if matches are found', () => {
|
||||||
|
const parent = 'testParent';
|
||||||
|
const route = {
|
||||||
|
meta: {
|
||||||
|
menu: 'testMenu',
|
||||||
|
},
|
||||||
|
children: [{ name: 'child1' }, { name: 'child2' }],
|
||||||
|
};
|
||||||
|
vm.addChildren(module, route, parent);
|
||||||
|
|
||||||
|
expect(navigation.addMenuItem).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
jorgep marked this conversation as resolved
Outdated
jorgep
commented
Aquí habría que comprobar que el módulo ha sido añadido no? Aquí habría que comprobar que el módulo ha sido añadido no?
jsegarra
commented
Eso correspondería al test de useNavigationStore, no? No podríamos ni deberíamos testear funcionalidad de otros archivos Eso correspondería al test de useNavigationStore, no? No podríamos ni deberíamos testear funcionalidad de otros archivos
jorgep
commented
En el título del archivo pone should add menu items. Como sabes que ha funcionado? solo sabes que se ha llamado a la función. Los 3 tests son exactamente iguales, con diferente título. Veo tu punto, si no crees que sea el lugar de testearlo, cambia el título del test por uno que compruebe realmente lo que hace esa función, llamar a otra función. En el título del archivo pone should add menu items. Como sabes que ha funcionado? solo sabes que se ha llamado a la función. Los 3 tests son exactamente iguales, con diferente título. Veo tu punto, si no crees que sea el lugar de testearlo, cambia el título del test por uno que compruebe realmente lo que hace esa función, llamar a otra función.
jsegarra
commented
Mmm...WTF. Mmm...WTF.
Lo reviso, pero si 3 iguales
jorgep
commented
Hacer solo 1 test que compruebe que la función ha sido llamada. Estos tests hay hacerlos en navigationStore según lo que hablamos en persona. Hacer solo 1 test que compruebe que la función ha sido llamada. Estos tests hay hacerlos en navigationStore según lo que hablamos en persona.
|
|||||||
|
it('should handle routes with no meta menu', () => {
|
||||||
|
const route = {
|
||||||
|
meta: {},
|
||||||
|
menus: {},
|
||||||
|
};
|
||||||
|
|
||||||
|
const parent = [];
|
||||||
|
|
||||||
|
vm.addChildren(module, route, parent);
|
||||||
|
expect(navigation.addMenuItem).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty parent array', () => {
|
||||||
|
const parent = [];
|
||||||
|
const route = {
|
||||||
|
meta: {
|
||||||
|
menu: 'child11',
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: 'child1',
|
||||||
|
meta: {
|
||||||
|
menuChildren: [
|
||||||
|
{
|
||||||
|
name: 'CustomerCreditContracts',
|
||||||
|
title: 'creditContracts',
|
||||||
|
icon: 'vn:solunion',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
vm.addChildren(module, route, parent);
|
||||||
|
expect(navigation.addMenuItem).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
import { setActivePinia, createPinia } from 'pinia';
|
||||||
|
import { describe, beforeEach, afterEach, it, expect, vi, beforeAll } from 'vitest';
|
||||||
|
import { useNavigationStore } from '../useNavigationStore';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
let store;
|
||||||
|
|
||||||
|
vi.mock('src/router/modules', () => [
|
||||||
|
{ name: 'Item', meta: {} },
|
||||||
|
{ name: 'Shelving', meta: {} },
|
||||||
|
{ name: 'Order', meta: {} },
|
||||||
|
]);
|
||||||
|
|
||||||
|
vi.mock('src/filters', () => ({
|
||||||
|
toLowerCamel: vi.fn((name) => name.toLowerCase()),
|
||||||
|
}));
|
||||||
|
|
||||||
|
const modulesMock = [
|
||||||
|
{
|
||||||
|
name: 'Item',
|
||||||
|
children: null,
|
||||||
|
title: 'globals.pageTitles.undefined',
|
||||||
|
icon: undefined,
|
||||||
|
module: 'item',
|
||||||
|
isPinned: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Shelving',
|
||||||
|
children: null,
|
||||||
|
title: 'globals.pageTitles.undefined',
|
||||||
|
icon: undefined,
|
||||||
|
module: 'shelving',
|
||||||
|
isPinned: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Order',
|
||||||
|
children: null,
|
||||||
|
title: 'globals.pageTitles.undefined',
|
||||||
|
icon: undefined,
|
||||||
|
module: 'order',
|
||||||
|
isPinned: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const pinnedModulesMock = [
|
||||||
|
{
|
||||||
|
name: 'Item',
|
||||||
|
children: null,
|
||||||
|
title: 'globals.pageTitles.undefined',
|
||||||
|
icon: undefined,
|
||||||
|
module: 'item',
|
||||||
|
isPinned: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('useNavigationStore', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
setActivePinia(createPinia());
|
||||||
jorgep marked this conversation as resolved
jsegarra
commented
Si lo dejas aquí OK Si lo dejas aquí OK
Si lo mueves a beforeAll, tienes dependencia de los casos de prueba y fallan
|
|||||||
|
vi.spyOn(axios, 'get').mockResolvedValue({ data: true });
|
||||||
|
store = useNavigationStore();
|
||||||
|
store.getModules = vi.fn().mockReturnValue({
|
||||||
|
value: modulesMock,
|
||||||
|
});
|
||||||
|
store.getPinnedModules = vi.fn().mockReturnValue({
|
||||||
|
value: pinnedModulesMock,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
afterEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return modules with correct structure', () => {
|
||||||
|
const store = useNavigationStore();
|
||||||
|
const modules = store.getModules();
|
||||||
|
|
||||||
|
expect(modules.value).toEqual(modulesMock);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return pinned modules', () => {
|
||||||
|
const store = useNavigationStore();
|
||||||
|
const pinnedModules = store.getPinnedModules();
|
||||||
|
|
||||||
|
expect(pinnedModules.value).toEqual(pinnedModulesMock);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should toggle pinned modules', () => {
|
||||||
|
const store = useNavigationStore();
|
||||||
|
|
||||||
|
store.togglePinned('item');
|
||||||
|
store.togglePinned('shelving');
|
||||||
|
expect(store.pinnedModules).toEqual(['item', 'shelving']);
|
||||||
|
|
||||||
|
store.togglePinned('item');
|
||||||
|
expect(store.pinnedModules).toEqual(['shelving']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fetch pinned modules', async () => {
|
||||||
|
vi.spyOn(axios, 'get').mockResolvedValue({
|
||||||
|
data: [{ id: 1, workerFk: 9, moduleFk: 'order', position: 1 }],
|
||||||
|
});
|
||||||
|
const store = useNavigationStore();
|
||||||
|
await store.fetchPinned();
|
||||||
|
|
||||||
|
expect(store.pinnedModules).toEqual(['order']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should add menu item correctly', () => {
|
||||||
jsegarra marked this conversation as resolved
jorgep
commented
yo comprobaría tambien que se ha añadido en el parent yo comprobaría tambien que se ha añadido en el **parent**
jsegarra
commented
Vaya, no lo veía importante, pero tras hacer unas pruebas, si que lo es Vaya, no lo veía importante, pero tras hacer unas pruebas, si que lo es
|
|||||||
|
const store = useNavigationStore();
|
||||||
|
const module = 'customer';
|
||||||
|
const parent = [];
|
||||||
|
const route = {
|
||||||
|
name: 'customer',
|
||||||
|
title: 'Customer',
|
||||||
|
icon: 'customer',
|
||||||
|
meta: {
|
||||||
|
keyBinding: 'ctrl+shift+c',
|
||||||
|
name: 'customer',
|
||||||
|
title: 'Customer',
|
||||||
|
icon: 'customer',
|
||||||
|
menu: 'customer',
|
||||||
|
menuChildren: [{ name: 'customer', title: 'Customer', icon: 'customer' }],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = store.addMenuItem(module, route, parent);
|
||||||
|
const expectedItem = {
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
icon: 'customer',
|
||||||
|
name: 'customer',
|
||||||
|
title: 'globals.pageTitles.Customer',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
icon: 'customer',
|
||||||
|
keyBinding: 'ctrl+shift+c',
|
||||||
|
name: 'customer',
|
||||||
|
title: 'globals.pageTitles.Customer',
|
||||||
|
};
|
||||||
|
expect(result).toEqual(expectedItem);
|
||||||
|
expect(parent.length).toBe(1);
|
||||||
|
expect(parent).toEqual([expectedItem]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not add menu item if condition is not met', () => {
|
||||||
|
const store = useNavigationStore();
|
||||||
|
const module = 'testModule';
|
||||||
|
const route = { meta: { hidden: true, menuchildren: {} } };
|
||||||
|
const parent = [];
|
||||||
|
const result = store.addMenuItem(module, route, parent);
|
||||||
|
expect(result).toBeUndefined();
|
||||||
|
expect(parent.length).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
Poner otro nombre, está repetido.
oh vaya
should not call getMethodA when method is undefined por ej.