mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-18 15:33:04 +00:00
220 lines
5.9 KiB
TypeScript
220 lines
5.9 KiB
TypeScript
import {
|
|
DebugElement,
|
|
NO_ERRORS_SCHEMA,
|
|
} from '@angular/core';
|
|
import {
|
|
ComponentFixture,
|
|
inject,
|
|
TestBed,
|
|
waitForAsync,
|
|
} from '@angular/core/testing';
|
|
import { By } from '@angular/platform-browser';
|
|
import { ActivatedRoute } from '@angular/router';
|
|
import {
|
|
Store,
|
|
StoreModule,
|
|
} from '@ngrx/store';
|
|
import {
|
|
TranslateLoader,
|
|
TranslateModule,
|
|
} from '@ngx-translate/core';
|
|
import { cold } from 'jasmine-marbles';
|
|
import { of } from 'rxjs';
|
|
|
|
import { APP_DATA_SERVICES_MAP } from '../../../../config/app-config.interface';
|
|
import { AppState } from '../../../app.reducer';
|
|
import {
|
|
authReducer,
|
|
AuthState,
|
|
} from '../../../core/auth/auth.reducer';
|
|
import { AuthService } from '../../../core/auth/auth.service';
|
|
import { AuthTokenInfo } from '../../../core/auth/models/auth-token-info.model';
|
|
import { XSRFService } from '../../../core/xsrf/xsrf.service';
|
|
import { TranslateLoaderMock } from '../../mocks/translate-loader.mock';
|
|
import { ActivatedRouteStub } from '../../testing/active-router.stub';
|
|
import { EPersonMock } from '../../testing/eperson.mock';
|
|
import { UserMenuComponent } from './user-menu.component';
|
|
|
|
describe('UserMenuComponent', () => {
|
|
|
|
let component: UserMenuComponent;
|
|
let fixture: ComponentFixture<UserMenuComponent>;
|
|
let deUserMenu: DebugElement;
|
|
let authState: AuthState;
|
|
let authStateLoading: AuthState;
|
|
let authService: AuthService;
|
|
|
|
function serviceInit() {
|
|
authService = jasmine.createSpyObj('authService', {
|
|
getAuthenticatedUserFromStore: of(EPersonMock),
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
authState = {
|
|
authenticated: true,
|
|
loaded: true,
|
|
blocking: false,
|
|
loading: false,
|
|
authToken: new AuthTokenInfo('test_token'),
|
|
userId: EPersonMock.id,
|
|
idle: false,
|
|
};
|
|
authStateLoading = {
|
|
authenticated: true,
|
|
loaded: true,
|
|
blocking: false,
|
|
loading: true,
|
|
authToken: null,
|
|
userId: EPersonMock.id,
|
|
idle: false,
|
|
};
|
|
}
|
|
|
|
beforeEach(waitForAsync(() => {
|
|
serviceInit();
|
|
TestBed.configureTestingModule({
|
|
imports: [
|
|
StoreModule.forRoot(authReducer, {
|
|
runtimeChecks: {
|
|
strictStateImmutability: false,
|
|
strictActionImmutability: false,
|
|
},
|
|
}),
|
|
TranslateModule.forRoot({
|
|
loader: {
|
|
provide: TranslateLoader,
|
|
useClass: TranslateLoaderMock,
|
|
},
|
|
}),
|
|
UserMenuComponent,
|
|
],
|
|
providers: [
|
|
{ provide: AuthService, useValue: authService },
|
|
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
|
|
{ provide: XSRFService, useValue: {} },
|
|
{ provide: APP_DATA_SERVICES_MAP, useValue: {} },
|
|
],
|
|
schemas: [
|
|
NO_ERRORS_SCHEMA,
|
|
],
|
|
}).compileComponents();
|
|
|
|
}));
|
|
|
|
beforeEach(() => {
|
|
init();
|
|
});
|
|
|
|
describe('when auth state is loading', () => {
|
|
beforeEach(inject([Store], (store: Store<AppState>) => {
|
|
store
|
|
.subscribe((state) => {
|
|
(state as any).core = Object.create({});
|
|
(state as any).core.auth = authStateLoading;
|
|
});
|
|
|
|
// create component and test fixture
|
|
fixture = TestBed.createComponent(UserMenuComponent);
|
|
|
|
// get test component from the fixture
|
|
component = fixture.componentInstance;
|
|
|
|
fixture.detectChanges();
|
|
|
|
deUserMenu = fixture.debugElement.query(By.css('div'));
|
|
}));
|
|
|
|
afterEach(() => {
|
|
fixture.destroy();
|
|
});
|
|
|
|
it('should init component properly', () => {
|
|
expect(component).toBeDefined();
|
|
|
|
expect(component.loading$).toBeObservable(cold('b', {
|
|
b: true,
|
|
}));
|
|
|
|
expect(component.user$).toBeObservable(cold('(c|)', {
|
|
c: EPersonMock,
|
|
}));
|
|
const span = deUserMenu.query(By.css('.dropdown-item-text'));
|
|
expect(span).toBeNull();
|
|
});
|
|
|
|
});
|
|
|
|
describe('when auth state is not loading', () => {
|
|
beforeEach(inject([Store], (store: Store<AppState>) => {
|
|
store
|
|
.subscribe((state) => {
|
|
(state as any).core = Object.create({});
|
|
(state as any).core.auth = authState;
|
|
});
|
|
|
|
// create component and test fixture
|
|
fixture = TestBed.createComponent(UserMenuComponent);
|
|
|
|
// get test component from the fixture
|
|
component = fixture.componentInstance;
|
|
|
|
fixture.detectChanges();
|
|
|
|
deUserMenu = fixture.debugElement.query(By.css('ul#user-menu-dropdown'));
|
|
}));
|
|
|
|
afterEach(() => {
|
|
fixture.destroy();
|
|
});
|
|
|
|
it('should init component properly', () => {
|
|
expect(component).toBeDefined();
|
|
|
|
expect(component.loading$).toBeObservable(cold('b', {
|
|
b: false,
|
|
}));
|
|
|
|
expect(component.user$).toBeObservable(cold('(c|)', {
|
|
c: EPersonMock,
|
|
}));
|
|
|
|
expect(deUserMenu).toBeDefined();
|
|
});
|
|
|
|
it('should display user name and email', () => {
|
|
const username = 'User Test';
|
|
const email = 'test@test.com';
|
|
const span = deUserMenu.query(By.css('.username-email-wrapper'));
|
|
expect(span).toBeDefined();
|
|
expect(span.nativeElement.innerHTML).toContain(username);
|
|
expect(span.nativeElement.innerHTML).toContain(email);
|
|
});
|
|
|
|
it('should create logout component', () => {
|
|
const components = fixture.debugElement.query(By.css('[data-test="log-out-component"]'));
|
|
expect(components).toBeTruthy();
|
|
});
|
|
|
|
it('should not create logout component', () => {
|
|
component.inExpandableNavbar = true;
|
|
fixture.detectChanges();
|
|
const components = fixture.debugElement.query(By.css('[data-test="log-out-component"]'));
|
|
expect(components).toBeFalsy();
|
|
});
|
|
|
|
it('should call onMenuItemClick when li is clicked', () => {
|
|
spyOn(component, 'onMenuItemClick');
|
|
const lis = fixture.debugElement.queryAll(By.css('.ds-menu-item-wrapper'));
|
|
const secondLi = lis[1];
|
|
secondLi.triggerEventHandler('click', {
|
|
preventDefault: () => {/**/
|
|
},
|
|
});
|
|
expect(component.onMenuItemClick).toHaveBeenCalled();
|
|
});
|
|
|
|
});
|
|
|
|
});
|