| 1 | import XCTest |
| 2 | @testable import RastrilloApple |
| 3 | |
| 4 | final class NativeAccountsTests: XCTestCase { |
| 5 | @MainActor func testChangingSavedOriginCannotRedirectCredential() throws { |
| 6 | let suite = "OficinaAccountsTest.\(UUID().uuidString)" |
| 7 | let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) |
| 8 | defer { defaults.removePersistentDomain(forName: suite) } |
| 9 | let original = NativeAccount(id: UUID().uuidString, origin: URL(string: "https://trusted.test")!, name: "Work") |
| 10 | try NativeCredentials.save(NativeSession(name: "__Host-rastrillo_session", value: "secret"), origin: original.credentialKey) |
| 11 | defer { NativeCredentials.remove(original.credentialKey) } |
| 12 | for origin in ["https://other.test", "http://trusted.test", "https://trusted.test/path"] { |
| 13 | let modified = NativeAccount(id: original.id, origin: URL(string: origin)!, name: original.name) |
| 14 | defaults.set(try JSONEncoder().encode([modified]), forKey: "native.accounts") |
| 15 | defaults.set(original.id, forKey: "native.activeAccount") |
| 16 | let connection = NativeConnection(defaultServer: "https://trusted.test", defaults: defaults) |
| 17 | XCTAssertNil(connection.client) |
| 18 | XCTAssertNil(connection.activeAccountID) |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | @MainActor func testBackPreservesSessionsAndRestoresMostRecentAccount() throws { |
| 23 | let suite = "OficinaAccountsTest.\(UUID().uuidString)" |
| 24 | let defaults = try XCTUnwrap(UserDefaults(suiteName: suite)) |
| 25 | defer { defaults.removePersistentDomain(forName: suite) } |
| 26 | let origin = URL(string: "https://trusted.test")! |
| 27 | let first = NativeAccount(id: UUID().uuidString, origin: origin, name: "Work") |
| 28 | let second = NativeAccount(id: UUID().uuidString, origin: origin, name: "Personal") |
| 29 | for (account, token) in [(first,"first"), (second,"second")] { |
| 30 | try NativeCredentials.save(NativeSession(name: "__Host-rastrillo_session", value: token), origin: account.credentialKey) |
| 31 | } |
| 32 | defer { for account in [first,second] { NativeCredentials.remove(account.credentialKey) } } |
| 33 | defaults.set(try JSONEncoder().encode([first,second]), forKey: "native.accounts") |
| 34 | let connection = NativeConnection(defaultServer: origin.absoluteString, defaults: defaults) |
| 35 | connection.selectAccount(second) |
| 36 | XCTAssertEqual(connection.client?.credential?.value, "second") |
| 37 | connection.showAccounts() |
| 38 | XCTAssertNil(connection.client) |
| 39 | XCTAssertEqual(connection.accounts.count, 2) |
| 40 | let restored = NativeConnection(defaultServer: origin.absoluteString, defaults: defaults) |
| 41 | XCTAssertEqual(restored.activeAccountID, second.id) |
| 42 | XCTAssertEqual(restored.client?.credential?.value, "second") |
| 43 | restored.selectAccount(first) |
| 44 | XCTAssertEqual(restored.client?.credential?.value, "first") |
| 45 | } |
| 46 | } |
| 47 | |