Само приложение работает нормально, но я не могу заставить работать тест, подтверждающий это.
В части 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")
}
}
}