mirror of https://github.com/Squidex/squidex.git
27 changed files with 660 additions and 312 deletions
@ -0,0 +1,37 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
||||
|
*/ |
||||
|
|
||||
|
import { Observable } from 'rxjs'; |
||||
|
import { IMock, Mock, Times } from 'typemoq'; |
||||
|
|
||||
|
import { UsersState } from './../state/users.state'; |
||||
|
import { UnsetUserGuard } from './unset-user.guard'; |
||||
|
|
||||
|
describe('UnsetUserGuard', () => { |
||||
|
let usersState: IMock<UsersState>; |
||||
|
let userGuard: UnsetUserGuard; |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
usersState = Mock.ofType<UsersState>(); |
||||
|
userGuard = new UnsetUserGuard(usersState.object); |
||||
|
}); |
||||
|
|
||||
|
it('should unset user', () => { |
||||
|
usersState.setup(x => x.selectUser(null)) |
||||
|
.returns(() => Observable.of(null)); |
||||
|
|
||||
|
let result: boolean; |
||||
|
|
||||
|
userGuard.canActivate().subscribe(x => { |
||||
|
result = x; |
||||
|
}).unsubscribe(); |
||||
|
|
||||
|
expect(result!).toBeTruthy(); |
||||
|
|
||||
|
usersState.verify(x => x.selectUser(null), Times.once()); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,72 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
||||
|
*/ |
||||
|
|
||||
|
import { Router } from '@angular/router'; |
||||
|
import { Observable } from 'rxjs'; |
||||
|
import { IMock, Mock, Times } from 'typemoq'; |
||||
|
|
||||
|
import { UserDto } from './../services/users.service'; |
||||
|
import { UsersState } from './../state/users.state'; |
||||
|
import { UserMustExistGuard } from './user-must-exist.guard'; |
||||
|
|
||||
|
describe('UserMustExistGuard', () => { |
||||
|
let usersState: IMock<UsersState>; |
||||
|
let router: IMock<Router>; |
||||
|
let userGuard: UserMustExistGuard; |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
router = Mock.ofType<Router>(); |
||||
|
usersState = Mock.ofType<UsersState>(); |
||||
|
userGuard = new UserMustExistGuard(usersState.object, router.object); |
||||
|
}); |
||||
|
|
||||
|
it('should load user and return true when found', () => { |
||||
|
usersState.setup(x => x.selectUser('123')) |
||||
|
.returns(() => Observable.of(<UserDto>{})); |
||||
|
|
||||
|
let result: boolean; |
||||
|
|
||||
|
const route: any = { |
||||
|
snapshot: { |
||||
|
params: { |
||||
|
userId: '123' |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
userGuard.canActivate(route).subscribe(x => { |
||||
|
result = x; |
||||
|
}).unsubscribe(); |
||||
|
|
||||
|
expect(result!).toBeTruthy(); |
||||
|
|
||||
|
usersState.verify(x => x.selectUser('123'), Times.once()); |
||||
|
}); |
||||
|
|
||||
|
it('should load user and return false when not found', () => { |
||||
|
usersState.setup(x => x.selectUser('123')) |
||||
|
.returns(() => Observable.of(null)); |
||||
|
|
||||
|
let result: boolean; |
||||
|
|
||||
|
const route: any = { |
||||
|
snapshot: { |
||||
|
params: { |
||||
|
userId: '123' |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
userGuard.canActivate(route).subscribe(x => { |
||||
|
result = x; |
||||
|
}).unsubscribe(); |
||||
|
|
||||
|
expect(result!).toBeFalsy(); |
||||
|
|
||||
|
router.verify(x => x.navigate(['/404']), Times.once()); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,236 @@ |
|||||
|
/* |
||||
|
* Squidex Headless CMS |
||||
|
* |
||||
|
* @license |
||||
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
||||
|
*/ |
||||
|
|
||||
|
import { Observable } from 'rxjs'; |
||||
|
import { IMock, It, Mock, Times } from 'typemoq'; |
||||
|
|
||||
|
import { AuthService, DialogService } from '@app/shared'; |
||||
|
|
||||
|
import { UsersState } from './users.state'; |
||||
|
|
||||
|
import { |
||||
|
CreateUserDto, |
||||
|
UserDto, |
||||
|
UpdateUserDto, |
||||
|
UsersDto, |
||||
|
UsersService |
||||
|
} from './../services/users.service'; |
||||
|
|
||||
|
describe('UsersState', () => { |
||||
|
const oldUsers = [ |
||||
|
new UserDto('id1', 'mail1@mail.de', 'name1', false), |
||||
|
new UserDto('id2', 'mail2@mail.de', 'name2', true) |
||||
|
]; |
||||
|
|
||||
|
const newUser = new UserDto('id3', 'mail3@mail.de', 'name3', false); |
||||
|
|
||||
|
let authService: IMock<AuthService>; |
||||
|
let dialogService: IMock<DialogService>; |
||||
|
let usersService: IMock<UsersService>; |
||||
|
let usersState: UsersState; |
||||
|
|
||||
|
beforeEach(() => { |
||||
|
authService = Mock.ofType<AuthService>(); |
||||
|
|
||||
|
authService.setup(x => x.user) |
||||
|
.returns(() => <any>{ id: 'id2' }); |
||||
|
|
||||
|
dialogService = Mock.ofType<DialogService>(); |
||||
|
|
||||
|
usersService = Mock.ofType<UsersService>(); |
||||
|
|
||||
|
usersService.setup(x => x.getUsers(10, 0, undefined)) |
||||
|
.returns(() => Observable.of(new UsersDto(200, oldUsers))); |
||||
|
|
||||
|
usersState = new UsersState(authService.object, dialogService.object, usersService.object); |
||||
|
usersState.loadUsers().subscribe(); |
||||
|
}); |
||||
|
|
||||
|
it('should load apps', () => { |
||||
|
expect(usersState.snapshot.users.values).toEqual(oldUsers); |
||||
|
expect(usersState.snapshot.usersPager.numberOfItems).toEqual(200); |
||||
|
|
||||
|
usersService.verifyAll(); |
||||
|
}); |
||||
|
|
||||
|
it('should raise notification on load when notify is true', () => { |
||||
|
usersState.loadUsers(true).subscribe(); |
||||
|
|
||||
|
dialogService.verify(x => x.notifyInfo(It.isAnyString()), Times.once()); |
||||
|
}); |
||||
|
|
||||
|
it('should not load user when already loaded', () => { |
||||
|
let selectedUser: UserDto; |
||||
|
|
||||
|
usersState.selectUser('id1').subscribe(x => { |
||||
|
selectedUser = x!; |
||||
|
}); |
||||
|
|
||||
|
expect(selectedUser!).toEqual(oldUsers[0]); |
||||
|
expect(usersState.snapshot.selectedUser).toBe(oldUsers[0]); |
||||
|
|
||||
|
usersService.verify(x => x.getUser(It.isAnyString()), Times.never()); |
||||
|
}); |
||||
|
|
||||
|
it('should mark as current user when selected user equals to profile', () => { |
||||
|
usersState.selectUser('id2').subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.isCurrentUser).toBeTruthy(); |
||||
|
}); |
||||
|
|
||||
|
it('should load user when not loaded', () => { |
||||
|
usersService.setup(x => x.getUser('id3')) |
||||
|
.returns(() => Observable.of(newUser)); |
||||
|
|
||||
|
let selectedUser: UserDto; |
||||
|
|
||||
|
usersState.selectUser('id3').subscribe(x => { |
||||
|
selectedUser = x!; |
||||
|
}); |
||||
|
|
||||
|
expect(selectedUser!).toEqual(newUser); |
||||
|
expect(usersState.snapshot.selectedUser).toBe(newUser); |
||||
|
}); |
||||
|
|
||||
|
it('should return null when unselecting user', () => { |
||||
|
let selectedUser: UserDto; |
||||
|
|
||||
|
usersState.selectUser(null).subscribe(x => { |
||||
|
selectedUser = x!; |
||||
|
}); |
||||
|
|
||||
|
expect(selectedUser!).toBeNull(); |
||||
|
expect(usersState.snapshot.selectedUser).toBeNull(); |
||||
|
|
||||
|
usersService.verify(x => x.getUser(It.isAnyString()), Times.never()); |
||||
|
}); |
||||
|
|
||||
|
it('should return null when user to select is not found', () => { |
||||
|
usersService.setup(x => x.getUser('unknown')) |
||||
|
.returns(() => Observable.throw({})); |
||||
|
|
||||
|
let selectedUser: UserDto; |
||||
|
|
||||
|
usersState.selectUser('unknown').subscribe(x => { |
||||
|
selectedUser = x!; |
||||
|
}).unsubscribe(); |
||||
|
|
||||
|
expect(selectedUser!).toBeNull(); |
||||
|
expect(usersState.snapshot.selectedUser).toBeNull(); |
||||
|
}); |
||||
|
|
||||
|
it('should mark user as locked', () => { |
||||
|
usersService.setup(x => x.lockUser('id1')) |
||||
|
.returns(() => Observable.of({})); |
||||
|
|
||||
|
usersState.selectUser('id1').subscribe(); |
||||
|
usersState.lockUser(oldUsers[0]).subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.users.at(0).isLocked).toBeTruthy(); |
||||
|
expect(usersState.snapshot.selectedUser!.isLocked).toBeTruthy(); |
||||
|
}); |
||||
|
|
||||
|
it('should raise notification when locking failed', () => { |
||||
|
usersService.setup(x => x.lockUser('id1')) |
||||
|
.returns(() => Observable.throw({})); |
||||
|
|
||||
|
usersState.lockUser(oldUsers[0]).onErrorResumeNext().subscribe(); |
||||
|
|
||||
|
dialogService.verify(x => x.notifyError(It.isAny()), Times.once()); |
||||
|
}); |
||||
|
|
||||
|
it('should unmark user as locked', () => { |
||||
|
usersService.setup(x => x.unlockUser('id2')) |
||||
|
.returns(() => Observable.of({})); |
||||
|
|
||||
|
usersState.selectUser('id2').subscribe(); |
||||
|
usersState.unlockUser(oldUsers[1]).subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.users.at(1).isLocked).toBeFalsy(); |
||||
|
expect(usersState.snapshot.selectedUser!.isLocked).toBeFalsy(); |
||||
|
}); |
||||
|
|
||||
|
it('should raise notification when unlocking failed', () => { |
||||
|
usersService.setup(x => x.unlockUser('id2')) |
||||
|
.returns(() => Observable.throw({})); |
||||
|
|
||||
|
usersState.unlockUser(oldUsers[1]).onErrorResumeNext().subscribe(); |
||||
|
|
||||
|
dialogService.verify(x => x.notifyError(It.isAny()), Times.once()); |
||||
|
}); |
||||
|
|
||||
|
it('should update user on update', () => { |
||||
|
const request = new UpdateUserDto('new@mail.com', 'New'); |
||||
|
|
||||
|
usersService.setup(x => x.putUser('id1', request)) |
||||
|
.returns(() => Observable.of({})); |
||||
|
|
||||
|
usersState.selectUser('id1').subscribe(); |
||||
|
usersState.updateUser(oldUsers[0], request).subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.users.at(0).email).toEqual('new@mail.com'); |
||||
|
expect(usersState.snapshot.users.at(0).displayName).toEqual('New'); |
||||
|
expect(usersState.snapshot.selectedUser!.email).toEqual('new@mail.com'); |
||||
|
expect(usersState.snapshot.selectedUser!.displayName).toEqual('New'); |
||||
|
}); |
||||
|
|
||||
|
it('should not raise notification when updating failed', () => { |
||||
|
const request = new UpdateUserDto('new@mail.com', 'New'); |
||||
|
|
||||
|
usersService.setup(x => x.putUser('id1', request)) |
||||
|
.returns(() => Observable.throw({})); |
||||
|
|
||||
|
usersState.updateUser(oldUsers[0], request).onErrorResumeNext().subscribe(); |
||||
|
|
||||
|
dialogService.verify(x => x.notifyError(It.isAny()), Times.never()); |
||||
|
}); |
||||
|
|
||||
|
it('should add user to state when created', () => { |
||||
|
const request = new CreateUserDto(newUser.email, newUser.displayName, 'password'); |
||||
|
|
||||
|
usersService.setup(x => x.postUser(request)) |
||||
|
.returns(() => Observable.of(newUser)); |
||||
|
|
||||
|
usersState.createUser(request).subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.users.at(0)).toBe(newUser); |
||||
|
expect(usersState.snapshot.usersPager.numberOfItems).toBe(201); |
||||
|
}); |
||||
|
|
||||
|
it('should not raise notification when creating failed', () => { |
||||
|
const request = new CreateUserDto(newUser.email, newUser.displayName, 'password'); |
||||
|
|
||||
|
usersService.setup(x => x.postUser(request)) |
||||
|
.returns(() => Observable.throw({})); |
||||
|
|
||||
|
usersState.createUser(request).onErrorResumeNext().subscribe(); |
||||
|
|
||||
|
dialogService.verify(x => x.notifyError(It.isAny()), Times.never()); |
||||
|
}); |
||||
|
|
||||
|
it('should load next page and prev page when paging', () => { |
||||
|
usersService.setup(x => x.getUsers(10, 10, undefined)) |
||||
|
.returns(() => Observable.of(new UsersDto(200, []))); |
||||
|
|
||||
|
usersState.goNext().subscribe(); |
||||
|
usersState.goPrev().subscribe(); |
||||
|
|
||||
|
usersService.verify(x => x.getUsers(10, 10, undefined), Times.once()); |
||||
|
usersService.verify(x => x.getUsers(10, 0, undefined), Times.exactly(2)); |
||||
|
}); |
||||
|
|
||||
|
it('should load with query when searching', () => { |
||||
|
usersService.setup(x => x.getUsers(10, 0, 'my-query')) |
||||
|
.returns(() => Observable.of(new UsersDto(0, []))); |
||||
|
|
||||
|
usersState.search('my-query').subscribe(); |
||||
|
|
||||
|
expect(usersState.snapshot.usersQuery).toEqual('my-query'); |
||||
|
|
||||
|
usersService.verify(x => x.getUsers(10, 0, 'my-query'), Times.once()); |
||||
|
}); |
||||
|
}); |
||||
Loading…
Reference in new issue