mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { renderWithQueryClient, within } from '@/react-tools/test-utils';
 | 
						|
import { UserContext } from '@/react/hooks/useUser';
 | 
						|
import { UserViewModel } from '@/portainer/models/user';
 | 
						|
import { server, rest } from '@/setup-tests/server';
 | 
						|
import {
 | 
						|
  createMockResourceGroups,
 | 
						|
  createMockSubscriptions,
 | 
						|
} from '@/react-tools/test-mocks';
 | 
						|
 | 
						|
import { DashboardView } from './DashboardView';
 | 
						|
 | 
						|
jest.mock('@uirouter/react', () => ({
 | 
						|
  ...jest.requireActual('@uirouter/react'),
 | 
						|
  useCurrentStateAndParams: jest.fn(() => ({
 | 
						|
    params: { endpointId: 1 },
 | 
						|
  })),
 | 
						|
}));
 | 
						|
 | 
						|
test('dashboard items should render correctly', async () => {
 | 
						|
  const { findByLabelText } = await renderComponent();
 | 
						|
 | 
						|
  const subscriptionsItem = await findByLabelText('Subscription');
 | 
						|
  expect(subscriptionsItem).toBeVisible();
 | 
						|
 | 
						|
  const subscriptionElements = within(subscriptionsItem);
 | 
						|
  expect(subscriptionElements.getByLabelText('value')).toBeVisible();
 | 
						|
 | 
						|
  expect(subscriptionElements.getByLabelText('resourceType')).toHaveTextContent(
 | 
						|
    'Subscriptions'
 | 
						|
  );
 | 
						|
 | 
						|
  const resourceGroupsItem = await findByLabelText('Resource group');
 | 
						|
  expect(resourceGroupsItem).toBeVisible();
 | 
						|
 | 
						|
  const resourceGroupElements = within(resourceGroupsItem);
 | 
						|
  expect(resourceGroupElements.getByLabelText('value')).toBeVisible();
 | 
						|
 | 
						|
  expect(
 | 
						|
    resourceGroupElements.getByLabelText('resourceType')
 | 
						|
  ).toHaveTextContent('Resource groups');
 | 
						|
});
 | 
						|
 | 
						|
test('when there are no subscriptions, should show 0 subscriptions and 0 resource groups', async () => {
 | 
						|
  const { findByLabelText } = await renderComponent();
 | 
						|
 | 
						|
  const subscriptionElements = within(await findByLabelText('Subscription'));
 | 
						|
  expect(subscriptionElements.getByLabelText('value')).toHaveTextContent('0');
 | 
						|
 | 
						|
  const resourceGroupElements = within(await findByLabelText('Resource group'));
 | 
						|
  expect(resourceGroupElements.getByLabelText('value')).toHaveTextContent('0');
 | 
						|
});
 | 
						|
 | 
						|
test('when there is subscription & resource group data, should display these', async () => {
 | 
						|
  const { findByLabelText } = await renderComponent(1, { 'subscription-1': 2 });
 | 
						|
 | 
						|
  const subscriptionElements = within(await findByLabelText('Subscription'));
 | 
						|
  expect(subscriptionElements.getByLabelText('value')).toHaveTextContent('1');
 | 
						|
 | 
						|
  const resourceGroupElements = within(await findByLabelText('Resource group'));
 | 
						|
  expect(resourceGroupElements.getByLabelText('value')).toHaveTextContent('2');
 | 
						|
});
 | 
						|
 | 
						|
test('should correctly show total number of resource groups across multiple subscriptions', async () => {
 | 
						|
  const { findByLabelText } = await renderComponent(2, {
 | 
						|
    'subscription-1': 2,
 | 
						|
    'subscription-2': 3,
 | 
						|
  });
 | 
						|
 | 
						|
  const resourceGroupElements = within(await findByLabelText('Resource group'));
 | 
						|
  expect(resourceGroupElements.getByLabelText('value')).toHaveTextContent('5');
 | 
						|
});
 | 
						|
 | 
						|
test("when only subscriptions fail to load, don't show the dashboard", async () => {
 | 
						|
  const { queryByLabelText } = await renderComponent(
 | 
						|
    1,
 | 
						|
    { 'subscription-1': 1 },
 | 
						|
    500,
 | 
						|
    200
 | 
						|
  );
 | 
						|
  expect(queryByLabelText('Subscription')).not.toBeInTheDocument();
 | 
						|
  expect(queryByLabelText('Resource group')).not.toBeInTheDocument();
 | 
						|
});
 | 
						|
 | 
						|
test('when only resource groups fail to load, still show the subscriptions', async () => {
 | 
						|
  const { queryByLabelText, findByLabelText } = await renderComponent(
 | 
						|
    1,
 | 
						|
    { 'subscription-1': 1 },
 | 
						|
    200,
 | 
						|
    500
 | 
						|
  );
 | 
						|
  await expect(findByLabelText('Subscription')).resolves.toBeInTheDocument();
 | 
						|
  expect(queryByLabelText('Resource group')).not.toBeInTheDocument();
 | 
						|
});
 | 
						|
 | 
						|
async function renderComponent(
 | 
						|
  subscriptionsCount = 0,
 | 
						|
  resourceGroups: Record<string, number> = {},
 | 
						|
  subscriptionsStatus = 200,
 | 
						|
  resourceGroupsStatus = 200
 | 
						|
) {
 | 
						|
  const user = new UserViewModel({ Username: 'user' });
 | 
						|
  const state = { user };
 | 
						|
 | 
						|
  server.use(
 | 
						|
    rest.get(
 | 
						|
      '/api/endpoints/:endpointId/azure/subscriptions',
 | 
						|
      (req, res, ctx) =>
 | 
						|
        res(
 | 
						|
          ctx.json(createMockSubscriptions(subscriptionsCount)),
 | 
						|
          ctx.status(subscriptionsStatus)
 | 
						|
        )
 | 
						|
    ),
 | 
						|
    rest.get(
 | 
						|
      '/api/endpoints/:endpointId/azure/subscriptions/:subscriptionId/resourcegroups',
 | 
						|
      (req, res, ctx) => {
 | 
						|
        if (typeof req.params.subscriptionId !== 'string') {
 | 
						|
          throw new Error("Provided subscriptionId must be of type: 'string'");
 | 
						|
        }
 | 
						|
 | 
						|
        const { subscriptionId } = req.params;
 | 
						|
        return res(
 | 
						|
          ctx.json(
 | 
						|
            createMockResourceGroups(
 | 
						|
              req.params.subscriptionId,
 | 
						|
              resourceGroups[subscriptionId] || 0
 | 
						|
            )
 | 
						|
          ),
 | 
						|
          ctx.status(resourceGroupsStatus)
 | 
						|
        );
 | 
						|
      }
 | 
						|
    )
 | 
						|
  );
 | 
						|
  const renderResult = renderWithQueryClient(
 | 
						|
    <UserContext.Provider value={state}>
 | 
						|
      <DashboardView />
 | 
						|
    </UserContext.Provider>
 | 
						|
  );
 | 
						|
 | 
						|
  await expect(renderResult.findByText(/Home/)).resolves.toBeVisible();
 | 
						|
 | 
						|
  return renderResult;
 | 
						|
}
 |