//
//  KeyFileManagerTest.swift
//  passKitTests
//
//  Created by Danny Moesch on 01.07.19.
//  Copyright © 2019 Bob Sun. All rights reserved.
//

import XCTest

@testable import passKit

final class KeyFileManagerTest: XCTestCase {
    private static let filePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("test.txt").path
    private static let keyFileManager = KeyFileManager(keyType: PGPKey.PUBLIC, keyPath: filePath) { _, _ in }

    override func tearDown() {
        try? FileManager.default.removeItem(atPath: Self.filePath)
        super.tearDown()
    }

    func testImportKeyFromFileSharing() throws {
        let fileContent = "content".data(using: .ascii)
        var storage: [String: String] = [:]
        let keyFileManager = KeyFileManager(keyType: PGPKey.PRIVATE, keyPath: Self.filePath) { storage[$1] = $0 }

        FileManager.default.createFile(atPath: Self.filePath, contents: fileContent, attributes: nil)
        try keyFileManager.importKeyFromFileSharing()

        XCTAssertFalse(FileManager.default.fileExists(atPath: Self.filePath))
        XCTAssertEqual(storage[PGPKey.PRIVATE.getKeychainKey()], "content")
    }

    func testErrorReadingFile() throws {
        XCTAssertThrowsError(try Self.keyFileManager.importKeyFromFileSharing())
    }

    func testImportKeyFromURL() throws {
        let fileContent = "content".data(using: .ascii)
        let url = URL(fileURLWithPath: Self.filePath)
        var storage: [String: String] = [:]
        let keyFileManager = KeyFileManager(keyType: PGPKey.PRIVATE, keyPath: Self.filePath) { storage[$1] = $0 }

        FileManager.default.createFile(atPath: Self.filePath, contents: fileContent, attributes: nil)
        try keyFileManager.importKey(from: url)

        XCTAssertEqual(storage[PGPKey.PRIVATE.getKeychainKey()], "content")
    }

    func testImportKeyFromString() throws {
        let string = "content"
        var storage: [String: String] = [:]
        let keyFileManager = KeyFileManager(keyType: PGPKey.PRIVATE, keyPath: Self.filePath) { storage[$1] = $0 }

        try keyFileManager.importKey(from: string)

        XCTAssertEqual(storage[PGPKey.PRIVATE.getKeychainKey()], string)
    }

    func testImportKeyFromNonAsciiString() throws {
        XCTAssertThrowsError(try Self.keyFileManager.importKey(from: "≠")) {
            XCTAssertEqual($0 as! AppError, AppError.encoding)
        }
    }

    func testFileExists() {
        FileManager.default.createFile(atPath: Self.filePath, contents: nil, attributes: nil)

        XCTAssertTrue(Self.keyFileManager.doesKeyFileExist())
    }

    func testFileDoesNotExist() {
        XCTAssertFalse(Self.keyFileManager.doesKeyFileExist())
    }
}
