1
+ package kickstart.security
2
+
3
+ import com.natpryce.hamkrest.assertion.assertThat
4
+ import com.natpryce.hamkrest.present
5
+ import kickstart.AbstractDatabaseTest
6
+ import org.junit.jupiter.api.BeforeEach
7
+ import org.junit.jupiter.api.Test
8
+ import org.junit.jupiter.api.assertThrows
9
+ import security.UserBuilder
10
+ import security.UserThat.hasSameStateAs
11
+ import security.UserThat.hasUsername
12
+ import security.Users
13
+ import security.user
14
+ import java.sql.SQLException
15
+
16
+ class UsersDatabaseTest : AbstractDatabaseTest () {
17
+
18
+ val db = UsersDatabase (executor)
19
+
20
+ @BeforeEach
21
+ fun cleanDatabase () {
22
+ clean(Users )
23
+ }
24
+
25
+ @Test
26
+ fun `round trips users` () {
27
+ val samples = listOf (
28
+ user { username = " dany@persuaders.com" ; password = " american" },
29
+ user { username = " brett@persuaders.com" ; password = " british" }
30
+ )
31
+
32
+ samples.forEach { assertCanBePersisted(it) }
33
+ }
34
+
35
+ @Test
36
+ fun `finds user by username` () {
37
+ persist(
38
+ user { username = " dany@persuaders.com" },
39
+ user { username = " brett@persuaders.com" },
40
+ user { username = " remington.steel@gmail.com" }
41
+ )
42
+ val match = db.findBy(Username (" brett@persuaders.com" ))
43
+
44
+ assertThat(" found" , match, present(hasUsername(" brett@persuaders.com" )))
45
+ }
46
+
47
+ @Test
48
+ fun `refuses to add account if username is already taken` () {
49
+ persist(user { username = " remington.steel@gmail.com" })
50
+
51
+ assertThrows<SQLException > { db.add(user { username = " remington.steel@gmail.com" }.build()) }
52
+ }
53
+
54
+ private fun assertCanBePersisted (user : UserBuilder ) {
55
+ assertReloadsWithSameState(persisted(user))
56
+ }
57
+
58
+ private fun assertReloadsWithSameState (original : User ) {
59
+ val persisted: User ? = db.findBy(original.username)
60
+ assertThat(" persisted entity" , persisted, present(hasSameStateAs(original)))
61
+ }
62
+
63
+ private fun persist (vararg users : UserBuilder ) {
64
+ users.forEach { persisted(it) }
65
+ }
66
+
67
+ private fun persisted (user : UserBuilder ): User {
68
+ return transaction {
69
+ user.build().also { db.add(it) }
70
+ }
71
+ }
72
+ }
0 commit comments