import { GCMockModule } from '@core/mocks/gc-module.mock'; import { FeatureFlag, FeatureFlags } from '@core/typings/feature-flag.typing'; import { FeatureStatus } from '@yourcause/common/feature-flag'; import { BeforeEach, Spec, TestCase } from '@yourcause/test-decorators'; import { DescribeAngularService } from '@yourcause/test-decorators/angular'; import { expect, spy } from 'chai'; import { FeatureFlagsService } from './feature-flags.service'; enum FakeFeatureFlags { TestFlag = 1, TestFlag2 = 2, TestFlag3 = 3 } @DescribeAngularService(FeatureFlagsService, { imports: [GCMockModule] }) export class FeatureFlagsServiceSpec implements Spec { featureFlagResponse: FeatureFlag[] = [{ name: 'Test flag', statusDate: '', updatedDate: '', feature: FakeFeatureFlags.TestFlag as any, status: FeatureStatus.OFF }, { name: 'Test flag 2', statusDate: '', updatedDate: '', feature: FakeFeatureFlags.TestFlag2 as any, status: FeatureStatus.CANARY }, { name: 'Test flag 3', statusDate: '', updatedDate: '', feature: FakeFeatureFlags.TestFlag3 as any, status: FeatureStatus.ON }]; @BeforeEach() mock (service: FeatureFlagsService) { service['resources']['getFeatureFlags'] = async () => this.featureFlagResponse; service['resources']['updateFeatureFlagStatus'] = async () => {}; } @TestCase('should call common lib on fetch') async testShouldCallCommonOnFetch (service: FeatureFlagsService) { const spy2 = spy.on(service['featureFlagService'], 'setFeatureFlags'); await service.fetchFlags(); expect(spy2).to.have.been.called(); } @TestCase('should refetch when a flag is updated') async testShouldRefetchOnUpdate (service: FeatureFlagsService) { const spy2 = spy.on(service, 'fetchFlags'); await service.updateFlag(FeatureFlags.TestFlag, FeatureStatus.ON); expect(spy2).to.have.been.called(); } @TestCase('should be able to properly map flags to common model') testShouldMapFlagsToCommon (service: FeatureFlagsService) { const response = service['adaptGCFeatureFlagsToCommonFlags'](this.featureFlagResponse); expect(response).to.deep.equal({ [FakeFeatureFlags.TestFlag]: FeatureStatus.OFF, [FakeFeatureFlags.TestFlag2]: FeatureStatus.CANARY, [FakeFeatureFlags.TestFlag3]: FeatureStatus.ON }); } }