import {ChangeDetectionStrategy, Component, ElementRef, Injectable, ViewChild, ViewContainerRef} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {TranslateModule, TranslateService} from '../public-api'; @Injectable() @Component({ selector: 'hmx-app', changeDetection: ChangeDetectionStrategy.OnPush, template: `
TEST
TEST.VALUE
Some init content
TEST1 Hey TEST2
Some init content
TEST
TEST
TEST
TEST
` }) class AppComponent { viewContainerRef: ViewContainerRef; @ViewChild('noKey', {static: true}) noKey!: ElementRef; @ViewChild('contentAsKey', {static: true}) contentAsKey!: ElementRef; @ViewChild('withKey', {static: true}) withKey!: ElementRef; @ViewChild('withOtherElements', {static: true}) withOtherElements!: ElementRef; @ViewChild('withParams', {static: true}) withParams!: ElementRef; @ViewChild('withParamsNoKey', {static: true}) withParamsNoKey!: ElementRef; @ViewChild('noContent', {static: true}) noContent!: ElementRef; @ViewChild('leadingSpaceNoKeyNoParams') leadingSpaceNoKeyNoParams!: ElementRef; @ViewChild('trailingSpaceNoKeyNoParams') trailingSpaceNoKeyNoParams!: ElementRef; @ViewChild('withSpaceAndLineBreakNoKeyNoParams') withSpaceAndLineBreakNoKeyNoParams!: ElementRef; value = {value: 'ok'}; constructor(viewContainerRef: ViewContainerRef) { this.viewContainerRef = viewContainerRef; } } describe('TranslateDirective', () => { let translate: TranslateService; let fixture: ComponentFixture; beforeEach(() => { TestBed.configureTestingModule({ imports: [ TranslateModule.forRoot() ], declarations: [AppComponent] }); translate = TestBed.inject(TranslateService); fixture = (TestBed).createComponent(AppComponent); fixture.detectChanges(); }); it('should translate a string using the container value', () => { expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "This is a test"}); translate.use('en'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('This is a test'); }); it('should translate a string using the container value as a key', () => { expect(fixture.componentInstance.contentAsKey.nativeElement.innerHTML).toEqual('TEST.VALUE'); translate.setTranslation('en', {"TEST": {"VALUE": "This is a test"}}); translate.use('en'); expect(fixture.componentInstance.contentAsKey.nativeElement.innerHTML).toEqual('This is a test'); }); it('should translate a string using the key value', () => { // replace the content with the key expect(fixture.componentInstance.withKey.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "This is a test"}); translate.use('en'); expect(fixture.componentInstance.withKey.nativeElement.innerHTML).toEqual('This is a test'); }); it('should translate first child strings with elements in the middle', () => { // replace the content with the key expect(fixture.componentInstance.withOtherElements.nativeElement.innerHTML).toEqual('TEST1 Hey TEST2'); translate.setTranslation('en', {"TEST1": "Awesome", "TEST2": "it works"}); translate.use('en'); expect(fixture.componentInstance.withOtherElements.nativeElement.innerHTML).toEqual('Awesome Hey it works'); }); it('should translate first child strings without recursion', () => { // replace the content with the key expect(fixture.componentInstance.withOtherElements.nativeElement.innerHTML).toEqual('TEST1 Hey TEST2'); translate.setTranslation('en', {"TEST1": "TEST2", "TEST2": "it works"}); translate.use('en'); expect(fixture.componentInstance.withOtherElements.nativeElement.innerHTML).toEqual('TEST2 Hey it works'); }); it('should translate a string with params and a key', () => { // replace the content with the key expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "It is {{value}}"}); translate.use('en'); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('It is ok'); }); it('should translate a string with params and no key', () => { // replace the content with the key expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "It is {{value}}"}); translate.use('en'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('It is ok'); }); it('should update the translation when params change', () => { // replace the content with the key expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('TEST'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "It is {{value}}"}); translate.use('en'); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('It is ok'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('It is ok'); fixture.componentInstance.value = {value: 'changed'}; fixture.detectChanges(); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('It is changed'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('It is changed'); }); it('should update the DOM when the lang changes and the translation key starts with space', () => { expect(fixture.componentInstance.leadingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual(' TEST'); const en = "This is a test - with leading spaces in translation key"; const fr = "C'est un test - avec un espace de tête dans la clé de traduction"; const leadingSpaceFromKey = ' '; translate.setTranslation('en', {"TEST": en}); translate.setTranslation('fr', {"TEST": fr}); translate.use('en'); expect(fixture.componentInstance.leadingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual(leadingSpaceFromKey + en); translate.use('fr'); expect(fixture.componentInstance.leadingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual(leadingSpaceFromKey + fr); }); it('should update the DOM when the lang changes and the translation key has line breaks and spaces', () => { expect(fixture.componentInstance.withSpaceAndLineBreakNoKeyNoParams.nativeElement.innerHTML).toEqual(' TEST '); const en = "This is a test - with trailing spaces in translation key"; const fr = "C'est un test - avec un espace de fuite dans la clé de traduction"; const whiteSpaceFromKey = ' '; translate.setTranslation('en', {"TEST": en}); translate.setTranslation('fr', {"TEST": fr}); translate.use('en'); expect(fixture.componentInstance.withSpaceAndLineBreakNoKeyNoParams.nativeElement.innerHTML).toEqual(whiteSpaceFromKey + en + whiteSpaceFromKey); translate.use('fr'); expect(fixture.componentInstance.withSpaceAndLineBreakNoKeyNoParams.nativeElement.innerHTML).toEqual(whiteSpaceFromKey + fr + whiteSpaceFromKey); }); it('should update the DOM when the lang changes and the translation key ends with space', () => { expect(fixture.componentInstance.trailingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual('TEST '); const en = "This is a test - with spaces and line breaks in translation key"; const fr = "C'est un test - avec des espaces et sauts de lignes dans la clé de traduction"; const trailingSpaceFromKey = ' '; translate.setTranslation('en', {"TEST": en}); translate.setTranslation('fr', {"TEST": fr}); translate.use('en'); expect(fixture.componentInstance.trailingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual(en + trailingSpaceFromKey); translate.use('fr'); expect(fixture.componentInstance.trailingSpaceNoKeyNoParams.nativeElement.innerHTML).toEqual(fr + trailingSpaceFromKey); }); it('should update the DOM when the lang changes', () => { expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('TEST'); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('TEST'); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "This is a test"}); translate.setTranslation('fr', {"TEST": "C'est un test"}); translate.use('en'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('This is a test'); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('This is a test'); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual('This is a test'); translate.use('fr'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual("C'est un test"); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual("C'est un test"); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual("C'est un test"); }); it('should update the DOM when the lang changes and the translation ends with space', () => { expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('TEST'); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual('TEST'); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual('TEST'); const en = " This is a test - with spaces "; const fr = " C'est un test - avec espaces "; translate.setTranslation('en', {"TEST": en}); translate.setTranslation('fr', {"TEST": fr}); translate.use('en'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual(`${en}`); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual(en); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual(en); translate.use('fr'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual(`${fr}`); expect(fixture.componentInstance.withParams.nativeElement.innerHTML).toEqual(fr); expect(fixture.componentInstance.noContent.nativeElement.innerHTML).toEqual(fr); }); it('should update the DOM when the default lang changes', () => { expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('TEST'); translate.setTranslation('en', {"TEST": "This is a test"}); translate.setTranslation('fr', {"TEST": "C'est un test"}); translate.setDefaultLang('en'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual('This is a test'); translate.setDefaultLang('fr'); expect(fixture.componentInstance.noKey.nativeElement.innerHTML).toEqual("C'est un test"); }); it('should unsubscribe from lang change subscription on destroy', () => { expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); fixture.destroy(); translate.setTranslation('en', {"TEST": "This is a test"}); translate.use('en'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); }); it('should unsubscribe from default lang change subscription on destroy', () => { expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); fixture.destroy(); translate.setTranslation('en', {"TEST": "This is a test"}); translate.setDefaultLang('en'); expect(fixture.componentInstance.withParamsNoKey.nativeElement.innerHTML).toEqual('TEST'); }); });