//
//  AstroWebViewControllerTests.swift
//  Astro
//
//  Created by Jeremy Wiebe on 2015-06-04.
//  Renamed UIWebViewControllerTests --> AstroWebViewControllerTests 2015-09-14.
//  Copyright (c) 2015 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
import WebKit
@testable import Astro

class AstroWebViewControllerTests: AstroTestCase {

    let defaultWebViewPluginAddress = "WebViewPlugin:123"
    var messageBus: MessageBus!
    var pluginResolver: StubPluginResolver!
    var webViewPlugin: WebViewPlugin!

    override func setUp() {
        messageBus = MessageBus()
        pluginResolver = StubPluginResolver()
        webViewPlugin = WebViewPlugin(address: defaultWebViewPluginAddress, messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
    }

    func getWKWebViewController() -> AstroWebViewController {
        return AstroWebViewController(state: nil, webViewConfiguration: WKWebViewConfiguration())
    }

    func testCreatesWebViewDuringInit() {
        let wkWebViewController = getWKWebViewController()
        XCTAssertNotNil(wkWebViewController.webView)
    }

    func testWebViewIsClearedAfterSavingState() {
        let wkWebViewController = getWKWebViewController()

        wkWebViewController.save()

        XCTAssertNil(wkWebViewController.webView)
    }

    func testStateIsSavedAfterSave() {
        let wkWebViewController = getWKWebViewController()

        wkWebViewController.save()

        XCTAssertNotNil(wkWebViewController.encodedState)
    }

    func testWebViewIsCreatedWhenRestored() {
        let wkWebViewController = getWKWebViewController()

        wkWebViewController.save()

        wkWebViewController.restore(contentInsets: nil, scrollIndicatorInsets: nil)

        XCTAssertNotNil(wkWebViewController.webView)
    }

    func testStateIsClearedAfterRestore() {
        let wkWebViewController = getWKWebViewController()

        wkWebViewController.save()

        wkWebViewController.restore(contentInsets: nil, scrollIndicatorInsets: nil)

        XCTAssertNil(wkWebViewController.encodedState)
    }

    func testReloadWebViewIfNeeded() {
        let webViewController = TestWebViewController(state: nil, webViewConfiguration: WKWebViewConfiguration())
        let testURL = URL(string: "https://www.google.ca")

        webViewController.lastKnownURL = testURL
        webViewController.reloadWebViewIfNeeded()
        XCTAssertEqual(webViewController.reloadLastKnownURLCallCount, 1, "reload from last known wasn't called exactly once")
    }

    // This is important since saveLastKnownUrl is required for rehydration logic and state restoration with WKWebView
    func testSaveNonDestructiveCalledOnLoadComplete() {
        let navigationPlugin = NavigationPlugin(address: "NavigationPlugin:0", messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
        let webViewPlugin = WebViewPlugin(address: defaultWebViewPluginAddress, messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
        let webViewController = TestWebViewController(state: nil, webViewConfiguration: WKWebViewConfiguration())

        webViewPlugin.typedViewController = webViewController
        navigationPlugin.navigateToPlugin(defaultWebViewPluginAddress, options: nil) { _ in
        }
        webViewPlugin.navigationRequestCompleted()
        XCTAssertEqual(webViewController.saveLastKnownUrlCount, 1, "expect one call to saveLastKnownUrl on load complete")
    }
}
