From 076ea2281fe495d34d546991490f54850c3f3257 Mon Sep 17 00:00:00 2001 From: Georgios Kalpakas Date: Tue, 11 Jul 2017 00:29:46 +0300 Subject: [PATCH] test(aio): add tests for CodeTabsComponent --- .../embedded/code/code-tabs.component.spec.ts | 238 ++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 aio/src/app/embedded/code/code-tabs.component.spec.ts diff --git a/aio/src/app/embedded/code/code-tabs.component.spec.ts b/aio/src/app/embedded/code/code-tabs.component.spec.ts new file mode 100644 index 0000000000..adfc2f82f4 --- /dev/null +++ b/aio/src/app/embedded/code/code-tabs.component.spec.ts @@ -0,0 +1,238 @@ +import { CommonModule } from '@angular/common'; +import { Component, DebugElement, Input, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MdTabGroup, MdTabsModule } from '@angular/material'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { CodeTabsComponent } from './code-tabs.component'; + + +describe('CodeTabsComponent', () => { + let fixture: ComponentFixture; + let hostComponent: HostComponent; + let codeTabsDe: DebugElement; + let codeTabsComponent: CodeTabsComponent; + + const createComponentBasic = (codeTabsContent = '') => { + fixture = TestBed.createComponent(HostComponent); + hostComponent = fixture.componentInstance; + codeTabsDe = fixture.debugElement.children[0]; + codeTabsComponent = codeTabsDe.componentInstance; + + // Copy the CodeTab's innerHTML (content) + // into the `codeTabsContent` property as the DocViewer does. + codeTabsDe.nativeElement.codeTabsContent = codeTabsContent; + fixture.detectChanges(); + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ CodeTabsComponent, HostComponent, TestCodeComponent ], + imports: [ CommonModule ], + schemas: [ NO_ERRORS_SCHEMA ], + }); + }); + + it('should create CodeTabsComponent', () => { + createComponentBasic(); + expect(codeTabsComponent).toBeTruthy('CodeTabsComponent'); + }); + + describe('(tab labels)', () => { + let labelElems: HTMLSpanElement[]; + + const createComponent = (codeTabsContent?: string) => { + createComponentBasic(codeTabsContent); + const labelDes = codeTabsDe.queryAll(By.css('.mat-tab-label')); + labelElems = labelDes.map(de => de.nativeElement.querySelector('span')); + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ MdTabsModule, NoopAnimationsModule ] + }); + }); + + it('should create a label for each tab', () => { + createComponent(` + foo + bar + baz + `); + + expect(labelElems.length).toBe(3); + }); + + it('should use the `title` as label', () => { + createComponent(` + foo + bar + `); + const texts = labelElems.map(s => s.textContent); + + expect(texts).toEqual(['foo-title', 'bar-title']); + }); + + it('should add the `class` to the label element', () => { + createComponent(` + foo + bar + `); + const classes = labelElems.map(s => s.className); + + expect(classes).toEqual(['foo-class', 'bar-class']); + }); + }); + + describe('(tab content)', () => { + let codeDes: DebugElement[]; + let codeComponents: TestCodeComponent[]; + + const createComponent = (codeTabsContent?: string) => { + createComponentBasic(codeTabsContent); + codeDes = codeTabsDe.queryAll(By.directive(TestCodeComponent)); + codeComponents = codeDes.map(de => de.componentInstance); + }; + + it('should pass `class` to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const classes = codeDes.map(de => de.nativeElement.className); + + expect(classes).toEqual(['foo-class', 'bar-class']); + }); + + it('should pass content to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const codes = codeComponents.map(c => c.code); + + expect(codes).toEqual(['foo', 'bar']); + }); + + it('should pass `language` to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const langs = codeComponents.map(c => c.language); + + expect(langs).toEqual(['foo-lang', 'bar-lang']); + }); + + it('should pass `linenums` to CodeComponent ()', () => { + createComponent(` + foo + bar + baz + qux + `); + const lnums = codeComponents.map(c => c.linenums); + + expect(lnums).toEqual(['foo-lnums', 'bar-lnums', '', '']); + }); + + it('should use the default value (if present on ) if `linenums` is not specified', () => { + TestBed.overrideComponent(HostComponent, { + set: { template: '' } + }); + + createComponent(` + foo + bar + baz + `); + const lnums = codeComponents.map(c => c.linenums); + + expect(lnums).toEqual(['foo-lnums', '', 'default-lnums']); + }); + + it('should pass `path` to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const paths = codeComponents.map(c => c.path); + + expect(paths).toEqual(['foo-path', 'bar-path']); + }); + + it('should default to an empty string if `path` is not spcified', () => { + createComponent(` + foo + bar + `); + const paths = codeComponents.map(c => c.path); + + expect(paths).toEqual(['', '']); + }); + + it('should pass `region` to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const regions = codeComponents.map(c => c.region); + + expect(regions).toEqual(['foo-region', 'bar-region']); + }); + + it('should default to an empty string if `region` is not spcified', () => { + createComponent(` + foo + bar + `); + const regions = codeComponents.map(c => c.region); + + expect(regions).toEqual(['', '']); + }); + + it('should pass `title` to CodeComponent ()', () => { + createComponent(` + foo + bar + `); + const titles = codeComponents.map(c => c.title); + + expect(titles).toEqual(['foo-title', 'bar-title']); + }); + }); +}); + +//// Test helpers //// +@Component({ + selector: 'aio-code', + template: ` +
lang: {{ language }}
+
linenums: {{ linenums }}
+ code:
{{ someCode }}
+ ` +}) +class TestCodeComponent { + @Input() code = ''; + @Input() hideCopy: boolean; + @Input() language: string; + @Input() linenums: string; + @Input() path: string; + @Input() region: string; + @Input() title: string; + + get someCode() { + if (this.code && this.code.length > 30) { + return `${this.code.substring(0, 30)}...`; + } + + return this.code; + } +} + +@Component({ + selector: 'aio-host-comp', + template: `` +}) +class HostComponent {}