//
//  KeychainDataSourceTests.swift
//  Astro
//
//  Created by Steven Shin on 1/5/17.
//  Copyright © 2017 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro
class KeychainDataSourceTests: AstroTestCase {

    var dataSource: KeychainDataSource!

    override func setUp() {
        let secItemClasses = [kSecClassGenericPassword,
                              kSecClassInternetPassword,
                              kSecClassCertificate,
                              kSecClassKey,
                              kSecClassIdentity]
        for secItemClass in secItemClasses {
            let dictionary = [kSecClass as String: secItemClass]
            SecItemDelete(dictionary as CFDictionary)
        }

        dataSource = KeychainDataSource()
    }

    func testSetNoError() {
        do {
            try dataSource.setKey("key", value: "value")
        } catch DataStoreError.error(let message) {
            XCTFail(message)
        } catch {
            XCTFail("Wrong error")
        }
        XCTAssert(true)
    }

    func testGetNoError() {
        let query: [String: Any] = [
            String(kSecClass): kSecClassKey,
            String(kSecAttrAccessible): kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
            String(kSecAttrApplicationLabel): "key",
            String(kSecValueData): "value".data(using: .utf8)!
        ]

        let status = SecItemAdd(query as CFDictionary, nil)
        if status != noErr {
            XCTFail(String(status))
        }

        do {
            let result = try self.dataSource.getString("key")
            XCTAssertEqual(result, "value")
        } catch DataStoreError.error(let message) {
            XCTFail(message)
        } catch {
            XCTFail("wrong error")
        }
    }

    func testGetItemNotFound() {
        do {
            let result = try self.dataSource.getString("key")
            XCTAssertNil(result)
        } catch DataStoreError.error(let message) {
            XCTFail(message)
        } catch {
            XCTFail("wrong error")
        }
    }
}
