From 82f95d6d996a6742da51e3e1ee47cbe5d55cd904 Mon Sep 17 00:00:00 2001 From: xuwei-k <6b656e6a69@gmail.com> Date: Sat, 8 Apr 2023 10:09:16 +0900 Subject: [PATCH] migrate to scalatest --- .github/workflows/build-test.yml | 2 +- .../ws/ahc/AhcCurlRequestLoggerSpec.scala | 78 +++--- .../ws/ahc/StandaloneWSClientSupport.scala | 5 +- .../test/scala/play/NettyServerProvider.scala | 22 +- .../ws/ahc/AhcCurlRequestLoggerSpec.scala | 76 ++--- .../api/libs/ws/ahc/AhcWSClientSpec.scala | 70 +++-- .../libs/ws/ahc/AhcWSRequestFilterSpec.scala | 43 ++- .../api/libs/ws/ahc/JsonRequestSpec.scala | 19 +- .../ws/ahc/StandaloneWSClientSupport.scala | 5 +- .../play/api/libs/ws/ahc/XMLRequestSpec.scala | 24 +- .../api/libs/ws/ahc/cache/CachingSpec.scala | 16 +- .../play/libs/ws/ahc/AhcWSClientSpec.scala | 25 +- .../libs/ws/ahc/AhcWSRequestFilterSpec.scala | 60 ++-- .../scala/play/api/libs/oauth/OAuthSpec.scala | 6 +- .../libs/ws/ahc/AhcConfigBuilderSpec.scala | 64 ++--- .../ws/ahc/AhcWSClientConfigParserSpec.scala | 42 +-- .../api/libs/ws/ahc/AhcWSRequestSpec.scala | 262 ++++++++++-------- .../api/libs/ws/ahc/AhcWSResponseSpec.scala | 157 +++++------ .../libs/ws/ahc/cache/AhcWSCacheSpec.scala | 22 +- .../cache/BackgroundAsyncHandlerSpec.scala | 4 +- .../ws/ahc/cache/CacheAsyncHandlerSpec.scala | 4 +- .../ws/ahc/cache/CacheableResponseSpec.scala | 18 +- .../play/libs/ws/ahc/AhcWSRequestSpec.scala | 226 +++++++-------- .../play/libs/ws/ahc/AhcWSResponseSpec.scala | 18 +- .../api/libs/ws/JsonBodyReadablesSpec.scala | 19 +- .../play/api/libs/ws/WSConfigParserSpec.scala | 16 +- project/Dependencies.scala | 7 +- 27 files changed, 657 insertions(+), 653 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 6b99248f..f5852c7c 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -39,7 +39,7 @@ jobs: with: java: 21, 17 scala: 2.13.x, 3.x - cmd: sbt ++$MATRIX_SCALA 'testOnly -- xonly timefactor 5' + cmd: sbt ++$MATRIX_SCALA test finish: name: Finish diff --git a/integration-tests/src/test/java/play/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala b/integration-tests/src/test/java/play/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala index 413be5f5..dbb8efcb 100644 --- a/integration-tests/src/test/java/play/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala +++ b/integration-tests/src/test/java/play/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala @@ -4,9 +4,8 @@ package play.libs.ws.ahc -import org.specs2.concurrent.ExecutionEnv -import org.specs2.concurrent.FutureAwait -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.mvc.Results @@ -22,11 +21,11 @@ import scala.jdk.CollectionConverters._ import scala.jdk.FutureConverters._ import play.api.routing.sird._ -class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcCurlRequestLoggerSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureAwait + with ScalaFutures with DefaultBodyWritables { override def routes(components: BuiltInComponents) = { @@ -56,9 +55,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("--verbose") + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("--verbose"))) } "add all headers" in withClient() { client => @@ -71,11 +70,11 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue val messages = testLogger.getLoggingEvents.asScala.map(_.getMessage) - messages must containMatch("--header 'My-Header: My-Header-Value'") + assert(messages.exists(_.contains("--header 'My-Header: My-Header-Value'"))) } "add all cookies" in withClient() { client => @@ -88,11 +87,11 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue val messages = testLogger.getLoggingEvents.asScala.map(_.getMessage) - messages must containMatch("""--cookie 'cookie1=value1'""") + assert(messages.exists(_.contains("""--cookie 'cookie1=value1'"""))) } "add method" in withClient() { client => @@ -104,9 +103,11 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("--request GET") + assert( + testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("--request GET")) + ) } "add authorization header" in withClient() { client => @@ -119,14 +120,20 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) - - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch( - """--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ='""" + .futureValue + + assert( + testLogger.getLoggingEvents.asScala + .map(_.getMessage) + .exists( + _.contains( + """--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ='""" + ) + ) ) } - "handle body" in { + "handle body" should { "add when in memory" in withClient() { client => val testLogger = createTestLogger @@ -138,9 +145,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("the-body") + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("the-body"))) } "do nothing for empty bodies" in withClient() { client => @@ -153,9 +160,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must not containMatch "--data" + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).forall(!_.contains("--data"))) } } @@ -171,18 +178,19 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(curlRequestLogger) .get() .asScala - .awaitFor(defaultTimeout) - - testLogger.getLoggingEvents.get(0).getMessage must beEqualTo( - s""" - |curl \\ - | --verbose \\ - | --request GET \\ - | --header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \\ - | --header 'content-type: text/plain' \\ - | --header 'My-Header: My-Header-Value' \\ - | --data 'the-body' \\ - | 'http://localhost:$testServerPort/' + .futureValue + + assert( + testLogger.getLoggingEvents.get(0).getMessage == + s""" + |curl \\ + | --verbose \\ + | --request GET \\ + | --header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \\ + | --header 'content-type: text/plain' \\ + | --header 'My-Header: My-Header-Value' \\ + | --data 'the-body' \\ + | 'http://localhost:$testServerPort/' """.stripMargin.trim ) } diff --git a/integration-tests/src/test/java/play/libs/ws/ahc/StandaloneWSClientSupport.scala b/integration-tests/src/test/java/play/libs/ws/ahc/StandaloneWSClientSupport.scala index 82434821..0f35db5e 100644 --- a/integration-tests/src/test/java/play/libs/ws/ahc/StandaloneWSClientSupport.scala +++ b/integration-tests/src/test/java/play/libs/ws/ahc/StandaloneWSClientSupport.scala @@ -5,7 +5,6 @@ package play.libs.ws.ahc import org.apache.pekko.stream.Materializer -import org.specs2.execute.Result import play.api.libs.ws.ahc.AhcConfigBuilder import play.api.libs.ws.ahc.AhcWSClientConfig import play.api.libs.ws.ahc.{ AhcWSClientConfigFactory => ScalaAhcWSClientConfigFactory } @@ -15,9 +14,9 @@ trait StandaloneWSClientSupport { def materializer: Materializer - def withClient( + def withClient[A]( config: AhcWSClientConfig = ScalaAhcWSClientConfigFactory.forConfig() - )(block: StandaloneAhcWSClient => Result): Result = { + )(block: StandaloneAhcWSClient => A): A = { val asyncHttpClient = new DefaultAsyncHttpClient(new AhcConfigBuilder(config).build()) val client = new StandaloneAhcWSClient(asyncHttpClient, materializer) try { diff --git a/integration-tests/src/test/scala/play/NettyServerProvider.scala b/integration-tests/src/test/scala/play/NettyServerProvider.scala index 9b7b59ba..5ca53940 100644 --- a/integration-tests/src/test/scala/play/NettyServerProvider.scala +++ b/integration-tests/src/test/scala/play/NettyServerProvider.scala @@ -5,13 +5,17 @@ package play import org.apache.pekko.actor.ActorSystem -import org.specs2.concurrent.ExecutionEnv -import org.specs2.specification.BeforeAfterAll import scala.concurrent.duration._ import scala.concurrent.Await +import scala.concurrent.ExecutionContext import org.apache.pekko.stream.Materializer +import org.scalatest.BeforeAndAfterAll +import org.scalatest.Suite +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.time.Millis +import org.scalatest.time.Span import play.api.mvc.Handler import play.api.mvc.RequestHeader import play.core.server.NettyServer @@ -19,17 +23,17 @@ import play.core.server.ServerConfig import play.api.BuiltInComponents import play.api.Mode -trait NettyServerProvider extends BeforeAfterAll { +trait NettyServerProvider extends BeforeAndAfterAll with ScalaFutures { self: Suite => + + final implicit override def patienceConfig: PatienceConfig = + PatienceConfig(Span(3000, Millis)) /** * @return Routes to be used by the test. */ def routes(components: BuiltInComponents): PartialFunction[RequestHeader, Handler] - /** - * The execution context environment. - */ - def executionEnv: ExecutionEnv + protected implicit def executionContext: ExecutionContext = ExecutionContext.global lazy val testServerPort: Int = server.httpPort.getOrElse(sys.error("undefined port number")) val defaultTimeout: FiniteDuration = 5.seconds @@ -47,7 +51,9 @@ trait NettyServerProvider extends BeforeAfterAll { ) )(components => routes(components)) - override def beforeAll(): Unit = {} + override def beforeAll(): Unit = { + super.beforeAll() + } override def afterAll(): Unit = { server.stop() diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala index 33130432..3b185be6 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcCurlRequestLoggerSpec.scala @@ -4,9 +4,8 @@ package play.api.libs.ws.ahc -import org.specs2.concurrent.ExecutionEnv -import org.specs2.concurrent.FutureAwait -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.libs.ws.DefaultBodyWritables @@ -23,11 +22,11 @@ import play.api.routing.sird._ import scala.jdk.CollectionConverters._ -class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcCurlRequestLoggerSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureAwait + with ScalaFutures with DefaultBodyWritables { override def routes(components: BuiltInComponents): PartialFunction[RequestHeader, Handler] = { @@ -57,9 +56,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .url(s"http://localhost:$testServerPort/") .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("--verbose") + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("--verbose"))) } "add all headers" in withClient() { client => @@ -71,11 +70,11 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .addHttpHeaders("My-Header" -> "My-Header-Value") .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue val messages = testLogger.getLoggingEvents.asScala.map(_.getMessage) - messages must containMatch("--header 'My-Header: My-Header-Value'") + assert(messages.exists(_.contains("--header 'My-Header: My-Header-Value'"))) } "add all cookies" in withClient() { client => @@ -87,11 +86,11 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .addCookies(DefaultWSCookie("cookie1", "value1")) .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue val messages = testLogger.getLoggingEvents.asScala.map(_.getMessage) - messages must containMatch("--cookie 'cookie1=value1'") + assert(messages.exists(_.contains("--cookie 'cookie1=value1'"))) } "add method" in withClient() { client => @@ -102,9 +101,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .url(s"http://localhost:$testServerPort/") .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("--request GET") + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("--request GET"))) } "add authorization header" in withClient() { client => @@ -116,14 +115,20 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .withAuth("username", "password", WSAuthScheme.BASIC) .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) - - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch( - """--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ='""" + .futureValue + + assert( + testLogger.getLoggingEvents.asScala + .map(_.getMessage) + .exists( + _.contains( + """--header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ='""" + ) + ) ) } - "handle body" in { + "handle body" should { "add when in memory" in withClient() { client => val testLogger = createTestLogger @@ -134,9 +139,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .withBody("the-body") .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must containMatch("the-body") + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).exists(_.contains("the-body"))) } "do nothing for empty bodies" in withClient() { client => @@ -148,9 +153,9 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .withBody(EmptyBody) .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) + .futureValue - testLogger.getLoggingEvents.asScala.map(_.getMessage) must not containMatch "--data" + assert(testLogger.getLoggingEvents.asScala.map(_.getMessage).forall(!_.contains("--data"))) } } @@ -165,18 +170,19 @@ class AhcCurlRequestLoggerSpec(implicit val executionEnv: ExecutionEnv) .withAuth("username", "password", WSAuthScheme.BASIC) .withRequestFilter(curlRequestLogger) .get() - .awaitFor(defaultTimeout) - - testLogger.getLoggingEvents.get(0).getMessage must beEqualTo( - s""" - |curl \\ - | --verbose \\ - | --request GET \\ - | --header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \\ - | --header 'My-Header: My-Header-Value' \\ - | --header 'Content-Type: text/plain' \\ - | --data 'the-body' \\ - | 'http://localhost:$testServerPort/' + .futureValue + + assert( + testLogger.getLoggingEvents.get(0).getMessage == + s""" + |curl \\ + | --verbose \\ + | --request GET \\ + | --header 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \\ + | --header 'My-Header: My-Header-Value' \\ + | --header 'Content-Type: text/plain' \\ + | --data 'the-body' \\ + | 'http://localhost:$testServerPort/' """.stripMargin.trim ) } diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSClientSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSClientSpec.scala index a74b0258..4fa9d589 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSClientSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSClientSpec.scala @@ -6,11 +6,8 @@ package play.api.libs.ws.ahc import org.apache.pekko.stream.scaladsl.Sink import org.apache.pekko.util.ByteString -import org.specs2.concurrent.ExecutionEnv -import org.specs2.concurrent.FutureAwait -import org.specs2.execute.Result -import org.specs2.matcher.FutureMatchers -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.http.Status.MOVED_PERMANENTLY @@ -24,18 +21,17 @@ import play.shaded.ahc.org.asynchttpclient.handler.MaxRedirectException import scala.concurrent._ -class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcWSClientSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureMatchers - with FutureAwait + with ScalaFutures with DefaultBodyReadables with DefaultBodyWritables { - def withClientFollowingRedirect( + def withClientFollowingRedirect[A]( config: AhcWSClientConfig = AhcWSClientConfigFactory.forConfig() - )(block: StandaloneAhcWSClient => Result): Result = { + )(block: StandaloneAhcWSClient => A): A = { withClient( config.copy( wsClientConfig = config.wsClientConfig.copy(followRedirects = true) @@ -106,13 +102,15 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) "url" should { "throw an exception on invalid url" in { withClient() { client => - { client.url("localhost") } must throwAn[IllegalArgumentException] + assertThrows[IllegalArgumentException] { + client.url("localhost") + } } } "not throw exception on valid url" in { withClient() { client => - { client.url(s"http://localhost:$testServerPort") } must not(throwAn[IllegalArgumentException]) + client.url(s"http://localhost:$testServerPort") } } } @@ -125,7 +123,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/index").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -143,7 +141,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/index").get().map(res => res.body[Foo]), defaultTimeout ) - result must beEqualTo(Foo("Say hello to play")) + assert(result == Foo("Say hello to play")) } } @@ -154,22 +152,22 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) defaultTimeout ) val bytes: ByteString = Await.result(resultSource.runWith(Sink.head), defaultTimeout) - bytes.utf8String must beEqualTo("Say hello to play") + assert(bytes.utf8String == "Say hello to play") } } - "when following redirect" in { + "when following redirect" should { "honor the number of redirects allowed" in { // 1. Default number of max redirects is 5 withClientFollowingRedirect() { client => - { + assertThrows[MaxRedirectException] { val request = client // 2. Ask to redirect 10 times .url(s"http://localhost:$testServerPort/redirects/302/10") .get() Await.result(request, defaultTimeout) - } must throwA[MaxRedirectException] + } } } @@ -179,7 +177,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/302").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -188,7 +186,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) val ahcWsConfig = AhcWSClientConfigFactory.forConfig().copy(wsClientConfig = wsConfig) withClient(config = ahcWsConfig) { client => val result = Await.result(client.url(s"http://localhost:$testServerPort/redirect/302").get(), defaultTimeout) - result.status must beEqualTo(302) + assert(result.status == 302) } } @@ -201,7 +199,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .withFollowRedirects(false) .get() val result = Await.result(request, defaultTimeout) - result.status must beEqualTo(302) + assert(result.status == 302) } } @@ -211,7 +209,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/301").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -221,7 +219,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/302").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -231,7 +229,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/303").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -241,7 +239,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/307").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -251,7 +249,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/redirect/308").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -262,7 +260,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .withVirtualHost("localhost1") .get() val result = Await.result(request, defaultTimeout) - result.header("Req-Host") must beSome("localhost1") + assert(result.header("Req-Host") == Some("localhost1")) } } @@ -273,7 +271,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .addHttpHeaders("X-Test" -> "Test") .get() val result = Await.result(request, defaultTimeout) - result.header("Req-X-Test") must beSome("Test") + assert(result.header("Req-X-Test") == Some("Test")) } } @@ -284,7 +282,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .withAuth("test", "test", WSAuthScheme.BASIC) .get() val result = Await.result(request, defaultTimeout) - result.header("Req-Authorization") must beSome + assert(result.header("Req-Authorization").isDefined) } } @@ -294,7 +292,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/cookie").get().map(res => res.body[String]), defaultTimeout ) - result must beEqualTo(s"Cookie value => redirect-cookie") + assert(result == s"Cookie value => redirect-cookie") } } @@ -311,11 +309,11 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) client.url(s"http://localhost:$testServerPort/cookie-destination").get().map(res => res.body[String]), defaultTimeout ) - res2 must beEqualTo(s"Request is missing required cookie 'flash'") + assert(res2 == s"Request is missing required cookie 'flash'") } } - "switch to get " in { + "switch to get " should { "for HTTP 301 Moved Permanently" in { withClientFollowingRedirect() { client => val request = client @@ -328,7 +326,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) // 2. So when following the redirect, the GET path should be found // and we get its body - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -338,7 +336,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .url(s"http://localhost:$testServerPort/redirect/303") .post("request body") val result = Await.result(request.map(res => res.body[String]), defaultTimeout) - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } @@ -354,7 +352,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) // 2. So when following the redirect, the GET path should be found // and we get its body - result must beEqualTo("Say hello to play") + assert(result == "Say hello to play") } } } diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestFilterSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestFilterSpec.scala index d1fd61ca..2db9ef64 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestFilterSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestFilterSpec.scala @@ -4,9 +4,8 @@ package play.api.libs.ws.ahc -import org.specs2.concurrent.ExecutionEnv -import org.specs2.matcher.FutureMatchers -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.libs.ws._ @@ -14,11 +13,11 @@ import play.api.mvc.Results import scala.collection.mutable -class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcWSRequestFilterSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureMatchers + with ScalaFutures with DefaultBodyReadables { override def routes(components: BuiltInComponents) = { case _ => @@ -67,9 +66,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) }) .get() .map { response => - response.body[String] must contain("some string") + assert(response.body[String].contains("some string")) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "stream with adhoc request filter" in withClient() { client => @@ -81,9 +80,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withMethod("GET") .stream() .map { response => - response.body[String] must contain("some string") + assert(response.body[String].contains("some string")) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "work with one request filter" in withClient() { client => @@ -93,9 +92,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withRequestFilter(new CallbackRequestFilter(callList, 1)) .get() .map { _ => - callList must contain(1) + assert(callList.contains(1)) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "stream with one request filter" in withClient() { client => @@ -106,9 +105,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withMethod("GET") .stream() .map { _ => - callList must contain(1) + assert(callList.contains(1)) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "work with three request filter" in withClient() { client => @@ -120,9 +119,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withRequestFilter(new CallbackRequestFilter(callList, 3)) .get() .map { _ => - callList must containTheSameElementsAs(Seq(1, 2, 3)) + assert(callList.toSet == Set(1, 2, 3)) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "stream with three request filters" in withClient() { client => @@ -135,9 +134,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withMethod("GET") .stream() .map { _ => - callList must containTheSameElementsAs(Seq(1, 2, 3)) + assert(callList.toSet == Set(1, 2, 3)) } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "should allow filters to modify the request" in withClient() { client => @@ -148,9 +147,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withRequestFilter(new HeaderAppendingFilter(appendedHeader, appendedHeaderValue)) .get() .map { response => - response.headers("X-Request-Id").head must be_==("someid") + assert(response.headers("X-Request-Id").head == "someid") } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } "allow filters to modify the streaming request" in withClient() { client => @@ -162,9 +161,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .withMethod("GET") .stream() .map { response => - response.headers("X-Request-Id").head must be_==("someid") + assert(response.headers("X-Request-Id").head == "someid") } - .await(retries = 0, timeout = defaultTimeout) + .futureValue } } } diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/JsonRequestSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/JsonRequestSpec.scala index 7394ab89..37eec0f9 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/JsonRequestSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/JsonRequestSpec.scala @@ -14,8 +14,8 @@ import org.mockito.Mockito.verify import org.mockito.Mockito.when import org.mockito.Mockito -import org.specs2.mutable.Specification -import org.specs2.specification.AfterAll +import org.scalatest.BeforeAndAfterAll +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.json.JsString import play.api.libs.json.JsValue import play.api.libs.json.Json @@ -29,8 +29,7 @@ import scala.reflect.ClassTag /** */ -class JsonRequestSpec extends Specification with AfterAll with JsonBodyWritables { - sequential +class JsonRequestSpec extends AnyWordSpec with BeforeAndAfterAll with JsonBodyWritables { private def mock[A](implicit a: ClassTag[A]): A = Mockito.mock(a.runtimeClass).asInstanceOf[A] @@ -50,8 +49,8 @@ class JsonRequestSpec extends Specification with AfterAll with JsonBodyWritables .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("Content-Type") must be_==("application/json") - ByteString.fromArray(req.getByteData).utf8String must be_==("""{"k1":"v1"}""") + assert(req.getHeaders.get("Content-Type") == "application/json") + assert(ByteString.fromArray(req.getByteData).utf8String == """{"k1":"v1"}""") } "set a json node using the default object mapper" in { @@ -65,8 +64,8 @@ class JsonRequestSpec extends Specification with AfterAll with JsonBodyWritables .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("Content-Type") must be_==("application/json") - ByteString.fromArray(req.getByteData).utf8String must be_==("""{"k1":"v1"}""") + assert(req.getHeaders.get("Content-Type") == "application/json") + assert(ByteString.fromArray(req.getByteData).utf8String == """{"k1":"v1"}""") } "read an encoding of UTF-8" in { @@ -81,7 +80,7 @@ class JsonRequestSpec extends Specification with AfterAll with JsonBodyWritables val value: JsValue = JsonBodyReadables.readableAsJson.transform(response) verify(ahcResponse, times(1)).getResponseBody(StandardCharsets.UTF_8) verify(ahcResponse, times(1)).getContentType - value.toString must beEqualTo(json) + assert(value.toString == json) } "read an encoding of ISO-8859-1" in { @@ -96,6 +95,6 @@ class JsonRequestSpec extends Specification with AfterAll with JsonBodyWritables val value: JsValue = JsonBodyReadables.readableAsJson.transform(response) verify(ahcResponse, times(1)).getResponseBody(StandardCharsets.ISO_8859_1) verify(ahcResponse, times(1)).getContentType - value.toString must beEqualTo(json) + assert(value.toString == json) } } diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/StandaloneWSClientSupport.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/StandaloneWSClientSupport.scala index 0a2e692b..003458f5 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/StandaloneWSClientSupport.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/StandaloneWSClientSupport.scala @@ -5,15 +5,14 @@ package play.api.libs.ws.ahc import org.apache.pekko.stream.Materializer -import org.specs2.execute.Result trait StandaloneWSClientSupport { def materializer: Materializer - def withClient( + def withClient[A]( config: AhcWSClientConfig = AhcWSClientConfigFactory.forConfig() - )(block: StandaloneAhcWSClient => Result): Result = { + )(block: StandaloneAhcWSClient => A): A = { val client = StandaloneAhcWSClient(config)(materializer) try { block(client) diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/XMLRequestSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/XMLRequestSpec.scala index 05ef5c86..2c8f1dfa 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/XMLRequestSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/XMLRequestSpec.scala @@ -9,17 +9,15 @@ import java.nio.charset.StandardCharsets import org.apache.pekko.actor.ActorSystem import org.apache.pekko.stream.Materializer import org.apache.pekko.util.ByteString -import org.specs2.matcher.MustMatchers -import org.specs2.mutable.Specification -import org.specs2.specification.AfterAll +import org.scalatest.BeforeAndAfterAll +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.ws._ import scala.xml.Elem /** */ -class XMLRequestSpec extends Specification with AfterAll with MustMatchers { - sequential +class XMLRequestSpec extends AnyWordSpec with BeforeAndAfterAll { implicit val system: ActorSystem = ActorSystem() implicit val materializer: Materializer = Materializer.matFromSystem @@ -59,8 +57,8 @@ class XMLRequestSpec extends Specification with AfterAll with MustMatchers { .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("Content-Type") must be_==("text/xml; charset=UTF-8") - ByteString.fromArray(req.getByteData).utf8String must be_==("") + assert(req.getHeaders.get("Content-Type") == "text/xml; charset=UTF-8") + assert(ByteString.fromArray(req.getByteData).utf8String == "") } "read an XML node in Utf-8" in { @@ -76,9 +74,9 @@ class XMLRequestSpec extends Specification with AfterAll with MustMatchers { val readables = new XMLBodyReadables() {} /* UTF-8 */ val value: Elem = readables.readableAsXml.transform(new StubResponse(test.getBytes(StandardCharsets.UTF_8))) - (value \\ "note" \ "to").text must be_==("Tove") - (value \\ "note" \ "from").text must be_==("Jani") - (value \\ "note" \ "heading").text must be_==("Reminder") + assert((value \\ "note" \ "to").text == "Tove") + assert((value \\ "note" \ "from").text == "Jani") + assert((value \\ "note" \ "heading").text == "Reminder") } "read an XML node in Utf-16" in { @@ -94,8 +92,8 @@ class XMLRequestSpec extends Specification with AfterAll with MustMatchers { val readables = new XMLBodyReadables() {} /* UTF-16 */ val value: Elem = readables.readableAsXml.transform(new StubResponse(test.getBytes(StandardCharsets.UTF_16))) - (value \\ "note" \ "to").text must be_==("Tove") - (value \\ "note" \ "from").text must be_==("Jani") - (value \\ "note" \ "heading").text must be_==("Reminder") + assert((value \\ "note" \ "to").text == "Tove") + assert((value \\ "note" \ "from").text == "Jani") + assert((value \\ "note" \ "heading").text == "Reminder") } } diff --git a/integration-tests/src/test/scala/play/api/libs/ws/ahc/cache/CachingSpec.scala b/integration-tests/src/test/scala/play/api/libs/ws/ahc/cache/CachingSpec.scala index 361cea81..be384129 100644 --- a/integration-tests/src/test/scala/play/api/libs/ws/ahc/cache/CachingSpec.scala +++ b/integration-tests/src/test/scala/play/api/libs/ws/ahc/cache/CachingSpec.scala @@ -7,10 +7,7 @@ package play.api.libs.ws.ahc.cache import org.mockito.ArgumentMatchers.any import org.mockito.Mockito import org.mockito.Mockito.when -import org.specs2.concurrent.ExecutionEnv -import org.specs2.matcher.FutureMatchers -import org.specs2.mutable.Specification -import org.specs2.specification.AfterAll +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.libs.ws.ahc._ @@ -24,11 +21,7 @@ import play.shaded.ahc.org.asynchttpclient._ import scala.concurrent.Future import scala.reflect.ClassTag -class CachingSpec(implicit val executionEnv: ExecutionEnv) - extends Specification - with NettyServerProvider - with AfterAll - with FutureMatchers { +class CachingSpec extends AnyWordSpec with NettyServerProvider { private def mock[A](implicit a: ClassTag[A]): A = Mockito.mock(a.runtimeClass).asInstanceOf[A] @@ -64,12 +57,11 @@ class CachingSpec(implicit val executionEnv: ExecutionEnv) ws.url(s"http://localhost:$testServerPort/hello") .get() .map { response => - response.body[String] must be_==("

Say hello to play

") + assert(response.body[String] == "

Say hello to play

") } - .await + .futureValue Mockito.verify(cache).get(EffectiveURIKey("GET", new java.net.URI(s"http://localhost:$testServerPort/hello"))) - success } } } diff --git a/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSClientSpec.scala b/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSClientSpec.scala index 621d7d2c..a463bb51 100644 --- a/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSClientSpec.scala +++ b/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSClientSpec.scala @@ -6,9 +6,8 @@ package play.libs.ws.ahc import org.apache.pekko.stream.javadsl.Sink import org.apache.pekko.util.ByteString -import org.specs2.concurrent.ExecutionEnv -import org.specs2.matcher.FutureMatchers -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.mvc.AnyContentAsText @@ -19,13 +18,12 @@ import play.libs.ws._ import scala.jdk.FutureConverters._ import scala.concurrent.Future -import scala.concurrent.duration._ -class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcWSClientSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureMatchers + with ScalaFutures with XMLBodyWritables with XMLBodyReadables { @@ -59,8 +57,8 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) .url(s"http://localhost:$testServerPort") .post(someOtherMethod("hello world")) .asScala - .map(response => response.getBody() must be_==("hello world")) - .await(retries = 0, timeout = 5.seconds) + .map(response => assert(response.getBody() == "hello world")) + .futureValue } "source successfully" in withClient() { client => @@ -69,7 +67,7 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) response.getBodyAsSource.runWith(Sink.head[ByteString](), materializer).asScala } val expected: ByteString = ByteString.fromString("

Say hello to play

") - result must be_==(expected).await(retries = 0, timeout = 5.seconds) + assert(result.futureValue == expected) } "round trip XML successfully" in withClient() { client => @@ -96,11 +94,10 @@ class AhcWSClientSpec(implicit val executionEnv: ExecutionEnv) val responseXml = response.getBody(xml()) responseXml.normalizeDocument() - (responseXml.isEqualNode(document) must beTrue).and { - response.getUri must beEqualTo(new java.net.URI(s"http://localhost:$testServerPort")) - } + assert(responseXml.isEqualNode(document)) + assert(response.getUri == new java.net.URI(s"http://localhost:$testServerPort")) } - .await(retries = 0, timeout = 5.seconds) + .futureValue } } } diff --git a/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSRequestFilterSpec.scala b/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSRequestFilterSpec.scala index 33212913..67facfe8 100644 --- a/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSRequestFilterSpec.scala +++ b/integration-tests/src/test/scala/play/libs/ws/ahc/AhcWSRequestFilterSpec.scala @@ -4,21 +4,19 @@ package play.libs.ws.ahc -import org.specs2.concurrent.ExecutionEnv -import org.specs2.matcher.FutureMatchers -import org.specs2.mutable.Specification +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.wordspec.AnyWordSpec import play.NettyServerProvider import play.api.BuiltInComponents import play.api.mvc.Results -import scala.concurrent.duration._ import scala.jdk.FutureConverters._ -class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) - extends Specification +class AhcWSRequestFilterSpec + extends AnyWordSpec with NettyServerProvider with StandaloneWSClientSupport - with FutureMatchers { + with ScalaFutures { override def routes(components: BuiltInComponents) = { case _ => components.defaultActionBuilder { req => @@ -43,11 +41,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(new CallbackRequestFilter(callList, 1)) .get() .asScala - responseFuture - .map { _ => - callList.asScala must contain(1) - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { _ => + assert(callList.asScala.map(_.intValue()).contains(1)) + }.futureValue } "stream with one request filter" in withClient() { client => @@ -59,11 +55,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(new CallbackRequestFilter(callList, 1)) .stream() .asScala - responseFuture - .map { _ => - callList.asScala must contain(1) - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { _ => + assert(callList.asScala.map(_.intValue()).contains(1)) + }.futureValue } "work with three request filter" in withClient() { client => @@ -77,11 +71,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(new CallbackRequestFilter(callList, 3)) .get() .asScala - responseFuture - .map { _ => - callList.asScala must containTheSameElementsAs(Seq(1, 2, 3)) - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { _ => + assert(callList.asScala.toSet == Set(1, 2, 3)) + }.futureValue } "stream with three request filters" in withClient() { client => @@ -95,11 +87,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .setRequestFilter(new CallbackRequestFilter(callList, 3)) .stream() .asScala - responseFuture - .map { _ => - callList.asScala must containTheSameElementsAs(Seq(1, 2, 3)) - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { _ => + assert(callList.asScala.toSet == Set(1, 2, 3)) + }.futureValue } "should allow filters to modify the request" in withClient() { client => @@ -112,11 +102,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .get() .asScala - responseFuture - .map { response => - response.getHeaders.get("X-Request-Id").get(0) must be_==("someid") - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { response => + assert(response.getHeaders.get("X-Request-Id").get(0) == "someid") + }.futureValue } "allow filters to modify the streaming request" in withClient() { client => @@ -129,11 +117,9 @@ class AhcWSRequestFilterSpec(implicit val executionEnv: ExecutionEnv) .stream() .asScala - responseFuture - .map { response => - response.getHeaders.get("X-Request-Id").get(0) must be_==("someid") - } - .await(retries = 0, timeout = 5.seconds) + responseFuture.map { response => + assert(response.getHeaders.get("X-Request-Id").get(0) == "someid") + }.futureValue } } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/oauth/OAuthSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/oauth/OAuthSpec.scala index cbe5f748..615f7c50 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/oauth/OAuthSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/oauth/OAuthSpec.scala @@ -4,12 +4,12 @@ package play.api.libs.oauth -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec -class OAuthSpec extends Specification { +class OAuthSpec extends AnyWordSpec { "OAuth" should { "be able to use signpost OAuth" in { - Class.forName("play.shaded.oauth.oauth.signpost.OAuth") must not(throwA[ClassNotFoundException]) + Class.forName("play.shaded.oauth.oauth.signpost.OAuth") } } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcConfigBuilderSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcConfigBuilderSpec.scala index c597fcdb..ae6e9d3d 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcConfigBuilderSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcConfigBuilderSpec.scala @@ -9,7 +9,7 @@ import com.typesafe.config.ConfigFactory import com.typesafe.sslconfig.ssl.Protocols import com.typesafe.sslconfig.ssl.SSLConfigFactory import com.typesafe.sslconfig.ssl.SSLConfigSettings -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.ws.WSClientConfig import play.shaded.ahc.org.asynchttpclient.proxy.ProxyServerSelector import play.shaded.ahc.org.asynchttpclient.util.ProxyUtils @@ -18,7 +18,7 @@ import scala.concurrent.duration._ /** */ -class AhcConfigBuilderSpec extends Specification { +class AhcConfigBuilderSpec extends AnyWordSpec { val defaultWsConfig = WSClientConfig() val defaultConfig = AhcWSClientConfig(defaultWsConfig) @@ -35,11 +35,11 @@ class AhcConfigBuilderSpec extends Specification { builder.setFollowRedirect(false) } .build() - ahcConfig.isCompressionEnforced must beFalse - ahcConfig.isFollowRedirect must beFalse - ahcConfig.getConnectTimeout must_== 120000 - ahcConfig.getRequestTimeout must_== 120000 - ahcConfig.getReadTimeout must_== 120000 + assert(ahcConfig.isCompressionEnforced == false) + assert(ahcConfig.isFollowRedirect == false) + assert(ahcConfig.getConnectTimeout == 120000) + assert(ahcConfig.getRequestTimeout == 120000) + assert(ahcConfig.getReadTimeout == 120000) } "with basic options" should { @@ -49,13 +49,13 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getReadTimeout must_== defaultWsConfig.idleTimeout.toMillis - actual.getRequestTimeout must_== defaultWsConfig.requestTimeout.toMillis - actual.getConnectTimeout must_== defaultWsConfig.connectionTimeout.toMillis - actual.isFollowRedirect must_== defaultWsConfig.followRedirects - actual.getCookieStore must_== null + assert(actual.getReadTimeout == defaultWsConfig.idleTimeout.toMillis) + assert(actual.getRequestTimeout == defaultWsConfig.requestTimeout.toMillis) + assert(actual.getConnectTimeout == defaultWsConfig.connectionTimeout.toMillis) + assert(actual.isFollowRedirect == defaultWsConfig.followRedirects) + assert(actual.getCookieStore == null) - actual.getEnabledProtocols.toSeq must not contain Protocols.deprecatedProtocols + assert(actual.getEnabledProtocols.toSeq.forall(x => !Protocols.deprecatedProtocols.contains(x))) } "use an explicit idle timeout" in { @@ -64,7 +64,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getReadTimeout must_== 42L + assert(actual.getReadTimeout == 42L) } "use an explicit request timeout" in { @@ -73,7 +73,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getRequestTimeout must_== 47L + assert(actual.getRequestTimeout == 47L) } "use an explicit connection timeout" in { @@ -82,7 +82,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getConnectTimeout must_== 99L + assert(actual.getConnectTimeout == 99L) } "use an explicit followRedirects option" in { @@ -91,7 +91,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.isFollowRedirect must_== true + assert(actual.isFollowRedirect == true) } "use an explicit proxy if useProxyProperties is true and there are system defined proxy settings" in { @@ -106,9 +106,9 @@ class AhcConfigBuilderSpec extends Specification { val proxyServerSelector = actual.getProxyServerSelector - proxyServerSelector must not(beNull) + assert(proxyServerSelector != null) - (proxyServerSelector must not).be_==(ProxyServerSelector.NO_PROXY_SELECTOR) + assert(proxyServerSelector != ProxyServerSelector.NO_PROXY_SELECTOR) } finally { // Unset http.proxyHost System.clearProperty(ProxyUtils.PROXY_HOST) @@ -122,42 +122,42 @@ class AhcConfigBuilderSpec extends Specification { val config = defaultConfig.copy(keepAlive = false) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.isKeepAlive must_== false + assert(actual.isKeepAlive == false) } "allow setting ahc maximumConnectionsPerHost" in { val config = defaultConfig.copy(maxConnectionsPerHost = 3) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getMaxConnectionsPerHost must_== 3 + assert(actual.getMaxConnectionsPerHost == 3) } "allow setting ahc maximumConnectionsTotal" in { val config = defaultConfig.copy(maxConnectionsTotal = 6) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getMaxConnections must_== 6 + assert(actual.getMaxConnections == 6) } "allow setting ahc maxNumberOfRedirects" in { val config = defaultConfig.copy(maxNumberOfRedirects = 0) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getMaxRedirects must_== 0 + assert(actual.getMaxRedirects == 0) } "allow setting ahc maxRequestRetry" in { val config = defaultConfig.copy(maxRequestRetry = 99) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.getMaxRequestRetry must_== 99 + assert(actual.getMaxRequestRetry == 99) } "allow setting ahc disableUrlEncoding" in { val config = defaultConfig.copy(disableUrlEncoding = true) val builder = new AhcConfigBuilder(config) val actual = builder.build() - actual.isDisableUrlEncodingForBoundRequests must_== true + assert(actual.isDisableUrlEncodingForBoundRequests == true) } } @@ -177,12 +177,12 @@ class AhcConfigBuilderSpec extends Specification { val config = defaultConfig.copy(wsClientConfig = wsConfig) val builder = new AhcConfigBuilder(config) - sslConfig.protocol must_== "TLSv1.2" + assert(sslConfig.protocol == "TLSv1.2") val asyncClientConfig = builder.build() // ...and return a result so specs2 is happy. - asyncClientConfig.getSslEngineFactory must not(beNull) + assert(asyncClientConfig.getSslEngineFactory != null) } "should validate certificates" in { @@ -192,7 +192,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val asyncConfig = builder.build() - asyncConfig.isUseInsecureTrustManager must beFalse + assert(asyncConfig.isUseInsecureTrustManager == false) } "should disable the hostname verifier if loose.acceptAnyCertificate is enabled" in { @@ -203,7 +203,7 @@ class AhcConfigBuilderSpec extends Specification { val builder = new AhcConfigBuilder(config) val asyncConfig = builder.build() - asyncConfig.isUseInsecureTrustManager must beTrue + assert(asyncConfig.isUseInsecureTrustManager) } } @@ -218,7 +218,7 @@ class AhcConfigBuilderSpec extends Specification { val actual = builder.configureProtocols(existingProtocols, sslConfig) - actual.toSeq must containTheSameElementsAs(Protocols.recommendedProtocols.toIndexedSeq) + assert(actual.toSet == Protocols.recommendedProtocols.toSet) } "provide explicit protocols if specified" in { @@ -231,7 +231,7 @@ class AhcConfigBuilderSpec extends Specification { val actual = builder.configureProtocols(existingProtocols, sslConfig) - actual.toSeq must containTheSameElementsAs(Seq("derp", "baz", "quux")) + assert(actual.toSet == Set("derp", "baz", "quux")) } } @@ -247,7 +247,7 @@ class AhcConfigBuilderSpec extends Specification { val actual = builder.configureCipherSuites(existingCiphers, sslConfig) - actual.toSeq must containTheSameElementsAs(Seq("goodone", "goodtwo")) + assert(actual.toSet == Set("goodone", "goodtwo")) } } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSClientConfigParserSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSClientConfigParserSpec.scala index e5f27948..d104962c 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSClientConfigParserSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSClientConfigParserSpec.scala @@ -5,12 +5,12 @@ package play.api.libs.ws.ahc import com.typesafe.config.ConfigFactory -import org.specs2.mutable._ +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.ws.WSClientConfig import scala.concurrent.duration._ -class AhcWSClientConfigParserSpec extends Specification { +class AhcWSClientConfigParserSpec extends AnyWordSpec { val defaultWsConfig = WSClientConfig() val defaultConfig = AhcWSClientConfig(defaultWsConfig) @@ -30,15 +30,15 @@ class AhcWSClientConfigParserSpec extends Specification { // since we use typesafe ssl-config we can't match the objects directly since they aren't case classes, // and also AhcWSClientConfig has a duration which will be parsed into nanocseconds while the case class uses minutes - s1.wsClientConfig.toString must_== s2.wsClientConfig.toString - s1.maxConnectionsPerHost must_== s2.maxConnectionsPerHost - s1.maxConnectionsTotal must_== s2.maxConnectionsTotal - s1.maxConnectionLifetime must_== s2.maxConnectionLifetime - s1.idleConnectionInPoolTimeout must_== s2.idleConnectionInPoolTimeout - s1.maxNumberOfRedirects must_== s2.maxNumberOfRedirects - s1.maxRequestRetry must_== s2.maxRequestRetry - s1.disableUrlEncoding must_== s2.disableUrlEncoding - s1.keepAlive must_== s2.keepAlive + assert(s1.wsClientConfig.toString == s2.wsClientConfig.toString) + assert(s1.maxConnectionsPerHost == s2.maxConnectionsPerHost) + assert(s1.maxConnectionsTotal == s2.maxConnectionsTotal) + assert(s1.maxConnectionLifetime == s2.maxConnectionLifetime) + assert(s1.idleConnectionInPoolTimeout == s2.idleConnectionInPoolTimeout) + assert(s1.maxNumberOfRedirects == s2.maxNumberOfRedirects) + assert(s1.maxRequestRetry == s2.maxRequestRetry) + assert(s1.disableUrlEncoding == s2.disableUrlEncoding) + assert(s1.keepAlive == s2.keepAlive) } "parse ws ahc section" in { @@ -54,22 +54,22 @@ class AhcWSClientConfigParserSpec extends Specification { |play.ws.ahc.keepAlive = false """.stripMargin) - actual.maxConnectionsPerHost must_== 3 - actual.maxConnectionsTotal must_== 6 - actual.maxConnectionLifetime must_== 1.minute - actual.idleConnectionInPoolTimeout must_== 30.seconds - actual.connectionPoolCleanerPeriod must_== 10.seconds - actual.maxNumberOfRedirects must_== 0 - actual.maxRequestRetry must_== 99 - actual.disableUrlEncoding must beTrue - actual.keepAlive must beFalse + assert(actual.maxConnectionsPerHost == 3) + assert(actual.maxConnectionsTotal == 6) + assert(actual.maxConnectionLifetime == 1.minute) + assert(actual.idleConnectionInPoolTimeout == 30.seconds) + assert(actual.connectionPoolCleanerPeriod == 10.seconds) + assert(actual.maxNumberOfRedirects == 0) + assert(actual.maxRequestRetry == 99) + assert(actual.disableUrlEncoding) + assert(actual.keepAlive == false) } "with keepAlive" should { "parse keepAlive default as true" in { val actual = parseThis("""""".stripMargin) - actual.keepAlive must beTrue + assert(actual.keepAlive) } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestSpec.scala index c6194e7c..38cc7924 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSRequestSpec.scala @@ -12,9 +12,9 @@ import org.apache.pekko.stream.Materializer import org.apache.pekko.util.ByteString import org.mockito.Mockito -import org.specs2.execute.Result -import org.specs2.mutable.Specification -import org.specs2.specification.AfterAll +import org.scalatest.BeforeAndAfterAll +import org.scalatest.OptionValues +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.oauth.ConsumerKey import play.api.libs.oauth.RequestToken @@ -28,9 +28,12 @@ import play.shaded.ahc.org.asynchttpclient.{ Request => AHCRequest } import scala.reflect.ClassTag -class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReadables with DefaultBodyWritables { - - sequential +class AhcWSRequestSpec + extends AnyWordSpec + with BeforeAndAfterAll + with DefaultBodyReadables + with DefaultBodyWritables + with OptionValues { private def mock[A](implicit a: ClassTag[A]): A = Mockito.mock(a.runtimeClass).asInstanceOf[A] @@ -44,11 +47,11 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada system.terminate() } - def withClient(block: StandaloneWSClient => Result): Result = { + def withClient[A](block: StandaloneWSClient => A): A = { block(wsClient) } - "Given the full URL" in { + "Given the full URL" should { implicit val materializer: Materializer = mock[org.apache.pekko.stream.Materializer] val client = mock[StandaloneAhcWSClient] @@ -56,46 +59,56 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada "request withQueryStringParameters" in { val request = StandaloneAhcWSRequest(client, "http://example.com") - request.uri.toString must equalTo("http://example.com") - request.withQueryStringParameters("bar" -> "baz").uri.toString must equalTo("http://example.com?bar=baz") - request.withQueryStringParameters("bar" -> "baz", "bar" -> "bah").uri.toString must equalTo( - "http://example.com?bar=bah&bar=baz" + assert(request.uri.toString == "http://example.com") + assert(request.withQueryStringParameters("bar" -> "baz").uri.toString == "http://example.com?bar=baz") + assert( + request + .withQueryStringParameters("bar" -> "baz", "bar" -> "bah") + .uri + .toString == "http://example.com?bar=bah&bar=baz" ) } "correctly URL-encode the query string part" in { val request = StandaloneAhcWSRequest(client, "http://example.com") - request.withQueryStringParameters("&" -> "=").uri.toString must equalTo("http://example.com?%26=%3D") + assert(request.withQueryStringParameters("&" -> "=").uri.toString == "http://example.com?%26=%3D") } "set all query string parameters" in { val request = StandaloneAhcWSRequest(client, "http://example.com") - request.withQueryStringParameters("bar" -> "baz").uri.toString must equalTo("http://example.com?bar=baz") - request.withQueryStringParameters("bar" -> "baz", "bar" -> "bah").uri.toString must equalTo( - "http://example.com?bar=bah&bar=baz" + assert(request.withQueryStringParameters("bar" -> "baz").uri.toString == "http://example.com?bar=baz") + assert( + request + .withQueryStringParameters("bar" -> "baz", "bar" -> "bah") + .uri + .toString == "http://example.com?bar=bah&bar=baz" ) } "discard old query parameters when setting new ones" in { val request = StandaloneAhcWSRequest(client, "http://example.com") - request - .withQueryStringParameters("bar" -> "baz") - .withQueryStringParameters("bar" -> "bah") - .uri - .toString must equalTo("http://example.com?bar=bah") + assert( + request + .withQueryStringParameters("bar" -> "baz") + .withQueryStringParameters("bar" -> "bah") + .uri + .toString == "http://example.com?bar=bah" + ) } "add query string param" in { val request = StandaloneAhcWSRequest(client, "http://example.com") - request - .withQueryStringParameters("bar" -> "baz") - .addQueryStringParameters("bar" -> "bah") - .uri - .toString must equalTo("http://example.com?bar=bah&bar=baz") + assert( + request + .withQueryStringParameters("bar" -> "baz") + .addQueryStringParameters("bar" -> "bah") + .uri + .toString == "http://example.com?bar=bah&bar=baz" + ) } "support adding several query string values for a parameter" in { @@ -104,9 +117,10 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withQueryStringParameters("play" -> "foo1") .addQueryStringParameters("play" -> "foo2") - newRequest.queryString.get("play") must beSome[Seq[String]].which(_.contains("foo1")) - newRequest.queryString.get("play") must beSome[Seq[String]].which(_.contains("foo2")) - newRequest.queryString.get("play") must beSome[Seq[String]].which(_.size == 2) + val actual = newRequest.queryString.get("play").value + assert(actual.contains("foo1")) + assert(actual.contains("foo2")) + assert(actual.size == 2) } "support several query string values for a parameter" in { @@ -118,16 +132,16 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .buildRequest() val paramsList: Seq[Param] = req.getQueryParams.asScala.toSeq - paramsList.exists(p => (p.getName == "foo") && (p.getValue == "foo1")) must beTrue - paramsList.exists(p => (p.getName == "foo") && (p.getValue == "foo2")) must beTrue - paramsList.count(p => p.getName == "foo") must beEqualTo(2) + assert(paramsList.exists(p => (p.getName == "foo") && (p.getValue == "foo1"))) + assert(paramsList.exists(p => (p.getName == "foo") && (p.getValue == "foo2"))) + assert(paramsList.count(p => p.getName == "foo") == 2) } } } - "For Cookies" in { + "For Cookies" should { def cookie(name: String, value: String): WSCookie = DefaultWSCookie(name, value) @@ -139,9 +153,9 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getCookies.asScala must size(1) - req.getCookies.asScala.head.name must beEqualTo("cookie1") - req.getCookies.asScala.head.value must beEqualTo("value1") + assert(req.getCookies.asScala.size == 1) + assert(req.getCookies.asScala.head.name == "cookie1") + assert(req.getCookies.asScala.head.value == "value1") } } @@ -153,12 +167,12 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getCookies.asScala must size(2) - req.getCookies.asScala.head.name must beEqualTo("cookie1") - req.getCookies.asScala.head.value must beEqualTo("value1") + assert(req.getCookies.asScala.size == 2) + assert(req.getCookies.asScala.head.name == "cookie1") + assert(req.getCookies.asScala.head.value == "value1") - req.getCookies.asScala(1).name must beEqualTo("cookie2") - req.getCookies.asScala(1).value must beEqualTo("value2") + assert(req.getCookies.asScala(1).name == "cookie2") + assert(req.getCookies.asScala(1).value == "value2") } } @@ -171,12 +185,12 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getCookies.asScala must size(2) - req.getCookies.asScala.head.name must beEqualTo("cookie1") - req.getCookies.asScala.head.value must beEqualTo("value1") + assert(req.getCookies.asScala.size == 2) + assert(req.getCookies.asScala.head.name == "cookie1") + assert(req.getCookies.asScala.head.value == "value1") - req.getCookies.asScala(1).name must beEqualTo("cookie2") - req.getCookies.asScala(1).value must beEqualTo("value2") + assert(req.getCookies.asScala(1).name == "cookie2") + assert(req.getCookies.asScala(1).value == "value2") } } @@ -189,12 +203,12 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getCookies.asScala must size(2) - req.getCookies.asScala.head.name must beEqualTo("cookie3") - req.getCookies.asScala.head.value must beEqualTo("value3") + assert(req.getCookies.asScala.size == 2) + assert(req.getCookies.asScala.head.name == "cookie3") + assert(req.getCookies.asScala.head.value == "value3") - req.getCookies.asScala(1).name must beEqualTo("cookie4") - req.getCookies.asScala(1).value must beEqualTo("value4") + assert(req.getCookies.asScala(1).name == "cookie4") + assert(req.getCookies.asScala(1).value == "value4") } } @@ -207,13 +221,13 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.entries.asScala must size(1) - req.getHeaders.get("Cookie") must beEqualTo("cookie1=value1, cookie2=value2") + assert(req.getHeaders.entries.asScala.size == 1) + assert(req.getHeaders.get("Cookie") == "cookie1=value1, cookie2=value2") } } } - "For HTTP Headers" in { + "For HTTP Headers" should { "support setting headers" in { withClient { client => @@ -222,7 +236,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withHttpHeaders("key" -> "value1", "key" -> "value2") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.getAll("key").asScala must containTheSameElementsAs(Seq("value1", "value2")) + assert(req.getHeaders.getAll("key").asScala.toSet == Set("value1", "value2")) } } @@ -234,8 +248,8 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withHttpHeaders("key2" -> "value2") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("key1") must beNull - req.getHeaders.get("key2") must beEqualTo("value2") + assert(req.getHeaders.get("key1") == null) + assert(req.getHeaders.get("key2") == "value2") } } @@ -247,7 +261,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .addHttpHeaders("key" -> "value2") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.getAll("key").asScala must containTheSameElementsAs(Seq("value1", "value2")) + assert(req.getHeaders.getAll("key").asScala.toSet == Set("value1", "value2")) } } @@ -259,8 +273,8 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .addHttpHeaders("key2" -> "value2") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("key1") must beEqualTo("value1") - req.getHeaders.get("key2") must beEqualTo("value2") + assert(req.getHeaders.get("key1") == "value1") + assert(req.getHeaders.get("key2") == "value2") } } @@ -274,8 +288,10 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withBody("I am a text/plain body") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.getAll(HttpHeaderNames.CONTENT_TYPE.toString()).asScala must_== Seq( - "fake/contenttype; charset=utf-8" + assert( + req.getHeaders.getAll(HttpHeaderNames.CONTENT_TYPE.toString()).asScala == Seq( + "fake/contenttype; charset=utf-8" + ) ) } } @@ -287,7 +303,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withHttpHeaders("key" -> "value1", "KEY" -> "value2") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.getAll("key").asScala must containTheSameElementsAs(Seq("value1", "value2")) + assert(req.getHeaders.getAll("key").asScala.toSet == Set("value1", "value2")) } } @@ -297,7 +313,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .url("http://playframework.com/") .withHttpHeaders("Key1" -> "value1", "Key2" -> "value2") - req.header("Key1") must beSome("value1") + assert(req.header("Key1") == Some("value1")) } } @@ -307,7 +323,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .url("http://playframework.com/") .withHttpHeaders("Key1" -> "value1", "Key1" -> "value2", "Key2" -> "some") - req.headerValues("Key1") must containTheSameElementsAs(Seq("value1", "value2")) + assert(req.headerValues("Key1").toSet == Set("value1", "value2")) } } @@ -317,7 +333,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .url("http://playframework.com/") .withHttpHeaders("Key1" -> "value1", "Key1" -> "value2", "Key2" -> "some") - req.header("Non") must beNone + assert(req.header("Non").isEmpty) } } @@ -327,7 +343,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .url("http://playframework.com/") .withHttpHeaders("Key1" -> "value1", "Key1" -> "value2", "Key2" -> "some") - req.headerValues("Non") must beEmpty + assert(req.headerValues("Non").isEmpty) } } @@ -337,13 +353,13 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .url("http://playframework.com/") .withHttpHeaders("Key1" -> "value1", "Key1" -> "value2", "Key2" -> "value") - req.headers("Key1") must containTheSameElementsAs(Seq("value1", "value2")) - req.headers("Key2") must containTheSameElementsAs(Seq("value")) + assert(req.headers("Key1").toSet == Set("value1", "value2")) + assert(req.headers("Key2").toSet == Set("value")) } } } - "For requests with body" in { + "For requests with body" should { "Have form params for content type application/x-www-form-urlencoded" in { withClient { client => @@ -352,7 +368,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withBody(Map("param1" -> Seq("value1"))) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (new String(req.getByteData, "UTF-8")) must_== "param1=value1" + assert((new String(req.getByteData, "UTF-8")) == "param1=value1") } } @@ -369,13 +385,15 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() // Note we use getFormParams instead of getByteData here. - req.getFormParams.asScala must containTheSameElementsAs( - List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")) + assert( + req.getFormParams.asScala.toSet == List( + new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1") + ).toSet ) - req.getByteData must beNull // should NOT result in byte data. + assert(req.getByteData == null) // should NOT result in byte data. val headers = req.getHeaders - headers.get("Content-Length") must beNull + assert(headers.get("Content-Length") == null) } } @@ -391,7 +409,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - reqEmptyParams.getFormParams.asScala must beEmpty + assert(reqEmptyParams.getFormParams.asScala.isEmpty) } } @@ -404,9 +422,9 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (new String(req.getByteData, "UTF-8")) must be_==("HELLO WORLD") + assert((new String(req.getByteData, "UTF-8")) == "HELLO WORLD") val headers = req.getHeaders - headers.get("Content-Length") must beNull + assert(headers.get("Content-Length") == null) } } @@ -421,7 +439,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withBody("HELLO WORLD") // and body is set to string (see #5221) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (new String(req.getByteData, "UTF-8")) must be_==("HELLO WORLD") // should result in byte data. + assert((new String(req.getByteData, "UTF-8")) == "HELLO WORLD") // should result in byte data. } } @@ -434,7 +452,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - ByteString(req.getByteData) must_== binData + assert(ByteString(req.getByteData) == binData) } "Preserve existing headers when setting the body" in { @@ -445,12 +463,12 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withBody("HELLO WORLD") // will set content-type header .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get("Some-Header") must beEqualTo("Some-Value") + assert(req.getHeaders.get("Some-Header") == "Some-Value") } } } - "When using a Proxy Server" in { + "When using a Proxy Server" should { "support a proxy server with basic" in withClient { client => val proxy = DefaultWSProxyServer( @@ -467,11 +485,11 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .buildRequest() val actual = req.getProxyServer - (actual.getHost must be).equalTo("localhost") - (actual.getPort must be).equalTo(8080) - (actual.getRealm.getPrincipal must be).equalTo("principal") - (actual.getRealm.getPassword must be).equalTo("password") - (actual.getRealm.getScheme must be).equalTo(AuthScheme.BASIC) + assert(actual.getHost == "localhost") + assert(actual.getPort == 8080) + assert(actual.getRealm.getPrincipal == "principal") + assert(actual.getRealm.getPassword == "password") + assert(actual.getRealm.getScheme == AuthScheme.BASIC) } "support a proxy server with NTLM" in withClient { client => @@ -490,12 +508,12 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .buildRequest() val actual = req.getProxyServer - (actual.getHost must be).equalTo("localhost") - (actual.getPort must be).equalTo(8080) - (actual.getRealm.getPrincipal must be).equalTo("principal") - (actual.getRealm.getPassword must be).equalTo("password") - (actual.getRealm.getNtlmDomain must be).equalTo("somentlmdomain") - (actual.getRealm.getScheme must be).equalTo(AuthScheme.NTLM) + assert(actual.getHost == "localhost") + assert(actual.getPort == 8080) + assert(actual.getRealm.getPrincipal == "principal") + assert(actual.getRealm.getPassword == "password") + assert(actual.getRealm.getNtlmDomain == "somentlmdomain") + assert(actual.getRealm.getScheme == AuthScheme.NTLM) } "support a proxy server" in withClient { client => @@ -507,19 +525,19 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .buildRequest() val actual = req.getProxyServer - (actual.getHost must be).equalTo("localhost") - (actual.getPort must be).equalTo(8080) - actual.getRealm must beNull + assert(actual.getHost == "localhost") + assert(actual.getPort == 8080) + assert(actual.getRealm == null) } } - "StandaloneAhcWSRequest supports" in { + "StandaloneAhcWSRequest supports" should { "replace url" in withClient { client => val req = client .url("http://playframework.com/") .withUrl("http://www.example.com/") - req.url must_=== "http://www.example.com/" + assert(req.url == "http://www.example.com/") } "a custom signature calculator" in { @@ -538,7 +556,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .sign(calc) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - called must beTrue + assert(called) } } @@ -548,7 +566,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withVirtualHost("192.168.1.1") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (req.getVirtualHost must be).equalTo("192.168.1.1") + assert(req.getVirtualHost == "192.168.1.1") } "follow redirects" in withClient { client => @@ -557,7 +575,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withFollowRedirects(follow = true) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getFollowRedirect must beEqualTo(true) + assert(req.getFollowRedirect == true) } "enable url encoding by default" in withClient { client => @@ -566,7 +584,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .addQueryStringParameters("abc+def" -> "uvw+xyz") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getUrl must beEqualTo("http://playframework.com/?abc%2Bdef=uvw%2Bxyz") + assert(req.getUrl == "http://playframework.com/?abc%2Bdef=uvw%2Bxyz") } "disable url encoding globally via client config" in { @@ -576,7 +594,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .addQueryStringParameters("abc+def" -> "uvw+xyz") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getUrl must beEqualTo("http://playframework.com/?abc+def=uvw+xyz") + assert(req.getUrl == "http://playframework.com/?abc+def=uvw+xyz") } "disable url encoding for specific request only" in withClient { client => @@ -586,7 +604,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withDisableUrlEncoding(disableUrlEncoding = true) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getUrl must beEqualTo("http://playframework.com/?abc+def=uvw+xyz") + assert(req.getUrl == "http://playframework.com/?abc+def=uvw+xyz") } "finite timeout" in withClient { client => @@ -595,7 +613,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withRequestTimeout(1000.millis) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (req.getRequestTimeout must be).equalTo(1000) + assert(req.getRequestTimeout == 1000) } "infinite timeout" in withClient { client => @@ -604,28 +622,30 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withRequestTimeout(Duration.Inf) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (req.getRequestTimeout must be).equalTo(-1) + assert(req.getRequestTimeout == -1) } "no negative timeout" in withClient { client => - client.url("http://playframework.com/").withRequestTimeout(-1.millis) should throwAn[IllegalArgumentException] + assertThrows[IllegalArgumentException] { client.url("http://playframework.com/").withRequestTimeout(-1.millis) } } "no timeout greater than Int.MaxValue" in withClient { client => - client - .url("http://playframework.com/") - .withRequestTimeout((Int.MaxValue.toLong + 1).millis) should throwAn[IllegalArgumentException] + assertThrows[IllegalArgumentException] { + client + .url("http://playframework.com/") + .withRequestTimeout((Int.MaxValue.toLong + 1).millis) + } } } - "Set Realm.UsePreemptiveAuth" in { + "Set Realm.UsePreemptiveAuth" should { "to false when WSAuthScheme.DIGEST being used" in withClient { client => val req = client .url("http://playframework.com/") .withAuth("usr", "pwd", WSAuthScheme.DIGEST) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getRealm.isUsePreemptiveAuth must beFalse + assert(req.getRealm.isUsePreemptiveAuth == false) } "to true when WSAuthScheme.DIGEST not being used" in withClient { client => @@ -634,7 +654,7 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withAuth("usr", "pwd", WSAuthScheme.BASIC) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getRealm.isUsePreemptiveAuth must beTrue + assert(req.getRealm.isUsePreemptiveAuth) } } @@ -646,10 +666,10 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - (new String(req.getByteData, "UTF-8")) must be_==("param1=value1") // should result in byte data. + assert((new String(req.getByteData, "UTF-8")) == "param1=value1") // should result in byte data. val headers = req.getHeaders - headers.get("Content-Length") must_== "9001" + assert(headers.get("Content-Length") == "9001") } "Remove a user defined content length header if we are parsing body explicitly when signed" in withClient { client => @@ -666,11 +686,11 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .buildRequest() val headers = req.getHeaders - req.getByteData must beNull // should NOT result in byte data. - req.getFormParams.asScala must containTheSameElementsAs( - List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")) + assert(req.getByteData == null) // should NOT result in byte data. + assert( + req.getFormParams.asScala.toSet == List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")).toSet ) - headers.get("Content-Length") must beNull // no content length! + assert(headers.get("Content-Length") == null) // no content length! } "Verify Content-Type header is passed through correctly" in withClient { client => @@ -681,7 +701,9 @@ class AhcWSRequestSpec extends Specification with AfterAll with DefaultBodyReada .withBody("HELLO WORLD") .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.getAll(HttpHeaderNames.CONTENT_TYPE.toString()).asScala must_== Seq("text/plain; charset=US-ASCII") + assert( + req.getHeaders.getAll(HttpHeaderNames.CONTENT_TYPE.toString()).asScala == Seq("text/plain; charset=US-ASCII") + ) } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSResponseSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSResponseSpec.scala index eeebc303..f0ddf358 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSResponseSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/AhcWSResponseSpec.scala @@ -10,7 +10,8 @@ import java.util import org.apache.pekko.util.ByteString import org.mockito.Mockito.when import org.mockito.Mockito -import org.specs2.mutable.Specification +import org.scalatest.OptionValues +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.ws._ import play.shaded.ahc.io.netty.handler.codec.http.DefaultHttpHeaders import play.shaded.ahc.io.netty.handler.codec.http.cookie.DefaultCookie @@ -19,7 +20,7 @@ import play.shaded.ahc.org.asynchttpclient.{ Response => AHCResponse } import scala.reflect.ClassTag -class AhcWSResponseSpec extends Specification with DefaultBodyReadables with DefaultBodyWritables { +class AhcWSResponseSpec extends AnyWordSpec with DefaultBodyReadables with DefaultBodyWritables with OptionValues { private def mock[A](implicit a: ClassTag[A]): A = Mockito.mock(a.runtimeClass).asInstanceOf[A] @@ -39,13 +40,13 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def val cookies: Seq[WSCookie] = response.cookies val cookie = cookies.head - cookie.name must ===(name) - cookie.value must ===(value) - cookie.path must beSome(path) - cookie.domain must beSome(domain) - cookie.maxAge must beSome(maxAge) - cookie.secure must beFalse - cookie.httpOnly must beFalse + assert(cookie.name == name) + assert(cookie.value == value) + assert(cookie.path == Some(path)) + assert(cookie.domain == Some(domain)) + assert(cookie.maxAge == Some(maxAge)) + assert(cookie.secure == false) + assert(cookie.httpOnly == false) } "get a single cookie from an AHC response" in { @@ -58,16 +59,14 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def val response = StandaloneAhcWSResponse(ahcResponse) - val optionCookie = response.cookie("someName") - optionCookie must beSome[WSCookie].which { cookie => - cookie.name must ===(name) - cookie.value must ===(value) - cookie.path must beSome(path) - cookie.domain must beSome(domain) - cookie.maxAge must beSome(maxAge) - cookie.secure must beFalse - cookie.httpOnly must beFalse - } + val cookie = response.cookie("someName").value + assert(cookie.name == name) + assert(cookie.value == value) + assert(cookie.path == Some(path)) + assert(cookie.domain == Some(domain)) + assert(cookie.maxAge == Some(maxAge)) + assert(cookie.secure == false) + assert(cookie.httpOnly == false) } "return -1 values of expires and maxAge as None" in { @@ -78,10 +77,8 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def val response = StandaloneAhcWSResponse(ahcResponse) - val optionCookie = response.cookie("someName") - optionCookie must beSome[WSCookie].which { cookie => - cookie.maxAge must beNone - } + val cookie = response.cookie("someName").value + assert(cookie.maxAge.isEmpty) } "get the body as bytes from the AHC response" in { @@ -89,7 +86,7 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def val bytes = ByteString(-87, -72, 96, -63, -32, 46, -117, -40, -128, -7, 61, 109, 80, 45, 44, 30) when(ahcResponse.getResponseBodyAsBytes).thenReturn(bytes.toArray) val response = StandaloneAhcWSResponse(ahcResponse) - response.body[ByteString] must_== bytes + assert(response.body[ByteString] == bytes) } "get JSON body as a string from the AHC response" in { @@ -100,70 +97,70 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def when(ahcResponse.getHeaders).thenReturn(ahcHeaders) when(ahcResponse.getResponseBody(StandardCharsets.UTF_8)).thenReturn(json) val response = StandaloneAhcWSResponse(ahcResponse) - response.body[String] must_== json - } - - "get text body as a string from the AHC response" in { - val ahcResponse: AHCResponse = mock[AHCResponse] - val text = "Hello ☺" - when(ahcResponse.getContentType).thenReturn("text/plain") - when(ahcResponse.getResponseBody(StandardCharsets.ISO_8859_1)).thenReturn(text) - val response = StandaloneAhcWSResponse(ahcResponse) - response.body[String] must_== text + assert(response.body[String] == json) } + } - "get headers from an AHC response in a case insensitive map" in { - val ahcResponse: AHCResponse = mock[AHCResponse] - val ahcHeaders = new DefaultHttpHeaders(true) - ahcHeaders.add("Foo", "bar") - ahcHeaders.add("Foo", "baz") - ahcHeaders.add("Bar", "baz") - when(ahcResponse.getHeaders).thenReturn(ahcHeaders) - val response = StandaloneAhcWSResponse(ahcResponse) - val headers = response.headers - headers must beEqualTo(Map("Foo" -> Seq("bar", "baz"), "Bar" -> Seq("baz"))) - headers.contains("foo") must beTrue - headers.contains("Foo") must beTrue - headers.contains("BAR") must beTrue - headers.contains("Bar") must beTrue - } + "get text body as a string from the AHC response" in { + val ahcResponse: AHCResponse = mock[AHCResponse] + val text = "Hello ☺" + when(ahcResponse.getContentType).thenReturn("text/plain") + when(ahcResponse.getResponseBody(StandardCharsets.ISO_8859_1)).thenReturn(text) + val response = StandaloneAhcWSResponse(ahcResponse) + assert(response.body[String] == text) + } - "get a single header" in { - val ahcResponse: AHCResponse = mock[AHCResponse] - val ahcHeaders = new DefaultHttpHeaders(true) - ahcHeaders.add("Foo", "bar") - ahcHeaders.add("Foo", "baz") - ahcHeaders.add("Bar", "baz") - when(ahcResponse.getHeaders).thenReturn(ahcHeaders) - val response = StandaloneAhcWSResponse(ahcResponse) + "get headers from an AHC response in a case insensitive map" in { + val ahcResponse: AHCResponse = mock[AHCResponse] + val ahcHeaders = new DefaultHttpHeaders(true) + ahcHeaders.add("Foo", "bar") + ahcHeaders.add("Foo", "baz") + ahcHeaders.add("Bar", "baz") + when(ahcResponse.getHeaders).thenReturn(ahcHeaders) + val response = StandaloneAhcWSResponse(ahcResponse) + val headers = response.headers + assert(headers == Map("Foo" -> Seq("bar", "baz"), "Bar" -> Seq("baz"))) + assert(headers.contains("foo")) + assert(headers.contains("Foo")) + assert(headers.contains("BAR")) + assert(headers.contains("Bar")) + } - response.header("Foo") must beSome("bar") - response.header("Bar") must beSome("baz") - } + "get a single header" in { + val ahcResponse: AHCResponse = mock[AHCResponse] + val ahcHeaders = new DefaultHttpHeaders(true) + ahcHeaders.add("Foo", "bar") + ahcHeaders.add("Foo", "baz") + ahcHeaders.add("Bar", "baz") + when(ahcResponse.getHeaders).thenReturn(ahcHeaders) + val response = StandaloneAhcWSResponse(ahcResponse) + + assert(response.header("Foo") == Some("bar")) + assert(response.header("Bar") == Some("baz")) + } - "get none when header does not exists" in { - val ahcResponse: AHCResponse = mock[AHCResponse] - val ahcHeaders = new DefaultHttpHeaders(true) - ahcHeaders.add("Foo", "bar") - ahcHeaders.add("Foo", "baz") - ahcHeaders.add("Bar", "baz") - when(ahcResponse.getHeaders).thenReturn(ahcHeaders) - val response = StandaloneAhcWSResponse(ahcResponse) + "get none when header does not exists" in { + val ahcResponse: AHCResponse = mock[AHCResponse] + val ahcHeaders = new DefaultHttpHeaders(true) + ahcHeaders.add("Foo", "bar") + ahcHeaders.add("Foo", "baz") + ahcHeaders.add("Bar", "baz") + when(ahcResponse.getHeaders).thenReturn(ahcHeaders) + val response = StandaloneAhcWSResponse(ahcResponse) - response.header("Non") must beNone - } + assert(response.header("Non").isEmpty) + } - "get all values for a header" in { - val ahcResponse: AHCResponse = mock[AHCResponse] - val ahcHeaders = new DefaultHttpHeaders(true) - ahcHeaders.add("Foo", "bar") - ahcHeaders.add("Foo", "baz") - ahcHeaders.add("Bar", "baz") - when(ahcResponse.getHeaders).thenReturn(ahcHeaders) - val response = StandaloneAhcWSResponse(ahcResponse) + "get all values for a header" in { + val ahcResponse: AHCResponse = mock[AHCResponse] + val ahcHeaders = new DefaultHttpHeaders(true) + ahcHeaders.add("Foo", "bar") + ahcHeaders.add("Foo", "baz") + ahcHeaders.add("Bar", "baz") + when(ahcResponse.getHeaders).thenReturn(ahcHeaders) + val response = StandaloneAhcWSResponse(ahcResponse) - response.headerValues("Foo") must beEqualTo(Seq("bar", "baz")) - } + assert(response.headerValues("Foo") == Seq("bar", "baz")) } def asCookie( diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/AhcWSCacheSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/AhcWSCacheSpec.scala index c077ab0d..acd69788 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/AhcWSCacheSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/AhcWSCacheSpec.scala @@ -8,14 +8,15 @@ import java.net.URI import org.playframework.cachecontrol.HttpDate._ import org.playframework.cachecontrol._ -import org.specs2.mutable.Specification +import org.scalatest.OptionValues +import org.scalatest.wordspec.AnyWordSpec import play.shaded.ahc.io.netty.handler.codec.http.DefaultHttpHeaders import play.shaded.ahc.io.netty.handler.codec.http.HttpHeaders import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig import play.shaded.ahc.org.asynchttpclient.Request import play.shaded.ahc.org.asynchttpclient.RequestBuilder -class AhcWSCacheSpec extends Specification { +class AhcWSCacheSpec extends AnyWordSpec with OptionValues { "freshness heuristics flag" should { @@ -31,11 +32,9 @@ class AhcWSCacheSpec extends Specification { val response: CacheResponse = StoredResponse(uri, 200, Map(HeaderName("Last-Modified") -> Seq(lastModifiedDate)), "GET", Map()) - val actual = cache.calculateFreshnessFromHeuristic(request, response) + val actual = cache.calculateFreshnessFromHeuristic(request, response).value - actual must beSome[Seconds].which { case value => - value must be_==(Seconds.seconds(360)) // 0.1 hours - } + assert(actual == Seconds.seconds(360)) // 0.1 hours } "be disabled when set to false" in { @@ -52,7 +51,7 @@ class AhcWSCacheSpec extends Specification { val actual = cache.calculateFreshnessFromHeuristic(request, response) - actual must beNone + assert(actual.isEmpty) } } @@ -70,13 +69,10 @@ class AhcWSCacheSpec extends Specification { val request = generateRequest(url)(headers => headers.add("Accept-Encoding", "gzip")) val response = CacheableResponse(200, url, achConfig).withHeaders("Vary" -> "Accept-Encoding") - val actual = cache.calculateSecondaryKeys(request, response) - - actual must beSome[Map[HeaderName, Seq[String]]].which { d => - d must haveKey(HeaderName("Accept-Encoding")) - d(HeaderName("Accept-Encoding")) must be_==(Seq("gzip")) - } + val d = cache.calculateSecondaryKeys(request, response).value + assert(d.isDefinedAt(HeaderName("Accept-Encoding"))) + assert(d(HeaderName("Accept-Encoding")) == Seq("gzip")) } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/BackgroundAsyncHandlerSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/BackgroundAsyncHandlerSpec.scala index 38c57623..5d2ad89b 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/BackgroundAsyncHandlerSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/BackgroundAsyncHandlerSpec.scala @@ -4,9 +4,9 @@ package play.api.libs.ws.ahc.cache -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec -class BackgroundAsyncHandlerSpec extends Specification { +class BackgroundAsyncHandlerSpec extends AnyWordSpec { "BackgroundAsyncHandler" should { diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheAsyncHandlerSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheAsyncHandlerSpec.scala index 70a3ee8e..106b3392 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheAsyncHandlerSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheAsyncHandlerSpec.scala @@ -4,9 +4,9 @@ package play.api.libs.ws.ahc.cache -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec -class CacheAsyncHandlerSpec extends Specification { +class CacheAsyncHandlerSpec extends AnyWordSpec { "CacheAsyncHandlerSpec" should { diff --git a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheableResponseSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheableResponseSpec.scala index fd668627..f448d314 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheableResponseSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/api/libs/ws/ahc/cache/CacheableResponseSpec.scala @@ -4,38 +4,38 @@ package play.api.libs.ws.ahc.cache -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec import play.shaded.ahc.io.netty.handler.codec.http.HttpHeaders.Names._ import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig -class CacheableResponseSpec extends Specification { +class CacheableResponseSpec extends AnyWordSpec { val achConfig = new DefaultAsyncHttpClientConfig.Builder().build() "CacheableResponse" should { - "get body" in { + "get body" should { "when it is text/plain" in { val response = CacheableResponse(200, "https://playframework.com/", "PlayFramework Homepage", achConfig) .withHeaders(CONTENT_TYPE -> "text/plain") - response.getResponseBody must beEqualTo("PlayFramework Homepage") - response.getContentType must beEqualTo("text/plain") + assert(response.getResponseBody == "PlayFramework Homepage") + assert(response.getContentType == "text/plain") } "when it is application/json" in { val response = CacheableResponse(200, "https://playframework.com/", """{ "a": "b" }""", achConfig).withHeaders( "Content-Type" -> "application/json" ) - response.getResponseBody must beEqualTo("""{ "a": "b" }""") - response.getContentType must beEqualTo("application/json") + assert(response.getResponseBody == """{ "a": "b" }""") + assert(response.getContentType == "application/json") } "when it is application/json; charset=utf-8" in { val response = CacheableResponse(200, "https://playframework.com/", """{ "a": "b" }""", achConfig).withHeaders( "Content-Type" -> "application/json; charset=utf-8" ) - response.getResponseBody must beEqualTo("""{ "a": "b" }""") - response.getContentType must beEqualTo("application/json; charset=utf-8") + assert(response.getResponseBody == """{ "a": "b" }""") + assert(response.getContentType == "application/json; charset=utf-8") } } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSRequestSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSRequestSpec.scala index 24b14fb3..71836e3b 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSRequestSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSRequestSpec.scala @@ -9,7 +9,7 @@ import com.typesafe.config.ConfigFactory import java.time.Duration import java.util.Collections -import org.specs2.mutable._ +import org.scalatest.wordspec.AnyWordSpec import play.libs.oauth.OAuth import play.libs.ws._ import play.shaded.ahc.io.netty.handler.codec.http.HttpHeaderNames @@ -21,7 +21,7 @@ import scala.jdk.CollectionConverters._ import scala.collection.mutable import scala.jdk.OptionConverters._ -class AhcWSRequestSpec extends Specification with DefaultBodyReadables with DefaultBodyWritables { +class AhcWSRequestSpec extends AnyWordSpec with DefaultBodyReadables with DefaultBodyWritables { "AhcWSRequest" should { @@ -30,8 +30,8 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa AhcWSClientConfigFactory.forConfig(ConfigFactory.load(), this.getClass.getClassLoader), /*materializer*/ null ) val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) - request.getMethod must be_==("GET") - request.buildRequest().getMethod must be_==("GET") + assert(request.getMethod == "GET") + assert(request.buildRequest().getMethod == "GET") } "Set virtualHost appropriately" in { @@ -41,7 +41,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) request.setVirtualHost("foo.com") val actual = request.buildRequest().getVirtualHost() - actual must beEqualTo("foo.com") + assert(actual == "foo.com") } "set the url" in { @@ -49,15 +49,13 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa AhcWSClientConfigFactory.forConfig(ConfigFactory.load(), this.getClass.getClassLoader), /*materializer*/ null ) val req = new StandaloneAhcWSRequest(client, "http://playframework.com/", null) - (req.getUrl must be_===("http://playframework.com/")).and { - val setReq = req.setUrl("http://example.com") - (setReq.getUrl must be_===("http://example.com")).and { - setReq must be_===(req) - } - } + assert(req.getUrl == "http://playframework.com/") + val setReq = req.setUrl("http://example.com") + assert(setReq.getUrl == "http://example.com") + assert(setReq == req) } - "For POST requests" in { + "For POST requests" should { "get method" in { val client = StandaloneAhcWSClient.create( @@ -66,7 +64,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa val req = new StandaloneAhcWSRequest(client, "http://playframework.com/", null) .setMethod("POST") - req.getMethod must be_===("POST") + assert(req.getMethod == "POST") } "set text/plain content-types for text bodies" in { @@ -77,7 +75,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .setBody(body("HELLO WORLD")) .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getStringData must be_==("HELLO WORLD") + assert(req.getStringData == "HELLO WORLD") } "sets content type based on a body when its not explicitly set" in { @@ -89,8 +87,8 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() - req.getHeaders.get(HttpHeaderNames.CONTENT_TYPE) must be_==("text/plain; charset=UTF-8") - req.getStringData must be_==("HELLO WORLD") + assert(req.getHeaders.get(HttpHeaderNames.CONTENT_TYPE) == "text/plain; charset=UTF-8") + assert(req.getStringData == "HELLO WORLD") } "keep existing content type when setting body" in { @@ -104,11 +102,9 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .buildRequest() // preserve the content type - req.getHeaders.get(HttpHeaderNames.CONTENT_TYPE) must be_==( - "text/plain+hello; charset=UTF-8" - ) + assert(req.getHeaders.get(HttpHeaderNames.CONTENT_TYPE) == "text/plain+hello; charset=UTF-8") // should result in byte data. - req.getStringData must be_==("HELLO WORLD") + assert(req.getStringData == "HELLO WORLD") } "have form params when passing in map" in { @@ -122,11 +118,13 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .buildRequest() // Must set the form url encoding autoomatically. - req.getHeaders.get("Content-Type") must be_==("application/x-www-form-urlencoded") + assert(req.getHeaders.get("Content-Type") == "application/x-www-form-urlencoded") // Note we use getFormParams instead of getByteData here. - req.getFormParams.asScala must containTheSameElementsAs( - List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")) + assert( + req.getFormParams.asScala.toSet == Set( + new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1") + ) ) } @@ -145,8 +143,10 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .asInstanceOf[StandaloneAhcWSRequest] .buildRequest() // Note we use getFormParams instead of getByteData here. - req.getFormParams.asScala must containTheSameElementsAs( - List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")) + assert( + req.getFormParams.asScala.toSet == Set( + new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1") + ) ) } @@ -167,10 +167,12 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .buildRequest() val headers = req.getHeaders - req.getFormParams.asScala must containTheSameElementsAs( - List(new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1")) + assert( + req.getFormParams.asScala.toSet == Set( + new play.shaded.ahc.org.asynchttpclient.Param("param1", "value1") + ) ) - headers.get("Content-Length") must beNull // no content length! + assert(headers.get("Content-Length") == null) // no content length! } } @@ -188,32 +190,32 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa new StandaloneAhcWSRequest(client, "http://playframework.com/", null) .sign(calc) .buildRequest() - called must beTrue + assert(called) } "setRequestTimeout(java.time.Duration)" should { "support setting a request timeout to a duration" in { - requestWithTimeout(Duration.ofSeconds(1)) must beEqualTo(1000) + assert(requestWithTimeout(Duration.ofSeconds(1)) == 1000) } "support setting a request timeout duration to infinite using -1" in { - requestWithTimeout(Duration.ofMillis(-1)) must beEqualTo(-1) + assert(requestWithTimeout(Duration.ofMillis(-1)) == -1) } "support setting a request timeout duration to infinite using any negative duration" in { - requestWithTimeout(Duration.ofMillis(-2)) must beEqualTo(-1) - requestWithTimeout(Duration.ofMillis(-15)) must beEqualTo(-1) - requestWithTimeout(Duration.ofSeconds(-1)) must beEqualTo(-1) - requestWithTimeout(Duration.ofMillis(java.lang.Integer.MIN_VALUE)) must beEqualTo(-1) + assert(requestWithTimeout(Duration.ofMillis(-2)) == -1) + assert(requestWithTimeout(Duration.ofMillis(-15)) == -1) + assert(requestWithTimeout(Duration.ofSeconds(-1)) == -1) + assert(requestWithTimeout(Duration.ofMillis(java.lang.Integer.MIN_VALUE)) == -1) } "support setting a request timeout duration to Long.MAX_VALUE as infinite" in { - requestWithTimeout(Duration.ofMillis(java.lang.Long.MAX_VALUE)) must beEqualTo(-1) + assert(requestWithTimeout(Duration.ofMillis(java.lang.Long.MAX_VALUE)) == -1) } "not support setting a request timeout to null" in { - requestWithTimeout(null) must throwA[IllegalArgumentException] + assertThrows[IllegalArgumentException] { requestWithTimeout(null) } } } @@ -225,7 +227,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa request.setBody(body("HELLO WORLD", null)) // content type is not set request.addHeader("Content-Type", "application/json") // will be used as content type is not set with a body val req = request.buildRequest() - req.getHeaders.get("Content-Type") must be_==("application/json") + assert(req.getHeaders.get("Content-Type") == "application/json") } "ignore explicit Content-Type header if the BodyWritable already set the Content-Type" in { @@ -236,7 +238,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa request.setBody(body("HELLO WORLD")) request.addHeader("Content-Type", "application/json") // will be ignored since body already sets content type val req = request.buildRequest() - req.getHeaders.get("Content-Type") must be_==("text/plain; charset=UTF-8") + assert(req.getHeaders.get("Content-Type") == "text/plain; charset=UTF-8") } "only send first Content-Type header and keep the charset when setting the Content-Type multiple times" in { @@ -248,7 +250,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa request.addHeader("Content-Type", "application/xml") request.setBody(body("HELLO WORLD")) // content type is not overwritten here as its already set before val req = request.buildRequest() - req.getHeaders.get("Content-Type") must be_==("application/json; charset=US-ASCII") + assert(req.getHeaders.get("Content-Type") == "application/json; charset=US-ASCII") } "Set Realm.UsePreemptiveAuth to false when WSAuthScheme.DIGEST being used" in { @@ -258,7 +260,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) request.setAuth("usr", "pwd", WSAuthScheme.DIGEST) val req = request.buildRequest() - req.getRealm.isUsePreemptiveAuth must beFalse + assert(req.getRealm.isUsePreemptiveAuth == false) } "Set Realm.UsePreemptiveAuth to true when WSAuthScheme.DIGEST not being used" in { @@ -268,10 +270,10 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) request.setAuth("usr", "pwd", WSAuthScheme.BASIC) val req = request.buildRequest() - req.getRealm.isUsePreemptiveAuth must beTrue + assert(req.getRealm.isUsePreemptiveAuth) } - "For HTTP Headers" in { + "For HTTP Headers" should { "add a new header" in { val client = StandaloneAhcWSClient.create( @@ -279,11 +281,13 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa ) val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) - request - .addHeader("header1", "value1") - .buildRequest() - .getHeaders - .get("header1") must beEqualTo("value1") + assert( + request + .addHeader("header1", "value1") + .buildRequest() + .getHeaders + .get("header1") == "value1" + ) } "add new value for existing header" in { @@ -294,11 +298,11 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header1", "value1") .addHeader("header1", "value2") - request.getHeaders.get("header1").asScala.toSet must_== Set("value1", "value2") + assert(request.getHeaders.get("header1").asScala.toSet == Set("value1", "value2")) val ahcRequest = request.buildRequest() - ahcRequest.getHeaders.getAll("header1").asScala.toSet must_== Set("value1", "value2") + assert(ahcRequest.getHeaders.getAll("header1").asScala.toSet == Set("value1", "value2")) } "set all headers" in { @@ -307,11 +311,13 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa ) val request = new StandaloneAhcWSRequest(client, "http://example.com", /*materializer*/ null) - request - .setHeaders(Map("header1" -> Seq("value1").asJava, "header2" -> Seq("value2").asJava).asJava) - .buildRequest() - .getHeaders - .get("header1") must beEqualTo("value1") + assert( + request + .setHeaders(Map("header1" -> Seq("value1").asJava, "header2" -> Seq("value2").asJava).asJava) + .buildRequest() + .getHeaders + .get("header1") == "value1" + ) } "keep existing headers when adding a new one" in { @@ -325,8 +331,8 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header2", "value2") .buildRequest() - ahcReq.getHeaders.get("header1") must beEqualTo("value1") - ahcReq.getHeaders.get("header2") must beEqualTo("value2") + assert(ahcReq.getHeaders.get("header1") == "value1") + assert(ahcReq.getHeaders.get("header2") == "value2") } "treat header names case insensitively" in { @@ -338,7 +344,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("HEADER1", "value2") .buildRequest() - request.getHeaders.getAll("header1").asScala.toSet must_== Set("value1", "value2") + assert(request.getHeaders.getAll("header1").asScala.toSet == Set("value1", "value2")) } "get a single header" in { @@ -349,7 +355,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header1", "value1") .addHeader("header1", "value2") - request.getHeader("header1").toScala must beSome("value1") + assert(request.getHeader("header1").toScala == Some("value1")) } "get an empty optional when header is not present" in { @@ -360,7 +366,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header1", "value1") .addHeader("header1", "value2") - request.getHeader("non").toScala must beNone + assert(request.getHeader("non").toScala.isEmpty) } "get all values for a header" in { @@ -371,7 +377,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header1", "value1") .addHeader("header1", "value2") - request.getHeaderValues("header1").asScala must containTheSameElementsAs(Seq("value1", "value2")) + assert(request.getHeaderValues("header1").asScala.toSet == Set("value1", "value2")) } "get an empty list when header is not present" in { @@ -382,7 +388,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header1", "value1") .addHeader("header1", "value2") - request.getHeaderValues("Non").asScala must beEmpty + assert(request.getHeaderValues("Non").asScala.isEmpty) } "get all headers" in { @@ -395,13 +401,13 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addHeader("header2", "Value1ForHeader2") val headers = request.getHeaders.asScala - headers("header1").asScala must containTheSameElementsAs(Seq("Value1ForHeader1", "Value2ForHeader1")) - headers("header2").asScala must containTheSameElementsAs(Seq("Value1ForHeader2")) + assert(headers("header1").asScala.toSet == Set("Value1ForHeader1", "Value2ForHeader1")) + assert(headers("header2").asScala.toSet == Set("Value1ForHeader2")) } } - "For query string parameters" in { + "For query string parameters" should { "add query string parameter" in { val client = StandaloneAhcWSClient.create( @@ -411,7 +417,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p1", "v1") .buildRequest() - request.getUrl must contain("p1=v1") + assert(request.getUrl.contains("p1=v1")) } "deterministic query param order a" in { @@ -423,7 +429,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p2", "v2") .buildRequest() - request.getUrl must contain("p1=v1&p2=v2") + assert(request.getUrl.contains("p1=v1&p2=v2")) } "deterministic query param order b" in { @@ -435,7 +441,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p1", "v1") .buildRequest() - request.getUrl must contain("p2=v2&p1=v1") + assert(request.getUrl.contains("p2=v2&p1=v1")) } "deterministic query param order for duplicate keys" in { @@ -449,7 +455,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p1", "v4") .buildRequest() - request.getUrl must contain("p1=v1&p1=v3&p1=v4&p2=v2") + assert(request.getUrl.contains("p1=v1&p1=v3&p1=v4&p2=v2")) } "add new value for existing parameter" in { @@ -461,8 +467,8 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p1", "v2") .buildRequest() - request.getUrl must contain("p1=v1") - request.getUrl must contain("p1=v2") + assert(request.getUrl.contains("p1=v1")) + assert(request.getUrl.contains("p1=v2")) } "keep existing parameters when adding a new one" in { @@ -474,8 +480,8 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("p2", "v2") .buildRequest() - request.getUrl must contain("p1=v1") - request.getUrl must contain("p2=v2") + assert(request.getUrl.contains("p1=v1")) + assert(request.getUrl.contains("p2=v2")) } "set all the parameters" in { @@ -486,35 +492,35 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .setQueryString(Map("p1" -> Seq("v1").asJava, "p2" -> Seq("v2").asJava).asJava) .buildRequest() - request.getUrl must contain("p1=v1") - request.getUrl must contain("p2=v2") + assert(request.getUrl.contains("p1=v1")) + assert(request.getUrl.contains("p2=v2")) } "set a query string appropriately" in { val queryParams = requestWithQueryString("q=playframework&src=typd") - queryParams.size must beEqualTo(2) - queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework")) must beTrue - queryParams.exists(p => (p.getName == "src") && (p.getValue == "typd")) must beTrue + assert(queryParams.size == 2) + assert(queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework"))) + assert(queryParams.exists(p => (p.getName == "src") && (p.getValue == "typd"))) } "support several query string values for a parameter" in { val queryParams = requestWithQueryString("q=scala&q=playframework&q=fp") - queryParams.size must beEqualTo(3) - queryParams.exists(p => (p.getName == "q") && (p.getValue == "scala")) must beTrue - queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework")) must beTrue - queryParams.exists(p => (p.getName == "q") && (p.getValue == "fp")) must beTrue - queryParams.count(p => p.getName == "q") must beEqualTo(3) + assert(queryParams.size == 3) + assert(queryParams.exists(p => (p.getName == "q") && (p.getValue == "scala"))) + assert(queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework"))) + assert(queryParams.exists(p => (p.getName == "q") && (p.getValue == "fp"))) + assert(queryParams.count(p => p.getName == "q") == 3) } "support a query string parameter without value" in { val queryParams = requestWithQueryString("q=playframework&src=") - queryParams.size must beEqualTo(2) - queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework")) must beTrue - queryParams.exists(p => (p.getName.equals("src")) && (p.getValue == null)) must beTrue + assert(queryParams.size == 2) + assert(queryParams.exists(p => (p.getName == "q") && (p.getValue == "playframework"))) + assert(queryParams.exists(p => (p.getName.equals("src")) && (p.getValue == null))) } "not support a query string with more than 2 = per part" in { - requestWithQueryString("q=scala=playframework&src=typd") must throwA[RuntimeException] + assertThrows[RuntimeException] { requestWithQueryString("q=scala=playframework&src=typd") } } "support a query string parameter with an encoded equals sign" in { @@ -526,12 +532,12 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa val queryParams = request.buildRequest().getQueryParams.asScala val p = queryParams(0) - p.getName must beEqualTo("bar") - p.getValue must beEqualTo("F%253Dma") + assert(p.getName == "bar") + assert(p.getValue == "F%253Dma") } "not support a query string if it starts with = and is empty" in { - requestWithQueryString("=&src=typd") must throwA[RuntimeException] + assertThrows[RuntimeException] { requestWithQueryString("=&src=typd") } } "enable url encoding by default" in { @@ -542,7 +548,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("abc+def", "uvw+xyz") .buildRequest() - request.getUrl must beEqualTo("http://example.com?abc%2Bdef=uvw%2Bxyz") + assert(request.getUrl == "http://example.com?abc%2Bdef=uvw%2Bxyz") } "disable url encoding globally via client config" in { @@ -555,7 +561,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addQueryParameter("abc+def", "uvw+xyz") .buildRequest() - request.getUrl must beEqualTo("http://example.com?abc+def=uvw+xyz") + assert(request.getUrl == "http://example.com?abc+def=uvw+xyz") } "disable url encoding for specific request only" in { @@ -567,11 +573,11 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .setDisableUrlEncoding(true) .buildRequest() - request.getUrl must beEqualTo("http://example.com?abc+def=uvw+xyz") + assert(request.getUrl == "http://example.com?abc+def=uvw+xyz") } } - "For Cookies" in { + "For Cookies" should { def cookie(name: String, value: String): WSCookie = { new WSCookieBuilder().setName(name).setValue(value).build() @@ -585,10 +591,10 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addCookie(cookie("cookie1", "value1")) val cookiesInRequest: mutable.Buffer[WSCookie] = request.getCookies.asScala - cookiesInRequest.size must beEqualTo(1) + assert(cookiesInRequest.size == 1) val cookieInRequest: WSCookie = cookiesInRequest.head - cookieInRequest.getName must beEqualTo("cookie1") - cookieInRequest.getValue must beEqualTo("value1") + assert(cookieInRequest.getName == "cookie1") + assert(cookieInRequest.getValue == "value1") } "add a new cookie" in { @@ -599,7 +605,7 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addCookie(cookie("cookie1", "value1")) .buildRequest() - request.getCookies.asScala.head.name must beEqualTo("cookie1") + assert(request.getCookies.asScala.head.name == "cookie1") } "add more than one cookie" in { @@ -610,9 +616,9 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addCookies(cookie("cookie1", "value1"), cookie("cookie2", "value2")) .buildRequest() - request.getCookies.asScala must size(2) - request.getCookies.asScala.head.name must beEqualTo("cookie1") - request.getCookies.asScala(1).name must beEqualTo("cookie2") + assert(request.getCookies.asScala.size == 2) + assert(request.getCookies.asScala.head.name == "cookie1") + assert(request.getCookies.asScala(1).name == "cookie2") } "keep existing cookies when adding a new one" in { @@ -624,9 +630,9 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .addCookie(cookie("cookie2", "value2")) .buildRequest() - request.getCookies.asScala must size(2) - request.getCookies.asScala.head.name must beEqualTo("cookie1") - request.getCookies.asScala(1).name must beEqualTo("cookie2") + assert(request.getCookies.asScala.size == 2) + assert(request.getCookies.asScala.head.name == "cookie1") + assert(request.getCookies.asScala(1).name == "cookie2") } "set all cookies" in { @@ -637,9 +643,9 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .setCookies(List(cookie("cookie1", "value1"), cookie("cookie2", "value2")).asJava) .buildRequest() - request.getCookies.asScala must size(2) - request.getCookies.asScala.head.name must beEqualTo("cookie1") - request.getCookies.asScala(1).name must beEqualTo("cookie2") + assert(request.getCookies.asScala.size == 2) + assert(request.getCookies.asScala.head.name == "cookie1") + assert(request.getCookies.asScala(1).name == "cookie2") } "discard old cookies when setting" in { @@ -651,9 +657,9 @@ class AhcWSRequestSpec extends Specification with DefaultBodyReadables with Defa .setCookies(List(cookie("cookie3", "value1"), cookie("cookie4", "value2")).asJava) .buildRequest() - request.getCookies.asScala must size(2) - request.getCookies.asScala.head.name must beEqualTo("cookie3") - request.getCookies.asScala(1).name must beEqualTo("cookie4") + assert(request.getCookies.asScala.size == 2) + assert(request.getCookies.asScala.head.name == "cookie3") + assert(request.getCookies.asScala(1).name == "cookie4") } } } diff --git a/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSResponseSpec.scala b/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSResponseSpec.scala index 9a08b435..61e8e0e1 100644 --- a/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSResponseSpec.scala +++ b/play-ahc-ws-standalone/src/test/scala/play/libs/ws/ahc/AhcWSResponseSpec.scala @@ -6,7 +6,7 @@ package play.libs.ws.ahc import org.mockito.Mockito.when import org.mockito.Mockito -import org.specs2.mutable._ +import org.scalatest.wordspec.AnyWordSpec import play.libs.ws._ import play.shaded.ahc.io.netty.handler.codec.http.DefaultHttpHeaders import play.shaded.ahc.org.asynchttpclient.Response @@ -15,7 +15,7 @@ import scala.jdk.CollectionConverters._ import scala.jdk.OptionConverters._ import scala.reflect.ClassTag -class AhcWSResponseSpec extends Specification with DefaultBodyReadables with DefaultBodyWritables { +class AhcWSResponseSpec extends AnyWordSpec with DefaultBodyReadables with DefaultBodyWritables { private def mock[A](implicit a: ClassTag[A]): A = Mockito.mock(a.runtimeClass).asInstanceOf[A] @@ -25,7 +25,7 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def "return the underlying response" in { val srcResponse = mock[Response] val response = new StandaloneAhcWSResponse(srcResponse) - response.getUnderlying must_== srcResponse + assert(response.getUnderlying == srcResponse) } } @@ -42,8 +42,8 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def when(srcResponse.getHeaders).thenReturn(srcHeaders) val response = new StandaloneAhcWSResponse(srcResponse) val headers = response.getHeaders - headers.get("foo").asScala must_== Seq("a", "b", "b") - headers.get("BAR").asScala must_== Seq("baz") + assert(headers.get("foo").asScala == Seq("a", "b", "b")) + assert(headers.get("BAR").asScala == Seq("baz")) } "get a single header" in { @@ -56,8 +56,8 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def when(srcResponse.getHeaders).thenReturn(srcHeaders) val response = new StandaloneAhcWSResponse(srcResponse) - response.getSingleHeader("Foo").toScala must beSome("a") - response.getSingleHeader("Bar").toScala must beSome("baz") + assert(response.getSingleHeader("Foo").toScala == Some("a")) + assert(response.getSingleHeader("Bar").toScala == Some("baz")) } "get an empty optional when header is not present" in { @@ -70,7 +70,7 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def when(srcResponse.getHeaders).thenReturn(srcHeaders) val response = new StandaloneAhcWSResponse(srcResponse) - response.getSingleHeader("Non").toScala must beNone + assert(response.getSingleHeader("Non").toScala.isEmpty) } "get all values for a header" in { @@ -83,7 +83,7 @@ class AhcWSResponseSpec extends Specification with DefaultBodyReadables with Def when(srcResponse.getHeaders).thenReturn(srcHeaders) val response = new StandaloneAhcWSResponse(srcResponse) - response.getHeaderValues("Foo").asScala must containTheSameElementsAs(Seq("a", "b", "b")) + assert(response.getHeaderValues("Foo").asScala.toSet == Set("a", "b", "b")) } } diff --git a/play-ws-standalone-json/src/test/scala/play/api/libs/ws/JsonBodyReadablesSpec.scala b/play-ws-standalone-json/src/test/scala/play/api/libs/ws/JsonBodyReadablesSpec.scala index 2d285368..671a44ec 100644 --- a/play-ws-standalone-json/src/test/scala/play/api/libs/ws/JsonBodyReadablesSpec.scala +++ b/play-ws-standalone-json/src/test/scala/play/api/libs/ws/JsonBodyReadablesSpec.scala @@ -9,12 +9,11 @@ import java.nio.charset.StandardCharsets._ import org.apache.pekko.stream.scaladsl.Source import org.apache.pekko.util.ByteString -import org.specs2.matcher.MustMatchers -import org.specs2.mutable.Specification +import org.scalatest.wordspec.AnyWordSpec import play.api.libs.json.JsSuccess import play.api.libs.json.JsValue -class JsonBodyReadablesSpec extends Specification with MustMatchers { +class JsonBodyReadablesSpec extends AnyWordSpec { class StubResponse(byteArray: Array[Byte], charset: Charset = UTF_8) extends StandaloneWSResponse { override def uri: java.net.URI = ??? @@ -46,7 +45,7 @@ class JsonBodyReadablesSpec extends Specification with MustMatchers { val charsetName = "UTF-32BE" val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(charsetName), Charset.forName(charsetName))) - (value \ "menu" \ "id").validate[String] must beEqualTo(JsSuccess("file")) + assert((value \ "menu" \ "id").validate[String] == JsSuccess("file")) } "read an encoding of UTF-32LE" in { @@ -55,7 +54,7 @@ class JsonBodyReadablesSpec extends Specification with MustMatchers { val charsetName = "UTF-32LE" val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(charsetName), Charset.forName(charsetName))) - (value \ "menu" \ "id").validate[String] must beEqualTo(JsSuccess("file")) + assert((value \ "menu" \ "id").validate[String] == JsSuccess("file")) } "read an encoding of UTF-16BE" in { @@ -63,7 +62,7 @@ class JsonBodyReadablesSpec extends Specification with MustMatchers { val json = """{"menu": {"id": "file", "value": "File"} }""" val charset = UTF_16BE val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(charset), charset)) - (value \ "menu" \ "id").validate[String] must beEqualTo(JsSuccess("file")) + assert((value \ "menu" \ "id").validate[String] == JsSuccess("file")) } "read an encoding of UTF-16LE" in { @@ -71,28 +70,28 @@ class JsonBodyReadablesSpec extends Specification with MustMatchers { val json = """{"menu": {"id": "file", "value": "File"} }""" val charset = UTF_16LE val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(charset), charset)) - (value \ "menu" \ "id").validate[String] must beEqualTo(JsSuccess("file")) + assert((value \ "menu" \ "id").validate[String] == JsSuccess("file")) } "read an encoding of UTF-8" in { val readables = new JsonBodyReadables() {} val json = """{"menu": {"id": "file", "value": "File"} }""" val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(UTF_8))) - (value \ "menu" \ "id").validate[String] must beEqualTo(JsSuccess("file")) + assert((value \ "menu" \ "id").validate[String] == JsSuccess("file")) } "read an encoding of UTF-8 with empty object" in { val readables = new JsonBodyReadables() {} val json = "{}" val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(UTF_8))) - value.toString() must beEqualTo("{}") + assert(value.toString() == "{}") } "read an encoding of UTF-8 with empty array" in { val readables = new JsonBodyReadables() {} val json = "[]" val value: JsValue = readables.readableAsJson.transform(new StubResponse(json.getBytes(UTF_8))) - value.toString() must beEqualTo("[]") + assert(value.toString() == "[]") } } diff --git a/play-ws-standalone/src/test/scala/play/api/libs/ws/WSConfigParserSpec.scala b/play-ws-standalone/src/test/scala/play/api/libs/ws/WSConfigParserSpec.scala index 7c71dc04..1e1a3a9b 100644 --- a/play-ws-standalone/src/test/scala/play/api/libs/ws/WSConfigParserSpec.scala +++ b/play-ws-standalone/src/test/scala/play/api/libs/ws/WSConfigParserSpec.scala @@ -4,12 +4,12 @@ package play.api.libs.ws -import org.specs2.mutable._ import com.typesafe.config.ConfigFactory +import org.scalatest.wordspec.AnyWordSpec import scala.concurrent.duration._ -class WSConfigParserSpec extends Specification { +class WSConfigParserSpec extends AnyWordSpec { "WSConfigParser" should { @@ -29,17 +29,17 @@ class WSConfigParserSpec extends Specification { |play.ws.useragent = "FakeUserAgent" """.stripMargin) - actual.connectionTimeout must_== 9999.millis - actual.idleTimeout must_== 666.millis - actual.requestTimeout must_== 1234.millis + assert(actual.connectionTimeout == 9999.millis) + assert(actual.idleTimeout == 666.millis) + assert(actual.requestTimeout == 1234.millis) // default: true - actual.followRedirects must beFalse + assert(actual.followRedirects == false) // default: true - actual.useProxyProperties must beFalse + assert(actual.useProxyProperties == false) - actual.userAgent must beSome[String].which(_ must_== "FakeUserAgent") + assert(actual.userAgent == Some("FakeUserAgent")) } } } diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a7ff997f..b675aaa4 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -15,10 +15,7 @@ object Dependencies { val awaitility = Seq("org.awaitility" % "awaitility" % "4.2.1") - val specsVersion = "4.20.7" - val specsBuild = Seq( - "specs2-core", - ).map("org.specs2" %% _ % specsVersion) + val scalatest = Seq("org.scalatest" %% "scalatest-wordspec" % "3.2.19") val mockito = Seq("org.mockito" % "mockito-core" % "5.12.0") @@ -65,7 +62,7 @@ object Dependencies { val reactiveStreams = Seq("org.reactivestreams" % "reactive-streams" % "1.0.4") val testDependencies = - (mockito ++ specsBuild ++ junitInterface ++ assertj ++ awaitility ++ slf4jtest ++ logback).map(_ % Test) + (mockito ++ scalatest ++ junitInterface ++ assertj ++ awaitility ++ slf4jtest ++ logback).map(_ % Test) val standaloneApiWSDependencies = javaxInject ++ sslConfigCore ++ pekkoStreams ++ testDependencies