95 lines
3.9 KiB
TypeScript
95 lines
3.9 KiB
TypeScript
|
|
import { describe, it, expect } from 'vitest';
|
|||
|
|
import { mount } from '@vue/test-utils';
|
|||
|
|
import { createVuetify } from 'vuetify';
|
|||
|
|
import BillingView from '../../resources/js/views/BillingView.vue';
|
|||
|
|
import { MOCK_INVOICES, MOCK_TRANSACTIONS } from '../../resources/js/composables/mockBilling';
|
|||
|
|
|
|||
|
|
describe('BillingView.vue', () => {
|
|||
|
|
const factory = () =>
|
|||
|
|
mount(BillingView, {
|
|||
|
|
global: { plugins: [createVuetify()] },
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('монтируется и содержит заголовок «Биллинг и тарифы»', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
expect(wrapper.find('h1').text()).toBe('Биллинг и тарифы');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('содержит page-stats с кошельком, лидами, runway-днями', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toMatch(/14\s+250\s*₽/); // кошелёк ₽
|
|||
|
|
expect(text).toContain('285');
|
|||
|
|
expect(text).toContain('лидов запас');
|
|||
|
|
expect(text).toContain('4 дня');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('показывает pending banner («1 платёж в обработке»)', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toContain('1 платёж в обработке');
|
|||
|
|
expect(text).toMatch(/5\s+000\s*₽/);
|
|||
|
|
expect(text).toContain('ЮKassa');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('содержит 3 wallet-cards (₽ / лиды / тариф)', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toContain('Кошелёк ₽');
|
|||
|
|
expect(text).toContain('LIVE');
|
|||
|
|
expect(text).toContain('Баланс лидов (ГЦК)');
|
|||
|
|
expect(text).toContain('Тариф');
|
|||
|
|
expect(text).toContain('Команда');
|
|||
|
|
expect(text).toContain('990 ₽/мес');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('содержит 3 фичи тарифа', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toContain('до 10 проектов');
|
|||
|
|
expect(text).toContain('4 менеджера');
|
|||
|
|
expect(text).toContain('Канбан, Webhook, API');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('содержит 4 tab-кнопки в transactions panel', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toContain('Все');
|
|||
|
|
expect(text).toContain('Пополнения');
|
|||
|
|
expect(text).toContain('Списания');
|
|||
|
|
expect(text).toContain('Возвраты');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('таблица транзакций по умолчанию (Все) содержит все mock-строки', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const rows = wrapper.findAll('tbody tr');
|
|||
|
|
expect(rows.length).toBe(MOCK_TRANSACTIONS.length);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('форматирует положительную сумму как «+ N ₽» и отрицательную как «− N ₽»', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toMatch(/\+\s+5\s+000\s*₽/); // +5000 топап
|
|||
|
|
expect(text).toMatch(/−\s+6\s+600\s*₽/); // -6600 списание
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('rejected-транзакция показывает «— 0 ₽»', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
expect(wrapper.text()).toContain('— 0 ₽');
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('содержит invoices section с 4 строками', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
expect(wrapper.text()).toContain('Счета и УПД');
|
|||
|
|
const rows = wrapper.findAll('.inv-row');
|
|||
|
|
expect(rows.length).toBe(MOCK_INVOICES.length);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('invoice показывает PDF или 1С 8.3 XML формат', () => {
|
|||
|
|
const wrapper = factory();
|
|||
|
|
const text = wrapper.text();
|
|||
|
|
expect(text).toContain('PDF');
|
|||
|
|
expect(text).toContain('1С 8.3 XML');
|
|||
|
|
});
|
|||
|
|
});
|