piral-notifications
Version:
Plugin for triggering notifications in Piral.
57 lines (53 loc) • 1.88 kB
text/typescript
/**
* @vitest-environment jsdom
*/
import create from 'zustand';
import { describe, it, expect, vitest } from 'vitest';
import { createNotificationsApi } from './create';
function createMockContainer() {
const state = create(() => ({
registry: {
extensions: {},
},
}));
return {
context: {
on: vitest.fn(),
off: vitest.fn(),
emit: vitest.fn(),
defineActions() {},
state,
dispatch(update) {
state.setState(update(state.getState()));
},
} as any,
api: {} as any,
};
}
describe('Create Notifications API Extensions', () => {
it('createCoreApi showNotification uses an action and leaves a disposer', async () => {
const container = createMockContainer();
container.context.openNotification = vitest.fn();
container.context.closeNotification = vitest.fn();
const api = (createNotificationsApi()(container.context) as any)(container.api);
const close = api.showNotification('my notification');
close();
await new Promise((resolve) => setTimeout(resolve, 0));
expect(container.context.openNotification).toHaveBeenCalled();
expect(container.context.closeNotification).toHaveBeenCalled();
});
it('createCoreApi showNotification can be auto closed', () => {
vitest.useFakeTimers();
const container = createMockContainer();
container.context.openNotification = vitest.fn();
container.context.closeNotification = vitest.fn();
const api = (createNotificationsApi()(container.context) as any)(container.api);
api.showNotification('my notification', {
autoClose: 100,
});
expect(container.context.openNotification).toHaveBeenCalled();
expect(container.context.closeNotification).not.toHaveBeenCalled();
vitest.advanceTimersByTime(120);
expect(container.context.closeNotification).toHaveBeenCalled();
});
});