-
-
-
-
-
- {{ t('globals.collapseMenu') }}
-
-
-
-
-
@@ -102,18 +85,4 @@ const filter = {
-
-
-
-
-
diff --git a/src/router/index.js b/src/router/index.js
index 3e442f0e62..7a0aedcaec 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -12,6 +12,7 @@ import { useSession } from 'src/composables/useSession';
import { useRole } from 'src/composables/useRole';
import { useUserConfig } from 'src/composables/useUserConfig';
import { toLowerCamel } from 'src/filters';
+import { useTokenConfig } from 'src/composables/useTokenConfig';
const state = useState();
const session = useSession();
@@ -55,6 +56,7 @@ export default route(function (/* { store, ssrContext } */) {
if (stateRoles.length === 0) {
await useRole().fetch();
await useUserConfig().fetch();
+ await useTokenConfig().fetch();
}
const matches = to.matched;
const hasRequiredRoles = matches.every((route) => {
diff --git a/src/router/modules/department.js b/src/router/modules/department.js
index aaffc34602..dfd5e64bac 100644
--- a/src/router/modules/department.js
+++ b/src/router/modules/department.js
@@ -6,6 +6,7 @@ export default {
meta: {
title: 'department',
icon: 'vn:greuge',
+ moduleName: 'Department',
},
component: RouterView,
redirect: { name: 'DepartmentCard' },
diff --git a/src/router/modules/index.js b/src/router/modules/index.js
index 6f4b0b35ef..941358d26a 100644
--- a/src/router/modules/index.js
+++ b/src/router/modules/index.js
@@ -16,6 +16,7 @@ import Entry from './entry';
import roadmap from './roadmap';
import Parking from './parking';
import Agency from './agency';
+import ItemType from './itemType';
export default [
Item,
@@ -36,4 +37,5 @@ export default [
roadmap,
Parking,
Agency,
+ ItemType,
];
diff --git a/src/router/modules/item.js b/src/router/modules/item.js
index bc1e72a948..7ee5dcf78e 100644
--- a/src/router/modules/item.js
+++ b/src/router/modules/item.js
@@ -11,7 +11,13 @@ export default {
component: RouterView,
redirect: { name: 'ItemMain' },
menus: {
- main: ['ItemList', 'WasteBreakdown', 'ItemFixedPrice', 'ItemRequest'],
+ main: [
+ 'ItemList',
+ 'WasteBreakdown',
+ 'ItemFixedPrice',
+ 'ItemRequest',
+ 'ItemTypeList',
+ ],
card: [
'ItemBasicData',
'ItemLog',
@@ -68,6 +74,23 @@ export default {
'https://grafana.verdnatura.es/d/TTNXQAxVk';
},
},
+ {
+ path: 'item-type-list',
+ name: 'ItemTypeList',
+ meta: {
+ title: 'family',
+ icon: 'contact_support',
+ },
+ component: () => import('src/pages/Item/ItemTypeList.vue'),
+ },
+ {
+ path: 'item-type-list/create',
+ name: 'ItemTypeCreate',
+ meta: {
+ title: 'itemTypeCreate',
+ },
+ component: () => import('src/pages/Item/ItemTypeCreate.vue'),
+ },
{
path: 'request',
name: 'ItemRequest',
diff --git a/src/router/modules/itemType.js b/src/router/modules/itemType.js
new file mode 100644
index 0000000000..8064c41ff2
--- /dev/null
+++ b/src/router/modules/itemType.js
@@ -0,0 +1,46 @@
+import { RouterView } from 'vue-router';
+
+export default {
+ path: '/item/item-type',
+ name: 'ItemType',
+ meta: {
+ title: 'itemType',
+ icon: 'contact_support',
+ moduleName: 'ItemType',
+ },
+ component: RouterView,
+ redirect: { name: 'ItemTypeList' },
+ menus: {
+ main: [],
+ card: ['ItemTypeBasicData'],
+ },
+ children: [
+ {
+ name: 'ItemTypeCard',
+ path: ':id',
+ component: () => import('src/pages/ItemType/Card/ItemTypeCard.vue'),
+ redirect: { name: 'ItemTypeSummary' },
+ children: [
+ {
+ name: 'ItemTypeSummary',
+ path: 'summary',
+ meta: {
+ title: 'summary',
+ },
+ component: () =>
+ import('src/pages/ItemType/Card/ItemTypeSummary.vue'),
+ },
+ {
+ name: 'ItemTypeBasicData',
+ path: 'basic-data',
+ meta: {
+ title: 'basicData',
+ icon: 'vn:settings',
+ },
+ component: () =>
+ import('src/pages/ItemType/Card/ItemTypeBasicData.vue'),
+ },
+ ],
+ },
+ ],
+};
diff --git a/src/router/modules/roadmap.js b/src/router/modules/roadmap.js
index 02edf94bee..6b2aa6a13e 100644
--- a/src/router/modules/roadmap.js
+++ b/src/router/modules/roadmap.js
@@ -6,6 +6,7 @@ export default {
meta: {
title: 'roadmap',
icon: 'vn:troncales',
+ moduleName: 'Roadmap',
},
component: RouterView,
redirect: { name: 'RouteMain' },
diff --git a/src/router/routes.js b/src/router/routes.js
index ca52441e7c..92145d44e7 100644
--- a/src/router/routes.js
+++ b/src/router/routes.js
@@ -10,6 +10,7 @@ import supplier from './modules/Supplier';
import route from './modules/route';
import travel from './modules/travel';
import department from './modules/department';
+import ItemType from './modules/itemType';
import shelving from 'src/router/modules/shelving';
import order from 'src/router/modules/order';
import entry from 'src/router/modules/entry';
@@ -73,6 +74,7 @@ const routes = [
entry,
parking,
agency,
+ ItemType,
{
path: '/:catchAll(.*)*',
name: 'NotFound',
diff --git a/test/vitest/__tests__/composables/useSession.spec.js b/test/vitest/__tests__/composables/useSession.spec.js
index f9f3dcb80e..2292859a97 100644
--- a/test/vitest/__tests__/composables/useSession.spec.js
+++ b/test/vitest/__tests__/composables/useSession.spec.js
@@ -1,5 +1,5 @@
-import { vi, describe, expect, it } from 'vitest';
-import { axios } from 'app/test/vitest/helper';
+import { vi, describe, expect, it, beforeAll, beforeEach } from 'vitest';
+import { axios, flushPromises } from 'app/test/vitest/helper';
import { useSession } from 'composables/useSession';
import { useState } from 'composables/useState';
@@ -63,73 +63,148 @@ describe('session', () => {
});
});
- describe('login', () => {
- const expectedUser = {
- id: 999,
- name: `T'Challa`,
- nickname: 'Black Panther',
- lang: 'en',
- userConfig: {
- darkMode: false,
- },
- };
- const rolesData = [
- {
- role: {
- name: 'salesPerson',
+ describe(
+ 'login',
+ () => {
+ const expectedUser = {
+ id: 999,
+ name: `T'Challa`,
+ nickname: 'Black Panther',
+ lang: 'en',
+ userConfig: {
+ darkMode: false,
},
- },
- {
- role: {
- name: 'admin',
+ };
+ const rolesData = [
+ {
+ role: {
+ name: 'salesPerson',
+ },
},
- },
- ];
+ {
+ role: {
+ name: 'admin',
+ },
+ },
+ ];
- it('should fetch the user roles and then set token in the sessionStorage', async () => {
- const expectedRoles = ['salesPerson', 'admin'];
- vi.spyOn(axios, 'get').mockResolvedValue({
- data: { roles: rolesData, user: expectedUser },
+ it('should fetch the user roles and then set token in the sessionStorage', async () => {
+ const expectedRoles = ['salesPerson', 'admin'];
+ vi.spyOn(axios, 'get').mockResolvedValue({
+ data: { roles: rolesData, user: expectedUser },
+ });
+
+ const expectedToken = 'mySessionToken';
+ const expectedTokenMultimedia = 'mySessionTokenMultimedia';
+ const keepLogin = false;
+
+ await session.login({
+ token: expectedToken,
+ tokenMultimedia: expectedTokenMultimedia,
+ keepLogin,
+ });
+
+ const roles = state.getRoles();
+ const localToken = localStorage.getItem('token');
+ const sessionToken = sessionStorage.getItem('token');
+
+ expect(roles.value).toEqual(expectedRoles);
+ expect(localToken).toBeNull();
+ expect(sessionToken).toEqual(expectedToken);
+
+ await session.destroy(); // this clears token and user for any other test
});
- const expectedToken = 'mySessionToken';
- const expectedTokenMultimedia = 'mySessionTokenMultimedia';
- const keepLogin = false;
+ it('should fetch the user roles and then set token in the localStorage', async () => {
+ const expectedRoles = ['salesPerson', 'admin'];
+ vi.spyOn(axios, 'get').mockResolvedValue({
+ data: { roles: rolesData, user: expectedUser },
+ });
- await session.login(expectedToken,expectedTokenMultimedia, keepLogin);
+ const expectedToken = 'myLocalToken';
+ const expectedTokenMultimedia = 'myLocalTokenMultimedia';
+ const keepLogin = true;
- const roles = state.getRoles();
- const localToken = localStorage.getItem('token');
- const sessionToken = sessionStorage.getItem('token');
+ await session.login({
+ token: expectedToken,
+ tokenMultimedia: expectedTokenMultimedia,
+ keepLogin,
+ });
- expect(roles.value).toEqual(expectedRoles);
- expect(localToken).toBeNull();
- expect(sessionToken).toEqual(expectedToken);
+ const roles = state.getRoles();
+ const localToken = localStorage.getItem('token');
+ const sessionToken = sessionStorage.getItem('token');
- await session.destroy(); // this clears token and user for any other test
+ expect(roles.value).toEqual(expectedRoles);
+ expect(localToken).toEqual(expectedToken);
+ expect(sessionToken).toBeNull();
+
+ await session.destroy(); // this clears token and user for any other test
+ });
+ },
+ {}
+ );
+
+ describe('RenewToken', () => {
+ const expectedToken = 'myToken';
+ const expectedTokenMultimedia = 'myTokenMultimedia';
+ const currentDate = new Date();
+ beforeAll(() => {
+ const tokenConfig = {
+ id: 1,
+ renewPeriod: 21600,
+ courtesyTime: 60,
+ renewInterval: 300,
+ };
+ state.setTokenConfig(tokenConfig);
+ sessionStorage.setItem('renewPeriod', 1);
});
+ it('NOT Should renewToken', async () => {
+ const data = {
+ token: expectedToken,
+ tokenMultimedia: expectedTokenMultimedia,
+ keepLogin: false,
+ ttl: 1,
+ created: Date.now(),
+ };
+ session.setSession(data);
+ expect(sessionStorage.getItem('keepLogin')).toBeFalsy();
+ expect(sessionStorage.getItem('created')).toBeDefined();
+ expect(sessionStorage.getItem('ttl')).toEqual(1);
+ await session.checkValidity();
+ expect(sessionStorage.getItem('token')).toEqual(expectedToken);
+ expect(sessionStorage.getItem('tokenMultimedia')).toEqual(
+ expectedTokenMultimedia
+ );
+ });
+ it('Should renewToken', async () => {
+ currentDate.setMinutes(currentDate.getMinutes() - 100);
+ const data = {
+ token: expectedToken,
+ tokenMultimedia: expectedTokenMultimedia,
+ keepLogin: false,
+ ttl: 1,
+ created: currentDate,
+ };
+ session.setSession(data);
- it('should fetch the user roles and then set token in the localStorage', async () => {
- const expectedRoles = ['salesPerson', 'admin'];
- vi.spyOn(axios, 'get').mockResolvedValue({
- data: { roles: rolesData, user: expectedUser },
- });
-
- const expectedToken = 'myLocalToken';
- const expectedTokenMultimedia = 'myLocalTokenMultimedia';
- const keepLogin = true;
-
- await session.login(expectedToken, expectedTokenMultimedia, keepLogin);
-
- const roles = state.getRoles();
- const localToken = localStorage.getItem('token');
- const sessionToken = sessionStorage.getItem('token');
-
- expect(roles.value).toEqual(expectedRoles);
- expect(localToken).toEqual(expectedToken);
- expect(sessionToken).toBeNull();
-
- await session.destroy(); // this clears token and user for any other test
+ vi.spyOn(axios, 'post')
+ .mockResolvedValueOnce({
+ data: { id: '' },
+ })
+ .mockResolvedValueOnce({
+ data: {
+ id: '',
+ },
+ });
+ expect(sessionStorage.getItem('keepLogin')).toBeFalsy();
+ expect(sessionStorage.getItem('created')).toBeDefined();
+ expect(sessionStorage.getItem('ttl')).toEqual(1);
+ await session.checkValidity();
+ expect(sessionStorage.getItem('token')).not.toEqual(expectedToken);
+ expect(sessionStorage.getItem('tokenMultimedia')).not.toEqual(
+ expectedTokenMultimedia
+ );
});
});
});
diff --git a/test/vitest/__tests__/composables/useTokenConfig.spec.js b/test/vitest/__tests__/composables/useTokenConfig.spec.js
new file mode 100644
index 0000000000..a25a4abb1e
--- /dev/null
+++ b/test/vitest/__tests__/composables/useTokenConfig.spec.js
@@ -0,0 +1,31 @@
+import { vi, describe, expect, it } from 'vitest';
+import { axios, flushPromises } from 'app/test/vitest/helper';
+import { useTokenConfig } from 'composables/useTokenConfig';
+const tokenConfig = useTokenConfig();
+
+describe('useTokenConfig', () => {
+ describe('fetch', () => {
+ it('should call setTokenConfig of the state with the expected data', async () => {
+ const data = {
+ id: 1,
+ renewPeriod: 21600,
+ courtesyTime: 60,
+ renewInterval: 300,
+ };
+ vi.spyOn(axios, 'get').mockResolvedValueOnce({
+ data,
+ });
+
+ vi.spyOn(tokenConfig.state, 'setTokenConfig');
+
+ tokenConfig.fetch();
+
+ await flushPromises();
+
+ expect(tokenConfig.state.setTokenConfig).toHaveBeenCalledWith(data);
+
+ const renewPeriod = sessionStorage.getItem('renewPeriod');
+ expect(renewPeriod).toEqual(data.renewPeriod);
+ });
+ });
+});