diff --git a/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.spec.ts b/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.spec.ts index 42d593703a66d06dcc7a98a56f18d417ac914ace..d06134448d514db2526478ecef34554008fe9e80 100644 --- a/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.spec.ts +++ b/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.spec.ts @@ -1,4 +1,5 @@ import { TestBed } from '@angular/core/testing'; +import { createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; import { provideMockActions } from '@ngrx/effects/testing'; import { Action } from '@ngrx/store'; @@ -12,13 +13,16 @@ import { UserSettingsResource } from '../user-settings.model'; import { UserSettingsRepository } from '../user-settings.repository'; import * as UserSettingsActions from './user-settings.actions'; import { UserSettingsEffects } from './user-settings.effects'; +import { UserSettingsFacade } from './user-settings.facade'; describe('UserSettingsEffects', () => { let actions: Observable<Action>; let effects: UserSettingsEffects; + const userSettingsFacade = mock(UserSettingsFacade); const userSettingsRepository = mock(UserSettingsRepository); + beforeEach(() => { TestBed.configureTestingModule({ imports: [NxModule.forRoot()], @@ -29,6 +33,10 @@ describe('UserSettingsEffects', () => { { provide: UserSettingsRepository, useValue: userSettingsRepository + }, + { + provide: UserSettingsFacade, + useValue: userSettingsFacade } ], }); @@ -55,6 +63,8 @@ describe('UserSettingsEffects', () => { actions = hot('-a', { a: action }); const expected = cold('-b', { b: UserSettingsActions.loadUserSettingsSuccess({ userSettings }) }); + expect(effects.loadUserSettings$).toBeObservable(expected); + }) it('should dispatch error action', () => { @@ -68,21 +78,23 @@ describe('UserSettingsEffects', () => { const userSettings = createUserSettings(); const action = UserSettingsActions.setUserSettings({ userSettings }); + beforeEach(() => { + userSettingsFacade.getUserSettings.mockReturnValue(of(createStateResource(userSettingsResource))); + userSettingsRepository.setUserSettings.mockReturnValue(of(userSettingsResource)); + }) + it('should call repository', () => { actions = of(action); effects.setUserSettings$.subscribe(); - expect(userSettingsRepository.setUserSettings).toHaveBeenCalledWith(userSettings); + expect(userSettingsRepository.setUserSettings).toHaveBeenCalledWith(userSettingsResource, userSettings); }) it('should dispatch success action', () => { - userSettingsRepository.setUserSettings.mockReturnValue(of(userSettingsResource)); - - actions = hot('-a', { a: action }); - - const expected = cold('-b', { b: UserSettingsActions.setUserSettingsSuccess({ userSettings: userSettingsResource })}); + actions = hot('-a-|', { a: action }); + const expected = cold('-a-|', { a: UserSettingsActions.setUserSettingsSuccess({ userSettings: userSettingsResource })}); expect(effects.setUserSettings$).toBeObservable(expected); }) diff --git a/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.ts b/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.ts index c375089e75c2931dfba89802db1fbd467b6f62fe..03c61f5f0aa8a15d6b625490c01da7dc16e892d2 100644 --- a/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.ts +++ b/goofy-client/libs/user-settings-shared/src/lib/+state/user-settings.effects.ts @@ -1,14 +1,15 @@ import { Injectable } from '@angular/core'; -import { Actions, createEffect, ofType } from '@ngrx/effects'; +import { Actions, concatLatestFrom, createEffect, ofType } from '@ngrx/effects'; import { map, switchMap } from 'rxjs/operators'; import { UserSettingsRepository } from '../user-settings.repository'; import * as UserSettingsActions from './user-settings.actions'; +import { UserSettingsFacade } from './user-settings.facade'; @Injectable() export class UserSettingsEffects { - constructor(private readonly actions$: Actions, private readonly repository: UserSettingsRepository) { } + constructor(private readonly actions$: Actions, private readonly repository: UserSettingsRepository, private readonly userSettingsFacade: UserSettingsFacade) { } loadUserSettings$ = createEffect(() => this.actions$.pipe( @@ -22,7 +23,8 @@ export class UserSettingsEffects { setUserSettings$ = createEffect(() => this.actions$.pipe( ofType(UserSettingsActions.setUserSettings), - switchMap((action) => this.repository.setUserSettings(action.userSettings).pipe( + concatLatestFrom(() => this.userSettingsFacade.getUserSettings()), + switchMap(([action, userSettingsResource]) => this.repository.setUserSettings(userSettingsResource.resource, action.userSettings).pipe( map(userSettings => UserSettingsActions.setUserSettingsSuccess({ userSettings })) )) ) diff --git a/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.spec.ts b/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.spec.ts index 7a05a2693470871083ee7208b779cfcaa863aaf7..19185502e900584f910edb17c36673254d0a8211 100644 --- a/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.spec.ts +++ b/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.spec.ts @@ -1,11 +1,48 @@ -describe('UserSettingsRepository', () => { +import { ApiRootLinkRel, ApiRootResource } from '@goofy-client/api-root-shared'; +import { mock, useFromMock } from '@goofy-client/test-utils'; +import { UserProfileResource } from '@goofy-client/user-profile-shared'; +import { ResourceFactory } from '@ngxp/rest'; +import { createApiRootResource } from 'libs/api-root-shared/test/api-root'; +import { UserProfileRepository } from "libs/user-profile-shared/src/lib/user-profile.repository"; +import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile'; +import { UserSettingsRepository } from './user-settings.repository'; - it('Get user settings of current user', () => { +const resourceFactory = mock(ResourceFactory); +const resourceWrapper = { get: jest.fn() }; +const apiRoot: ApiRootResource = createApiRootResource([ApiRootLinkRel.SEARCH_USER_PROFILES]); +beforeEach(() => { + // userProfileRepository = new UserProfileRepository(useFromMock(resourceFactory)); +}) + +describe('get user settings', () => { + const userProfileRepository: UserProfileRepository = new UserProfileRepository(useFromMock(resourceFactory)); + const userProfile: UserProfileResource = createUserProfileResource(); + const repository: UserSettingsRepository = new UserSettingsRepository(useFromMock(resourceFactory)); + + beforeEach(() => { + resourceFactory.from.mockReturnValue(resourceWrapper); }) - it('set settings of current user', () => { + it('should call resource factory', () => { + repository.getUserSettings(userProfile); + + expect(resourceFactory.from).toHaveBeenCalledWith(userProfile); + }) + it('should get', () => { + // const result = userPr }) + it('should return result', () => { + + }) + +}) + +describe('set user settings', () => { + + it('for current user', () => { + + }) }) \ No newline at end of file diff --git a/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.ts b/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.ts index 807f4f75ec21350108eb1c5bcb82397328950cbb..a142e67c8d4ba45dc3a8ce37a1aafcc70fb9efe9 100644 --- a/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.ts +++ b/goofy-client/libs/user-settings-shared/src/lib/user-settings.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { UserProfileLinkRel, UserProfileResource } from '@goofy-client/user-profile-shared'; import { ResourceFactory } from '@ngxp/rest'; import { Observable } from 'rxjs'; +import { UserSettingsLinkRel } from './user-settings.linkrel'; import { UserSettings, UserSettingsResource } from './user-settings.model'; @Injectable({ providedIn: 'root' }) @@ -13,7 +14,7 @@ export class UserSettingsRepository { return this.resourceFactory.from(userProfileResource).get(UserProfileLinkRel.SETTINGS); } - public setUserSettings(userSettings: UserSettings): Observable<UserSettingsResource> { - return null; + public setUserSettings(userSettingsResource: UserSettingsResource, userSettings: UserSettings): Observable<UserSettingsResource> { + return this.resourceFactory.from(userSettingsResource).patch(UserSettingsLinkRel.EDIT, userSettings); } } \ No newline at end of file