diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5489f5d..ebb8659 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,7 +31,7 @@ jobs: fail-fast: false matrix: java: ['adopt@1.8', 'adopt@1.11'] - scala: ['2.12.16', '2.13.10', '3.2.1'] + scala: ['2.12.18', '2.13.11', '3.3.0'] steps: - name: Checkout current branch uses: actions/checkout@v2.3.4 diff --git a/build.sbt b/build.sbt index 15e4d0c..5a972fd 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,7 @@ -val mainScala = "2.13.10" -val allScala = Seq("3.2.1", "2.13.10", "2.12.16") -val zioVersion = "2.0.0" -val zioAwsVersion = "5.17.224.4" +val mainScala = "2.13.11" +val allScala = Seq("3.3.0", "2.13.11", "2.12.18") +val zioVersion = "2.0.15" +val zioAwsVersion = "6.20.83.2" inThisBuild( List( @@ -34,6 +34,7 @@ publishTo := sonatypePublishToBundle.value addCommandAlias("fmt", "all scalafmtSbt scalafmt test:scalafmt") addCommandAlias("check", "all scalafmtSbtCheck scalafmtCheck test:scalafmtCheck") +addCommandAlias("validate", "check" + allScala.map(v => s"++${v}! test").mkString(";", ";", "")) lazy val root = project .in(file(".")) diff --git a/zio-sqs/src/test/scala/zio/sqs/Util.scala b/zio-sqs/src/test/scala/zio/sqs/Util.scala deleted file mode 100644 index c108eda..0000000 --- a/zio-sqs/src/test/scala/zio/sqs/Util.scala +++ /dev/null @@ -1,10 +0,0 @@ -package zio.sqs - -import zio.Chunk -import zio.test.{ Gen, Sized } - -object Util { - - def chunkOfStringsN(n: Int): Gen[Sized, Chunk[String]] = Gen.chunkOfN(n)(Gen.string(Gen.printableChar)) - -} diff --git a/zio-sqs/src/test/scala/zio/sqs/ZioSqsSpec.scala b/zio-sqs/src/test/scala/zio/sqs/ZioSqsSpec.scala index 790516d..3eb0a22 100644 --- a/zio-sqs/src/test/scala/zio/sqs/ZioSqsSpec.scala +++ b/zio-sqs/src/test/scala/zio/sqs/ZioSqsSpec.scala @@ -3,24 +3,24 @@ package zio.sqs import zio.aws.sqs.Sqs import zio.aws.sqs.model.Message import zio._ -import zio.durationInt import zio.sqs.ZioSqsMockServer._ import zio.sqs.producer.{ Producer, ProducerEvent } import zio.sqs.serialization.Serializer import zio.test.Assertion._ import zio.test._ -import zio.test.{ Live, TestClock, TestEnvironment } +import zio.test.{ Live, TestEnvironment } +import testing._ object ZioSqsSpec extends ZIOSpecDefault { - def spec: Spec[TestEnvironment, Any] = + override def spec = suite("ZioSqsSpec")( test("send messages") { val settings: SqsStreamSettings = SqsStreamSettings(stopWhenQueueEmpty = true) for { messages <- gen.runHead.someOrFailException - list <- ZIO.scoped(serverResource.flatMap(_ => sendAndGet(messages, settings))) + list <- ZIO.scoped(serverResource *> (sendAndGet(messages, settings))) } yield assert(list.map(_.body.getOrElse("")))(equalTo(messages)) }, @@ -31,7 +31,7 @@ object ZioSqsSpec extends ZIOSpecDefault { for { messages <- gen.runHead.someOrFailException list <- ZIO.scoped { - serverResource.flatMap { _ => + serverResource *> { for { messageFromQueue <- sendAndGet(messages, settings) list <- deleteAndGet(messageFromQueue, settings) @@ -47,7 +47,7 @@ object ZioSqsSpec extends ZIOSpecDefault { for { messages <- gen.runHead.someOrFailException list <- ZIO.scoped { - serverResource.flatMap { _ => + serverResource *> { for { _ <- sendAndGet(messages, settings) list <- get(settings) @@ -56,17 +56,14 @@ object ZioSqsSpec extends ZIOSpecDefault { } } yield assert(list)(isEmpty) } - ).provideCustomLayerShared((zio.aws.netty.NettyHttpClient.default >>> zio.aws.core.config.AwsConfig.default >>> clientResource).orDie) + ).provideSomeLayerShared[TestEnvironment]((zio.aws.netty.NettyHttpClient.default >>> zio.aws.core.config.AwsConfig.default >>> clientResource).orDie) override def aspects: Chunk[TestAspect[Nothing, TestEnvironment, Nothing, Any]] = Chunk(TestAspect.executionStrategy(ExecutionStrategy.Sequential)) private val queueName = "TestQueue" - val gen: Gen[Sized, Chunk[String]] = Util.chunkOfStringsN(10) - - def withFastClock: ZIO[Live, Any, Long] = - Live.withLive(TestClock.adjust(1.seconds))(_.repeat[Live, Long](Schedule.spaced(10.millis))) + val gen: Gen[Sized, Chunk[String]] = chunkOfStringsN(10) def sendAndGet(messages: Seq[String], settings: SqsStreamSettings): ZIO[Live with Sqs, Throwable, Chunk[Message.ReadOnly]] = for { diff --git a/zio-sqs/src/test/scala/zio/sqs/producer/ProducerSpec.scala b/zio-sqs/src/test/scala/zio/sqs/producer/ProducerSpec.scala index 863f031..8f9f90b 100644 --- a/zio-sqs/src/test/scala/zio/sqs/producer/ProducerSpec.scala +++ b/zio-sqs/src/test/scala/zio/sqs/producer/ProducerSpec.scala @@ -11,12 +11,12 @@ import zio.durationInt import zio.sqs.ZioSqsMockServer._ import zio.sqs.producer.Producer.{ DefaultProducer, SqsRequest, SqsRequestEntry, SqsResponseErrorEntry } import zio.sqs.serialization.Serializer -import zio.sqs.{ Util, Utils } +import zio.sqs.Utils import zio.stream.{ ZSink, ZStream } import zio.test.Assertion._ import zio.test._ -import zio.test.{ Live, TestClock, TestEnvironment } import zio.{ test => _, _ } +import zio.sqs.testing._ import scala.language.implicitConversions @@ -25,7 +25,7 @@ object ProducerSpec extends ZIOSpecDefault { implicit def sendMessageBatchResponseAsReadOnly(e: SendMessageBatchResponse): SendMessageBatchResponse.ReadOnly = SendMessageBatchResponse.wrap(e.buildAwsValue()) - def spec: Spec[TestEnvironment, Any] = + def spec = suite("Producer")( test("nextPower2 can be calculated") { assert(Producer.nextPower2(0))(equalTo(0)) && @@ -193,9 +193,8 @@ object ProducerSpec extends ZIOSpecDefault { val eventCount = settings.batchSize ZIO.scoped { for { - events <- Util.chunkOfStringsN(eventCount) - .sample - .map(_.get.value.map(ProducerEvent(_))) + events <- chunkOfStringsN(eventCount).sample + .map(_.value.map(ProducerEvent(_))) .run(ZSink.head[Chunk[ProducerEvent[String]]]) .someOrFailException retryQueue <- queueResource(16) @@ -223,10 +222,8 @@ object ProducerSpec extends ZIOSpecDefault { val eventCount = (settings.batchSize * 2) + 3 for { - events <- Util - .chunkOfStringsN(eventCount) - .sample - .map(_.get.value.map(ProducerEvent(_))) + events <- chunkOfStringsN(eventCount).sample + .map(_.value.map(ProducerEvent(_))) .run(ZSink.head[Chunk[ProducerEvent[String]]]) .someOrFailException results <- ZIO.scoped { @@ -269,10 +266,8 @@ object ProducerSpec extends ZIOSpecDefault { val eventCount = settings.batchSize for { - events <- Util - .chunkOfStringsN(eventCount) - .sample - .map(_.get.value.map(ProducerEvent(_))) + events <- chunkOfStringsN(eventCount).sample + .map(_.value.map(ProducerEvent(_))) .run(ZSink.head[Chunk[ProducerEvent[String]]]) .someOrFailException results <- ZIO.scoped { @@ -311,10 +306,8 @@ object ProducerSpec extends ZIOSpecDefault { val eventCount = settings.batchSize * 2 for { - events <- Util - .chunkOfStringsN(eventCount) - .sample - .map(_.get.value.map(ProducerEvent(_))) + events <- chunkOfStringsN(eventCount).sample + .map(_.value.map(ProducerEvent(_))) .run(ZSink.head[Chunk[ProducerEvent[String]]]) .someOrFailException results <- ZIO.scoped { @@ -352,10 +345,8 @@ object ProducerSpec extends ZIOSpecDefault { val eventCount = settings.batchSize for { - events <- Util - .chunkOfStringsN(eventCount) - .sample - .map(_.get.value.map(ProducerEvent(_))) + events <- chunkOfStringsN(eventCount).sample + .map(_.value.map(ProducerEvent(_))) .run(ZSink.head[Chunk[ProducerEvent[String]]]) .someOrFailException results <- ZIO.scoped { @@ -620,7 +611,7 @@ object ProducerSpec extends ZIOSpecDefault { errOrResults <- producer.produceBatch(events).either } yield assert(errOrResults.isLeft)(isTrue) } - ).provideCustomLayerShared((zio.aws.netty.NettyHttpClient.default >>> zio.aws.core.config.AwsConfig.default >>> clientResource).orDie) + ).provideSomeLayerShared[TestEnvironment]((zio.aws.netty.NettyHttpClient.default >>> zio.aws.core.config.AwsConfig.default >>> clientResource).orDie) override def aspects: Chunk[TestAspect[Nothing, TestEnvironment, Nothing, Any]] = Chunk(TestAspect.executionStrategy(ExecutionStrategy.Sequential)) @@ -628,9 +619,6 @@ object ProducerSpec extends ZIOSpecDefault { def queueResource(capacity: Int): ZIO[Scope, Throwable, Queue[SqsRequestEntry[String]]] = ZIO.acquireRelease(Queue.bounded[SqsRequestEntry[String]](capacity))(_.shutdown) - def withFastClock: ZIO[Live, Any, Long] = - Live.withLive(TestClock.adjust(1.seconds))(_.repeat[Live, Long](Schedule.spaced(10.millis))) - /** * A client that fails all incoming messages in the batch with unrecoverable error. */ @@ -676,4 +664,10 @@ case class StubSqsService(api: SqsAsyncClient = null) extends Sqs { ??? override def changeMessageVisibility(request: model.ChangeMessageVisibilityRequest): IO[AwsError, Unit] = ??? override def withAspect[R](newAspect: aspects.AwsCallAspect[R], r: ZEnvironment[R]): Sqs = ??? + + override def cancelMessageMoveTask(request: CancelMessageMoveTaskRequest): IO[AwsError, CancelMessageMoveTaskResponse.ReadOnly] = ??? + + override def startMessageMoveTask(request: StartMessageMoveTaskRequest): IO[AwsError, StartMessageMoveTaskResponse.ReadOnly] = ??? + + override def listMessageMoveTasks(request: ListMessageMoveTasksRequest): IO[AwsError, ListMessageMoveTasksResponse.ReadOnly] = ??? } diff --git a/zio-sqs/src/test/scala/zio/sqs/testing/package.scala b/zio-sqs/src/test/scala/zio/sqs/testing/package.scala new file mode 100644 index 0000000..47ffbee --- /dev/null +++ b/zio-sqs/src/test/scala/zio/sqs/testing/package.scala @@ -0,0 +1,13 @@ +package zio.sqs + +import zio.test._ +import zio._ + +package object testing { + + val withFastClock = + Live.withLive(TestClock.adjust(1.seconds))(_.repeat(Schedule.spaced(10.millis))) + + def chunkOfStringsN(n: Int): Gen[Sized, Chunk[String]] = Gen.chunkOfN(n)(Gen.string(Gen.printableChar)) + +}