diff --git a/myteamwallet_frontend_modern/src/app/app.html b/myteamwallet_frontend_modern/src/app/app.html index 67e7bd4..c157873 100644 --- a/myteamwallet_frontend_modern/src/app/app.html +++ b/myteamwallet_frontend_modern/src/app/app.html @@ -1 +1,2 @@ + diff --git a/myteamwallet_frontend_modern/src/app/app.spec.ts b/myteamwallet_frontend_modern/src/app/app.spec.ts index 6400cbd..ab9aa98 100644 --- a/myteamwallet_frontend_modern/src/app/app.spec.ts +++ b/myteamwallet_frontend_modern/src/app/app.spec.ts @@ -1,76 +1,44 @@ -import { signal } from '@angular/core'; import { TestBed } from '@angular/core/testing'; +import { provideHttpClient } from '@angular/common/http'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { provideRouter } from '@angular/router'; -import { of } from 'rxjs'; import { App } from './app'; -import { AuthApi } from './core/auth/auth-api'; -import { AuthStore } from './core/auth/auth-store'; +import { environment } from '../environments/environment'; describe('App', () => { - const token = signal(null); - const updateUser = vi.fn(); - const meResponse = signal>({ - id: 1, - email: 'a@b.de', - firstName: 'Alex', - lastName: 'Muster', - }); - const me = vi.fn(() => of(meResponse())); - const setSession = vi.fn(); + const originalProduction = environment.production; - beforeEach(async () => { - token.set(null); - meResponse.set({ id: 1, email: 'a@b.de', firstName: 'Alex', lastName: 'Muster' }); - updateUser.mockClear(); - setSession.mockClear(); - me.mockClear(); + beforeEach(() => { + localStorage.clear(); + }); + + afterEach(() => { + environment.production = originalProduction; + }); + + it('sets --env-banner-height to 0px and renders no banner in production', async () => { + environment.production = true; await TestBed.configureTestingModule({ imports: [App], - providers: [ - provideRouter([]), - { provide: AuthStore, useValue: { token, updateUser, setSession } }, - { provide: AuthApi, useValue: { me } }, - ], + providers: [provideHttpClient(), provideHttpClientTesting(), provideRouter([])], }).compileComponents(); - }); - - it('should create the app', () => { const fixture = TestBed.createComponent(App); - expect(fixture.componentInstance).toBeTruthy(); + fixture.detectChanges(); + + expect(fixture.nativeElement.style.getPropertyValue('--env-banner-height')).toBe('0px'); + expect(fixture.nativeElement.querySelector('.env-banner')).toBeNull(); }); - it('validates and refreshes a restored session on startup', () => { - token.set('stored-token'); + it('sets --env-banner-height to 28px and renders the banner outside production', async () => { + environment.production = false; + await TestBed.configureTestingModule({ + imports: [App], + providers: [provideHttpClient(), provideHttpClientTesting(), provideRouter([])], + }).compileComponents(); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); - TestBed.createComponent(App); - - expect(me).toHaveBeenCalled(); - expect(updateUser).toHaveBeenCalledWith({ - id: 1, - email: 'a@b.de', - firstName: 'Alex', - lastName: 'Muster', - }); - }); - - it('replaces an expired stored token when me returns a refreshed token', () => { - token.set('expired-token'); - meResponse.set({ - id: 1, - email: 'a@b.de', - firstName: 'Alex', - lastName: 'Muster', - token: 'refreshed-token', - }); - - TestBed.createComponent(App); - - expect(setSession).toHaveBeenCalledWith('refreshed-token', { - id: 1, - email: 'a@b.de', - firstName: 'Alex', - lastName: 'Muster', - }); - expect(updateUser).not.toHaveBeenCalled(); + expect(fixture.nativeElement.style.getPropertyValue('--env-banner-height')).toBe('28px'); + expect(fixture.nativeElement.querySelector('.env-banner')).not.toBeNull(); }); }); diff --git a/myteamwallet_frontend_modern/src/app/app.ts b/myteamwallet_frontend_modern/src/app/app.ts index 3a24188..c5cd8a6 100644 --- a/myteamwallet_frontend_modern/src/app/app.ts +++ b/myteamwallet_frontend_modern/src/app/app.ts @@ -2,16 +2,22 @@ import { Component, inject } from '@angular/core'; import { RouterOutlet } from '@angular/router'; import { AuthApi } from './core/auth/auth-api'; import { AuthStore } from './core/auth/auth-store'; +import { environment } from '../environments/environment'; +import { ENV_BANNER_HEIGHT_PX, EnvBanner } from './shared/env-banner/env-banner'; @Component({ selector: 'app-root', - imports: [RouterOutlet], + imports: [RouterOutlet, EnvBanner], templateUrl: './app.html', styleUrl: './app.scss', + host: { + '[style.--env-banner-height]': 'bannerHeight', + }, }) export class App { private readonly authApi = inject(AuthApi); private readonly authStore = inject(AuthStore); + protected readonly bannerHeight = `${environment.production ? 0 : ENV_BANNER_HEIGHT_PX}px`; constructor() { if (this.authStore.token()) {