mirror of https://github.com/portainer/portainer
215 lines
5.8 KiB
TypeScript
215 lines
5.8 KiB
TypeScript
import { render, screen, within } from '@testing-library/react';
|
|
import { HttpResponse } from 'msw';
|
|
|
|
import { withTestQueryProvider } from '@/react/test-utils/withTestQuery';
|
|
import { server, http } from '@/setup-tests/server';
|
|
import {
|
|
createMockEnvironment,
|
|
createMockQueryResult,
|
|
} from '@/react-tools/test-mocks';
|
|
|
|
import { ClusterResourceReservation } from './ClusterResourceReservation';
|
|
|
|
const mockUseAuthorizations = vi.fn();
|
|
const mockUseEnvironmentId = vi.fn(() => 3);
|
|
const mockUseCurrentEnvironment = vi.fn();
|
|
|
|
// Set up mock implementations for hooks
|
|
vi.mock('@/react/hooks/useUser', () => ({
|
|
useAuthorizations: () => mockUseAuthorizations(),
|
|
}));
|
|
|
|
vi.mock('@/react/hooks/useEnvironmentId', () => ({
|
|
useEnvironmentId: () => mockUseEnvironmentId(),
|
|
}));
|
|
|
|
vi.mock('@/react/hooks/useCurrentEnvironment', () => ({
|
|
useCurrentEnvironment: () => mockUseCurrentEnvironment(),
|
|
}));
|
|
|
|
function renderComponent() {
|
|
const Wrapped = withTestQueryProvider(ClusterResourceReservation);
|
|
return render(<Wrapped />);
|
|
}
|
|
|
|
describe('ClusterResourceReservation', () => {
|
|
beforeEach(() => {
|
|
// Set the return values for the hooks
|
|
mockUseAuthorizations.mockReturnValue({
|
|
authorized: true,
|
|
isLoading: false,
|
|
});
|
|
|
|
mockUseEnvironmentId.mockReturnValue(3);
|
|
|
|
const mockEnvironment = createMockEnvironment();
|
|
mockEnvironment.Kubernetes.Configuration.UseServerMetrics = true;
|
|
mockUseCurrentEnvironment.mockReturnValue(
|
|
createMockQueryResult(mockEnvironment)
|
|
);
|
|
|
|
// Setup default mock responses
|
|
server.use(
|
|
http.get('/api/endpoints/3/kubernetes/api/v1/nodes', () =>
|
|
HttpResponse.json({
|
|
items: [
|
|
{
|
|
status: {
|
|
allocatable: {
|
|
cpu: '4',
|
|
memory: '8Gi',
|
|
},
|
|
},
|
|
},
|
|
],
|
|
})
|
|
),
|
|
http.get('/api/kubernetes/3/metrics/nodes', () =>
|
|
HttpResponse.json({
|
|
items: [
|
|
{
|
|
usage: {
|
|
cpu: '2',
|
|
memory: '4Gi',
|
|
},
|
|
},
|
|
],
|
|
})
|
|
),
|
|
http.get('/api/kubernetes/3/metrics/applications_resources', () =>
|
|
HttpResponse.json({
|
|
CpuRequest: 1,
|
|
MemoryRequest: '2Gi',
|
|
})
|
|
)
|
|
);
|
|
});
|
|
|
|
it('should display resource limits, reservations and usage when all APIs respond successfully', async () => {
|
|
renderComponent();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('memory-reservation')).findByText(
|
|
'2147 / 8589 MB - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('memory-usage')).findByText(
|
|
'4294 / 8589 MB - 50%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-reservation')).findByText(
|
|
'1 / 4 - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-usage')).findByText(
|
|
'2 / 4 - 50%'
|
|
)
|
|
).toBeVisible();
|
|
});
|
|
|
|
it('should not display resource usage if user does not have K8sClusterNodeR authorization', async () => {
|
|
mockUseAuthorizations.mockReturnValue({
|
|
authorized: false,
|
|
isLoading: false,
|
|
});
|
|
|
|
renderComponent();
|
|
|
|
// Should only show reservation bars
|
|
expect(
|
|
await within(await screen.findByTestId('memory-reservation')).findByText(
|
|
'2147 / 8589 MB - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-reservation')).findByText(
|
|
'1 / 4 - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
// Usage bars should not be present
|
|
expect(screen.queryByTestId('memory-usage')).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId('cpu-usage')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('should not display resource usage if metrics server is not enabled', async () => {
|
|
const disabledMetricsEnvironment = createMockEnvironment();
|
|
disabledMetricsEnvironment.Kubernetes.Configuration.UseServerMetrics =
|
|
false;
|
|
mockUseCurrentEnvironment.mockReturnValue(
|
|
createMockQueryResult(disabledMetricsEnvironment)
|
|
);
|
|
|
|
renderComponent();
|
|
|
|
// Should only show reservation bars
|
|
expect(
|
|
await within(await screen.findByTestId('memory-reservation')).findByText(
|
|
'2147 / 8589 MB - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-reservation')).findByText(
|
|
'1 / 4 - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
// Usage bars should not be present
|
|
expect(screen.queryByTestId('memory-usage')).not.toBeInTheDocument();
|
|
expect(screen.queryByTestId('cpu-usage')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('should display warning if metrics server is enabled but usage query fails', async () => {
|
|
server.use(
|
|
http.get('/api/kubernetes/3/metrics/nodes', () => HttpResponse.error())
|
|
);
|
|
|
|
// Mock console.error so test logs are not polluted
|
|
vi.spyOn(console, 'error').mockImplementation(() => {});
|
|
|
|
renderComponent();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('memory-reservation')).findByText(
|
|
'2147 / 8589 MB - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('memory-usage')).findByText(
|
|
'0 / 8589 MB - 0%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-reservation')).findByText(
|
|
'1 / 4 - 25%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
expect(
|
|
await within(await screen.findByTestId('cpu-usage')).findByText(
|
|
'0 / 4 - 0%'
|
|
)
|
|
).toBeVisible();
|
|
|
|
// Should show the warning message
|
|
expect(
|
|
await screen.findByText(
|
|
/Resource usage is not currently available as Metrics Server is not responding/
|
|
)
|
|
).toBeVisible();
|
|
|
|
// Restore console.error
|
|
vi.spyOn(console, 'error').mockRestore();
|
|
});
|
|
});
|