1
+ package com .softwaremill .codebrag .usecases .user
2
+
3
+ import org .scalatest .{BeforeAndAfter , FlatSpec }
4
+ import org .scalatest .matchers .ShouldMatchers
5
+ import org .scalatest .mock .MockitoSugar
6
+ import com .softwaremill .codebrag .dao .user .UserDAO
7
+ import org .mockito .Matchers ._
8
+ import org .mockito .Mockito ._
9
+ import com .softwaremill .codebrag .domain .builder .UserAssembler
10
+ import com .softwaremill .codebrag .domain .{Authentication , User }
11
+ import com .softwaremill .codebrag .usecases .assertions .{ActiveUserStatusRequiredException , AdminRoleRequiredException }
12
+ import org .bson .types .ObjectId
13
+
14
+ class DeleteUserUseCaseSpec extends FlatSpec with ShouldMatchers with BeforeAndAfter with MockitoSugar {
15
+
16
+ val userDao = mock[UserDAO ]
17
+ val useCase = new DeleteUserUseCase (userDao)
18
+
19
+ val InactiveUser = UserAssembler .randomUser.withActive(set = false ).get
20
+ val ActiveUser = UserAssembler .randomUser.withActive().get
21
+
22
+ val ValidExecutor = UserAssembler .randomUser.withAdmin().withActive().get
23
+ val NonAdminExecutor = UserAssembler .randomUser.withActive().withAdmin(set = false ).get
24
+ val InactiveExecutor = UserAssembler .randomUser.withActive(set = false ).withAdmin().get
25
+
26
+ after {
27
+ reset(userDao)
28
+ }
29
+
30
+ it should " not delete user when executing user is neither admin nor active" in {
31
+ // given
32
+ setupReturningUserFromDB(NonAdminExecutor , InactiveExecutor )
33
+ val form = DeleteUserForm (ActiveUser .id)
34
+
35
+ // when
36
+ intercept[AdminRoleRequiredException ] {
37
+ useCase.execute(NonAdminExecutor .id, form)
38
+ }
39
+ intercept[ActiveUserStatusRequiredException ] {
40
+ useCase.execute(InactiveExecutor .id, form)
41
+ }
42
+
43
+ // then
44
+ verify(userDao, never()).delete(any[ObjectId ])
45
+ }
46
+
47
+ it should " not allow to delete yourself" in {
48
+ // given
49
+ setupReturningUserFromDB(ValidExecutor )
50
+
51
+ // when
52
+ val ownChangeForm = DeleteUserForm (ValidExecutor .id)
53
+ val Left (result) = useCase.execute(ValidExecutor .id, ownChangeForm)
54
+
55
+ // then
56
+ result should be(Map (" userId" -> List (" Cannot delete own user" )))
57
+ verify(userDao, never()).delete(any[ObjectId ])
58
+ }
59
+
60
+
61
+ it should " delete user when validation passes" in {
62
+ // given
63
+ stubCurrentlyActiveUsersCountTo(0 )
64
+ setupReturningUserFromDB(ValidExecutor , ActiveUser )
65
+
66
+ // when
67
+ val newAuth = Authentication .basic(ActiveUser .authentication.username, " secret" )
68
+ val form = new DeleteUserForm (ActiveUser .id)
69
+ val result = useCase.execute(ValidExecutor .id, form)
70
+
71
+ // then
72
+ result should be(' right )
73
+ val expectedUser = form
74
+ verify(userDao).delete(expectedUser.userId)
75
+ }
76
+
77
+ private def stubCurrentlyActiveUsersCountTo (activeUsersCount : Int ) {
78
+ when(userDao.countAllActive()).thenReturn(activeUsersCount)
79
+ }
80
+
81
+ private def setupReturningUserFromDB (users : User * ) {
82
+ users.foreach { user =>
83
+ when(userDao.findById(user.id)).thenReturn(Some (user))
84
+ }
85
+ }
86
+
87
+ }
88
+
0 commit comments