директива akka http mock (авторизация) - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь записать модульное тестирование на сервер akka-http (route), но у меня возникают проблемы с директивой авторизации. Я просто хочу игнорировать (издеваться) директиву авторизации.

Минимальная версия моего кода:

object App {

    val logger: Logger = Logger[App]

    def main(args: Array[String]): Unit = {
        implicit val system: ActorSystem = ActorSystem("my-system")
        implicit val executionContext: ExecutionContextExecutor = system.dispatcher

        val service = new TestRoute()
        val bindingFuture = Http().bindAndHandle(service.route, "0.0.0.0", 8080)

        bindingFuture.onComplete {
            case Success(_) => println(s"listening on localhost:8080")
            case Failure(error) => println(s"failed: ${error.getMessage}")
        }
    }


    object TestRoute {

        def authorize: Directive1[JsObject] = extractCredentials.flatMap {
            case Some(OAuth2BearerToken(token)) => verifyToken(token) match {
                case Success(t) =>
                    logger.debug("token verified successfully")
                    provide(t)
                case Failure(t) =>
                    logger.warn(s"token is not valid: ${t.getMessage}")
                    reject(Rejections.validationRejection(t.getMessage))
            }
            case _ =>
                logger.warn("no token present in request")
                reject(AuthorizationFailedRejection)
        }


        def verifyToken(token: String): Try[JsObject] = {
            val source = Source.fromResource("public_production.pem")
            val fileData = try source.mkString finally source.close()
            JwtSprayJson.decodeJson(token, fileData, Seq(JwtAlgorithm.RS256))
        }
    }

    class TestRoute {
        val route: Route =
            TestRoute.authorize { jwtClaims =>
                println(jwtClaims)
                complete("sucess")
            } 
    }
}

Я хочу проверить маршрут в TestRoute. Так что authorize это директива, которую я хочу издеваться. Я просто хочу контролировать то, что вернет authorize, без необходимости фактически входить в функцию.

Мой коллега предложил обернуть Route в некоторый класс, который будет принимать метод authorize в качестве аргумента Так, что в модульном тесте я могу очень легко управлять им. Но я ищу ложный ответ.

Я видел несколько примеров с Mockito, но ни один из них не был совместим с моей самой масштабной версией, которая является 3.1.0.

...