From c30fc52d99fb18d77461050d6b79e90f55ef604a Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 15 May 2018 21:37:16 +0300 Subject: [PATCH] feat(aio): add component for lazy-loading custom element (#23944) PR Close #23944 --- .../custom-elements/custom-elements.module.ts | 3 + .../lazy-custom-element.component.spec.ts | 67 +++++++++++++++++++ .../lazy-custom-element.component.ts | 27 ++++++++ 3 files changed, 97 insertions(+) create mode 100644 aio/src/app/custom-elements/lazy-custom-element.component.spec.ts create mode 100644 aio/src/app/custom-elements/lazy-custom-element.component.ts diff --git a/aio/src/app/custom-elements/custom-elements.module.ts b/aio/src/app/custom-elements/custom-elements.module.ts index ebc5b3704a..f2000a391f 100644 --- a/aio/src/app/custom-elements/custom-elements.module.ts +++ b/aio/src/app/custom-elements/custom-elements.module.ts @@ -6,8 +6,11 @@ import { ELEMENT_MODULE_PATHS_AS_ROUTES, ELEMENT_MODULE_PATHS_TOKEN } from './element-registry'; +import { LazyCustomElementComponent } from './lazy-custom-element.component'; @NgModule({ + declarations: [ LazyCustomElementComponent ], + exports: [ LazyCustomElementComponent ], providers: [ ElementsLoader, { provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader }, diff --git a/aio/src/app/custom-elements/lazy-custom-element.component.spec.ts b/aio/src/app/custom-elements/lazy-custom-element.component.spec.ts new file mode 100644 index 0000000000..3e7c9a5fa5 --- /dev/null +++ b/aio/src/app/custom-elements/lazy-custom-element.component.spec.ts @@ -0,0 +1,67 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { Logger } from 'app/shared/logger.service'; +import { MockLogger } from 'testing/logger.service'; +import { LazyCustomElementComponent } from './lazy-custom-element.component'; +import { ElementsLoader } from './elements-loader'; + +describe('LazyCustomElementComponent', () => { + let mockElementsLoader: jasmine.SpyObj; + let mockLogger: MockLogger; + let fixture: ComponentFixture; + + beforeEach(() => { + mockElementsLoader = jasmine.createSpyObj('ElementsLoader', [ + 'loadContainingCustomElements', + 'loadCustomElement', + ]); + + const injector = TestBed.configureTestingModule({ + declarations: [ LazyCustomElementComponent ], + providers: [ + { provide: ElementsLoader, useValue: mockElementsLoader }, + { provide: Logger, useClass: MockLogger }, + ], + }); + + mockLogger = injector.get(Logger); + fixture = TestBed.createComponent(LazyCustomElementComponent); + }); + + it('should set the HTML content based on the selector', () => { + const elem = fixture.nativeElement; + + expect(elem.innerHTML).toBe(''); + + fixture.componentInstance.selector = 'foo-bar'; + fixture.detectChanges(); + + expect(elem.innerHTML).toBe(''); + }); + + it('should load the specified custom element', () => { + expect(mockElementsLoader.loadCustomElement).not.toHaveBeenCalled(); + + fixture.componentInstance.selector = 'foo-bar'; + fixture.detectChanges(); + + expect(mockElementsLoader.loadCustomElement).toHaveBeenCalledWith('foo-bar'); + }); + + it('should log an error (and abort) if the selector is empty', () => { + fixture.detectChanges(); + + expect(mockElementsLoader.loadCustomElement).not.toHaveBeenCalled(); + expect(mockLogger.output.error).toEqual([[jasmine.any(Error)]]); + expect(mockLogger.output.error[0][0].message).toBe('Invalid selector for \'aio-lazy-ce\': '); + }); + + it('should log an error (and abort) if the selector is invalid', () => { + fixture.componentInstance.selector = 'foo-bar>`; + this.elementsLoader.loadCustomElement(this.selector); + } +}