Skip to content

Commit 757465d

Browse files
feat: TT-224 Create a general service for Feature Toggle and its unit tests (#667)
1 parent 05fce31 commit 757465d

File tree

5 files changed

+74
-29
lines changed

5 files changed

+74
-29
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { FeatureToggle } from './../../../../../environments/enum';
2+
import { TestBed } from '@angular/core/testing';
3+
import { of, Observable } from 'rxjs';
4+
import { FeatureManagerService } from '../feature-toggle-manager.service';
5+
import { FeatureToggleGeneralService } from './feature-toggle-general.service';
6+
7+
8+
describe('FeatureToggleGeneralService', () => {
9+
let featureToggleGeneralService: FeatureToggleGeneralService;
10+
let featureManagerService: FeatureManagerService;
11+
12+
beforeEach(() => {
13+
TestBed.configureTestingModule({
14+
providers: [{ provide: FeatureManagerService }],
15+
});
16+
featureToggleGeneralService = TestBed.inject(FeatureToggleGeneralService);
17+
featureManagerService = TestBed.inject(FeatureManagerService);
18+
});
19+
20+
it('should be created', () => {
21+
expect(featureToggleGeneralService).toBeTruthy();
22+
});
23+
24+
const params = [{ bool: false }, { bool: true }];
25+
params.map((param) => {
26+
it(`isActivated should return a boolean ${param.bool}`, () => {
27+
const toggleName = FeatureToggle.SWITCH_GROUP;
28+
// tslint:disable-next-line: no-shadowed-variable
29+
featureManagerService.isToggleEnabledForUser = (toggleName) => of(param.bool);
30+
31+
featureToggleGeneralService.isActivated(toggleName).subscribe((enabled) => {
32+
expect(enabled).toBe(param.bool);
33+
});
34+
});
35+
});
36+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { map } from 'rxjs/operators';
2+
import { FeatureToggle } from './../../../../../environments/enum';
3+
import { Injectable } from '@angular/core';
4+
import { Observable } from 'rxjs';
5+
import { FeatureManagerService } from '../feature-toggle-manager.service';
6+
7+
@Injectable({
8+
providedIn: 'root',
9+
})
10+
export class FeatureToggleGeneralService {
11+
constructor(private featureManagerService: FeatureManagerService) {}
12+
13+
isActivated(featureToggle: FeatureToggle): Observable<boolean> {
14+
return this.featureManagerService.isToggleEnabledForUser(featureToggle);
15+
}
16+
}

src/app/modules/time-clock/components/entry-fields/entry-fields.component.spec.ts

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { NgxMaterialTimepickerModule } from 'ngx-material-timepicker';
1616
import * as moment from 'moment';
1717
import { DATE_FORMAT_YEAR } from 'src/environments/environment';
1818
import { FeatureManagerService } from './../../../shared/feature-toggles/feature-toggle-manager.service';
19+
import { FeatureToggleGeneralService } from './../../../shared/feature-toggles/feature-toggle-general/feature-toggle-general.service';
20+
import { FeatureToggle } from 'src/environments/enum';
1921

2022

2123
describe('EntryFieldsComponent', () => {
@@ -26,7 +28,7 @@ describe('EntryFieldsComponent', () => {
2628
let mockTechnologySelector;
2729
let mockProjectsSelector;
2830
let entryForm;
29-
let featureManagerService: FeatureManagerService;
31+
let featureToggleGeneralService: FeatureToggleGeneralService;
3032
const actionSub: ActionsSubject = new ActionsSubject();
3133
const toastrServiceStub = {
3234
error: (message?: string, title?: string, override?: Partial<IndividualConfig>) => { },
@@ -117,7 +119,7 @@ describe('EntryFieldsComponent', () => {
117119
entryForm = TestBed.inject(FormBuilder);
118120
mockTechnologySelector = store.overrideSelector(allTechnologies, state.technologies);
119121
mockProjectsSelector = store.overrideSelector(getCustomerProjects, state.projects);
120-
featureManagerService = TestBed.inject(FeatureManagerService);
122+
featureToggleGeneralService = TestBed.inject(FeatureToggleGeneralService);
121123
}));
122124

123125
beforeEach(() => {
@@ -431,42 +433,31 @@ describe('EntryFieldsComponent', () => {
431433
});
432434

433435
it('when feature-toggle "update-entries" enable for the user, the updateEntry function is executes to update the entries', () => {
434-
spyOn(featureManagerService, 'isToggleEnabledForUser').and.returnValue(of(true));
436+
spyOn(featureToggleGeneralService, 'isActivated').and.returnValue(of(true));
435437

436438
const mockEntry = { ...entry,
437439
start_date : moment().format(DATE_FORMAT_YEAR),
438440
start_hour : moment().format('HH:mm'),
439441
update_last_entry_if_overlap: true
440442
};
441443
component.newData = mockEntry;
442-
component.isFeatureToggleActivated();
443444
const expected = { update_last_entry_if_overlap: true };
444-
expect(component.newData.update_last_entry_if_overlap).toEqual(expected.update_last_entry_if_overlap);
445+
featureToggleGeneralService.isActivated(FeatureToggle.UPDATE_ENTRIES).subscribe(() => {
446+
expect(featureToggleGeneralService.isActivated).toHaveBeenCalled();
447+
expect(component.newData.update_last_entry_if_overlap).toEqual(expected.update_last_entry_if_overlap);
448+
});
445449
});
446450

447451
it('when FT "update-entries" disable for the user,the UpdateCurrentOrLastEntry function is called to update the entries', () => {
448-
spyOn(featureManagerService, 'isToggleEnabledForUser').and.returnValue(of(false));
452+
spyOn(featureToggleGeneralService, 'isActivated').and.returnValue(of(false));
449453

450454
const mockEntry = { ...entry,
451455
start_date : moment().format(DATE_FORMAT_YEAR),
452456
start_hour : moment().format('HH:mm'),
453-
update_last_entry_if_overlap: false
454457
};
455458
component.newData = mockEntry;
456-
component.isFeatureToggleActivated();
457-
const expected = { update_last_entry_if_overlap: false };
458-
expect(component.newData.update_last_entry_if_overlap).toEqual(expected.update_last_entry_if_overlap);
459-
});
460-
461-
const toggleValues = [true, false];
462-
toggleValues.map((toggleValue) => {
463-
it(`when FeatureToggle is ${toggleValue} should return ${toggleValue}`, () => {
464-
spyOn(featureManagerService, 'isToggleEnabledForUser').and.returnValue(of(toggleValue));
465-
466-
const isFeatureToggleActivated: Observable<boolean> = component.isFeatureToggleActivated();
467-
468-
expect(featureManagerService.isToggleEnabledForUser).toHaveBeenCalled();
469-
isFeatureToggleActivated.subscribe((value) => expect(value).toEqual(toggleValue));
459+
featureToggleGeneralService.isActivated(FeatureToggle.UPDATE_ENTRIES).subscribe(() => {
460+
expect(featureToggleGeneralService.isActivated).toHaveBeenCalled();
470461
});
471462
});
472463
});

src/app/modules/time-clock/components/entry-fields/entry-fields.component.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { AzureAdB2CService } from './../../../login/services/azure.ad.b2c.service';
2+
import { FeatureToggleGeneralService } from './../../../shared/feature-toggles/feature-toggle-general/feature-toggle-general.service';
13
import { ActivityManagementActionTypes } from './../../../activities-management/store/activity-management.actions';
2-
import { EntryActionTypes, LoadActiveEntry, UpdateCurrentOrLastEntry, UpdateEntry } from './../../store/entry.actions';
4+
import { EntryActionTypes, LoadActiveEntry, UpdateCurrentOrLastEntry, UpdateEntry, UpdateEntryRunning } from './../../store/entry.actions';
35
import { filter, map } from 'rxjs/operators';
46
import { Component, OnDestroy, OnInit } from '@angular/core';
57
import { FormBuilder, FormGroup } from '@angular/forms';
@@ -17,6 +19,7 @@ import { getTimeEntriesDataSource } from '../../store/entry.selectors';
1719
import { DATE_FORMAT } from 'src/environments/environment';
1820
import { Subscription, Observable } from 'rxjs';
1921
import { FeatureManagerService } from './../../../shared/feature-toggles/feature-toggle-manager.service';
22+
import { FeatureToggle } from './../../../../../environments/enum';
2023

2124
type Merged = TechnologyState & ProjectState & ActivityState;
2225

@@ -44,7 +47,7 @@ export class EntryFieldsComponent implements OnInit, OnDestroy {
4447
private store: Store<Merged>,
4548
private actionsSubject$: ActionsSubject,
4649
private toastrService: ToastrService,
47-
private featureManagerService: FeatureManagerService
50+
private featureToggleGeneralService: FeatureToggleGeneralService,
4851
) {
4952
this.entryForm = this.formBuilder.group({
5053
description: '',
@@ -65,7 +68,7 @@ export class EntryFieldsComponent implements OnInit, OnDestroy {
6568
this.store.dispatch(new LoadActiveEntry());
6669
});
6770

68-
this.isEnableToggleSubscription = this.isFeatureToggleActivated().subscribe((flag) => {
71+
this.isEnableToggleSubscription = this.featureToggleGeneralService.isActivated(FeatureToggle.UPDATE_ENTRIES).subscribe((flag) => {
6972
this.isFeatureToggleActive = flag;
7073
});
7174

@@ -192,9 +195,4 @@ export class EntryFieldsComponent implements OnInit, OnDestroy {
192195
this.loadActiveEntrySubscription.unsubscribe();
193196
this.actionSetDateSubscription.unsubscribe();
194197
}
195-
196-
isFeatureToggleActivated(): Observable<boolean> {
197-
return this.featureManagerService.isToggleEnabledForUser('update-entries')
198-
.pipe(map((enabled: boolean) => enabled));
199-
}
200198
}

src/environments/enum.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum FeatureToggle {
2+
SWITCH_GROUP = 'switch-group',
3+
UPDATE_ENTRIES = 'update-entries'
4+
}

0 commit comments

Comments
 (0)