Files
letro-ios/UnitTests/Sources/ClassicAppAccountManagerTests.swift
Doug 0bd72114b8 Add tests for loading Classic accounts.
Tidy up warnings and fix a few bugs that were revealed.
2026-03-11 17:42:53 +00:00

84 lines
3.8 KiB
Swift

//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
@testable import ElementX
import Foundation
import Testing
final class ClassicAppAccountManagerTests {
let testDirectory: URL = .temporaryDirectory.appending(component: UUID().uuidString)
let accountAESKey: Data
let accountIV: Data
let cryptoStorePassphrase: Data
let classicAppAccountManager: ClassicAppAccountManager
init() throws {
accountAESKey = try #require(Data(base64Encoded: "BzaSCm5i8QhJr6wGBPj7MDvqBwkwuHLqkRxprVV2zJE="))
accountIV = try #require(Data(base64Encoded: "dMmg6H2dYTRBE8PwjfAbAQ=="))
cryptoStorePassphrase = try #require(Data(base64Encoded: "ERE/ZXw8rlY3Lv3MBG9sV9g+euOuJnrJaSuvrAMWPrI="))
classicAppAccountManager = ClassicAppAccountManager(cacheFolder: testDirectory,
aesKey: accountAESKey,
iv: accountIV,
cryptoStorePassphrase: cryptoStorePassphrase)
}
@Test
func noAccounts() {
classicAppAccountManager.loadAccounts()
#expect(classicAppAccountManager.accounts.isEmpty)
}
@Test
func activeAccount() throws {
let account = ClassicAppAccount.mock(classicAppAccountManager: classicAppAccountManager,
cryptoStorePassphrase: cryptoStorePassphrase)
try setupFixtures(for: account)
classicAppAccountManager.loadAccounts()
#expect(classicAppAccountManager.accounts.count == 1)
#expect(classicAppAccountManager.accounts.first == account)
}
// MARK: - Helpers
private func setupFixtures(for account: ClassicAppAccount) throws {
let bundle = Bundle(for: Self.self)
// Copy the accountsV2 file (contains the MXKAccount for the signed in user).
let accountFileSource = try #require(bundle.url(forResource: "accountsV2", withExtension: nil))
let accountFileDestination = classicAppAccountManager.accountFile()
try FileManager.default.createDirectory(at: accountFileDestination.deletingLastPathComponent(), withIntermediateDirectories: true)
try FileManager.default.copyItem(at: accountFileSource, to: accountFileDestination)
// Copy the required users file (contains a subset of known MXUsers including the signed in user).
let userFileName = "94" // UInt(bitPattern: account.userID.hash) % 100
let userFileSource = try #require(bundle.url(forResource: userFileName, withExtension: nil))
let usersDestination = classicAppAccountManager.storeUsersPath(for: account.userID)
try FileManager.default.createDirectory(at: usersDestination, withIntermediateDirectories: true)
try FileManager.default.copyItem(at: userFileSource, to: usersDestination.appending(component: userFileName))
}
}
extension ClassicAppAccount {
/// Creates a mock account based on the fixtures used by this test.
static func mock(classicAppAccountManager: ClassicAppAccountManager, cryptoStorePassphrase: Data) -> ClassicAppAccount {
let userID = "@classicappaccount:matrix.org"
return ClassicAppAccount(userID: userID,
displayName: "Classic App Account",
avatarURL: "mxc://matrix.org/LYIzLOiILkjQJCqsgzAOUirs",
serverName: "matrix.org",
cryptoStoreURL: classicAppAccountManager.cryptoStoreURL(for: userID),
cryptoStorePassphrase: cryptoStorePassphrase)
}
}