@unifygtm/intent-client
Version:
JavaScript client for interacting with the Unify Intent API in the browser.
117 lines (100 loc) • 4.14 kB
text/typescript
import { anyNumber, mock, mockReset } from 'jest-mock-extended';
import {
CLIENT_SESSION_STORAGE_KEY,
SessionManager,
} from '../../../client/managers';
import { LocalStorageService } from '../../../client/storage';
import { ClientSession } from '../../../types';
import { MockClientSession, TEST_WRITE_KEY } from '../../mocks/data';
const localStorageMock = mock(LocalStorageService.prototype);
jest.mock('../../../client/storage', () => ({
...jest.requireActual('../../../client/storage'),
LocalStorageService: jest.fn().mockImplementation(() => localStorageMock),
}));
describe('SessionManager', () => {
beforeEach(() => {
mockReset(localStorageMock);
});
describe('getOrCreateSession', () => {
it('creates a new session if none exists', () => {
const sessionManager = new SessionManager(TEST_WRITE_KEY);
const result = sessionManager.getOrCreateSession();
expect(localStorageMock.get).toHaveBeenCalledWith(
CLIENT_SESSION_STORAGE_KEY,
);
expect(localStorageMock.set).toHaveBeenCalledWith(
CLIENT_SESSION_STORAGE_KEY,
result,
);
});
describe('when a session already exists', () => {
let mockSession: ClientSession;
describe('when the session is not expired', () => {
beforeEach(() => {
const tenMinutesFromNow = new Date();
tenMinutesFromNow.setMinutes(tenMinutesFromNow.getMinutes() + 10);
mockSession = MockClientSession({
expiration: tenMinutesFromNow.getTime(),
});
localStorageMock.get.mockReturnValueOnce(mockSession);
});
it('updates the session expiration time and returns it', () => {
const sessionManager = new SessionManager(TEST_WRITE_KEY);
const session = sessionManager.getOrCreateSession();
const expectedSession = {
...mockSession,
expiration: anyNumber(),
};
expect(localStorageMock.set).toHaveBeenCalledTimes(1);
expect(localStorageMock.set).toHaveBeenCalledWith(
CLIENT_SESSION_STORAGE_KEY,
expectedSession,
);
expect(session.expiration).toBeGreaterThan(mockSession.expiration);
});
it('gets the cached session if it exists, but still updates session', () => {
// Initialize cached value
localStorageMock.get.mockReturnValueOnce(mockSession);
const sessionManager = new SessionManager(TEST_WRITE_KEY);
sessionManager.getOrCreateSession();
// Clear mock so we can test fresh state
localStorageMock.get.mockClear();
localStorageMock.set.mockClear();
// Check that cached value exists
const session = sessionManager.getOrCreateSession();
expect(session).toEqual({
...mockSession,
expiration: anyNumber(),
});
expect(session.expiration).toBeGreaterThan(mockSession.expiration);
expect(localStorageMock.get).not.toHaveBeenCalled();
expect(localStorageMock.set).toHaveBeenCalledTimes(1);
expect(localStorageMock.set).toHaveBeenCalledWith(
CLIENT_SESSION_STORAGE_KEY,
session,
);
});
});
describe('when the session is expired', () => {
beforeEach(() => {
const tenMinutesAgo = new Date();
tenMinutesAgo.setMinutes(tenMinutesAgo.getMinutes() - 10);
mockSession = MockClientSession({
expiration: tenMinutesAgo.getTime(),
});
localStorageMock.get.mockReturnValueOnce(mockSession);
});
it('creates a new session and stores it', () => {
const sessionManager = new SessionManager(TEST_WRITE_KEY);
const result = sessionManager.getOrCreateSession();
expect(localStorageMock.get).toHaveBeenCalledTimes(1);
expect(localStorageMock.set).toHaveBeenCalledTimes(1);
expect(localStorageMock.set).toHaveBeenCalledWith(
CLIENT_SESSION_STORAGE_KEY,
result,
);
});
});
});
});
});