54451d2ea6
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>
69 lines
2.3 KiB
TypeScript
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);
|
|
});
|
|
});
|