5180 fichiers 38.5 Mo 0 téléchargements 199 vues mis à jour il y a 5 heures ui
nitro-v36-with-renderer-v36 / src / api / auth / ssoTokenExchange.test.ts
ssoTokenExchange.test.ts 2.3 Ko Télécharger le fichier
/* @vitest-environment jsdom */
import { GetConfiguration } from '@octane/renderer';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { clearAccessToken, getAccessToken, persistAccessTokenFromPayload, setAccessToken } from './accessToken';
import { exchangeSsoTicketForAccessToken } from './ssoTokenExchange';

const FAR_FUTURE = 4102444800;

const replyWith = (accessToken: string) => vi.fn(async () => new Response(JSON.stringify({ accessToken, accessTokenExpiresAt: FAR_FUTURE }), { status: 200 }));

describe('exchangeSsoTicketForAccessToken', () => {
    beforeEach(() => {
        window.localStorage.clear();
        clearAccessToken();
        vi.mocked(GetConfiguration).mockReturnValue({
            getValue: (_key: string, fallback: unknown) => fallback,
            interpolate: (value: string) => value
        } as never);
    });

    afterEach(() => vi.unstubAllGlobals());

    it('drops a token left in storage by another session before exchanging the new ticket', async () => {
        setAccessToken('token-of-the-previous-user', FAR_FUTURE);
        const fetch = replyWith('token-of-the-new-user');
        vi.stubGlobal('fetch', fetch);

        await exchangeSsoTicketForAccessToken('ticket-of-the-new-user');

        expect(fetch).toHaveBeenCalledTimes(1);
        expect(getAccessToken()).toBe('token-of-the-new-user');
    });

    it('keeps the token a login just stored for the same ticket, without asking again', async () => {
        persistAccessTokenFromPayload({ accessToken: 'token-from-the-login', accessTokenExpiresAt: FAR_FUTURE }, 'ticket-1');
        const fetch = replyWith('unused');
        vi.stubGlobal('fetch', fetch);

        await exchangeSsoTicketForAccessToken('ticket-1');

        expect(fetch).not.toHaveBeenCalled();
        expect(getAccessToken()).toBe('token-from-the-login');
    });

    it('does not keep the old token when the exchange for a new ticket fails', async () => {
        persistAccessTokenFromPayload({ accessToken: 'token-of-ticket-1', accessTokenExpiresAt: FAR_FUTURE }, 'ticket-1');
        vi.stubGlobal(
            'fetch',
            vi.fn(async () => new Response('', { status: 401 }))
        );

        await exchangeSsoTicketForAccessToken('ticket-2');

        expect(getAccessToken()).toBe('');
    });
});
15Sujets
1Dépôts
20Membres
2En ligne
Profile
Inscrit
Dernière visite
Messages
0
Votes positifs
0
Votes négatifs
0

Nous utilisons des cookies pour assurer le bon fonctionnement du site et améliorer votre expérience. en savoir plus

Autoriser