import { fireEvent, render, screen } from '@testing-library/react';
import React from 'react';
import type { Application } from '@spinnaker/core';
import { CollapsibleSectionStateCache } from '@spinnaker/core';
import { mockLaunchTemplate, mockServerGroup } from '@spinnaker/mocks';
import type { IAmazonMixedInstancesPolicy, IAmazonServerGroupView, IScalingPolicy } from '../../../domain';
import { InstancesDistributionDetailsSection } from '../../../index';
describe('InstancesDistribution', () => {
const app = {} as Application;
const expectValue = (label: string, value: string) => {
const term = screen.getByText(label, { selector: 'dt' });
expect(term.nextElementSibling).toHaveTextContent(value);
};
const serverGroupWithMip = {
...mockServerGroup,
mixedInstancesPolicy: {
instancesDistribution: {
onDemandAllocationStrategy: 'prioritized',
onDemandBaseCapacity: 1,
onDemandPercentageAboveBaseCapacity: 50,
spotAllocationStrategy: 'capacity-optimized',
spotMaxPrice: '1.5',
},
launchTemplates: [mockLaunchTemplate],
} as IAmazonMixedInstancesPolicy,
scalingPolicies: [] as IScalingPolicy[],
} as IAmazonServerGroupView;
beforeEach(() => vi.spyOn(CollapsibleSectionStateCache, 'isSet').mockReturnValue(false));
it('should NOT render for server group without mixed instances policy ', () => {
const serverGroupWithLt = {
...mockServerGroup,
launchTemplate: mockLaunchTemplate,
} as IAmazonServerGroupView;
const { container } = render();
expect(container).toBeEmptyDOMElement();
});
it('should render for server group with mixed instances policy', () => {
render();
fireEvent.click(screen.getByText('Instances Distribution'));
expectValue('On-Demand Allocation Strategy', 'prioritized');
expectValue('On-Demand Base Capacity', '1');
expectValue('On-Demand Percentage Above Base Capacity', '50');
expectValue('Spot Allocation Strategy', 'capacity-optimized');
expectValue('Max Spot Price', '1.5');
});
it('should render for spotInstancePools conditionally', () => {
const newServerGroup = {
...serverGroupWithMip,
};
newServerGroup.mixedInstancesPolicy.instancesDistribution.spotAllocationStrategy = 'lowest-price';
newServerGroup.mixedInstancesPolicy.instancesDistribution.spotInstancePools = 5;
render();
fireEvent.click(screen.getByText('Instances Distribution'));
expectValue('Spot Allocation Strategy', 'lowest-price');
expectValue('Spot Instance Pools', '5');
});
});