1
1
package repository .impl .jdbc
2
2
3
3
import java .util .concurrent .TimeUnit
4
-
5
4
import com .google .inject .Guice
6
5
import config .di .DefaultModule
7
- import domain .entity .User
6
+ import domain .entity .{ User , UserId }
8
7
import fujitask .eff .Fujitask
9
8
import infra .db .Database
10
- import kits .eff .Reader
9
+ import kits .eff .{ Exc , Opt , Reader }
11
10
import org .scalatest .{DiagrammedAssertions , FlatSpec }
12
11
import repository .{ReadTransaction , ReadWriteTransaction , UserRepository }
13
-
14
12
import scala .concurrent .ExecutionContext .Implicits .global
15
13
import org .scalatest ._
16
-
17
14
import scala .concurrent .duration .Duration
18
15
import scala .concurrent .{Await , Future }
19
16
import scala .util .Try
@@ -48,16 +45,16 @@ class UserRepositoryImplSpec
48
45
" UserRepository" should " create/read/update/delete a user in ReadWrite transaction successfully" in new SetUp {
49
46
val actual = for {
50
47
user1 <- sut.create(" test" )
51
- user2Opt <- sut.read(user1.id)
48
+ user2Opt <- Opt .run( sut.read(user1.id) )
52
49
_ <- sut.update(user1.copy(name = " changed" ))
53
- user3Opt <- sut.read(user1.id)
50
+ user3Opt <- Opt .run( sut.read(user1.id) )
54
51
_ <- sut.delete(user1.id)
55
- user4Opt <- sut.read(user1.id)
52
+ user4Opt <- Opt .run( sut.read(user1.id) )
56
53
i <- Fujitask .ask[ReadWriteTransaction , ScalikeJDBCWriteTransaction ]
57
54
} yield {
58
- assert(user1 == User (1L , " test" ))
59
- assert(user2Opt.contains(User (1L , " test" )))
60
- assert(user3Opt.contains(User (1L , " changed" )))
55
+ assert(user1 == User (UserId ( 1L ) , " test" ))
56
+ assert(user2Opt.contains(User (UserId ( 1L ) , " test" )))
57
+ assert(user3Opt.contains(User (UserId ( 1L ) , " changed" )))
61
58
assert(user4Opt.isEmpty)
62
59
assert(i.isInstanceOf [ScalikeJDBCWriteTransaction ])
63
60
}
@@ -67,7 +64,7 @@ class UserRepositoryImplSpec
67
64
68
65
it should " read a user in Read only transaction successfully" in new SetUp {
69
66
val actual = for {
70
- _ <- sut.read(1L )
67
+ _ <- Opt .run( sut.read(UserId ( 1L )) )
71
68
i <- Fujitask .ask[ReadTransaction , ScalikeJDBCReadTransaction ]
72
69
} yield {
73
70
assert(i.isInstanceOf [ScalikeJDBCReadTransaction ])
@@ -101,4 +98,34 @@ class UserRepositoryImplSpec
101
98
assert(Try (values(Fujitask .run(actual))).isFailure)
102
99
assert(Database .isEmpty)
103
100
}
101
+
102
+ it should " rollback if Either.Left and using `runWithEither`" in new SetUp {
103
+ assert(Database .isEmpty)
104
+
105
+ val eff = for {
106
+ _ <- sut.create(" test" )
107
+ _ <- Exc .raise(new RuntimeException ())
108
+ } yield ()
109
+
110
+ val actual = Try (values(Fujitask .runWithEither(eff)))
111
+
112
+ assert(actual.isSuccess)
113
+ assert(actual.get.isLeft)
114
+ assert(Database .isEmpty)
115
+ }
116
+
117
+ it should " NOT rollback if Either.Left but using `run`" in new SetUp {
118
+ assert(Database .isEmpty)
119
+
120
+ val eff = for {
121
+ _ <- sut.create(" test" )
122
+ _ <- Exc .raise(new RuntimeException ())
123
+ } yield ()
124
+
125
+ val actual = Try (values(Fujitask .run(Exc .run(eff))))
126
+
127
+ assert(actual.isSuccess)
128
+ assert(actual.get.isLeft)
129
+ assert(! Database .isEmpty)
130
+ }
104
131
}
0 commit comments