Files
portainer/app/react/kubernetes/more-resources/ServiceAccountsView/ItemView/ServiceAccountDetailsWidget.test.tsx
T

167 lines
4.6 KiB
TypeScript

import { render, screen } from '@testing-library/react';
import { vi } from 'vitest';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ReactNode } from 'react';
import { useServiceAccount } from '../queries/useServiceAccount';
import { ServiceAccountDetailsWidget } from './ServiceAccountDetailsWidget';
vi.mock('../queries/useServiceAccount', () => ({
useServiceAccount: vi.fn(),
}));
vi.mock('@/react/hooks/useEnvironmentId', () => ({
useEnvironmentId: () => 1,
}));
vi.mock('@/react/hooks/useUser', () => ({
useCurrentUser: () => ({ isPureAdmin: true }),
}));
vi.mock('@/react/kubernetes/configs/queries/useSecrets', () => ({
useSecrets: vi.fn(() => ({ data: [] })),
}));
vi.mock('@/react/portainer/registries/queries/useRegistry', () => ({
useRegistry: vi.fn(() => ({ data: undefined })),
}));
vi.mock('@@/Link', () => ({
Link: ({ children }: { children: ReactNode }) => <span>{children}</span>,
}));
function renderWidget() {
const client = new QueryClient();
return render(
<QueryClientProvider client={client}>
<ServiceAccountDetailsWidget namespace="default" name="my-sa" />
</QueryClientProvider>
);
}
describe('ServiceAccountDetailsWidget', () => {
it('shows service account name and namespace', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('my-sa')).toBeInTheDocument();
expect(screen.getByText('default')).toBeInTheDocument();
});
it('shows image pull secret badges', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
imagePullSecrets: [{ name: 'registry-creds' }],
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('registry-creds')).toBeInTheDocument();
});
it('shows "None" when there are no image pull secrets', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
imagePullSecrets: [],
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('None')).toBeInTheDocument();
});
it('truncates image pull secrets beyond the visible limit and shows overflow badge', () => {
const secrets = Array.from({ length: 7 }, (_, i) => ({
name: `secret-${i}`,
}));
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
imagePullSecrets: secrets,
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('+ 2 more')).toBeInTheDocument();
expect(screen.queryByText('secret-5')).not.toBeInTheDocument();
});
it('shows automount token as Disabled when explicitly false', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
automountServiceAccountToken: false,
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('Disabled')).toBeInTheDocument();
});
it('shows automount token as Enabled when not set', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'my-sa',
namespace: 'default',
isSystem: false,
uid: '',
creationDate: '',
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
expect(screen.getByText('Enabled')).toBeInTheDocument();
});
it('shows SystemBadge for system service accounts', () => {
vi.mocked(useServiceAccount).mockReturnValue({
data: {
name: 'default',
namespace: 'kube-system',
isSystem: true,
uid: '',
creationDate: '',
},
isLoading: false,
} as unknown as ReturnType<typeof useServiceAccount>);
renderWidget();
const systemBadges = screen.getAllByRole('status');
expect(systemBadges).toHaveLength(2);
expect(systemBadges[0]).toHaveTextContent('System');
});
});