diff --git a/src/boot/axios.js b/src/boot/axios.js index aee38e887..5da26a404 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -4,9 +4,8 @@ import { Router } from 'src/router'; import useNotify from 'src/composables/useNotify.js'; import { useStateQueryStore } from 'src/stores/useStateQueryStore'; -const session = useSession(); -const { notify } = useNotify(); -const stateQuery = useStateQueryStore(); +let session, notify, stateQuery; + const baseUrl = '/api/'; axios.defaults.baseURL = baseUrl; @@ -51,9 +50,15 @@ const onResponseError = (error) => { return Promise.reject(error); }; -axios.interceptors.request.use(onRequest, onRequestError); -axios.interceptors.response.use(onResponse, onResponseError); -axiosNoError.interceptors.request.use(onRequest); -axiosNoError.interceptors.response.use(onResponse); +export function setupAxios() { + session = useSession(); + notify = useNotify().notify; + stateQuery = useStateQueryStore(); + + axios.interceptors.request.use(onRequest, onRequestError); + axios.interceptors.response.use(onResponse, onResponseError); + axiosNoError.interceptors.request.use(onRequest); + axiosNoError.interceptors.response.use(onResponse); +} export { onRequest, onResponseError, axiosNoError }; diff --git a/src/boot/quasar.js b/src/boot/quasar.js index 01fe68d8b..1cc2e82cf 100644 --- a/src/boot/quasar.js +++ b/src/boot/quasar.js @@ -1,6 +1,7 @@ import { boot } from 'quasar/wrappers'; import qFormMixin from './qformMixin'; import keyShortcut from './keyShortcut'; +import { setupAxios } from 'src/boot/axios'; import useNotify from 'src/composables/useNotify.js'; import { CanceledError } from 'axios'; @@ -48,4 +49,5 @@ export default boot(({ app }) => { notify(message ?? 'globals.error', 'negative', 'error'); }; + setupAxios(); }); diff --git a/src/composables/useSession.js b/src/composables/useSession.js index 633a30bb0..5097a1fee 100644 --- a/src/composables/useSession.js +++ b/src/composables/useSession.js @@ -8,9 +8,13 @@ import useNotify from './useNotify'; import { useTokenConfig } from './useTokenConfig'; const TOKEN_MULTIMEDIA = 'tokenMultimedia'; const TOKEN = 'token'; - +let router; +export default { + setup() { + router = useRouter(); + }, +}; export function useSession() { - const router = useRouter(); const { notify } = useNotify(); let isCheckingToken = false; let intervalId = null; diff --git a/src/router/index.js b/src/router/index.js index 18541c0b2..5ed8ad9ed 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -14,8 +14,8 @@ import { useUserConfig } from 'src/composables/useUserConfig'; import { useTokenConfig } from 'src/composables/useTokenConfig'; import { useAcl } from 'src/composables/useAcl'; -const state = useState(); -const session = useSession(); +let state, session; + const { t, te } = i18n.global; const createHistory = process.env.SERVER @@ -43,8 +43,10 @@ const Router = createRouter({ * with the Router instance. */ export { Router }; -export default route(function (/* { store, ssrContext } */) { +export default route((/* { store, ssrContext } */) => { Router.beforeEach(async (to, from, next) => { + state = useState(); + session = useSession(); const { isLoggedIn } = session; const outLayout = Router.options.routes[0].children.map((r) => r.name); if (!isLoggedIn() && !outLayout.includes(to.name)) { diff --git a/test/vitest/__tests__/boot/axios.spec.js b/test/vitest/__tests__/boot/axios.spec.js index 19d396ec5..3c59dbc48 100644 --- a/test/vitest/__tests__/boot/axios.spec.js +++ b/test/vitest/__tests__/boot/axios.spec.js @@ -1,23 +1,38 @@ -import { Notify } from 'quasar'; -import { onRequest, onResponseError } from 'src/boot/axios'; -import { describe, expect, it, vi } from 'vitest'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { setupAxios, onRequest, onResponseError } from 'src/boot/axios'; +import { useSession } from 'src/composables/useSession'; +import useNotify from 'src/composables/useNotify'; +import { useStateQueryStore } from 'src/stores/useStateQueryStore'; -vi.mock('src/composables/useSession', () => ({ - useSession: () => ({ - getToken: () => 'DEFAULT_TOKEN', - isLoggedIn: () => vi.fn(), - destroy: () => vi.fn(), - }), -})); - -vi.mock('src/stores/useStateQueryStore', () => ({ - useStateQueryStore: () => ({ - add: () => vi.fn(), - remove: () => vi.fn(), - }), -})); +vi.mock('src/composables/useSession'); +vi.mock('src/composables/useNotify'); +vi.mock('src/stores/useStateQueryStore'); describe('Axios boot', () => { + let sessionMock, notifyMock, stateQueryMock; + + beforeEach(() => { + sessionMock = { + getToken: vi.fn().mockReturnValue('DEFAULT_TOKEN'), + isLoggedIn: vi.fn().mockReturnValue(true), + destroy: vi.fn(), + }; + + notifyMock = { + notify: vi.fn(), + }; + + stateQueryMock = { + add: vi.fn(), + remove: vi.fn(), + }; + + useSession.mockReturnValue(sessionMock); + useNotify.mockReturnValue(notifyMock); + useStateQueryStore.mockReturnValue(stateQueryMock); + + setupAxios(); + }); describe('onRequest()', async () => { it('should set the "Authorization" property on the headers', async () => { const config = { headers: {} };