44 lines
1.9 KiB
TypeScript
44 lines
1.9 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import { ref } from 'vue';
|
|
import { useTourLauncher } from '../../resources/js/composables/useTourLauncher';
|
|
|
|
function makeRouterMocks(query: Record<string, string>) {
|
|
const route = ref({ query, fullPath: '/x' });
|
|
const router = { push: vi.fn().mockResolvedValue(undefined), replace: vi.fn().mockResolvedValue(undefined) };
|
|
return { route, router };
|
|
}
|
|
|
|
describe('useTourLauncher', () => {
|
|
it('валидный ?tour= → активирует сценарий и ведёт на роут первого шага', async () => {
|
|
const { route, router } = makeRouterMocks({ tour: 'create-project' });
|
|
const l = useTourLauncher(route as never, router as never);
|
|
await l.checkQuery();
|
|
expect(l.activeTour.value?.name).toBe('create-project');
|
|
expect(router.push).toHaveBeenCalledWith({ path: '/projects', query: {} });
|
|
});
|
|
|
|
it('мусорный ?tour= → игнор без падения, query чистится', async () => {
|
|
const { route, router } = makeRouterMocks({ tour: 'no-such' });
|
|
const l = useTourLauncher(route as never, router as never);
|
|
await l.checkQuery();
|
|
expect(l.activeTour.value).toBeNull();
|
|
expect(router.replace).toHaveBeenCalled();
|
|
});
|
|
|
|
it('без ?tour= — ничего не делает', async () => {
|
|
const { route, router } = makeRouterMocks({});
|
|
const l = useTourLauncher(route as never, router as never);
|
|
await l.checkQuery();
|
|
expect(l.activeTour.value).toBeNull();
|
|
expect(router.push).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('finishTour гасит активный тур', async () => {
|
|
const { route, router } = makeRouterMocks({ tour: 'tariffs' });
|
|
const l = useTourLauncher(route as never, router as never);
|
|
await l.checkQuery();
|
|
l.finishTour();
|
|
expect(l.activeTour.value).toBeNull();
|
|
});
|
|
});
|