Files
portal/app/tests/Frontend/ProjectCardBadge.spec.ts
T
Дмитрий 0a4d4f3224 feat(projects): UX «запустится сам после пополнения» + бейдж «ждёт пополнения»
Окно нехватки баланса («Проекты») и «Конкурентное поле» теперь честно
говорят, что взведённый проект запустится сам после пополнения (вместо
«пополните, чтобы запустить»); добавлена кнопка «Пока не надо» (оставить
черновиком). Бейдж взведённого проекта — «ждёт пополнения / запустится
сам» вместо «не хватает баланса». Синхронно в «Проектах» и «Конкурентном
поле». Тесты: ProjectLimitOverloadDialog + ProjectCardBadge обновлены/
дополнены; 8 фронт-спеков 59/59.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 21:41:53 +03:00

62 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from 'vitest';
import { mount } from '@vue/test-utils';
import { createVuetify } from 'vuetify';
import ProjectCard from '../../resources/js/components/projects/ProjectCard.vue';
const vuetify = createVuetify();
const baseProject = {
id: 1,
name: 'Test Project',
signal_type: 'site' as const,
signal_identifier: 'test.ru',
is_active: false,
daily_limit_target: 5,
delivered_today: 0,
sync_status: 'ok' as const,
};
describe('ProjectCard — бейдж баланса', () => {
it('проект с preflight_blocked_at показывает «Ждёт пополнения — запустится сам»', () => {
const project = { ...baseProject, preflight_blocked_at: '2026-07-02T10:00:00Z', balance_blocked: true };
const w = mount(ProjectCard, {
props: { project, selected: false },
global: { plugins: [vuetify], stubs: { RouterLink: true } },
});
expect(w.text()).toContain('Ждёт пополнения — запустится сам');
});
it('обычная пауза (preflight_blocked_at=null) показывает «Приостановлен» а не блок баланса', () => {
const project = { ...baseProject, preflight_blocked_at: null, balance_blocked: false, is_active: false };
const w = mount(ProjectCard, {
props: { project, selected: false },
global: { plugins: [vuetify], stubs: { RouterLink: true } },
});
expect(w.text()).not.toContain('Ждёт пополнения — запустится сам');
// «На паузе» из v-else блока
expect(w.text()).toContain('На паузе');
});
// Плашка смотрела только на синхронизацию с поставщиком и не знала про паузу: карточка
// остановленного проекта одновременно писала «На паузе» и зелёное «Собирает заявки» —
// клиент видел два взаимоисключающих состояния (поймано на кадрах разборов 14.07.2026).
it('проект на паузе НЕ показывает зелёное «Собирает заявки»', () => {
const project = { ...baseProject, is_active: false, sync_status: 'ok' as const, preflight_blocked_at: null, balance_blocked: false };
const w = mount(ProjectCard, {
props: { project, selected: false },
global: { plugins: [vuetify], stubs: { RouterLink: true } },
});
expect(w.text()).not.toContain('Собирает заявки');
expect(w.text()).toContain('Остановлен вами — заявки не приходят');
});
it('активный проект НЕ показывает бейдж баланса', () => {
const project = { ...baseProject, is_active: true, preflight_blocked_at: null, balance_blocked: false };
const w = mount(ProjectCard, {
props: { project, selected: false },
global: { plugins: [vuetify], stubs: { RouterLink: true } },
});
expect(w.text()).not.toContain('не хватает баланса');
});
});