fix: update frontend unit tests to improve coverage and handle edge cases
This commit is contained in:
@@ -90,6 +90,38 @@ describe('api client', () => {
|
||||
expect(error.message).toBe('Bad request')
|
||||
})
|
||||
|
||||
it('keeps original message when response payload is not an object', async () => {
|
||||
const error: ResponseError = {
|
||||
response: { data: 'plain text error' as unknown as Record<string, unknown> },
|
||||
config: { url: '/test' },
|
||||
message: 'Original',
|
||||
}
|
||||
|
||||
const handler = capturedHandlers.onRejected
|
||||
expect(handler).toBeDefined()
|
||||
|
||||
const resultPromise = handler ? handler(error) : Promise.reject(new Error('handler missing'))
|
||||
|
||||
await expect(resultPromise).rejects.toBe(error)
|
||||
expect(error.message).toBe('Original')
|
||||
})
|
||||
|
||||
it('uses error field over message field when both exist', async () => {
|
||||
const error: ResponseError = {
|
||||
response: { data: { error: 'Preferred error', message: 'Secondary message' } },
|
||||
config: { url: '/test' },
|
||||
message: 'Original',
|
||||
}
|
||||
|
||||
const handler = capturedHandlers.onRejected
|
||||
expect(handler).toBeDefined()
|
||||
|
||||
const resultPromise = handler ? handler(error) : Promise.reject(new Error('handler missing'))
|
||||
|
||||
await expect(resultPromise).rejects.toBe(error)
|
||||
expect(error.message).toBe('Preferred error')
|
||||
})
|
||||
|
||||
it('invokes auth error handler on 401 outside auth endpoints', async () => {
|
||||
const onAuthError = vi.fn()
|
||||
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
||||
@@ -137,4 +169,37 @@ describe('api client', () => {
|
||||
|
||||
warnSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('does not invoke auth error handler when status is not 401', async () => {
|
||||
const onAuthError = vi.fn()
|
||||
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
|
||||
|
||||
setAuthErrorHandler(onAuthError)
|
||||
|
||||
const error: ResponseError = {
|
||||
response: { status: 403, data: { message: 'Forbidden' } },
|
||||
config: { url: '/proxy-hosts' },
|
||||
message: 'Original',
|
||||
}
|
||||
|
||||
const handler = capturedHandlers.onRejected
|
||||
expect(handler).toBeDefined()
|
||||
|
||||
const resultPromise = handler ? handler(error) : Promise.reject(new Error('handler missing'))
|
||||
|
||||
await expect(resultPromise).rejects.toBe(error)
|
||||
expect(onAuthError).not.toHaveBeenCalled()
|
||||
expect(warnSpy).not.toHaveBeenCalled()
|
||||
|
||||
warnSpy.mockRestore()
|
||||
})
|
||||
|
||||
it('passes through successful responses via fulfilled interceptor', () => {
|
||||
const responsePayload = { data: { ok: true } }
|
||||
const fulfilled = capturedHandlers.onFulfilled
|
||||
|
||||
expect(fulfilled).toBeDefined()
|
||||
const result = fulfilled ? fulfilled(responsePayload) : undefined
|
||||
expect(result).toBe(responsePayload)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -37,6 +37,14 @@ describe('import API', () => {
|
||||
expect(result).toEqual(mockResponse);
|
||||
});
|
||||
|
||||
it('uploadCaddyfilesMulti accepts empty file arrays', async () => {
|
||||
mockedPost.mockResolvedValue({ data: { preview: { hosts: [], conflicts: [], errors: [] } } });
|
||||
|
||||
const result = await uploadCaddyfilesMulti([]);
|
||||
expect(client.post).toHaveBeenCalledWith('/import/upload-multi', { files: [] });
|
||||
expect(result).toEqual({ preview: { hosts: [], conflicts: [], errors: [] } });
|
||||
});
|
||||
|
||||
it('getImportPreview gets preview', async () => {
|
||||
const mockResponse = { preview: { hosts: [] } };
|
||||
mockedGet.mockResolvedValue({ data: mockResponse });
|
||||
@@ -70,6 +78,20 @@ describe('import API', () => {
|
||||
expect(client.post).toHaveBeenCalledWith('/import/cancel');
|
||||
});
|
||||
|
||||
it('forwards commitImport errors', async () => {
|
||||
const error = new Error('commit failed');
|
||||
mockedPost.mockRejectedValue(error);
|
||||
|
||||
await expect(commitImport('uuid-123', {}, {})).rejects.toBe(error);
|
||||
});
|
||||
|
||||
it('forwards cancelImport errors', async () => {
|
||||
const error = new Error('cancel failed');
|
||||
mockedPost.mockRejectedValue(error);
|
||||
|
||||
await expect(cancelImport()).rejects.toBe(error);
|
||||
});
|
||||
|
||||
it('getImportStatus gets status', async () => {
|
||||
const mockResponse = { has_pending: true };
|
||||
mockedGet.mockResolvedValue({ data: mockResponse });
|
||||
@@ -85,4 +107,11 @@ describe('import API', () => {
|
||||
const result = await getImportStatus();
|
||||
expect(result).toEqual({ has_pending: false });
|
||||
});
|
||||
|
||||
it('getImportStatus returns false on non-Error rejections', async () => {
|
||||
mockedGet.mockRejectedValue('network down');
|
||||
|
||||
const result = await getImportStatus();
|
||||
expect(result).toEqual({ has_pending: false });
|
||||
});
|
||||
});
|
||||
|
||||
@@ -39,6 +39,15 @@ describe('securityHeadersApi', () => {
|
||||
expect(result).toEqual(mockProfile);
|
||||
});
|
||||
|
||||
it('getProfile accepts UUID string identifiers', async () => {
|
||||
const mockProfile = { id: 2, uuid: 'profile-uuid', name: 'Profile UUID' };
|
||||
mockedGet.mockResolvedValue({ data: { profile: mockProfile } });
|
||||
|
||||
const result = await securityHeadersApi.getProfile('profile-uuid');
|
||||
expect(client.get).toHaveBeenCalledWith('/security/headers/profiles/profile-uuid');
|
||||
expect(result).toEqual(mockProfile);
|
||||
});
|
||||
|
||||
it('createProfile creates a profile', async () => {
|
||||
const newProfile = { name: 'New Profile' };
|
||||
const mockResponse = { id: 1, ...newProfile };
|
||||
@@ -66,6 +75,13 @@ describe('securityHeadersApi', () => {
|
||||
expect(client.delete).toHaveBeenCalledWith('/security/headers/profiles/1');
|
||||
});
|
||||
|
||||
it('forwards API errors from listProfiles', async () => {
|
||||
const error = new Error('backend unavailable');
|
||||
mockedGet.mockRejectedValue(error);
|
||||
|
||||
await expect(securityHeadersApi.listProfiles()).rejects.toBe(error);
|
||||
});
|
||||
|
||||
it('getPresets returns presets', async () => {
|
||||
const mockPresets = [{ name: 'Basic' }];
|
||||
mockedGet.mockResolvedValue({ data: { presets: mockPresets } });
|
||||
|
||||
Reference in New Issue
Block a user