Files
multi-simadmin/apps/ios/Tests/MultiSimAdminTests/InstanceSessionServiceTests.swift
T

51 lines
1.8 KiB
Swift

import XCTest
@testable import MultiSimAdmin
final class InstanceSessionServiceTests: XCTestCase {
func testLoginStoresAndClearsSessionCookie() async throws {
let store = InstanceSessionStore()
let client = MockSessionClient(status: 204)
let service = InstanceSessionService(store: store, client: client)
let instance = Self.instance()
let result = try await service.login(instance, password: "secret")
XCTAssertTrue(result.authenticated)
let cookie = await store.cookie(for: instance.id, origin: instance.origin)
XCTAssertEqual(cookie, "simadmin_session=token")
let rejected = try await service.login(instance, password: "bad")
XCTAssertFalse(rejected.authenticated)
let removed = await store.cookie(for: instance.id, origin: instance.origin)
XCTAssertEqual(removed, nil)
}
private static func instance() -> Instance {
Instance(
id: UUID(),
name: "Session",
origin: URL(string: "http://192.168.1.20:3000")!,
configRevision: 1,
createdAt: Date(),
updatedAt: Date()
)
}
private struct MockSessionClient: SimAdminClientProtocol {
let status: Int
func send(
_ route: UpstreamRoute,
baseURL: URL,
cookie: String?
) async throws -> UpstreamResponse {
guard case let .authLogin(submitted) = route else {
return UpstreamResponse(status: 200, data: Data("{}.utf8".utf8), setCookie: nil)
}
let authorized = submitted == "secret"
let setCookie = authorized ? "simadmin_session=token; Path=/" : nil
return UpstreamResponse(status: authorized ? status : 200, data: Data("{}".utf8), setCookie: setCookie)
}
}
}