//
//  Copyright (c) 2015 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro

class SharingPluginTests: AstroTestCase {
    var messageBus: MessageBus!
    var pluginResolver: StubPluginResolver!
    var sharingPlugin: SharingPlugin!

    let testMessage = "test message"
    let testUrl = "http://www.blah.com"
    let numberMessage = 123.123

    override func setUp() {
        messageBus = MessageBus()
        pluginResolver = StubPluginResolver()
        sharingPlugin = SharingPlugin(address: "SharingPlugin:0", messageBus: messageBus, pluginResolver: pluginResolver, options: nil)
    }

    func testMessageFromOptions() {
        let options = ["message": testMessage]
        let message = sharingPlugin.messageFromOptions(options)
        XCTAssertEqual(message, testMessage)
    }

    func testMessageFromOptionsEmptyOptions() {
        let options = JSONObject()
        let message = sharingPlugin.messageFromOptions(options)
        XCTAssertNil(message)
    }

    func testMessageFromOptionsNilOptions() {
        let options: JSONObject? = nil
        let message = sharingPlugin.messageFromOptions(options)
        XCTAssertNil(message)
    }

    func testMessageFromOptionsNumberOptions() {
        let options = ["message": numberMessage]
        let message = sharingPlugin.messageFromOptions(options)
        XCTAssertNil(message)
    }

    func testUrlFromOptions() {
        let options = ["url": testUrl]
        let nsurl = sharingPlugin.urlFromOptions(options)
        XCTAssertEqual(nsurl, URL(string: testUrl))
    }

    func testUrlFromOptionsEmptyOptions() {
        let options = JSONObject()
        let nsurl = sharingPlugin.urlFromOptions(options)
        XCTAssertNil(nsurl)
    }

    func testUrlFromOptionsNilOptions() {
        let options: JSONObject? = nil
        let nsurl = sharingPlugin.urlFromOptions(options)
        XCTAssertNil(nsurl)
    }

    func testUrlFromOptionsNumberOptions() {
        let options = ["url": numberMessage]
        let nsurl = sharingPlugin.urlFromOptions(options)
        XCTAssertNil(nsurl)
    }

    func testUrlFromOptionsNonUrlOptions() {
        let options = ["url": testMessage]
        let nsurl = sharingPlugin.urlFromOptions(options)
        XCTAssertNil(nsurl)
    }

    func testCreateActivityItems() {
        let options = ["message": testMessage, "url": testUrl]
        let activityItems = sharingPlugin.createActivityItems(options)

        // Tried to use activityItems.contains here but couldn't figure
        // it out.
        XCTAssertEqual(activityItems[0] as? String, testMessage)
        XCTAssertEqual(activityItems[1] as? URL, URL(string: testUrl)!)
    }

    func testCreateActivityItemsMessageOnly() {
        let options = ["message": testMessage]
        let activityItems = sharingPlugin.createActivityItems(options)
        XCTAssertEqual(activityItems[0] as? String, testMessage)
    }

    func testCreateActivityItemsUrlOnly() {
        let options = ["url": testUrl]
        let activityItems = sharingPlugin.createActivityItems(options)
        XCTAssertEqual(activityItems[0] as? URL, URL(string: testUrl)!)
    }

    func testCreateActivityItemsEmptyOptions() {
        let options = JSONObject()
        let activityItems = sharingPlugin.createActivityItems(options)
        XCTAssertTrue(activityItems.isEmpty)
    }

    func testCreateActivityItemsNilOptions() {
        let options: JSONObject? = nil
        let activityItems = sharingPlugin.createActivityItems(options)
        XCTAssertTrue(activityItems.isEmpty)
    }
}
