import XCTest @testable import RastrilloApple final class NativeAccountsTests: XCTestCase { @MainActor func testChangingSavedOriginCannotRedirectCredential() throws { let suite = "OficinaAccountsTest.\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) defer { defaults.removePersistentDomain(forName: suite) } let original = NativeAccount(id: UUID().uuidString, origin: URL(string: "https://trusted.test")!, name: "Work") try NativeCredentials.save(NativeSession(name: "__Host-rastrillo_session", value: "secret"), origin: original.credentialKey) defer { NativeCredentials.remove(original.credentialKey) } for origin in ["https://other.test", "http://trusted.test", "https://trusted.test/path"] { let modified = NativeAccount(id: original.id, origin: URL(string: origin)!, name: original.name) defaults.set(try JSONEncoder().encode([modified]), forKey: "native.accounts") defaults.set(original.id, forKey: "native.activeAccount") let connection = NativeConnection(defaultServer: "https://trusted.test", defaults: defaults) XCTAssertNil(connection.client) XCTAssertNil(connection.activeAccountID) } } @MainActor func testBackPreservesSessionsAndRestoresMostRecentAccount() throws { let suite = "OficinaAccountsTest.\(UUID().uuidString)" let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) defer { defaults.removePersistentDomain(forName: suite) } let origin = URL(string: "https://trusted.test")! let first = NativeAccount(id: UUID().uuidString, origin: origin, name: "Work") let second = NativeAccount(id: UUID().uuidString, origin: origin, name: "Personal") for (account, token) in [(first,"first"), (second,"second")] { try NativeCredentials.save(NativeSession(name: "__Host-rastrillo_session", value: token), origin: account.credentialKey) } defer { for account in [first,second] { NativeCredentials.remove(account.credentialKey) } } defaults.set(try JSONEncoder().encode([first,second]), forKey: "native.accounts") let connection = NativeConnection(defaultServer: origin.absoluteString, defaults: defaults) connection.selectAccount(second) XCTAssertEqual(connection.client?.credential?.value, "second") connection.showAccounts() XCTAssertNil(connection.client) XCTAssertEqual(connection.accounts.count, 2) let restored = NativeConnection(defaultServer: origin.absoluteString, defaults: defaults) XCTAssertEqual(restored.activeAccountID, second.id) XCTAssertEqual(restored.client?.credential?.value, "second") restored.selectAccount(first) XCTAssertEqual(restored.client?.credential?.value, "first") } }