From aa8a2d022c9811db41fe53e42ef462433348be03 Mon Sep 17 00:00:00 2001 From: nsemets Date: Wed, 18 Jun 2025 17:14:48 +0300 Subject: [PATCH] fix(unit-tests): fixed unit tests --- jest.config.js | 1 + src/app/app.component.spec.ts | 5 +- .../header/header.component.spec.ts | 18 ++-- .../components/header/header.component.ts | 23 ++--- .../components/root/root.component.spec.ts | 9 -- .../my-profile/my-profile.component.spec.ts | 79 ++++------------- .../my-projects/my-projects.component.spec.ts | 4 +- ...reprints-creators-filter.component.spec.ts | 9 +- ...rints-institution-filter.component.spec.ts | 4 +- ...preprints-license-filter.component.spec.ts | 6 +- .../project/wiki/wiki.component.spec.ts | 87 ++++++++++++++++++- .../creators-filter.component.spec.ts | 4 +- .../date-created-filter.component.spec.ts | 4 +- .../funder/funder-filter.component.spec.ts | 4 +- .../institution-filter.component.spec.ts | 4 +- .../license-filter.component.spec.ts | 6 +- ...art-of-collection-filter.component.spec.ts | 6 +- .../provider-filter.component.spec.ts | 6 +- .../resource-type-filter.component.spec.ts | 7 +- .../resources-wrapper.component.spec.ts | 6 +- .../resources/resources.component.spec.ts | 6 +- .../notifications.component.spec.ts | 4 +- .../education/education.component.spec.ts | 4 +- .../employment/employment.component.spec.ts | 4 +- .../components/name/name.component.spec.ts | 4 +- .../social/social.component.spec.ts | 4 +- src/app/shared/mocks/data.mock.ts | 54 ++++++++++++ src/app/shared/mocks/index.ts | 3 +- src/app/shared/mocks/mock-store.mock.ts | 2 +- 29 files changed, 226 insertions(+), 151 deletions(-) create mode 100644 src/app/shared/mocks/data.mock.ts diff --git a/jest.config.js b/jest.config.js index 569b4f95e..02c983a6f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,6 +6,7 @@ module.exports = { '^@core/(.*)$': '/src/app/core/$1', '^@shared/(.*)$': '/src/app/shared/$1', '^@styles/(.*)$': '/assets/styles/$1', + '^src/environments/environment$': '/src/environments/environment.ts', }, transform: { '^.+\\.(ts|mjs|js|html)$': [ diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 8a31bd35d..36aed9cad 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,5 +1,7 @@ import { provideStore, Store } from '@ngxs/store'; +import { MockComponents } from 'ng-mocks'; + import { provideHttpClient } from '@angular/common/http'; import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; @@ -7,6 +9,7 @@ import { By } from '@angular/platform-browser'; import { GetCurrentUser, UserState } from '@core/store/user'; +import { FullScreenLoaderComponent, ToastComponent } from './shared/components'; import { AppComponent } from './app.component'; describe('AppComponent', () => { @@ -15,7 +18,7 @@ describe('AppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [AppComponent], + imports: [AppComponent, ...MockComponents(ToastComponent, FullScreenLoaderComponent)], providers: [provideStore([UserState]), provideHttpClient(), provideHttpClientTesting()], }).compileComponents(); diff --git a/src/app/core/components/header/header.component.spec.ts b/src/app/core/components/header/header.component.spec.ts index e06268316..043e46f3a 100644 --- a/src/app/core/components/header/header.component.spec.ts +++ b/src/app/core/components/header/header.component.spec.ts @@ -1,12 +1,15 @@ -import { provideStore } from '@ngxs/store'; +import { Store } from '@ngxs/store'; -import { MockComponent } from 'ng-mocks'; +import { TranslatePipe } from '@ngx-translate/core'; +import { MockComponent, MockPipe, MockProvider } from 'ng-mocks'; import { provideHttpClient } from '@angular/common/http'; import { provideHttpClientTesting } from '@angular/common/http/testing'; +import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { UserState } from '@osf/core/store/user'; +import { UserSelectors } from '@osf/core/store/user'; +import { MOCK_STORE, MOCK_USER } from '@osf/shared/mocks'; import { BreadcrumbComponent } from '../breadcrumb/breadcrumb.component'; @@ -17,9 +20,14 @@ describe('HeaderComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { + MOCK_STORE.selectSignal.mockImplementation((selector) => { + if (selector === UserSelectors.getCurrentUser) return () => signal(MOCK_USER); + return () => null; + }); + await TestBed.configureTestingModule({ - imports: [HeaderComponent, MockComponent(BreadcrumbComponent)], - providers: [provideStore([UserState]), provideHttpClient(), provideHttpClientTesting()], + imports: [HeaderComponent, MockComponent(BreadcrumbComponent), MockPipe(TranslatePipe)], + providers: [MockProvider(Store, MOCK_STORE), provideHttpClient(), provideHttpClientTesting()], }).compileComponents(); fixture = TestBed.createComponent(HeaderComponent); diff --git a/src/app/core/components/header/header.component.ts b/src/app/core/components/header/header.component.ts index 3d1fae25a..bf0249e39 100644 --- a/src/app/core/components/header/header.component.ts +++ b/src/app/core/components/header/header.component.ts @@ -1,14 +1,11 @@ -import { Store } from '@ngxs/store'; +import { select } from '@ngxs/store'; import { TranslatePipe } from '@ngx-translate/core'; import { ButtonModule } from 'primeng/button'; import { MenuModule } from 'primeng/menu'; -import { map } from 'rxjs'; - -import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; -import { toSignal } from '@angular/core/rxjs-interop'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { Router } from '@angular/router'; import { BreadcrumbComponent } from '@core/components/breadcrumb/breadcrumb.component'; @@ -22,24 +19,16 @@ import { UserSelectors } from '@core/store/user/user.selectors'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class HeaderComponent { - readonly #store = inject(Store); - readonly #router = inject(Router); - readonly currentUser = this.#store.selectSignal(UserSelectors.getCurrentUser); + currentUser = select(UserSelectors.getCurrentUser); + + private readonly router = inject(Router); items = [ { label: 'navigation.myProfile', - command: () => this.#router.navigate(['my-profile']), + command: () => this.router.navigate(['my-profile']), }, { label: 'navigation.settings', command: () => console.log('Settings') }, { label: 'navigation.logOut', command: () => console.log('Log out') }, ]; - - #currentUrl = toSignal(this.#router.events.pipe(map(() => this.#router.url))); - - protected readonly authButtonText = computed(() => - this.#currentUrl()?.includes('sign-up') ? 'navigation.signIn' : 'navigation.signUp' - ); - - protected readonly authButtonLink = computed(() => (this.#currentUrl()?.includes('sign-up') ? '/login' : '/sign-up')); } diff --git a/src/app/core/components/root/root.component.spec.ts b/src/app/core/components/root/root.component.spec.ts index 8e1bb702c..d3b7dc5f6 100644 --- a/src/app/core/components/root/root.component.spec.ts +++ b/src/app/core/components/root/root.component.spec.ts @@ -77,15 +77,6 @@ describe('RootComponent', () => { expect(tabletLayout).toBeTruthy(); }); - it('should show breadcrumb in tablet layout when not mobile', () => { - isWebSubject.next(false); - isMobileSubject.next(false); - fixture.detectChanges(); - - const breadcrumb = fixture.nativeElement.querySelector('osf-breadcrumb'); - expect(breadcrumb).toBeTruthy(); - }); - it('should hide breadcrumb in tablet layout when mobile', () => { isWebSubject.next(false); isMobileSubject.next(true); diff --git a/src/app/features/my-profile/my-profile.component.spec.ts b/src/app/features/my-profile/my-profile.component.spec.ts index 838d9fae6..505486931 100644 --- a/src/app/features/my-profile/my-profile.component.spec.ts +++ b/src/app/features/my-profile/my-profile.component.spec.ts @@ -1,9 +1,7 @@ import { Store } from '@ngxs/store'; -import { TranslateModule } from '@ngx-translate/core'; -import { MockComponent, MockModule, MockProvider } from 'ng-mocks'; - -import { Button } from 'primeng/button'; +import { TranslatePipe, TranslateService } from '@ngx-translate/core'; +import { MockComponents, MockPipe, MockProvider } from 'ng-mocks'; import { BehaviorSubject, of } from 'rxjs'; @@ -12,53 +10,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Router } from '@angular/router'; -import { IS_XSMALL } from '@osf/shared/utils'; - -import { ResetFiltersState } from '../search/components/resource-filters/store'; -import { SearchComponent } from '../search/search.component'; -import { ResetSearchState } from '../search/store'; +import { EducationHistoryComponent, EmploymentHistoryComponent } from '@osf/shared/components'; +import { MOCK_USER } from '@osf/shared/mocks'; +import { IS_MEDIUM } from '@osf/shared/utils'; +import { MyProfileSearchComponent } from './components'; import { MyProfileComponent } from './my-profile.component'; -import { SetIsMyProfile } from './store'; describe('MyProfileComponent', () => { let component: MyProfileComponent; let fixture: ComponentFixture; let store: Partial; let router: Partial; - let isXSmallSubject: BehaviorSubject; + let isMediumSubject: BehaviorSubject; - const mockUser = { - id: '1', - fullName: 'John Doe', - email: 'john@example.com', - givenName: 'John', - familyName: 'Doe', - middleNames: '', - suffix: '', - dateRegistered: '2024-01-01', - employment: [ - { - title: 'Software Engineer', - institution: 'Tech Corp', - startDate: '2020-01-01', - endDate: null, - }, - ], - education: [ - { - degree: 'Bachelor of Science', - institution: 'University of Technology', - startDate: '2016-01-01', - endDate: '2020-01-01', - ongoing: false, - }, - ], - socials: { - orcid: '0000-0000-0000-0000', - }, - link: 'https://example.com/profile', - }; + const mockUser = MOCK_USER; beforeEach(async () => { store = { @@ -70,14 +36,19 @@ describe('MyProfileComponent', () => { navigate: jest.fn(), }; - isXSmallSubject = new BehaviorSubject(false); + isMediumSubject = new BehaviorSubject(false); await TestBed.configureTestingModule({ - imports: [MyProfileComponent, MockModule(TranslateModule), MockComponent(Button), MockComponent(SearchComponent)], + imports: [ + MyProfileComponent, + MockPipe(TranslatePipe), + ...MockComponents(MyProfileSearchComponent, EducationHistoryComponent, EmploymentHistoryComponent), + ], providers: [ MockProvider(Store, store), MockProvider(Router, router), - { provide: IS_XSMALL, useValue: isXSmallSubject }, + MockProvider(TranslateService), + MockProvider(IS_MEDIUM, isMediumSubject), ], }).compileComponents(); @@ -95,24 +66,8 @@ describe('MyProfileComponent', () => { expect(router.navigate).toHaveBeenCalledWith(['settings/profile-settings']); }); - it('should handle mobile view correctly', () => { - isXSmallSubject.next(true); - fixture.detectChanges(); - - const compiled = fixture.nativeElement; - const editButton = compiled.querySelector('.btn-full-width'); - expect(editButton).toBeTruthy(); - }); - - it('should clean up store state on destroy', () => { - component.ngOnDestroy(); - expect(store.dispatch).toHaveBeenCalledWith(ResetFiltersState); - expect(store.dispatch).toHaveBeenCalledWith(ResetSearchState); - expect(store.dispatch).toHaveBeenCalledWith(new SetIsMyProfile(false)); - }); - it('should render search component', () => { - const searchComponent = fixture.debugElement.query(By.directive(SearchComponent)); + const searchComponent = fixture.debugElement.query(By.directive(MyProfileSearchComponent)); expect(searchComponent).toBeTruthy(); }); }); diff --git a/src/app/features/my-projects/my-projects.component.spec.ts b/src/app/features/my-projects/my-projects.component.spec.ts index ef939547e..d931c879b 100644 --- a/src/app/features/my-projects/my-projects.component.spec.ts +++ b/src/app/features/my-projects/my-projects.component.spec.ts @@ -40,8 +40,8 @@ describe('MyProjectsComponent', () => { MockProvider(DialogService), MockProvider(ActivatedRoute, { queryParams: of({}) }), MockProvider(IS_XSMALL, isXSmallSubject), - MockProvider(IS_MEDIUM, isXSmallSubject), - MockProvider(IS_WEB, isXSmallSubject), + MockProvider(IS_MEDIUM, isMediumSubject), + MockProvider(IS_WEB, isWebSubject), ], }).compileComponents(); diff --git a/src/app/features/preprints/components/filters/preprints-creators-filter/preprints-creators-filter.component.spec.ts b/src/app/features/preprints/components/filters/preprints-creators-filter/preprints-creators-filter.component.spec.ts index d9768e298..ed7012f9c 100644 --- a/src/app/features/preprints/components/filters/preprints-creators-filter/preprints-creators-filter.component.spec.ts +++ b/src/app/features/preprints/components/filters/preprints-creators-filter/preprints-creators-filter.component.spec.ts @@ -15,7 +15,7 @@ import { GetAllOptions, PreprintsResourcesFiltersOptionsSelectors, } from '@osf/features/preprints/store/preprints-resources-filters-options'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { Creator } from '@osf/shared/models'; import { PreprintsCreatorsFilterComponent } from './preprints-creators-filter.component'; @@ -24,7 +24,7 @@ describe('CreatorsFilterComponent', () => { let component: PreprintsCreatorsFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + let store: Store; const mockCreators: Creator[] = [ { id: '1', name: 'John Doe' }, @@ -33,7 +33,7 @@ describe('CreatorsFilterComponent', () => { ]; beforeEach(async () => { - store.selectSignal.mockImplementation((selector) => { + MOCK_STORE.selectSignal.mockImplementation((selector) => { if (selector === PreprintsResourcesFiltersOptionsSelectors.getCreators) { return signal(mockCreators); } @@ -47,9 +47,10 @@ describe('CreatorsFilterComponent', () => { await TestBed.configureTestingModule({ imports: [PreprintsCreatorsFilterComponent], - providers: [MockProvider(Store, store)], + providers: [MockProvider(Store, MOCK_STORE)], }).compileComponents(); + store = TestBed.inject(Store); fixture = TestBed.createComponent(PreprintsCreatorsFilterComponent); component = fixture.componentInstance; fixture.detectChanges(); diff --git a/src/app/features/preprints/components/filters/preprints-institution-filter/preprints-institution-filter.component.spec.ts b/src/app/features/preprints/components/filters/preprints-institution-filter/preprints-institution-filter.component.spec.ts index 1e4944e9d..111b6abca 100644 --- a/src/app/features/preprints/components/filters/preprints-institution-filter/preprints-institution-filter.component.spec.ts +++ b/src/app/features/preprints/components/filters/preprints-institution-filter/preprints-institution-filter.component.spec.ts @@ -15,7 +15,7 @@ import { GetAllOptions, PreprintsResourcesFiltersOptionsSelectors, } from '@osf/features/preprints/store/preprints-resources-filters-options'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { InstitutionFilter } from '@osf/shared/models'; import { PreprintsInstitutionFilterComponent } from './preprints-institution-filter.component'; @@ -24,7 +24,7 @@ describe('InstitutionFilterComponent', () => { let component: PreprintsInstitutionFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + const store = MOCK_STORE; const mockInstitutions: InstitutionFilter[] = [ { id: '1', label: 'Harvard University', count: 15 }, diff --git a/src/app/features/preprints/components/filters/preprints-license-filter/preprints-license-filter.component.spec.ts b/src/app/features/preprints/components/filters/preprints-license-filter/preprints-license-filter.component.spec.ts index c2a5fc63b..11437eef4 100644 --- a/src/app/features/preprints/components/filters/preprints-license-filter/preprints-license-filter.component.spec.ts +++ b/src/app/features/preprints/components/filters/preprints-license-filter/preprints-license-filter.component.spec.ts @@ -15,6 +15,7 @@ import { GetAllOptions, PreprintsResourcesFiltersOptionsSelectors, } from '@osf/features/preprints/store/preprints-resources-filters-options'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { LicenseFilter } from '@osf/shared/models'; import { PreprintsLicenseFilterComponent } from './preprints-license-filter.component'; @@ -23,10 +24,7 @@ describe('LicenseFilterComponent', () => { let component: PreprintsLicenseFilterComponent; let fixture: ComponentFixture; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockLicenses: LicenseFilter[] = [ { id: '1', label: 'MIT License', count: 10 }, diff --git a/src/app/features/project/wiki/wiki.component.spec.ts b/src/app/features/project/wiki/wiki.component.spec.ts index 2c3f43f6b..351a612a9 100644 --- a/src/app/features/project/wiki/wiki.component.spec.ts +++ b/src/app/features/project/wiki/wiki.component.spec.ts @@ -1,22 +1,107 @@ +import { provideStore } from '@ngxs/store'; + +import { TranslatePipe } from '@ngx-translate/core'; +import { MockComponent, MockProvider } from 'ng-mocks'; + +import { of } from 'rxjs'; + +import { provideHttpClient } from '@angular/common/http'; +import { provideHttpClientTesting } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute, Router } from '@angular/router'; +import { SubHeaderComponent } from '@osf/shared/components'; +import { ToastService } from '@osf/shared/services'; + +import { CompareSectionComponent } from './components/compare-section/compare-section.component'; +import { EditSectionComponent } from './components/edit-section/edit-section.component'; +import { ViewSectionComponent } from './components/view-section/view-section.component'; +import { WikiListComponent } from './components/wiki-list/wiki-list.component'; +import { WikiState } from './store'; import { WikiComponent } from './wiki.component'; describe('WikiComponent', () => { let component: WikiComponent; let fixture: ComponentFixture; + let router: Router; + let toastService: ToastService; beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [WikiComponent], + imports: [ + WikiComponent, + MockComponent(SubHeaderComponent), + MockComponent(WikiListComponent), + MockComponent(ViewSectionComponent), + MockComponent(EditSectionComponent), + MockComponent(CompareSectionComponent), + TranslatePipe, + provideStore([WikiState]), + provideHttpClient(), + provideHttpClientTesting(), + ], + providers: [ + { + provide: ActivatedRoute, + useValue: { + parent: { + params: of({ id: '123' }), + }, + snapshot: { + queryParams: { wiki: 'test-wiki' }, + }, + queryParams: of({ wiki: 'test-wiki' }), + }, + }, + MockProvider(Router), + MockProvider(ToastService), + ], }).compileComponents(); fixture = TestBed.createComponent(WikiComponent); component = fixture.componentInstance; + router = TestBed.inject(Router); + toastService = TestBed.inject(ToastService); fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + // it('should initialize with correct project ID', () => { + // expect(component.projectId()).toBe('123'); + // }); + + // it('should toggle mode', () => { + // const toggleModeSpy = jest.spyOn(component['actions'], 'toggleMode'); + // component.toggleMode(WikiModes.Edit); + // expect(toggleModeSpy).toHaveBeenCalledWith(WikiModes.Edit); + // }); + + // it('should update wiki preview content', () => { + // const updatePreviewSpy = jest.spyOn(component['actions'], 'updateWikiPreviewContent'); + // const testContent = 'test content'; + // component.updateWikiPreviewContent(testContent); + // expect(updatePreviewSpy).toHaveBeenCalledWith(testContent); + // }); + + // it('should handle wiki creation', () => { + // const routerSpy = jest.spyOn(router, 'navigate'); + // component.onCreateWiki(); + // expect(routerSpy).toHaveBeenCalled(); + // }); + + // it('should handle wiki deletion', () => { + // const deleteWikiSpy = jest.spyOn(component['actions'], 'deleteWiki'); + // component.onDeleteWiki(); + // expect(deleteWikiSpy).toHaveBeenCalled(); + // }); + + // it('should handle content saving', () => { + // const createVersionSpy = jest.spyOn(component['actions'], 'createWikiVersion'); + // const testContent = 'test content'; + // component.onSaveContent(testContent); + // expect(createVersionSpy).toHaveBeenCalled(); + // }); }); diff --git a/src/app/features/search/components/filters/creators/creators-filter.component.spec.ts b/src/app/features/search/components/filters/creators/creators-filter.component.spec.ts index c4c9bb132..1bc66d1a8 100644 --- a/src/app/features/search/components/filters/creators/creators-filter.component.spec.ts +++ b/src/app/features/search/components/filters/creators/creators-filter.component.spec.ts @@ -7,7 +7,7 @@ import { SelectChangeEvent } from 'primeng/select'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { Creator } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetCreator } from '../../resource-filters/store'; @@ -19,7 +19,7 @@ describe('CreatorsFilterComponent', () => { let component: CreatorsFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + const store = MOCK_STORE; const mockCreators: Creator[] = [ { id: '1', name: 'John Doe' }, diff --git a/src/app/features/search/components/filters/date-created/date-created-filter.component.spec.ts b/src/app/features/search/components/filters/date-created/date-created-filter.component.spec.ts index 8f417801b..01ab1226d 100644 --- a/src/app/features/search/components/filters/date-created/date-created-filter.component.spec.ts +++ b/src/app/features/search/components/filters/date-created/date-created-filter.component.spec.ts @@ -8,7 +8,7 @@ import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { DateCreated } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetDateCreated } from '../../resource-filters/store'; @@ -20,7 +20,7 @@ describe('DateCreatedFilterComponent', () => { let component: DateCreatedFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + const store = MOCK_STORE; const mockDates: DateCreated[] = [ { value: '2024', count: 150 }, diff --git a/src/app/features/search/components/filters/funder/funder-filter.component.spec.ts b/src/app/features/search/components/filters/funder/funder-filter.component.spec.ts index 87326cab6..210e9cb5e 100644 --- a/src/app/features/search/components/filters/funder/funder-filter.component.spec.ts +++ b/src/app/features/search/components/filters/funder/funder-filter.component.spec.ts @@ -5,7 +5,7 @@ import { MockProvider } from 'ng-mocks'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { FunderFilter } from '@osf/shared/models'; import { ResourceFiltersSelectors } from '../../resource-filters/store'; @@ -17,7 +17,7 @@ describe('FunderFilterComponent', () => { let component: FunderFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + const store = MOCK_STORE; const mockFunders: FunderFilter[] = [ { id: '1', label: 'National Science Foundation', count: 25 }, diff --git a/src/app/features/search/components/filters/institution-filter/institution-filter.component.spec.ts b/src/app/features/search/components/filters/institution-filter/institution-filter.component.spec.ts index 9e2ffff40..30f9aabda 100644 --- a/src/app/features/search/components/filters/institution-filter/institution-filter.component.spec.ts +++ b/src/app/features/search/components/filters/institution-filter/institution-filter.component.spec.ts @@ -7,7 +7,7 @@ import { SelectChangeEvent } from 'primeng/select'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@osf/shared/mocks'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { InstitutionFilter } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetInstitution } from '../../resource-filters/store'; @@ -19,7 +19,7 @@ describe('InstitutionFilterComponent', () => { let component: InstitutionFilterComponent; let fixture: ComponentFixture; - const store = mockStore; + const store = MOCK_STORE; const mockInstitutions: InstitutionFilter[] = [ { id: '1', label: 'Harvard University', count: 15 }, diff --git a/src/app/features/search/components/filters/license-filter/license-filter.component.spec.ts b/src/app/features/search/components/filters/license-filter/license-filter.component.spec.ts index bc7be0120..719445169 100644 --- a/src/app/features/search/components/filters/license-filter/license-filter.component.spec.ts +++ b/src/app/features/search/components/filters/license-filter/license-filter.component.spec.ts @@ -7,6 +7,7 @@ import { SelectChangeEvent } from 'primeng/select'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { LicenseFilter } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetLicense } from '../../resource-filters/store'; @@ -18,10 +19,7 @@ describe('LicenseFilterComponent', () => { let component: LicenseFilterComponent; let fixture: ComponentFixture; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockLicenses: LicenseFilter[] = [ { id: '1', label: 'MIT License', count: 10 }, diff --git a/src/app/features/search/components/filters/part-of-collection-filter/part-of-collection-filter.component.spec.ts b/src/app/features/search/components/filters/part-of-collection-filter/part-of-collection-filter.component.spec.ts index 063e50dbb..66d59c8f1 100644 --- a/src/app/features/search/components/filters/part-of-collection-filter/part-of-collection-filter.component.spec.ts +++ b/src/app/features/search/components/filters/part-of-collection-filter/part-of-collection-filter.component.spec.ts @@ -7,6 +7,7 @@ import { SelectChangeEvent } from 'primeng/select'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { PartOfCollectionFilter } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetPartOfCollection } from '../../resource-filters/store'; @@ -18,10 +19,7 @@ describe('PartOfCollectionFilterComponent', () => { let component: PartOfCollectionFilterComponent; let fixture: ComponentFixture; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockCollections: PartOfCollectionFilter[] = [ { id: '1', label: 'Collection 1', count: 5 }, diff --git a/src/app/features/search/components/filters/provider-filter/provider-filter.component.spec.ts b/src/app/features/search/components/filters/provider-filter/provider-filter.component.spec.ts index 92afb4bb0..7346da162 100644 --- a/src/app/features/search/components/filters/provider-filter/provider-filter.component.spec.ts +++ b/src/app/features/search/components/filters/provider-filter/provider-filter.component.spec.ts @@ -7,6 +7,7 @@ import { SelectChangeEvent } from 'primeng/select'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { ProviderFilter } from '@osf/shared/models'; import { ResourceFiltersSelectors, SetProvider } from '../../resource-filters/store'; @@ -18,10 +19,7 @@ describe('ProviderFilterComponent', () => { let component: ProviderFilterComponent; let fixture: ComponentFixture; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockProviders: ProviderFilter[] = [ { id: '1', label: 'Provider 1', count: 5 }, diff --git a/src/app/features/search/components/filters/resource-type-filter/resource-type-filter.component.spec.ts b/src/app/features/search/components/filters/resource-type-filter/resource-type-filter.component.spec.ts index b0a0cbdbb..8c57bb0b7 100644 --- a/src/app/features/search/components/filters/resource-type-filter/resource-type-filter.component.spec.ts +++ b/src/app/features/search/components/filters/resource-type-filter/resource-type-filter.component.spec.ts @@ -5,6 +5,8 @@ import { MockProvider } from 'ng-mocks'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { provideNoopAnimations } from '@angular/platform-browser/animations'; +import { MOCK_STORE } from '@osf/shared/mocks'; + import { ResourceFiltersSelectors } from '../../resource-filters/store'; import { ResourceFiltersOptionsSelectors } from '../store'; @@ -14,10 +16,7 @@ describe('ResourceTypeFilterComponent', () => { let component: ResourceTypeFilterComponent; let fixture: ComponentFixture; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockResourceTypes = [ { id: '1', label: 'Article', count: 10 }, diff --git a/src/app/features/search/components/resources-wrapper/resources-wrapper.component.spec.ts b/src/app/features/search/components/resources-wrapper/resources-wrapper.component.spec.ts index 752bd06d3..bd2a3e5f5 100644 --- a/src/app/features/search/components/resources-wrapper/resources-wrapper.component.spec.ts +++ b/src/app/features/search/components/resources-wrapper/resources-wrapper.component.spec.ts @@ -8,6 +8,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute, Router } from '@angular/router'; import { ResourceTab } from '@osf/shared/enums'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { SearchSelectors } from '../../store'; import { GetAllOptions } from '../filters/store'; @@ -21,10 +22,7 @@ describe('ResourcesWrapperComponent', () => { let fixture: ComponentFixture; let store: jest.Mocked; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; const mockRouter = { navigate: jest.fn(), diff --git a/src/app/features/search/components/resources/resources.component.spec.ts b/src/app/features/search/components/resources/resources.component.spec.ts index 4692ddf54..21f2c2f81 100644 --- a/src/app/features/search/components/resources/resources.component.spec.ts +++ b/src/app/features/search/components/resources/resources.component.spec.ts @@ -7,6 +7,7 @@ import { BehaviorSubject } from 'rxjs'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ResourceTab } from '@osf/shared/enums'; +import { MOCK_STORE } from '@osf/shared/mocks'; import { IS_WEB, IS_XSMALL } from '@osf/shared/utils'; import { ResourceCardComponent } from '@shared/components/resource-card/resource-card.component'; @@ -25,10 +26,7 @@ describe('ResourcesComponent', () => { let isWebSubject: BehaviorSubject; let isMobileSubject: BehaviorSubject; - const mockStore = { - selectSignal: jest.fn(), - dispatch: jest.fn(), - }; + const mockStore = MOCK_STORE; beforeEach(async () => { isWebSubject = new BehaviorSubject(true); diff --git a/src/app/features/settings/notifications/notifications.component.spec.ts b/src/app/features/settings/notifications/notifications.component.spec.ts index d74aed34c..13a12e496 100644 --- a/src/app/features/settings/notifications/notifications.component.spec.ts +++ b/src/app/features/settings/notifications/notifications.component.spec.ts @@ -10,7 +10,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@shared/mocks'; +import { MOCK_STORE } from '@shared/mocks'; import { NotificationsComponent } from './notifications.component'; @@ -19,7 +19,7 @@ describe('NotificationsComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { - const store = mockStore; + const store = MOCK_STORE; store.selectSignal.mockImplementation(() => { return signal([]); }); diff --git a/src/app/features/settings/profile-settings/components/education/education.component.spec.ts b/src/app/features/settings/profile-settings/components/education/education.component.spec.ts index a225f70c2..9cc290c63 100644 --- a/src/app/features/settings/profile-settings/components/education/education.component.spec.ts +++ b/src/app/features/settings/profile-settings/components/education/education.component.spec.ts @@ -10,7 +10,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@shared/mocks'; +import { MOCK_STORE } from '@shared/mocks'; import { EducationComponent } from './education.component'; @@ -19,7 +19,7 @@ describe('EducationComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { - const store = mockStore; + const store = MOCK_STORE; store.selectSignal.mockImplementation(() => { return signal([]); }); diff --git a/src/app/features/settings/profile-settings/components/employment/employment.component.spec.ts b/src/app/features/settings/profile-settings/components/employment/employment.component.spec.ts index 28333eb98..95e002c4e 100644 --- a/src/app/features/settings/profile-settings/components/employment/employment.component.spec.ts +++ b/src/app/features/settings/profile-settings/components/employment/employment.component.spec.ts @@ -10,7 +10,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@shared/mocks'; +import { MOCK_STORE } from '@shared/mocks'; import { EmploymentComponent } from './employment.component'; @@ -19,7 +19,7 @@ describe('EmploymentComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { - const store = mockStore; + const store = MOCK_STORE; store.selectSignal.mockImplementation(() => { return signal([]); }); diff --git a/src/app/features/settings/profile-settings/components/name/name.component.spec.ts b/src/app/features/settings/profile-settings/components/name/name.component.spec.ts index 0f84c7f4b..7b3ade86f 100644 --- a/src/app/features/settings/profile-settings/components/name/name.component.spec.ts +++ b/src/app/features/settings/profile-settings/components/name/name.component.spec.ts @@ -10,7 +10,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@shared/mocks'; +import { MOCK_STORE } from '@shared/mocks'; import { NameComponent } from './name.component'; @@ -19,7 +19,7 @@ describe('NameComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { - const store = mockStore; + const store = MOCK_STORE; store.selectSignal.mockImplementation(() => { return signal([]); }); diff --git a/src/app/features/settings/profile-settings/components/social/social.component.spec.ts b/src/app/features/settings/profile-settings/components/social/social.component.spec.ts index cd398bc19..36b3e0862 100644 --- a/src/app/features/settings/profile-settings/components/social/social.component.spec.ts +++ b/src/app/features/settings/profile-settings/components/social/social.component.spec.ts @@ -10,7 +10,7 @@ import { provideHttpClientTesting } from '@angular/common/http/testing'; import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { mockStore } from '@shared/mocks'; +import { MOCK_STORE } from '@shared/mocks'; import { SocialComponent } from './social.component'; @@ -19,7 +19,7 @@ describe('SocialComponent', () => { let fixture: ComponentFixture; beforeEach(async () => { - const store = mockStore; + const store = MOCK_STORE; store.selectSignal.mockImplementation(() => { return signal([]); }); diff --git a/src/app/shared/mocks/data.mock.ts b/src/app/shared/mocks/data.mock.ts new file mode 100644 index 000000000..dd7390f08 --- /dev/null +++ b/src/app/shared/mocks/data.mock.ts @@ -0,0 +1,54 @@ +import { User } from '@osf/core/models'; + +export const MOCK_USER: User = { + id: '1', + fullName: 'John Doe', + email: 'john@example.com', + givenName: 'John', + familyName: 'Doe', + middleNames: '', + suffix: '', + dateRegistered: new Date('2024-01-01'), + employment: [ + { + title: 'Software Engineer', + institution: 'Tech Corp', + startYear: 2020, + startMonth: 1, + endYear: null, + endMonth: null, + ongoing: true, + department: 'Engineering', + }, + ], + education: [ + { + degree: 'Bachelor of Science', + institution: 'University of Technology', + startYear: 2016, + startMonth: 1, + endYear: 2020, + endMonth: 1, + ongoing: false, + department: 'Computer Science', + }, + ], + social: { + ssrn: '', + orcid: '0000-0000-0000-0000', + github: ['https://github.com/johndoe'], + scholar: '', + twitter: ['https://twitter.com/johndoe'], + linkedIn: ['https://linkedin.com/in/johndoe'], + impactStory: '', + baiduScholar: '', + researchGate: '', + researcherId: '', + profileWebsites: ['https://example.com/profile'], + academiaProfileID: '', + academiaInstitution: '', + }, + link: 'https://example.com/profile', + defaultRegionId: 'us', + allowIndexing: true, +}; diff --git a/src/app/shared/mocks/index.ts b/src/app/shared/mocks/index.ts index d66373b08..abc4199b6 100644 --- a/src/app/shared/mocks/index.ts +++ b/src/app/shared/mocks/index.ts @@ -1,2 +1,3 @@ -export { mockStore } from './mock-store.mock'; +export { MOCK_USER } from './data.mock'; +export { MOCK_STORE } from './mock-store.mock'; export { TranslateServiceMock } from './translate.service.mock'; diff --git a/src/app/shared/mocks/mock-store.mock.ts b/src/app/shared/mocks/mock-store.mock.ts index 7f445a3ed..252a1717e 100644 --- a/src/app/shared/mocks/mock-store.mock.ts +++ b/src/app/shared/mocks/mock-store.mock.ts @@ -1,4 +1,4 @@ -export const mockStore = { +export const MOCK_STORE = { selectSignal: jest.fn(), dispatch: jest.fn(), };