Skip to content

Commit 59ce1a9

Browse files
[DSpace#1816][CST-6565] Refactored methods & Tests
Test: - New tests for the use case of filtering analytics configuration; - Enhanced initialization of service with new google analytics service mock.
1 parent 18dda8c commit 59ce1a9

2 files changed

Lines changed: 67 additions & 30 deletions

File tree

src/app/shared/cookies/browser-klaro.service.spec.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ import { getTestScheduler } from 'jasmine-marbles';
1212
import { MetadataValue } from '../../core/shared/metadata.models';
1313
import { cloneDeep } from 'lodash';
1414
import { ConfigurationDataService } from '../../core/data/configuration-data.service';
15-
import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils';
15+
import {createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$} from '../remote-data.utils';
1616
import { ConfigurationProperty } from '../../core/shared/configuration-property.model';
1717

1818
describe('BrowserKlaroService', () => {
1919
const trackingIdProp = 'google.analytics.key';
2020
const trackingIdTestValue = 'mock-tracking-id';
21+
const googleAnalytics = 'google-analytics';
2122
let translateService;
2223
let ePersonService;
2324
let authService;
@@ -33,11 +34,15 @@ describe('BrowserKlaroService', () => {
3334
values: values,
3435
}),
3536
});
37+
const googleAnalyticsFilter =
38+
(bService: BrowserKlaroService) =>
39+
bService.klaroConfig.services.filter(({name}) => name === googleAnalytics);
3640

3741
let mockConfig;
3842
let appName;
3943
let purpose;
4044
let testKey;
45+
let findByPropertyName;
4146

4247
beforeEach(() => {
4348
user = new EPerson();
@@ -52,6 +57,7 @@ describe('BrowserKlaroService', () => {
5257
getAuthenticatedUserFromStore: observableOf(user)
5358
});
5459
configurationDataService = createConfigSuccessSpy(trackingIdTestValue);
60+
findByPropertyName = cloneDeep(configurationDataService.findByPropertyName);
5561
cookieService = jasmine.createSpyObj('cookieService', {
5662
get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22klaro%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}',
5763
set: () => {
@@ -101,6 +107,9 @@ describe('BrowserKlaroService', () => {
101107
services: [{
102108
name: appName,
103109
purposes: [purpose]
110+
},{
111+
name: googleAnalytics,
112+
purposes: [purpose]
104113
}],
105114

106115
};
@@ -251,4 +260,46 @@ describe('BrowserKlaroService', () => {
251260
expect(ePersonService.patch).not.toHaveBeenCalled();
252261
});
253262
});
263+
264+
describe('initialize google analytics configuration', () => {
265+
beforeEach(() => {
266+
configurationDataService.findByPropertyName = findByPropertyName;
267+
spyOn((service as any), 'getUser$').and.returnValue(observableOf(user));
268+
translateService.get.and.returnValue(observableOf('loading...'));
269+
spyOn(service, 'addAppMessages');
270+
spyOn((service as any), 'initializeUser');
271+
spyOn(service, 'translateConfiguration');
272+
});
273+
it('should have been initialized with googleAnalytics', () => {
274+
const filteredServices = googleAnalyticsFilter(service);
275+
expect(filteredServices.length).toBe(1);
276+
});
277+
it('should filter empty configuration', () => {
278+
configurationDataService.findByPropertyName = jasmine.createSpy().and.returnValue(
279+
createSuccessfulRemoteDataObject$({
280+
... new ConfigurationProperty(),
281+
name: googleAnalytics,
282+
values: [],
283+
}));
284+
service.initialize();
285+
const filteredServices = googleAnalyticsFilter(service);
286+
expect(filteredServices.length).toBe(0);
287+
});
288+
it('should filter when error', () => {
289+
configurationDataService.findByPropertyName = jasmine.createSpy().and.returnValue(
290+
createFailedRemoteDataObject$('Erro while loading GA')
291+
);
292+
service.initialize();
293+
const filteredServices = googleAnalyticsFilter(service);
294+
expect(filteredServices.length).toBe(0);
295+
});
296+
it('should filter when invalid payload', () => {
297+
configurationDataService.findByPropertyName = jasmine.createSpy().and.returnValue(
298+
createSuccessfulRemoteDataObject$(null)
299+
);
300+
service.initialize();
301+
const filteredServices = googleAnalyticsFilter(service);
302+
expect(filteredServices.length).toBe(0);
303+
});
304+
});
254305
});

src/app/shared/cookies/browser-klaro.service.ts

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ import { EPersonDataService } from '../../core/eperson/eperson-data.service';
1313
import { cloneDeep, debounce } from 'lodash';
1414
import { ANONYMOUS_STORAGE_NAME_KLARO, klaroConfiguration } from './klaro-configuration';
1515
import { Operation } from 'fast-json-patch';
16-
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
16+
import { getFirstCompletedRemoteData} from '../../core/shared/operators';
1717
import { ConfigurationDataService } from '../../core/data/configuration-data.service';
18-
import { RemoteData } from '../../core/data/remote-data';
19-
import { ConfigurationProperty } from '../../core/shared/configuration-property.model';
2018

2119
/**
2220
* Metadata field to store a user's cookie consent preferences in
@@ -80,22 +78,25 @@ export class BrowserKlaroService extends KlaroService {
8078
this.klaroConfig.translations.en.consentNotice.description = 'cookies.consent.content-notice.description.no-privacy';
8179
}
8280

83-
const configurationToHide$: Observable<Pick<typeof klaroConfiguration, 'name'>[]> =
84-
this.configService.findByPropertyName(this.GOOGLE_ANALYTICS_KEY)
85-
.pipe(
86-
getFirstCompletedRemoteData(),
87-
map(remoteData => this.mapInvalidConfiguration(remoteData, this.GOOGLE_ANALYTICS_SERVICE_NAME)),
88-
take(1)
89-
);
81+
const servicesToHide$: Observable<string[]> = this.configService.findByPropertyName(this.GOOGLE_ANALYTICS_KEY).pipe(
82+
getFirstCompletedRemoteData(),
83+
map(remoteData => {
84+
if (!remoteData.hasSucceeded || !remoteData.payload || isEmpty(remoteData.payload.values)) {
85+
return [this.GOOGLE_ANALYTICS_SERVICE_NAME];
86+
} else {
87+
return [];
88+
}
89+
}),
90+
);
9091

9192
this.translateService.setDefaultLang(environment.defaultLanguage);
9293

9394
const user$: Observable<EPerson> = this.getUser$();
9495

9596
const translationServiceReady$ = this.translateService.get('loading.default').pipe(take(1));
9697

97-
observableCombineLatest([user$, translationServiceReady$, configurationToHide$])
98-
.subscribe(([user, translation, servicesToHide]: [EPerson, string, Pick<typeof klaroConfiguration, 'name'>[]]) => {
98+
observableCombineLatest([user$, servicesToHide$, translationServiceReady$])
99+
.subscribe(([user, servicesToHide, _]: [EPerson, string[], string]) => {
99100
user = cloneDeep(user);
100101

101102
if (hasValue(user)) {
@@ -120,21 +121,6 @@ export class BrowserKlaroService extends KlaroService {
120121
});
121122
}
122123

123-
private mapInvalidConfiguration(
124-
remoteData: RemoteData<ConfigurationProperty>,
125-
configurationName: string
126-
): Pick<typeof klaroConfiguration, 'name'>[] {
127-
if (this.isEmptyOrInvalid(remoteData)) {
128-
return [{name: configurationName}];
129-
} else {
130-
return [];
131-
}
132-
}
133-
134-
private isEmptyOrInvalid(remoteData: RemoteData<ConfigurationProperty>): boolean {
135-
return !remoteData.hasSucceeded || !remoteData.payload || isEmpty(remoteData.payload.values);
136-
}
137-
138124
/**
139125
* Initialize configuration for the logged in user
140126
* @param user The authenticated user
@@ -302,7 +288,7 @@ export class BrowserKlaroService extends KlaroService {
302288
/**
303289
* remove the google analytics from the services
304290
*/
305-
private filterConfigServices(servicesToHide: Pick<typeof klaroConfiguration, 'name'>[]): Pick<typeof klaroConfiguration, 'services'>[] {
306-
return this.klaroConfig.services.filter(service => !servicesToHide.some(el => el.name === service.name));
291+
private filterConfigServices(servicesToHide: string[]): Pick<typeof klaroConfiguration, 'services'>[] {
292+
return this.klaroConfig.services.filter(service => !servicesToHide.some(name => name === service.name));
307293
}
308294
}

0 commit comments

Comments
 (0)