diff --git a/frontend/app/cypress/integration/favorites.spec.ts b/frontend/app/cypress/integration/favorites.spec.ts index 62e9f828..4c01946b 100644 --- a/frontend/app/cypress/integration/favorites.spec.ts +++ b/frontend/app/cypress/integration/favorites.spec.ts @@ -41,8 +41,8 @@ describe('favorites', function () { }); cy.get('stapps-favorite-button').click(); cy.get('stapps-favorite-button > ion-button > ion-icon') - .invoke('attr', 'ng-reflect-fill') - .should('eq', 'true'); + .invoke('attr', 'class') + .should('eq', 'selected'); }); cy.visit('/favorites'); cy.get('stapps-data-list-item').within(() => { diff --git a/frontend/app/src/app/modules/profile/id-cards.spec.ts b/frontend/app/src/app/modules/profile/id-cards.spec.ts index 2d752c4a..66d710f0 100644 --- a/frontend/app/src/app/modules/profile/id-cards.spec.ts +++ b/frontend/app/src/app/modules/profile/id-cards.spec.ts @@ -4,6 +4,13 @@ import {HttpClient} from '@angular/common/http'; import {AuthHelperService} from '../auth/auth-helper.service'; import {BehaviorSubject, firstValueFrom, of} from 'rxjs'; import {EncryptedStorageProvider} from '../storage/encrypted-storage.provider'; +import {TestBed} from '@angular/core/testing'; +import {TranslateService} from '@ngx-translate/core'; +import {StorageBackend, Requestor} from '@openid/appauth'; +import {IonicStorage, Browser} from 'ionic-appauth'; +import {LoggerTestingModule} from 'ngx-logger/testing'; +import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; +import {SimpleBrowser} from '../../util/browser.factory'; class FakeAuth { isLoggedIn$ = new BehaviorSubject(false); @@ -13,40 +20,100 @@ class FakeAuth { } describe('IdCards', () => { - let configProvider: ConfigProvider; + let configProviderSpy: ConfigProvider; let httpClient: HttpClient; - let authHelper: AuthHelperService; let encryptedStorageProvider: EncryptedStorageProvider; let fakeAuth: FakeAuth; + const authHelperServiceMock = jasmine.createSpyObj('AuthHelperService', ['getProvider']); + const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['setDefaultLang', 'use']); + let storageBackendSpy: jasmine.SpyObj; + const simpleBrowserMock = jasmine.createSpyObj('SimpleBrowser', ['open']); + beforeEach(() => { - configProvider = jasmine.createSpyObj('ConfigProvider', ['config']); - configProvider.config = { + storageBackendSpy = jasmine.createSpyObj('StorageBackend', ['getItem']); + configProviderSpy = jasmine.createSpyObj('ConfigProvider', ['config', 'getAnyValue']); + configProviderSpy.config = { app: {features: {extern: {idCards: {url: 'http://id-cards.local', authProvider: 'fakeAuth'}}}}, } as never; - httpClient = jasmine.createSpyObj('HttpClient', ['get']); - fakeAuth = new FakeAuth(); - authHelper = jasmine.createSpyObj('AuthHelperService', ['getProvider']); - authHelper.getProvider = jasmine.createSpy().and.returnValue(fakeAuth); + configProviderSpy.getAnyValue = () => + ({ + default: { + endpoints: { + mapping: { + id: '$.id', + email: '$.attributes.mailPrimaryAddress', + givenName: '$.attributes.givenName', + familyName: '$.attributes.sn', + name: '$.attributes.sn', + role: '$.attributes.eduPersonPrimaryAffiliation', + studentId: '$.attributes.employeeNumber', + }, + }, + }, + }) as never; encryptedStorageProvider = jasmine.createSpyObj('EncryptedStorageProvider', ['get', 'set', 'delete']); encryptedStorageProvider.get = jasmine.createSpy().and.resolveTo(); encryptedStorageProvider.set = jasmine.createSpy().and.resolveTo(); encryptedStorageProvider.delete = jasmine.createSpy().and.resolveTo(); + httpClient = jasmine.createSpyObj('HttpClient', ['get']); + + TestBed.configureTestingModule({ + imports: [LoggerTestingModule], + providers: [ + IdCardsProvider, + StAppsWebHttpClient, + { + provide: TranslateService, + useValue: translateServiceSpy, + }, + { + provide: EncryptedStorageProvider, + useValue: encryptedStorageProvider, + }, + IonicStorage, + { + provide: ConfigProvider, + useValue: configProviderSpy, + }, + Browser, + { + provide: StorageBackend, + useValue: storageBackendSpy, + }, + { + provide: AuthHelperService, + useValue: authHelperServiceMock, + }, + { + provide: SimpleBrowser, + useValue: simpleBrowserMock, + }, + { + provide: HttpClient, + useValue: httpClient, + }, + Requestor, + ], + }); + + fakeAuth = new FakeAuth(); + authHelperServiceMock.getProvider = jasmine.createSpy().and.returnValue(fakeAuth); }); it('should emit undefined if not logged in', async () => { - const provider = new IdCardsProvider(); + const provider = TestBed.inject(IdCardsProvider); expect(await firstValueFrom(provider.getIdCards())).toEqual([]); - expect(authHelper.getProvider).toHaveBeenCalledTimes(1); + expect(authHelperServiceMock.getProvider).toHaveBeenCalledTimes(1); }); it('should emit network result when logged in', async () => { fakeAuth.isLoggedIn$.next(true); httpClient.get = jasmine.createSpy().and.returnValue(of(['abc'])); fakeAuth.getValidToken = jasmine.createSpy().and.resolveTo({accessToken: 'fake-token'}); - const provider = new IdCardsProvider(); + const provider = TestBed.inject(IdCardsProvider); expect(await firstValueFrom(provider.getIdCards())).toEqual(['abc' as never]); - expect(authHelper.getProvider).toHaveBeenCalledTimes(1); + expect(authHelperServiceMock.getProvider).toHaveBeenCalledTimes(1); // eslint-disable-next-line unicorn/no-null expect(httpClient.get).toHaveBeenCalledOnceWith('http://id-cards.local', { headers: { @@ -57,7 +124,7 @@ describe('IdCards', () => { }); it('should react to logins', async () => { - const provider = new IdCardsProvider(); + const provider = TestBed.inject(IdCardsProvider); const observable = provider.getIdCards(); expect(await firstValueFrom(observable)).toEqual([]); httpClient.get = jasmine.createSpy().and.returnValue(of(['abc']));