Skip to content

Commit 234b490

Browse files
vins01-4scienceatarix83
authored andcommitted
Merged in dspace-cris-2023_02_x_DSC-758 (pull request DSpace#1508)
Dspace cris 2023 02 x DSC-758 Approved-by: Giuseppe Digilio
2 parents 5d5f439 + 04df967 commit 234b490

3 files changed

Lines changed: 152 additions & 104 deletions

File tree

src/app/core/locale/locale.service.spec.ts

Lines changed: 139 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { AuthService } from '../auth/auth.service';
1010
import { NativeWindowRef } from '../services/window.service';
1111
import { RouteService } from '../services/route.service';
1212
import { routeServiceStub } from '../../shared/testing/route-service.stub';
13+
import { of as observableOf } from 'rxjs';
1314

1415
describe('LocaleService test suite', () => {
1516
let service: LocaleService;
@@ -22,129 +23,164 @@ describe('LocaleService test suite', () => {
2223
let authService;
2324
let routeService;
2425
let document;
26+
let spyOnGetLanguage;
27+
28+
29+
const translateServiceStub: any = {
30+
getLangs: () => {
31+
return langList;
32+
},
33+
getBrowserLang: () => {
34+
return langList;
35+
},
36+
// eslint-disable-next-line @typescript-eslint/no-empty-function
37+
use: (param: string) => {
38+
}
39+
};
2540

2641
authService = jasmine.createSpyObj('AuthService', {
2742
isAuthenticated: jasmine.createSpy('isAuthenticated'),
2843
isAuthenticationLoaded: jasmine.createSpy('isAuthenticationLoaded')
2944
});
30-
3145
const langList = ['en', 'xx', 'de'];
3246

33-
beforeEach(waitForAsync(() => {
34-
return TestBed.configureTestingModule({
35-
imports: [
36-
TranslateModule.forRoot({
37-
loader: {
38-
provide: TranslateLoader,
39-
useClass: TranslateLoaderMock
40-
}
41-
}),
42-
],
43-
providers: [
44-
{ provide: CookieService, useValue: new CookieServiceMock() },
45-
{ provide: AuthService, userValue: authService },
46-
{ provide: RouteService, useValue: routeServiceStub },
47-
{ provide: Document, useValue: document },
48-
]
49-
});
50-
}));
51-
52-
beforeEach(() => {
53-
cookieService = TestBed.inject(CookieService);
54-
translateService = TestBed.inject(TranslateService);
55-
routeService = TestBed.inject(RouteService);
56-
window = new NativeWindowRef();
57-
document = { documentElement: { lang: 'en' } };
58-
service = new LocaleService(window, cookieService, translateService, authService, routeService, document);
59-
serviceAsAny = service;
60-
spyOnGet = spyOn(cookieService, 'get');
61-
spyOnSet = spyOn(cookieService, 'set');
62-
});
47+
describe('with valid language', () => {
48+
49+
beforeEach(waitForAsync(() => {
50+
return TestBed.configureTestingModule({
51+
imports: [
52+
TranslateModule.forRoot({
53+
loader: {
54+
provide: TranslateLoader,
55+
useClass: TranslateLoaderMock
56+
}
57+
}),
58+
],
59+
providers: [
60+
{ provide: CookieService, useValue: new CookieServiceMock() },
61+
{ provide: AuthService, userValue: authService },
62+
{ provide: RouteService, useValue: routeServiceStub },
63+
{ provide: TranslateService, useValue: translateServiceStub },
64+
{ provide: Document, useValue: document },
65+
]
66+
});
67+
}));
6368

64-
describe('getCurrentLanguageCode', () => {
6569
beforeEach(() => {
66-
spyOn(translateService, 'getLangs').and.returnValue(langList);
67-
});
68-
69-
it('should return the language saved on cookie if it\'s a valid & active language', () => {
70-
spyOnGet.and.returnValue('de');
71-
expect(service.getCurrentLanguageCode()).toBe('de');
72-
});
73-
74-
it('should return the default language if the cookie language is disabled', () => {
75-
spyOnGet.and.returnValue('disabled');
76-
expect(service.getCurrentLanguageCode()).toBe('en');
77-
});
78-
79-
it('should return the default language if the cookie language does not exist', () => {
80-
spyOnGet.and.returnValue('does-not-exist');
81-
expect(service.getCurrentLanguageCode()).toBe('en');
82-
});
83-
84-
it('should return language from browser setting', () => {
85-
spyOn(translateService, 'getBrowserLang').and.returnValue('xx');
86-
expect(service.getCurrentLanguageCode()).toBe('xx');
70+
cookieService = TestBed.inject(CookieService);
71+
translateService = TestBed.inject(TranslateService);
72+
routeService = TestBed.inject(RouteService);
73+
window = new NativeWindowRef();
74+
document = { documentElement: { lang: 'en' } };
75+
service = new LocaleService(window, cookieService, translateService, authService, routeService, document);
76+
serviceAsAny = service;
77+
spyOnGet = spyOn(cookieService, 'get');
78+
spyOnSet = spyOn(cookieService, 'set');
79+
spyOnGetLanguage = spyOn(routeService, 'getQueryParameterValue').withArgs('lang');
8780
});
8881

89-
it('should return default language from config', () => {
90-
spyOn(translateService, 'getBrowserLang').and.returnValue('fr');
91-
expect(service.getCurrentLanguageCode()).toBe('en');
92-
});
93-
});
94-
95-
describe('getLanguageCodeFromCookie', () => {
96-
it('should return language from cookie', () => {
97-
spyOnGet.and.returnValue('de');
98-
expect(service.getLanguageCodeFromCookie()).toBe('de');
82+
describe('getCurrentLanguageCode', () => {
83+
it('should return language saved on cookie', () => {
84+
spyOnGet.and.returnValue('de');
85+
expect(service.getCurrentLanguageCode()).toBe('de');
86+
});
87+
88+
describe('', () => {
89+
beforeEach(() => {
90+
spyOn(translateService, 'getLangs').and.returnValue(langList);
91+
});
92+
93+
it('should return language from browser setting', () => {
94+
spyOn(translateService, 'getBrowserLang').and.returnValue('xx');
95+
expect(service.getCurrentLanguageCode()).toBe('xx');
96+
});
97+
98+
it('should return default language from config', () => {
99+
spyOn(translateService, 'getBrowserLang').and.returnValue('fr');
100+
expect(service.getCurrentLanguageCode()).toBe('en');
101+
});
102+
});
99103
});
100104

101-
});
105+
describe('getLanguageCodeFromCookie', () => {
106+
it('should return language from cookie', () => {
107+
spyOnGet.and.returnValue('de');
108+
expect(service.getLanguageCodeFromCookie()).toBe('de');
109+
});
102110

103-
describe('saveLanguageCodeToCookie', () => {
104-
it('should save language to cookie', () => {
105-
service.saveLanguageCodeToCookie('en');
106-
expect(spyOnSet).toHaveBeenCalledWith(LANG_COOKIE, 'en');
107111
});
108-
});
109112

110-
describe('setCurrentLanguageCode', () => {
111-
beforeEach(() => {
112-
spyOn(service, 'saveLanguageCodeToCookie');
113-
spyOn(translateService, 'use');
113+
describe('saveLanguageCodeToCookie', () => {
114+
it('should save language to cookie', () => {
115+
service.saveLanguageCodeToCookie('en');
116+
expect(spyOnSet).toHaveBeenCalledWith(LANG_COOKIE, 'en');
117+
});
114118
});
115119

116-
it('should set the given language', () => {
117-
service.setCurrentLanguageCode('xx');
118-
expect(translateService.use).toHaveBeenCalledWith('xx');
119-
expect(service.saveLanguageCodeToCookie).toHaveBeenCalledWith('xx');
120-
});
121-
122-
it('should set the current language', () => {
123-
spyOn(service, 'getCurrentLanguageCode').and.returnValue('es');
124-
service.setCurrentLanguageCode();
125-
expect(translateService.use).toHaveBeenCalledWith('es');
126-
expect(service.saveLanguageCodeToCookie).toHaveBeenCalledWith('es');
127-
});
128-
129-
it('should set the current language on the html tag', () => {
130-
spyOn(service, 'getCurrentLanguageCode').and.returnValue('es');
131-
service.setCurrentLanguageCode();
132-
expect((service as any).document.documentElement.lang).toEqual('es');
133-
});
134-
});
135-
136-
describe('', () => {
137-
it('should set quality to current language list', () => {
138-
const langListWithQuality = ['en;q=1', 'xx;q=0.9', 'de;q=0.8'];
139-
spyOn(service, 'setQuality').and.returnValue(langListWithQuality);
140-
service.setQuality(langList, LANG_ORIGIN.BROWSER, false);
141-
expect(service.setQuality).toHaveBeenCalledWith(langList, LANG_ORIGIN.BROWSER, false);
120+
describe('setCurrentLanguageCode', () => {
121+
beforeEach(() => {
122+
spyOn(service, 'saveLanguageCodeToCookie');
123+
spyOn(translateService, 'use');
124+
});
125+
126+
it('should set the given language', () => {
127+
service.setCurrentLanguageCode('it');
128+
expect(translateService.use).toHaveBeenCalledWith('it');
129+
expect(service.saveLanguageCodeToCookie).toHaveBeenCalledWith('it');
130+
});
131+
132+
it('should set the current language', () => {
133+
spyOn(service, 'getCurrentLanguageCode').and.returnValue('es');
134+
service.setCurrentLanguageCode();
135+
expect(translateService.use).toHaveBeenCalledWith('es');
136+
expect(service.saveLanguageCodeToCookie).toHaveBeenCalledWith('es');
137+
});
138+
139+
it('should set the current language on the html tag', () => {
140+
spyOn(service, 'getCurrentLanguageCode').and.returnValue('es');
141+
service.setCurrentLanguageCode();
142+
expect((service as any).document.documentElement.lang).toEqual('es');
143+
});
144+
145+
describe('should set language on init', () => {
146+
beforeEach(() => {
147+
spyOn(translateService, 'getLangs').and.returnValue(langList);
148+
spyOn(service, 'setCurrentLanguageCode');
149+
});
150+
describe('whith correct lang query param ', () => {
151+
beforeEach(() => {
152+
spyOnGetLanguage.and.returnValue(observableOf('en'));
153+
service.initDefaults();
154+
});
155+
it('should set correct lang', () => {
156+
expect(service.setCurrentLanguageCode).toHaveBeenCalledWith('en');
157+
});
158+
});
159+
describe('whith wrong lang query param ', () => {
160+
beforeEach(() => {
161+
spyOnGetLanguage.and.returnValue(observableOf('abcd'));
162+
service.initDefaults();
163+
});
164+
it('should not set lang', () => {
165+
expect(service.setCurrentLanguageCode).not.toHaveBeenCalled();
166+
});
167+
});
168+
});
142169
});
143170

144-
it('should return the list of language with quality factor', () => {
145-
spyOn(service, 'getLanguageCodeList');
146-
service.getLanguageCodeList();
147-
expect(service.getLanguageCodeList).toHaveBeenCalled();
171+
describe('', () => {
172+
it('should set quality to current language list', () => {
173+
const langListWithQuality = ['en;q=1', 'it;q=0.9', 'de;q=0.8'];
174+
spyOn(service, 'setQuality').and.returnValue(langListWithQuality);
175+
service.setQuality(langList, LANG_ORIGIN.BROWSER, false);
176+
expect(service.setQuality).toHaveBeenCalledWith(langList, LANG_ORIGIN.BROWSER, false);
177+
});
178+
179+
it('should return the list of language with quality factor', () => {
180+
spyOn(service, 'getLanguageCodeList');
181+
service.getLanguageCodeList();
182+
expect(service.getLanguageCodeList).toHaveBeenCalled();
183+
});
148184
});
149185
});
150186
});

src/app/core/locale/locale.service.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ export class LocaleService {
4343
protected routeService: RouteService,
4444
@Inject(DOCUMENT) protected document: any
4545
) {
46+
this.initDefaults();
47+
}
48+
49+
/**
50+
* Initialize the language from query params
51+
*/
52+
initDefaults() {
53+
this.routeService.getQueryParameterValue('lang').subscribe(lang => {
54+
if (lang && this.translate.getLangs().includes(lang)) {
55+
this.setCurrentLanguageCode(lang);
56+
}
57+
});
4658
}
4759

4860
/**

src/app/shared/testing/route-service.stub.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const routeServiceStub: any = {
2323
getQueryParamMap: () => {
2424
return observableOf(new Map());
2525
},
26-
getQueryParameterValue: () => {
26+
getQueryParameterValue: (lang?: string) => {
2727
return observableOf({});
2828
},
2929
getRouteParameterValue: (param) => {

0 commit comments

Comments
 (0)