Skip to content

Commit 207c0a3

Browse files
committed
add resource dao, update resource test kit
1 parent 02cf5df commit 207c0a3

File tree

4 files changed

+123
-63
lines changed

4 files changed

+123
-63
lines changed

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ ThisBuild / organization := "app.softnetwork"
22

33
name := "resource"
44

5-
ThisBuild / version := "0.8.0"
5+
ThisBuild / version := "0.8.1"
66

77
ThisBuild / scalaVersion := "2.12.18"
88

core/src/main/scala/app/softnetwork/resource/handlers/ResourceHandler.scala

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package app.softnetwork.resource.handlers
22

3+
import akka.actor.typed.ActorSystem
34
import akka.cluster.sharding.typed.scaladsl.EntityTypeKey
45
import app.softnetwork.persistence.typed.scaladsl.EntityPattern
56
import app.softnetwork.resource.message.ResourceMessages._
67
import app.softnetwork.resource.persistence.typed.ResourceBehavior
78
import app.softnetwork.persistence.typed.CommandTypeKey
9+
import org.slf4j.{Logger, LoggerFactory}
810

11+
import scala.concurrent.Future
912
import scala.language.implicitConversions
1013
import scala.reflect.ClassTag
1114

@@ -21,3 +24,41 @@ trait GenericResourceHandler extends EntityPattern[ResourceCommand, ResourceResu
2124
}
2225

2326
trait ResourceHandler extends GenericResourceHandler with ResourceTypeKey
27+
28+
trait ResourceDao extends ResourceHandler {
29+
def createResource(entityId: String, bytes: Array[Byte], uri: Option[String])(implicit
30+
system: ActorSystem[_]
31+
): Future[ResourceResult] = {
32+
?(
33+
entityId,
34+
CreateResource(entityId, bytes, uri)
35+
)
36+
}
37+
38+
def updateResource(entityId: String, bytes: Array[Byte], uri: Option[String])(implicit
39+
system: ActorSystem[_]
40+
): Future[ResourceResult] = {
41+
?(
42+
entityId,
43+
UpdateResource(entityId, bytes, uri)
44+
)
45+
}
46+
47+
def deleteResource(entityId: String)(implicit system: ActorSystem[_]): Future[ResourceResult] = {
48+
?(
49+
entityId,
50+
DeleteResource(entityId)
51+
)
52+
}
53+
54+
def loadResource(entityId: String)(implicit system: ActorSystem[_]): Future[ResourceResult] = {
55+
?(
56+
entityId,
57+
LoadResource(entityId)
58+
)
59+
}
60+
}
61+
62+
object ResourceDao extends ResourceDao {
63+
lazy val log: Logger = LoggerFactory.getLogger(getClass.getName)
64+
}

testkit/src/main/scala/app/softnetwork/resource/scalatest/ResourceTestKit.scala

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,22 @@
11
package app.softnetwork.resource.scalatest
22

3+
import akka.actor.typed.ActorSystem
34
import app.softnetwork.persistence.scalatest.InMemoryPersistenceTestKit
45
import app.softnetwork.resource.config.ResourceSettings
6+
import app.softnetwork.resource.handlers.ResourceDao
57
import app.softnetwork.resource.launch.ResourceGuardian
8+
import app.softnetwork.resource.message.ResourceEvents.{
9+
ResourceCreatedEvent,
10+
ResourceDeletedEvent,
11+
ResourceEvent,
12+
ResourceUpdatedEvent
13+
}
14+
import app.softnetwork.resource.message.ResourceMessages.{
15+
ResourceCreated,
16+
ResourceDeleted,
17+
ResourceLoaded,
18+
ResourceUpdated
19+
}
620
import app.softnetwork.resource.model.Resource.ProviderType
721
import app.softnetwork.resource.model.GenericResource
822
import app.softnetwork.resource.spi.{ResourceProvider, ResourceProviders}
@@ -20,5 +34,46 @@ trait ResourceTestKit[Resource <: GenericResource]
2034

2135
def providerType: ProviderType
2236

23-
lazy val provider: ResourceProvider = ResourceProviders.provider(providerType)
37+
lazy val resourceProvider: ResourceProvider = ResourceProviders.provider(providerType)
38+
39+
def resourceDao: ResourceDao = ResourceDao
40+
41+
def createResource(entityId: String, bytes: Array[Byte], uri: Option[String])(implicit
42+
system: ActorSystem[_]
43+
): ResourceCreatedEvent = {
44+
val probe = createTestProbe[ResourceEvent]()
45+
subscribeProbe(probe)
46+
resourceDao.createResource(entityId, bytes, uri) await {
47+
case ResourceCreated => probe.expectMessageType[ResourceCreatedEvent]
48+
case _ => fail(s"Resource $entityId not created")
49+
}
50+
}
51+
52+
def updateResource(entityId: String, bytes: Array[Byte], uri: Option[String])(implicit
53+
system: ActorSystem[_]
54+
): ResourceUpdatedEvent = {
55+
val probe = createTestProbe[ResourceEvent]()
56+
subscribeProbe(probe)
57+
resourceDao.updateResource(entityId, bytes, uri) await {
58+
case ResourceUpdated => probe.expectMessageType[ResourceUpdatedEvent]
59+
case _ => fail(s"Resource $entityId not updated")
60+
}
61+
}
62+
63+
def deleteResource(entityId: String)(implicit system: ActorSystem[_]): ResourceDeletedEvent = {
64+
val probe = createTestProbe[ResourceEvent]()
65+
subscribeProbe(probe)
66+
resourceDao.deleteResource(entityId) await {
67+
case ResourceDeleted => probe.expectMessageType[ResourceDeletedEvent]
68+
case _ => fail(s"Resource $entityId not deleted")
69+
}
70+
}
71+
72+
def loadResource(entityId: String)(implicit system: ActorSystem[_]): Resource = {
73+
resourceDao.loadResource(entityId) await {
74+
case r: ResourceLoaded => r.resource.asInstanceOf[Resource]
75+
case _ => fail(s"Resource $entityId not found")
76+
}
77+
}
78+
2479
}

testkit/src/test/scala/app/softnetwork/resource/handlers/ResourceHandlerSpec.scala

Lines changed: 25 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package app.softnetwork.resource.handlers
33
import akka.actor.typed.ActorSystem
44

55
import java.io.{ByteArrayInputStream, File}
6-
import app.softnetwork.resource.message.ResourceMessages._
76
import org.scalatest.wordspec.AnyWordSpecLike
87
import app.softnetwork.utils.HashTools
98
import app.softnetwork.resource.config.ResourceSettings.{BaseUrl, ImageSizes, ResourcePath}
@@ -16,7 +15,6 @@ import org.slf4j.{Logger, LoggerFactory}
1615
import org.softnetwork.session.model.Session
1716

1817
import java.nio.file.{Files, Paths}
19-
import scala.concurrent.Future
2018
import scala.reflect.io.Directory
2119

2220
/** Created by smanciot on 27/04/2020.
@@ -49,75 +47,44 @@ class ResourceHandlerSpec
4947
new ByteArrayInputStream(bytes)
5048
)
5149
.getOrElse("")
52-
val dir = new Directory(new File(provider.rootDir))
50+
val dir = new Directory(new File(resourceProvider.rootDir))
5351
dir.deleteRecursively()
5452
}
5553

5654
"Resource handler" must {
5755

5856
"create resource" in {
59-
val probe = createTestProbe[ResourceEvent]()
60-
subscribeProbe(probe)
61-
createOrUpdateResource("create") await {
62-
case ResourceCreated =>
63-
probe.expectMessageType[ResourceCreatedEvent]
64-
assert(Files.exists(Paths.get(s"${provider.rootDir}${uri.getOrElse("")}/create")))
65-
case _ => fail()
66-
}
57+
createOrUpdateResource("create")
58+
assert(Files.exists(Paths.get(s"${resourceProvider.rootDir}${uri.getOrElse("")}/create")))
6759
}
6860

6961
"update resource" in {
70-
val probe = createTestProbe[ResourceEvent]()
71-
subscribeProbe(probe)
72-
createOrUpdateResource("update", update = true) await {
73-
case ResourceUpdated =>
74-
probe.expectMessageType[ResourceUpdatedEvent]
75-
assert(Files.exists(Paths.get(s"${provider.rootDir}${uri.getOrElse("")}/update")))
76-
case _ => fail()
77-
}
62+
createOrUpdateResource("update", update = true)
63+
assert(Files.exists(Paths.get(s"${resourceProvider.rootDir}${uri.getOrElse("")}/update")))
7864
}
7965

8066
"load resource" in {
81-
val probe = createTestProbe[ResourceEvent]()
82-
subscribeProbe(probe)
83-
createOrUpdateResource("load") await {
84-
case ResourceCreated =>
85-
probe.expectMessageType[ResourceCreatedEvent]
86-
assert(Files.exists(Paths.get(s"${provider.rootDir}${uri.getOrElse("")}/load")))
87-
?("load", LoadResource("load")) await {
88-
case r: ResourceLoaded =>
89-
r.resource.md5 shouldBe md5
90-
for (size <- ImageSizes.values) {
91-
provider.loadResource("load", uri, None, Seq(SizeOption(size)): _*) match {
92-
case Some(_) =>
93-
case _ => fail()
94-
}
95-
}
96-
case other => fail(other)
97-
}
98-
case other => fail(other)
67+
createOrUpdateResource("load")
68+
assert(Files.exists(Paths.get(s"${resourceProvider.rootDir}${uri.getOrElse("")}/load")))
69+
val resource = loadResource("load")
70+
resource.md5 shouldBe md5
71+
for (size <- ImageSizes.values) {
72+
resourceProvider.loadResource("load", uri, None, Seq(SizeOption(size)): _*) match {
73+
case Some(_) =>
74+
case _ => fail()
75+
}
9976
}
10077
}
10178

10279
"delete resource" in {
103-
val probe = createTestProbe[ResourceEvent]()
104-
subscribeProbe(probe)
105-
createOrUpdateResource("delete") await {
106-
case ResourceCreated =>
107-
probe.expectMessageType[ResourceCreatedEvent]
108-
assert(Files.exists(Paths.get(s"${provider.rootDir}${uri.getOrElse("")}/delete")))
109-
?("delete", DeleteResource("delete")) await {
110-
case ResourceDeleted =>
111-
probe.expectMessageType[ResourceDeletedEvent]
112-
assert(!Files.exists(Paths.get(s"${provider.rootDir}${uri.getOrElse("")}/delete")))
113-
case _ => fail()
114-
}
115-
case _ => fail()
116-
}
80+
createOrUpdateResource("delete")
81+
assert(Files.exists(Paths.get(s"${resourceProvider.rootDir}${uri.getOrElse("")}/delete")))
82+
deleteResource("delete")
83+
assert(!Files.exists(Paths.get(s"${resourceProvider.rootDir}${uri.getOrElse("")}/delete")))
11784
}
11885

11986
"list resources" in {
120-
val resources = provider.listResources(uri.getOrElse("/"))
87+
val resources = resourceProvider.listResources(uri.getOrElse("/"))
12188
assert(resources.nonEmpty)
12289
assert(resources.forall(!_.directory))
12390
val files = resources.map(_.name)
@@ -143,14 +110,11 @@ class ResourceHandlerSpec
143110
private[this] def createOrUpdateResource(
144111
entityId: String,
145112
update: Boolean = false
146-
): Future[ResourceResult] = {
147-
?(
148-
entityId,
149-
if (update) {
150-
UpdateResource(entityId, bytes, uri)
151-
} else {
152-
CreateResource(entityId, bytes, uri)
153-
}
154-
)
113+
): ResourceEvent = {
114+
if (update) {
115+
updateResource(entityId, bytes, uri)
116+
} else {
117+
createResource(entityId, bytes, uri)
118+
}
155119
}
156120
}

0 commit comments

Comments
 (0)