96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { bulkUpdateACL } from '../proxyHosts';
|
|
import type { BulkUpdateACLResponse } from '../proxyHosts';
|
|
|
|
// Mock the client module
|
|
const mockPut = vi.fn();
|
|
vi.mock('../client', () => ({
|
|
default: {
|
|
put: (...args: unknown[]) => mockPut(...args),
|
|
},
|
|
}));
|
|
|
|
describe('proxyHosts bulk operations', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('bulkUpdateACL', () => {
|
|
it('should apply ACL to multiple hosts', async () => {
|
|
const mockResponse: BulkUpdateACLResponse = {
|
|
updated: 3,
|
|
errors: [],
|
|
};
|
|
mockPut.mockResolvedValue({ data: mockResponse });
|
|
|
|
const hostUUIDs = ['uuid-1', 'uuid-2', 'uuid-3'];
|
|
const accessListID = 42;
|
|
const result = await bulkUpdateACL(hostUUIDs, accessListID);
|
|
|
|
expect(mockPut).toHaveBeenCalledWith('/proxy-hosts/bulk-update-acl', {
|
|
host_uuids: hostUUIDs,
|
|
access_list_id: accessListID,
|
|
});
|
|
expect(result).toEqual(mockResponse);
|
|
});
|
|
|
|
it('should remove ACL from hosts when accessListID is null', async () => {
|
|
const mockResponse: BulkUpdateACLResponse = {
|
|
updated: 2,
|
|
errors: [],
|
|
};
|
|
mockPut.mockResolvedValue({ data: mockResponse });
|
|
|
|
const hostUUIDs = ['uuid-1', 'uuid-2'];
|
|
const result = await bulkUpdateACL(hostUUIDs, null);
|
|
|
|
expect(mockPut).toHaveBeenCalledWith('/proxy-hosts/bulk-update-acl', {
|
|
host_uuids: hostUUIDs,
|
|
access_list_id: null,
|
|
});
|
|
expect(result).toEqual(mockResponse);
|
|
});
|
|
|
|
it('should handle partial failures', async () => {
|
|
const mockResponse: BulkUpdateACLResponse = {
|
|
updated: 1,
|
|
errors: [
|
|
{ uuid: 'invalid-uuid', error: 'proxy host not found' },
|
|
],
|
|
};
|
|
mockPut.mockResolvedValue({ data: mockResponse });
|
|
|
|
const hostUUIDs = ['valid-uuid', 'invalid-uuid'];
|
|
const accessListID = 10;
|
|
const result = await bulkUpdateACL(hostUUIDs, accessListID);
|
|
|
|
expect(result.updated).toBe(1);
|
|
expect(result.errors).toHaveLength(1);
|
|
expect(result.errors[0].uuid).toBe('invalid-uuid');
|
|
});
|
|
|
|
it('should handle empty host list', async () => {
|
|
const mockResponse: BulkUpdateACLResponse = {
|
|
updated: 0,
|
|
errors: [],
|
|
};
|
|
mockPut.mockResolvedValue({ data: mockResponse });
|
|
|
|
const result = await bulkUpdateACL([], 5);
|
|
|
|
expect(mockPut).toHaveBeenCalledWith('/proxy-hosts/bulk-update-acl', {
|
|
host_uuids: [],
|
|
access_list_id: 5,
|
|
});
|
|
expect(result.updated).toBe(0);
|
|
});
|
|
|
|
it('should propagate API errors', async () => {
|
|
const error = new Error('Network error');
|
|
mockPut.mockRejectedValue(error);
|
|
|
|
await expect(bulkUpdateACL(['uuid-1'], 1)).rejects.toThrow('Network error');
|
|
});
|
|
});
|
|
});
|