import type { IScope } from 'angular';
import { mock } from 'angular';
import type { ShallowWrapper } from 'enzyme';
import { shallow } from 'enzyme';
import React from 'react';
import type { IAccountSelectInputProps, IAccountSelectInputState } from './AccountSelectInput';
import { AccountSelectInput } from './AccountSelectInput';
import type { IAccountDetails } from './AccountService';
import { AccountService } from './AccountService';
import Spy = jasmine.Spy;
const makeAccount = (name: string, cloudProvider: string, primaryAccount: boolean): IAccountDetails => {
return {
accountId: name,
name,
type: cloudProvider,
cloudProvider,
environment: null,
primaryAccount,
accountType: null,
authorized: true,
challengeDestructiveActions: false,
regions: [],
requiredGroupMembership: null,
};
};
describe('', () => {
let component: ShallowWrapper;
let $scope: IScope;
let AccountServiceSpy: Spy;
const allAccounts: { [provider: string]: IAccountDetails[] } = {
aws: [makeAccount('prod', 'aws', true), makeAccount('backup', 'aws', false)],
titus: [makeAccount('titusprod', 'titus', true), makeAccount('titusbackup', 'titus', false)],
};
beforeEach(
mock.inject(($rootScope: IScope) => {
$scope = $rootScope.$new();
AccountServiceSpy = spyOn(AccountService, 'getAllAccountDetailsForProvider').and.callFake((provider: string) => {
return Promise.resolve(allAccounts[provider]);
});
}),
);
it('groups accounts by primary field when provider not specified', (done) => {
const accounts = allAccounts.aws.concat(allAccounts.titus);
component = shallow();
setImmediate(() => {
$scope.$digest();
expect(component.state().primaryAccounts).toEqual(['prod', 'titusprod']);
expect(component.state().secondaryAccounts).toEqual(['backup', 'titusbackup']);
done();
});
});
it('groups accounts by primary field when only one provider available', (done) => {
component = shallow();
setImmediate(() => {
$scope.$digest();
expect(component.state().primaryAccounts).toEqual(['prod']);
expect(component.state().secondaryAccounts).toEqual(['backup']);
expect(AccountServiceSpy.calls.count()).toBe(1);
done();
});
});
it('groups accounts by primary field when only names and provider supplied', (done) => {
const accounts = allAccounts.aws.map((acct) => acct.name);
component = shallow();
setImmediate(() => {
$scope.$digest();
expect(component.state().primaryAccounts).toEqual(['prod']);
expect(component.state().secondaryAccounts).toEqual(['backup']);
expect(AccountServiceSpy.calls.count()).toBe(1);
done();
});
});
it('sets mergedAccounts only if there are no accounts supplied', () => {
component = shallow();
$scope.$digest();
const state = component.state();
expect(state.mergedAccounts).toEqual([]);
expect(state.primaryAccounts).toEqual([]);
expect(state.secondaryAccounts).toEqual([]);
expect(AccountServiceSpy.calls.count()).toBe(0);
});
it('sets all accounts as primary when only names are supplied and provider is not set', () => {
component = shallow();
$scope.$digest();
const state = component.state();
expect(state.mergedAccounts).toEqual(['prod', 'test']);
expect(state.primaryAccounts).toEqual(['prod', 'test']);
expect(state.secondaryAccounts).toEqual([]);
expect(AccountServiceSpy.calls.count()).toBe(0);
});
it('re-groups accounts when they change', () => {
component = shallow();
$scope.$digest();
let state = component.state();
expect(state.mergedAccounts).toEqual(['prod', 'test']);
expect(state.primaryAccounts).toEqual(['prod', 'test']);
expect(state.secondaryAccounts).toEqual([]);
expect(AccountServiceSpy.calls.count()).toBe(0);
component.setProps({ accounts: ['prod', 'test', 'staging'] });
$scope.$digest();
state = component.state();
expect(state.mergedAccounts).toEqual(['prod', 'staging', 'test']);
expect(state.primaryAccounts).toEqual(['prod', 'staging', 'test']);
expect(state.secondaryAccounts).toEqual([]);
expect(AccountServiceSpy.calls.count()).toBe(0);
});
it('unselects nonexistent account', function () {
let updatedVal: string = null;
const onChange = (evt: React.ChangeEvent) => (updatedVal = evt.target.value);
component = shallow(
,
);
$scope.$digest();
expect(updatedVal).toBe('');
});
//
it('does not unselect account if account is an expression', () => {
let updatedVal: string = null;
const onChange = (evt: React.ChangeEvent) => (updatedVal = evt.target.value);
component = shallow(
,
);
$scope.$digest();
expect(updatedVal).toBeNull();
});
it('sets flag on ctrl if account is an expression', () => {
const text = 'Resolved at runtime from expression';
component = shallow(
,
);
$scope.$digest();
expect(component.text()).toContain(text);
});
});