Add centralized API client with axios interceptors, remove vue-axios
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -21,13 +21,14 @@ vi.mock('@/router/index.ts', () => ({
|
||||
default: { push: vi.fn(), currentRoute: { value: { path: '/' } } },
|
||||
}));
|
||||
|
||||
import axios from 'axios';
|
||||
import useFilesStore from '@/stores/files.js';
|
||||
const { mockGet, mockPost, mockPut, mockDelete } = vi.hoisted(() => ({
|
||||
mockGet: vi.fn(), mockPost: vi.fn(), mockPut: vi.fn(), mockDelete: vi.fn(),
|
||||
}));
|
||||
vi.mock('@/api/client.js', () => ({
|
||||
default: { get: mockGet, post: mockPost, put: mockPut, delete: mockDelete },
|
||||
}));
|
||||
|
||||
vi.spyOn(axios, 'get').mockImplementation(vi.fn());
|
||||
vi.spyOn(axios, 'post').mockImplementation(vi.fn());
|
||||
vi.spyOn(axios, 'put').mockImplementation(vi.fn());
|
||||
vi.spyOn(axios, 'delete').mockImplementation(vi.fn());
|
||||
import useFilesStore from '@/stores/files.js';
|
||||
|
||||
describe('filesStore', () => {
|
||||
let store;
|
||||
@@ -63,7 +64,7 @@ describe('filesStore', () => {
|
||||
|
||||
describe('fetchAllFiles', () => {
|
||||
it('fetches and transforms file data', async () => {
|
||||
axios.get.mockResolvedValue({
|
||||
mockGet.mockResolvedValue({
|
||||
data: [
|
||||
{
|
||||
type: 'log',
|
||||
@@ -85,7 +86,7 @@ describe('filesStore', () => {
|
||||
|
||||
await store.fetchAllFiles();
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('/api/files');
|
||||
expect(mockGet).toHaveBeenCalledWith('/api/files');
|
||||
expect(store.allEventFiles).toHaveLength(2);
|
||||
expect(store.allEventFiles[0].fileType).toBe('Log');
|
||||
expect(store.allEventFiles[0].icon).toBe('work_history');
|
||||
@@ -96,19 +97,19 @@ describe('filesStore', () => {
|
||||
});
|
||||
|
||||
it('does not throw on API failure', async () => {
|
||||
axios.get.mockRejectedValue(new Error('Network error'));
|
||||
mockGet.mockRejectedValue(new Error('Network error'));
|
||||
await expect(store.fetchAllFiles()).resolves.toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('upload', () => {
|
||||
it('uploads file and navigates to Upload page', async () => {
|
||||
axios.post.mockResolvedValue({ data: { id: 42 } });
|
||||
mockPost.mockResolvedValue({ data: { id: 42 } });
|
||||
const formData = new FormData();
|
||||
|
||||
await store.upload(formData);
|
||||
|
||||
expect(axios.post).toHaveBeenCalledWith(
|
||||
expect(mockPost).toHaveBeenCalledWith(
|
||||
'/api/logs/csv-uploads',
|
||||
formData,
|
||||
expect.objectContaining({
|
||||
@@ -123,25 +124,25 @@ describe('filesStore', () => {
|
||||
describe('getUploadDetail', () => {
|
||||
it('fetches upload preview', async () => {
|
||||
store.uploadId = 10;
|
||||
axios.get.mockResolvedValue({
|
||||
mockGet.mockResolvedValue({
|
||||
data: { preview: { columns: ['a', 'b'] } },
|
||||
});
|
||||
|
||||
await store.getUploadDetail();
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('/api/logs/csv-uploads/10');
|
||||
expect(mockGet).toHaveBeenCalledWith('/api/logs/csv-uploads/10');
|
||||
expect(store.allUploadDetail).toEqual({ columns: ['a', 'b'] });
|
||||
});
|
||||
});
|
||||
|
||||
describe('rename', () => {
|
||||
it('renames a log file', async () => {
|
||||
axios.put.mockResolvedValue({});
|
||||
axios.get.mockResolvedValue({ data: [] });
|
||||
mockPut.mockResolvedValue({});
|
||||
mockGet.mockResolvedValue({ data: [] });
|
||||
|
||||
await store.rename('log', 5, 'new-name');
|
||||
|
||||
expect(axios.put).toHaveBeenCalledWith('/api/logs/5/name', {
|
||||
expect(mockPut).toHaveBeenCalledWith('/api/logs/5/name', {
|
||||
name: 'new-name',
|
||||
});
|
||||
});
|
||||
@@ -149,30 +150,30 @@ describe('filesStore', () => {
|
||||
|
||||
describe('getDependents', () => {
|
||||
it('fetches dependents for a log', async () => {
|
||||
axios.get.mockResolvedValue({ data: [{ id: 1 }, { id: 2 }] });
|
||||
mockGet.mockResolvedValue({ data: [{ id: 1 }, { id: 2 }] });
|
||||
|
||||
await store.getDependents('log', 7);
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('/api/logs/7/dependents');
|
||||
expect(mockGet).toHaveBeenCalledWith('/api/logs/7/dependents');
|
||||
expect(store.allDependentsData).toEqual([{ id: 1 }, { id: 2 }]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('deleteFile', () => {
|
||||
it('calls axios.delete before fetchAllFiles', async () => {
|
||||
it('calls mockDelete before fetchAllFiles', async () => {
|
||||
const callOrder = [];
|
||||
axios.delete.mockImplementation(async () => {
|
||||
mockDelete.mockImplementation(async () => {
|
||||
callOrder.push('delete');
|
||||
return {};
|
||||
});
|
||||
axios.get.mockImplementation(async () => {
|
||||
mockGet.mockImplementation(async () => {
|
||||
callOrder.push('get');
|
||||
return { data: [] };
|
||||
});
|
||||
|
||||
await store.deleteFile('log', 1);
|
||||
|
||||
expect(axios.delete).toHaveBeenCalledWith('/api/logs/1');
|
||||
expect(mockDelete).toHaveBeenCalledWith('/api/logs/1');
|
||||
expect(callOrder.indexOf('delete')).toBeLessThan(
|
||||
callOrder.indexOf('get'),
|
||||
);
|
||||
@@ -183,37 +184,37 @@ describe('filesStore', () => {
|
||||
store.deleteFile('log', null),
|
||||
).resolves.toBeUndefined();
|
||||
|
||||
expect(axios.delete).not.toHaveBeenCalled();
|
||||
expect(mockDelete).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('deletionRecord', () => {
|
||||
it('deletes a deletion record', async () => {
|
||||
axios.delete.mockResolvedValue({});
|
||||
mockDelete.mockResolvedValue({});
|
||||
|
||||
await store.deletionRecord(5);
|
||||
|
||||
expect(axios.delete).toHaveBeenCalledWith('/api/deletion/5');
|
||||
expect(mockDelete).toHaveBeenCalledWith('/api/deletion/5');
|
||||
});
|
||||
});
|
||||
|
||||
describe('downloadFileCSV', () => {
|
||||
it('downloads CSV for a log', async () => {
|
||||
axios.get.mockResolvedValue({ data: 'col1,col2\na,b' });
|
||||
mockGet.mockResolvedValue({ data: 'col1,col2\na,b' });
|
||||
|
||||
window.URL.createObjectURL = vi.fn().mockReturnValue('blob:test');
|
||||
window.URL.revokeObjectURL = vi.fn();
|
||||
|
||||
await store.downloadFileCSV('log', 3, 'my-file');
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('/api/logs/3/csv');
|
||||
expect(mockGet).toHaveBeenCalledWith('/api/logs/3/csv');
|
||||
expect(window.URL.revokeObjectURL).toHaveBeenCalledWith('blob:test');
|
||||
});
|
||||
|
||||
it('returns early for unsupported type', async () => {
|
||||
await store.downloadFileCSV('log-check', 3, 'file');
|
||||
|
||||
expect(axios.get).not.toHaveBeenCalled();
|
||||
expect(mockGet).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user