//
//  CookiesStoreTests.swift
//  Astro
//
//  Created by Steven Shin on 3/16/17.
//  Copyright © 2017 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
import WebKit
@testable import Astro

class CookiesStoreTests: AstroTestCase {

    var capturedResult: CapturedRpcMethodResult!
    var cookiesStore: CookiesStore!
    var messageBus: MessageBus!
    let TESTURL = "https://mobify.com"

    override func setUp() {
        messageBus = MessageBus()
        cookiesStore = CookiesStore(messageBus: messageBus)
        capturedResult = CapturedRpcMethodResult()
    }

    func testSetWithEmptyURL() {
        self.cookiesStore.setCookie("", key: "hello", value: "a value for an empty key", respond: capturedResult.callback)
        XCTAssertTrue(capturedResult.hasError)
    }

    func testSetWithEmptyKey() {
        self.cookiesStore.setCookie(TESTURL, key: "", value: "a value for an empty key", respond: capturedResult.callback)
        XCTAssertTrue(capturedResult.hasError)
    }

    func testUIWebViewsHaveCookies() {
        self.cookiesStore.setCookie(TESTURL, key: "UICookie", value: "value", respond: capturedResult.callback)
        if let cookies = HTTPCookieStorage.shared.cookies {
            for cookie in cookies {
                if cookie.name == "UICookie" && cookie.value == "value" {
                    XCTAssertTrue(true)
                }
            }
        }
    }

    func testWkWebViewsHaveCookies() {
        let expectation = self.expectation(description: "Will load")
        self.cookiesStore.setCookie(TESTURL, key: "testCookie", value: "value", respond: capturedResult.callback)
        DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
            let webview = WKWebView(frame: .zero, configuration: WebViewPlugin.webViewConfiguration)
            let request = URLRequest(url: URL(string: self.TESTURL)!)
            webview.load(request)
            DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
                webview.evaluateJavaScript("document.cookie", completionHandler: { result, error in
                    let _ = webview
                    guard error == nil else {
                        XCTFail(error.debugDescription)
                        return
                    }
                    guard let cookie = result as? String else {
                        XCTFail()
                        return
                    }
                    XCTAssertTrue(cookie.contains(String("testCookie=value")))

                    expectation.fulfill()
                })
            }
        }
        self.waitForExpectations(timeout: 25) { error in
            XCTAssertNil(error)
        }
    }
}
