passforios/passKitTests/Models/PasswordStoreTest.swift

96 lines
3.9 KiB
Swift
Raw Normal View History

2020-04-11 23:23:38 -07:00
//
// PasswordStoreTest.swift
// passKitTests
//
2021-09-03 02:50:40 +02:00
// Created by Mingshen Sun on 13/4/2020.
2020-04-11 23:23:38 -07:00
// Copyright © 2020 Bob Sun. All rights reserved.
//
import Foundation
import ObjectiveGit
import XCTest
2020-04-11 23:23:38 -07:00
@testable import passKit
final class PasswordStoreTest: XCTestCase {
2026-03-09 00:17:31 +01:00
private let remoteRepoURL: URL = Bundle(for: PasswordStoreTest.self).resourceURL!.appendingPathComponent("Fixtures/password-store.git")
private let localRepoURL: URL = Globals.sharedContainerURL.appendingPathComponent("Library/password-store-test/")
private var passwordStore: PasswordStore! = nil
override func setUp() {
passwordStore = PasswordStore(url: localRepoURL)
}
override func tearDown() {
passwordStore.erase()
passwordStore = nil
}
func testInitPasswordEntityCoreData() throws {
try cloneRepository()
XCTAssertEqual(passwordStore.numberOfPasswords, 4)
let entity = passwordStore.fetchPasswordEntity(with: "personal/github.com.gpg")
XCTAssertEqual(entity!.path, "personal/github.com.gpg")
XCTAssertEqual(entity!.name, "github.com")
XCTAssertTrue(entity!.isSynced)
XCTAssertEqual(entity!.parent!.name, "personal")
XCTAssertNotNil(passwordStore.fetchPasswordEntity(with: "family/amazon.com.gpg"))
XCTAssertNotNil(passwordStore.fetchPasswordEntity(with: "work/github.com.gpg"))
XCTAssertNotNil(passwordStore.fetchPasswordEntity(with: "shared/github.com.gpg"))
let dirEntity = passwordStore.fetchPasswordEntity(with: "shared")
XCTAssertNotNil(dirEntity)
XCTAssertTrue(dirEntity!.isDir)
XCTAssertEqual(dirEntity!.name, "shared")
XCTAssertEqual(dirEntity!.children.count, 1)
}
func testCloneAndDecryptMultiKeys() throws {
2026-03-09 00:17:31 +01:00
try cloneRepository()
2025-01-25 15:40:12 -08:00
Defaults.isEnableGPGIDOn = true
2026-03-08 22:05:58 +01:00
defer {
Defaults.isEnableGPGIDOn = false
}
[
("work/github.com", "4712286271220DB299883EA7062E678DA1024DAE"),
("personal/github.com", "787EAE1A5FA3E749AA34CC6AA0645EBED862027E"),
].forEach { path, id in
2026-03-09 00:17:31 +01:00
let keyID = findGPGID(from: localRepoURL.appendingPathComponent(path))
XCTAssertEqual(keyID, id)
}
let keychain = AppKeychain.shared
try KeyFileManager(keyType: PGPKey.PUBLIC, keyPath: "", keyHandler: keychain.add).importKey(from: RSA2048_RSA4096.publicKeys)
try KeyFileManager(keyType: PGPKey.PRIVATE, keyPath: "", keyHandler: keychain.add).importKey(from: RSA2048_RSA4096.privateKeys)
try PGPAgent.shared.initKeys()
let personal = try decrypt(passwordStore: passwordStore, path: "personal/github.com.gpg", passphrase: "passforios")
XCTAssertEqual(personal.plainText, "passwordforpersonal\n")
let work = try decrypt(passwordStore: passwordStore, path: "work/github.com.gpg", passphrase: "passforios")
XCTAssertEqual(work.plainText, "passwordforwork\n")
2025-01-25 15:40:12 -08:00
let testPassword = Password(name: "test", path: "test.gpg", plainText: "testpassword")
2020-04-13 10:25:01 -07:00
let testPasswordEntity = try passwordStore.add(password: testPassword)!
let testPasswordPlain = try passwordStore.decrypt(passwordEntity: testPasswordEntity, requestPGPKeyPassphrase: requestPGPKeyPassphrase)
2020-04-13 10:25:01 -07:00
XCTAssertEqual(testPasswordPlain.plainText, "testpassword")
2020-04-12 19:32:58 -07:00
}
2026-03-09 00:17:31 +01:00
fileprivate func cloneRepository() throws {
try passwordStore.cloneRepository(remoteRepoURL: remoteRepoURL, branchName: "master")
expectation(for: NSPredicate { _, _ in FileManager.default.fileExists(atPath: self.localRepoURL.path) }, evaluatedWith: nil)
waitForExpectations(timeout: 3, handler: nil)
}
fileprivate func decrypt(passwordStore: PasswordStore, path: String, passphrase _: String) throws -> Password {
2025-02-08 14:26:45 -08:00
let entity = passwordStore.fetchPasswordEntity(with: path)!
return try passwordStore.decrypt(passwordEntity: entity, requestPGPKeyPassphrase: requestPGPKeyPassphrase)
}
2020-04-11 23:23:38 -07:00
}