Newer
Older
support / mongo / it / src / MongoJsonRepositoryIntegrationSpec.scala
package works.iterative.mongo

import zio.*
import zio.test.*
import zio.json.*
import Assertion.*

object MongoJsonRepositoryIntegrationSpec extends DefaultRunnableSpec:
  case class Example(id: String, value: String)
  sealed trait ExampleCriteria
  case object All extends ExampleCriteria
  case class ById(id: String) extends ExampleCriteria

  given JsonCodec[Example] = DeriveJsonCodec.gen

  override def spec = suite("Mongo repository integration spec")(
    test("repo can put and read back")(
      for
        repo <- ZIO
          .service[MongoJsonRepository[Example, String, ExampleCriteria]]
        _ <- repo.put(Example("1", "test"))
        result <- repo.matching(ById("1"))
      yield assertTrue(result.head.value == "test")
    )
  ).provideCustomLayer(layer.mapError(TestFailure.fail))

  val layer =
    import org.mongodb.scala.*
    import org.mongodb.scala.model.Filters.*
    import org.bson.json.JsonObject
    import org.mongodb.scala.bson.conversions.Bson
    import org.mongodb.scala.bson.Document
    MongoConfig.fromEnv >>> MongoClient.layer >>> (for
      client <- ZIO.service[MongoClient]
      coll <- Task.attempt(
        client.getDatabase("test").getCollection[JsonObject]("example")
      )
    yield new MongoJsonRepository[Example, String, ExampleCriteria](
      coll, {
        _ match
          case ById(id) => equal("id", id)
          case All      => Document()
      },
      e => ("id", e.id)
    )).toLayer