Skip to content
Snippets Groups Projects
Commit bee149de authored by OZGCloud's avatar OZGCloud
Browse files

OZG-2626 OZG-2886 setUserSettings() implementieren (WIP)

Aktueller Stand: Tests für Effects und Repository bearbeiten
parent ef4ee074
No related branches found
No related tags found
No related merge requests found
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { createStateResource } from '@goofy-client/tech-shared';
import { mock } from '@goofy-client/test-utils'; import { mock } from '@goofy-client/test-utils';
import { provideMockActions } from '@ngrx/effects/testing'; import { provideMockActions } from '@ngrx/effects/testing';
import { Action } from '@ngrx/store'; import { Action } from '@ngrx/store';
...@@ -12,13 +13,16 @@ import { UserSettingsResource } from '../user-settings.model'; ...@@ -12,13 +13,16 @@ import { UserSettingsResource } from '../user-settings.model';
import { UserSettingsRepository } from '../user-settings.repository'; import { UserSettingsRepository } from '../user-settings.repository';
import * as UserSettingsActions from './user-settings.actions'; import * as UserSettingsActions from './user-settings.actions';
import { UserSettingsEffects } from './user-settings.effects'; import { UserSettingsEffects } from './user-settings.effects';
import { UserSettingsFacade } from './user-settings.facade';
describe('UserSettingsEffects', () => { describe('UserSettingsEffects', () => {
let actions: Observable<Action>; let actions: Observable<Action>;
let effects: UserSettingsEffects; let effects: UserSettingsEffects;
const userSettingsFacade = mock(UserSettingsFacade);
const userSettingsRepository = mock(UserSettingsRepository); const userSettingsRepository = mock(UserSettingsRepository);
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NxModule.forRoot()], imports: [NxModule.forRoot()],
...@@ -29,6 +33,10 @@ describe('UserSettingsEffects', () => { ...@@ -29,6 +33,10 @@ describe('UserSettingsEffects', () => {
{ {
provide: UserSettingsRepository, provide: UserSettingsRepository,
useValue: userSettingsRepository useValue: userSettingsRepository
},
{
provide: UserSettingsFacade,
useValue: userSettingsFacade
} }
], ],
}); });
...@@ -55,6 +63,8 @@ describe('UserSettingsEffects', () => { ...@@ -55,6 +63,8 @@ describe('UserSettingsEffects', () => {
actions = hot('-a', { a: action }); actions = hot('-a', { a: action });
const expected = cold('-b', { b: UserSettingsActions.loadUserSettingsSuccess({ userSettings }) }); const expected = cold('-b', { b: UserSettingsActions.loadUserSettingsSuccess({ userSettings }) });
expect(effects.loadUserSettings$).toBeObservable(expected);
}) })
it('should dispatch error action', () => { it('should dispatch error action', () => {
...@@ -68,21 +78,23 @@ describe('UserSettingsEffects', () => { ...@@ -68,21 +78,23 @@ describe('UserSettingsEffects', () => {
const userSettings = createUserSettings(); const userSettings = createUserSettings();
const action = UserSettingsActions.setUserSettings({ userSettings }); const action = UserSettingsActions.setUserSettings({ userSettings });
beforeEach(() => {
userSettingsFacade.getUserSettings.mockReturnValue(of(createStateResource(userSettingsResource)));
userSettingsRepository.setUserSettings.mockReturnValue(of(userSettingsResource));
})
it('should call repository', () => { it('should call repository', () => {
actions = of(action); actions = of(action);
effects.setUserSettings$.subscribe(); effects.setUserSettings$.subscribe();
expect(userSettingsRepository.setUserSettings).toHaveBeenCalledWith(userSettings); expect(userSettingsRepository.setUserSettings).toHaveBeenCalledWith(userSettingsResource, userSettings);
}) })
it('should dispatch success action', () => { it('should dispatch success action', () => {
userSettingsRepository.setUserSettings.mockReturnValue(of(userSettingsResource)); actions = hot('-a-|', { a: action });
actions = hot('-a', { a: action });
const expected = cold('-b', { b: UserSettingsActions.setUserSettingsSuccess({ userSettings: userSettingsResource })});
const expected = cold('-a-|', { a: UserSettingsActions.setUserSettingsSuccess({ userSettings: userSettingsResource })});
expect(effects.setUserSettings$).toBeObservable(expected); expect(effects.setUserSettings$).toBeObservable(expected);
}) })
......
import { Injectable } from '@angular/core'; 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 { map, switchMap } from 'rxjs/operators';
import { UserSettingsRepository } from '../user-settings.repository'; import { UserSettingsRepository } from '../user-settings.repository';
import * as UserSettingsActions from './user-settings.actions'; import * as UserSettingsActions from './user-settings.actions';
import { UserSettingsFacade } from './user-settings.facade';
@Injectable() @Injectable()
export class UserSettingsEffects { 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(() => loadUserSettings$ = createEffect(() =>
this.actions$.pipe( this.actions$.pipe(
...@@ -22,7 +23,8 @@ export class UserSettingsEffects { ...@@ -22,7 +23,8 @@ export class UserSettingsEffects {
setUserSettings$ = createEffect(() => setUserSettings$ = createEffect(() =>
this.actions$.pipe( this.actions$.pipe(
ofType(UserSettingsActions.setUserSettings), 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 })) map(userSettings => UserSettingsActions.setUserSettingsSuccess({ userSettings }))
)) ))
) )
......
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));
}) })
it('set settings of current user', () => { 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('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
...@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; ...@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
import { UserProfileLinkRel, UserProfileResource } from '@goofy-client/user-profile-shared'; import { UserProfileLinkRel, UserProfileResource } from '@goofy-client/user-profile-shared';
import { ResourceFactory } from '@ngxp/rest'; import { ResourceFactory } from '@ngxp/rest';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { UserSettingsLinkRel } from './user-settings.linkrel';
import { UserSettings, UserSettingsResource } from './user-settings.model'; import { UserSettings, UserSettingsResource } from './user-settings.model';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
...@@ -13,7 +14,7 @@ export class UserSettingsRepository { ...@@ -13,7 +14,7 @@ export class UserSettingsRepository {
return this.resourceFactory.from(userProfileResource).get(UserProfileLinkRel.SETTINGS); return this.resourceFactory.from(userProfileResource).get(UserProfileLinkRel.SETTINGS);
} }
public setUserSettings(userSettings: UserSettings): Observable<UserSettingsResource> { public setUserSettings(userSettingsResource: UserSettingsResource, userSettings: UserSettings): Observable<UserSettingsResource> {
return null; return this.resourceFactory.from(userSettingsResource).patch(UserSettingsLinkRel.EDIT, userSettings);
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment