All Downloads are FREE. Search and download functionalities are using the official Maven repository.

endpoints4s.algebra.server.BasicAuthenticationTestSuite.scala Maven / Gradle / Ivy

package endpoints4s.algebra.server

import org.apache.pekko.http.scaladsl.model.{HttpRequest, StatusCodes}
import org.apache.pekko.http.scaladsl.model.headers.{BasicHttpCredentials, `WWW-Authenticate`}
import endpoints4s.algebra.BasicAuthenticationTestApi

trait BasicAuthenticationTestSuite[T <: BasicAuthenticationTestApi] extends EndpointsTestSuite[T] {

  "BasicAuthentication" should {

    "reject unauthenticated requests" in {
      serveEndpoint(serverApi.protectedEndpoint, Some("Hello!")) { port =>
        val request = HttpRequest(uri = s"http://localhost:$port/users")
        whenReady(sendAndDecodeEntityAsText(request)) { case (response, entity) =>
          response.status shouldBe StatusCodes.Unauthorized
          response
            .header[`WWW-Authenticate`]
            .exists(_.challenges.exists(_.scheme == "Basic")) shouldBe true
          entity shouldBe ""
          ()
        }
      }
    }

    "accept authenticated requests" in {
      serveEndpoint(serverApi.protectedEndpoint, Some("Hello!")) { port =>
        val request =
          HttpRequest(uri = s"http://localhost:$port/users")
            .addCredentials(BasicHttpCredentials("admin", "foo"))
        whenReady(sendAndDecodeEntityAsText(request)) { case (response, entity) =>
          response.status shouldBe StatusCodes.OK
          entity shouldBe "Hello!"
          ()
        }
      }
    }

    "reject authenticated requests with invalid parameters" in {
      serveEndpoint(serverApi.protectedEndpointWithParameter, Some("Hello!")) { port =>
        val request =
          HttpRequest(uri = s"http://localhost:$port/users/foo")
            .addCredentials(BasicHttpCredentials("admin", "foo"))
        whenReady(sendAndDecodeEntityAsText(request)) { case (response, entity) =>
          response.status shouldBe StatusCodes.BadRequest
          entity shouldBe "[\"Invalid integer value 'foo' for segment 'id'\"]"
          ()
        }
      }
    }

    "reject unauthenticated requests with Unauthorized response before validating query parameters" in {
      serveEndpoint(serverApi.protectedEndpointWithParameter, Some("Hello!")) { port =>
        val request = HttpRequest(uri = s"http://localhost:$port/users/foo")
        whenReady(sendAndDecodeEntityAsText(request)) { case (response, entity) =>
          response.status shouldBe StatusCodes.Unauthorized
          response
            .header[`WWW-Authenticate`]
            .exists(_.challenges.exists(_.scheme == "Basic")) shouldBe true
          entity shouldBe ""
          ()
        }
      }
    }

    "fall through to another endpoint if url doesn't match" in {
      serveManyEndpoints(
        EndpointWithImplementation(
          serverApi.protectedEndpointWithParameter,
          (_: Any) => Some("Protected")
        ),
        EndpointWithImplementation(serverApi.unprotectedEndpoint, (_: Any) => "Unprotected")
      ) { port =>
        val request = HttpRequest(uri = s"http://localhost:$port/users")
        whenReady(sendAndDecodeEntityAsText(request)) { case (response, entity) =>
          response.status shouldBe StatusCodes.OK
          entity shouldBe "Unprotected"
          ()
        }
      }
    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy