//
//  AstroApplicationTests.swift
//  Astro
//
//  Created by Jeremy Wiebe on 2015-05-26.
//  Copyright (c) 2015 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro

class AstroApplicationTests: AstroTestCase {
    var messageBus: MessageBus!
    var pluginResolver: StubPluginResolver!
    var capturedResult: CapturedRpcMethodResult!

    var viewController: AstroViewControllerBase!
    var plugin1: TestViewPlugin!
    var plugin2: TestViewPlugin!
    var app: AstroApplication!

    class TestMessageBus: MessageBus {
        var didSendMessage = false
        override func send(_ message: Message) {
            didSendMessage = true
        }
    }

    override func setUp() {
        messageBus = TestMessageBus()
        capturedResult = CapturedRpcMethodResult()
        pluginResolver = StubPluginResolver()

        viewController = AstroViewControllerBase(nibName: nil, bundle: nil, launchDeepLinkUri: nil)
        plugin1 = TestViewPlugin(address: "TestPlugin:1", messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
        pluginResolver.addPlugin(plugin1)

        plugin2 = TestViewPlugin(address: "TestPlugin:2", messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
        pluginResolver.addPlugin(plugin2)

        app = AstroApplication(viewController: viewController, messageBus: messageBus, pluginResolver: pluginResolver)
    }

    func testCanSetMainViewPlugin() {
        app.setMainViewPlugin("TestPlugin:1") { _ in }

        XCTAssert(viewController.view.subviews.contains(plugin1.viewController.view))
        XCTAssert(viewController.children.contains(plugin1.viewController))
    }

    func testCanReplaceMainViewPlugin() {
        app.setMainViewPlugin("TestPlugin:1") { _ in }
        XCTAssert(viewController.view.subviews.contains(plugin1.viewController.view))
        XCTAssert(viewController.children.contains(plugin1.viewController))

        app.setMainViewPlugin("TestPlugin:2") { _ in }
        XCTAssert(viewController.view.subviews.contains(plugin2.viewController.view))
        XCTAssert(viewController.children.contains(plugin2.viewController))

        XCTAssertFalse(viewController.view.subviews.contains(plugin1.viewController.view))
        XCTAssertFalse(viewController.children.contains(plugin1.viewController))
    }

    func testGetAppInformation() {
        app.getAppInformation(capturedResult.callback)
        XCTAssertTrue(capturedResult.hasResult)
    }

    func testDidReceiveDeeplinkTriggersMessage() {
        let url = URL(string: "https://www.example.com")!
        app.didReceiveDeeplink(for: url)

        XCTAssertTrue((messageBus as? TestMessageBus)!.didSendMessage)
    }
}
