From 6f900cc45d7dd7f97430812b86b5c1d1693c8ae3 Mon Sep 17 00:00:00 2001 From: Ittay Stern Date: Wed, 29 Aug 2018 17:01:32 +0300 Subject: merge from ecomp a88f0072 - Modern UI Issue-ID: VID-378 Change-Id: Ibcb23dd27f550cf32ce2fe0239f0f496ae014ff6 Signed-off-by: Ittay Stern --- .../basic/basic.featureFlag.directive.spec.ts | 93 ++++++++++++++++++++++ .../directive/basic/basic.featureFlag.directive.ts | 29 +++++++ 2 files changed, 122 insertions(+) create mode 100644 vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts create mode 100644 vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts (limited to 'vid-webpack-master/src/app/featureFlag/directive') diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts new file mode 100644 index 000000000..5722aa795 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.spec.ts @@ -0,0 +1,93 @@ +import {TestBed, ComponentFixture, tick, inject} from '@angular/core/testing'; +import {Component, DebugElement, Renderer2, Type} from "@angular/core"; +import {By} from "@angular/platform-browser"; +import {BasicFeatureFlagDirective} from "./basic.featureFlag.directive"; +import {FeatureFlagService} from "../../service/featureFlag.service"; +import {ConfigurationService} from "../../../shared/services/configuration.service"; +import {HttpClientTestingModule, HttpTestingController} from "@angular/common/http/testing"; +import {NgRedux} from "@angular-redux/store"; +import {of} from "rxjs"; + +@Component({ + template: ` +
+
+
+
` +}) +class TestFeatureFlagComponent { +} + +class MockRenderer { + setStyle() { + + } +} + +class MockAppStore { + getState() { + return { + global: { + flags : { + + } + } + } + } +} + + +describe('Basic Feature Flag Directive', () => { + let component: TestFeatureFlagComponent; + let fixture: ComponentFixture; + let directiveInstance: BasicFeatureFlagDirective; + let elementOff: DebugElement; + let elementOn: DebugElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule + ], + declarations: [ + TestFeatureFlagComponent, + BasicFeatureFlagDirective], + providers: [ + FeatureFlagService, + ConfigurationService, + {provide: NgRedux, useClass: MockAppStore}, + {provide: Renderer2, useClass: MockRenderer}] + }).compileComponents(); + + fixture = TestBed.createComponent(TestFeatureFlagComponent); + component = fixture.componentInstance; + elementOff = fixture.debugElement.query(By.css('#featureFlagOff')); + elementOn = fixture.debugElement.query(By.css('#featureFlagOn')); + directiveInstance = elementOff.injector.get(BasicFeatureFlagDirective); + }); + + + test('directive should be defined', () => { + expect(directiveInstance).toBeDefined(); + }); + + test('should hide element if feature flag is off', () => { + directiveInstance.flagName = 'featureFlagOff'; + + directiveInstance.ngAfterContentChecked(); + expect(elementOff.nativeElement.style.display).toEqual('none'); + }); + + test('should show element if feature flag is on', () => { + directiveInstance.flagName = 'featureFlagOn'; + + directiveInstance.ngAfterContentChecked(); + expect(elementOn.nativeElement.style.display).toEqual(''); + }); +}); diff --git a/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts new file mode 100644 index 000000000..e6cbb4f17 --- /dev/null +++ b/vid-webpack-master/src/app/featureFlag/directive/basic/basic.featureFlag.directive.ts @@ -0,0 +1,29 @@ +import {AfterContentChecked, Directive, ElementRef, Input} from '@angular/core'; +import {FeatureFlagService} from "../../service/featureFlag.service"; +import * as _ from 'lodash'; + +/************************************************************************ + Feature Flag Directive + Example: +
+ ************************************************************************/ +@Directive({ + selector: '[featureFlag]' +}) +export class BasicFeatureFlagDirective implements AfterContentChecked { + @Input() flagName: string; + element: ElementRef; + + constructor(el: ElementRef, private _featureToggleService: FeatureFlagService) { + this.element = el; + } + + ngAfterContentChecked(): void { + if (!_.isNil(this.element)) { + const isFeatureOn: boolean = this._featureToggleService.isFeatureOn(this.flagName); + if(!isFeatureOn){ + this._featureToggleService.hideElement(this.element) + } + } + } +} -- cgit 1.2.3-korg