//
//  LocalizationWrapperTests.swift
//  Astro
//
//  Created by Jason Voll on 2016-08-02.
//  Copyright © 2016 Mobify Research & Development Inc. All rights reserved.
//

import XCTest
@testable import Astro

class LocalizationWrapperTests: AstroTestCase {
    var messageBus: MessageBus!
    var stubLocaleChangedListener: StubLocaleChangedListener!
    var localizationWrapper: LocalizationWrapper!
    var capturedResult: CapturedRpcMethodResult!

    override func setUp() {
        messageBus = MessageBus()
        localizationWrapper = LocalizationWrapper(messageBus: messageBus)
        stubLocaleChangedListener = StubLocaleChangedListener()
        Localization.addLocaleChangedListener(stubLocaleChangedListener)
        capturedResult = CapturedRpcMethodResult()
    }

    func testSetLocaleRpc() {
        let locale = [
            "country": "fr",
            "language": "fr"
        ]
        self.localizationWrapper.setLocale(locale, respond: capturedResult.callback)
        AssertEqual(self.stubLocaleChangedListener.callCount, b: 1)
        AssertEqual(Localization.country, b: "FR")
        AssertEqual(Localization.language, b: "fr")
    }

    func testSetLocaleNoLanguage() {
        let startCountry = Localization.country
        let startLanguage = Localization.language
        let locale = [
            "country": "fr"
        ]
        self.localizationWrapper.setLocale(locale, respond: capturedResult.callback)
        XCTAssertTrue(capturedResult.hasError)
        AssertEqual(Localization.country, b: startCountry)
        AssertEqual(Localization.language, b: startLanguage)
        AssertEqual(self.stubLocaleChangedListener.callCount, b: 0)
    }

    func testSetLocaleNoCountry() {
        let startCountry = Localization.country
        let startLanguage = Localization.language
        let locale = [
            "language": "zh"
            ]
        self.localizationWrapper.setLocale(locale, respond: capturedResult.callback)
        XCTAssertTrue(capturedResult.hasError)
        AssertEqual(Localization.country, b: startCountry)
        AssertEqual(Localization.language, b: startLanguage)
        AssertEqual(self.stubLocaleChangedListener.callCount, b: 0)
    }

    func testGetLocaleRpc() {
        Localization.country = "ca"
        Localization.language = "en"
        self.localizationWrapper.getLocale(capturedResult.callback)
        if let result = capturedResult.result as? JSONObject {
            AssertEqual(result[LocalizationWrapper.KEY_COUNTRY] as? String, b: "CA")
            AssertEqual(result[LocalizationWrapper.KEY_LANGUAGE] as? String, b: "en")
        } else {
            XCTFail("No result or non-JSONObject result returned")
        }
        AssertEqual(stubLocaleChangedListener.callCount, b: 2)
    }

    func testSetLanguageRpc() {
        self.localizationWrapper.setLanguage("de", respond: capturedResult.callback)
        AssertEqual(self.stubLocaleChangedListener.callCount, b: 1)
        AssertEqual(Localization.language, b: "de")
    }

    func testGetLanguageRpc() {
        Localization.language = "cs"
        self.localizationWrapper.getLanguage(capturedResult.callback)
        AssertEqual(capturedResult.result as? String, b: "cs")
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    func testSetCountryRpc() {
        self.localizationWrapper.setCountry("dk", respond: capturedResult.callback)
        AssertEqual(self.stubLocaleChangedListener.callCount, b: 1)
        AssertEqual(Localization.country, b: "DK")
    }

    func testGetCountryRpc() {
        Localization.country = "gb"
        self.localizationWrapper.getCountry(capturedResult.callback)
        AssertEqual(capturedResult.result as? String, b: "GB")
        AssertEqual(stubLocaleChangedListener.callCount, b: 1)
    }

    func testTranslateRpc() {
        Localization.language = "en"
        self.localizationWrapper.translate("test_basic", respond: capturedResult.callback)
        AssertEqual(capturedResult.result as? String, b: "Basic test result")

        Localization.language = "ar"
        self.localizationWrapper.translate("test_basic", respond: capturedResult.callback)
        AssertEqual(capturedResult.result as? String, b: "Basic test result (العربية)")
        AssertEqual(stubLocaleChangedListener.callCount, b: 2)
    }
}
