Аутентифицированный сеанс Vapor не сохраняется внутри XCTest - PullRequest
0 голосов
/ 29 мая 2020

Само приложение работает нормально, но я не могу заставить работать тест, подтверждающий это.

В части 1 ниже тест проверяет, что вход в систему с использованием электронной почты и (правильного) пароля прошел успешно, и было возвращено правильное перенаправление URL. В коде непосредственно перед тем, как перенаправление возвращается к тесту, отладка показывает, что вызов request.auth.require(User.self) завершается успешно.

В обеих частях 2a и 2b XCTAssertEqual не выполняется, и журнал показывает, что результат вызов request.auth.require(User.self) вызвал ошибку о том, что пользователь не авторизован.

Часть 3 - это двойная проверка того, что часть 1 работает, поскольку она также возвращает правильное перенаправление URL-адреса для неудачного входа в систему.

Итак, похоже, что данные сеанса не сохраняются после вызова .test(...). Есть ли способ обойти это?

@testable import App
import XCTVapor
final class AppTests: XCTestCase
{
    func test011UserLoginLogout() throws
    {
        func attemptLogin(withPassword password:String, completion:(XCTHTTPResponse) throws -> ()) throws -> Void
        {
            var body = ByteBufferAllocator().buffer(capacity: 0)
            body.writeString(#"{"email":"me@example.com","password":"\#(password)"}"#)
            var headers = HTTPHeaders()
            headers.replaceOrAdd(name: .contentLength, value: body.readableBytes.description)
            headers.contentType = .json
            try app.test(.POST, "/login", headers:headers, body:body) { response in try completion( response ) }
        }

        var app = Application(.testing)
        app.databases.use(.mysql(hostname:DBHost, username:DBAccount, password:DBPassword, database:DBDatabase, tlsConfiguration:.none), as:.mysql)
        app.databases.default(to:.mysql)
        do { try configure(app!) }
        catch { XCTFail("configure(app) failed") }
        //  Part 1 succeeds
        try attemptLogin(withPassword:"goodPassword")
        {
            res in
            XCTAssertEqual(res.status, HTTPResponseStatus.seeOther)
            XCTAssertEqual(res.headers["location"].first,"success")
            try app!.test(.GET, "/success")
            {
                response in
                XCTAssertEqual(response.status, .ok) // <--- Part 2(a) fails
            }
        }

        try app.test(.GET, "/success")
        {
            response in
            XCTAssertEqual(response.status, .ok) // <-- Part 2(b) fails
        }

        // Part 3 succeeds
        try attemptLogin(withPassword:"badPassword")
        {
            response in
            XCTAssertEqual(response.status, .seeOther)
            XCTAssertEqual(response.headers["location"].first,"failed")
        }
    }
}

1 Ответ

0 голосов
/ 30 мая 2020

Я думаю, вам не хватает аутентификации в запросе, который не выполняется. Вам нужно либо передать сеансовую кухню ie в неудачный запрос, если вы используете сеансы, либо токен, если вы используете аутентификацию носителя.

...