37 lines
1.5 KiB
TypeScript
37 lines
1.5 KiB
TypeScript
|
|
import { describe, it, expect } from 'vitest';
|
||
|
|
import { mount } from '@vue/test-utils';
|
||
|
|
import { createVuetify } from 'vuetify';
|
||
|
|
import RecoveryCodesView from '../../resources/js/views/auth/RecoveryCodesView.vue';
|
||
|
|
|
||
|
|
describe('RecoveryCodesView.vue', () => {
|
||
|
|
const factory = () =>
|
||
|
|
mount(RecoveryCodesView, {
|
||
|
|
global: { plugins: [createVuetify()] },
|
||
|
|
});
|
||
|
|
|
||
|
|
it('монтируется и содержит заголовок «Резервные коды»', () => {
|
||
|
|
const wrapper = factory();
|
||
|
|
expect(wrapper.text()).toContain('Резервные коды');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('рендерит ровно 8 кодов в формате XXXX-XXXX', () => {
|
||
|
|
const wrapper = factory();
|
||
|
|
const codes = wrapper.findAll('.code-item');
|
||
|
|
expect(codes).toHaveLength(8);
|
||
|
|
codes.forEach((c) => {
|
||
|
|
expect(c.text()).toMatch(/^[A-Z0-9]{4}-[A-Z0-9]{4}$/);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('содержит warning о невозможности повторного просмотра', () => {
|
||
|
|
const wrapper = factory();
|
||
|
|
expect(wrapper.text()).toContain('После закрытия страницы коды нельзя посмотреть снова');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('содержит кнопки «Скачать .txt» и «Копировать»', () => {
|
||
|
|
const wrapper = factory();
|
||
|
|
expect(wrapper.text()).toContain('Скачать');
|
||
|
|
expect(wrapper.text()).toContain('Копировать');
|
||
|
|
});
|
||
|
|
});
|