Files
portal/app/tests/Frontend/projectsStore.bulkUpdate.spec.ts
T
Дмитрий 54451d2ea6 feat(projects): RegionsBulkDialog — subject-level regions (89 RF subjects) #1426
Bulk regions dialog reworked from federal-district bitmask to subject/region
selection, consistent with ProjectDetailsDrawer/NewProjectDialog. Full-stack:
add_regions/remove_regions on projects.regions INT[], BulkProjectActionRequest
split validation, ProjectService model-instance update. federal-districts.ts
removed (zero consumers). +menuRepositionFix util for v-autocomplete menu.
phpstan-baseline: bump actingAs ignore count 14->15 (new validation test).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 03:41:46 +03:00

69 lines
2.3 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { setActivePinia, createPinia } from 'pinia';
import axios from 'axios';
import { useProjectsStore } from '../../resources/js/stores/projectsStore';
vi.mock('axios');
describe('projectsStore.bulkUpdate', () => {
beforeEach(() => {
setActivePinia(createPinia());
vi.mocked(axios.post).mockResolvedValue({ data: { updated: 2, skipped: [], warnings: [] } });
vi.mocked(axios.get).mockResolvedValue({ data: { data: [], meta: { total: 0 } } });
});
it('sends ids array when selectAllByFilter=false', async () => {
const store = useProjectsStore();
store.selectedIds.add(3);
store.selectedIds.add(7);
await store.bulkUpdate({ action: 'pause' });
expect(axios.post).toHaveBeenCalledWith('/api/projects/bulk', {
action: 'pause',
ids: [3, 7],
});
});
it('sends scope.filter when selectAllByFilter=true', async () => {
const store = useProjectsStore();
store.selectAllByFilter = true;
store.filters.signal_type = 'sms';
store.filters.status = 'active';
store.filters.search = 'окна';
await store.bulkUpdate({ action: 'update_regions', add_regions: [3, 5], remove_regions: [1] });
expect(axios.post).toHaveBeenCalledWith('/api/projects/bulk', {
action: 'update_regions',
add_regions: [3, 5],
remove_regions: [1],
scope: { filter: { signal_type: 'sms', status: 'active', search: 'окна' } },
});
});
it('toggleSelect drops out of selectAllByFilter mode', () => {
const store = useProjectsStore();
store.selectAllByFilter = true;
store.selectedIds.add(1);
store.selectedIds.add(2);
store.toggleSelect(1);
expect(store.selectAllByFilter).toBe(false);
expect(store.selectedIds.has(1)).toBe(false);
expect(store.selectedIds.has(2)).toBe(true);
});
it('clears selection after successful bulkUpdate', async () => {
const store = useProjectsStore();
store.selectedIds.add(1);
store.selectAllByFilter = true;
await store.bulkUpdate({ action: 'pause' });
expect(store.selectedIds.size).toBe(0);
expect(store.selectAllByFilter).toBe(false);
});
});