/*
 * Copyright 2015-2016 IBM Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package catalog.cloudant

import org.junit.runner.RunWith
import org.scalatest.FlatSpec
import org.scalatest.junit.JUnitRunner

import catalog.CloudantUtil
import common.TestHelpers
import common.Wsk
import common.WskProps
import common.WhiskProperties
import common.WskTestHelpers
import spray.json.DefaultJsonProtocol.IntJsonFormat
import spray.json.DefaultJsonProtocol.StringJsonFormat
import spray.json.pimpAny
import common.WskActorSystem

/**
 * Tests for Cloudant trigger service
 */
@RunWith(classOf[JUnitRunner])
class CloudantTriggerPersistencyTest
    extends FlatSpec
    with TestHelpers
    with WskTestHelpers
    with WskActorSystem {

    val dbUsername = WhiskProperties.getProperty("db.username")
    val dbPassword = WhiskProperties.getProperty("db.password")
    val dbPrefix = WhiskProperties.getProperty("db.prefix")

    val wskprops = WskProps()
    val wsk = new Wsk

    val myCloudantCreds = CloudantUtil.Credential.makeFromVCAPFile("cloudantNoSQLDB", this.getClass.getSimpleName)

    val cloudantTriggerDBCreds = new CloudantUtil.Credential(dbUsername, dbPassword, dbPrefix + "cloudanttrigger")

    behavior of "Cloudant trigger service"


    ignore should "persist trigger into Cloudant" in withAssetCleaner(wskprops) {
        (wp, assetHelper) =>
            implicit val wskprops = wp // shadow global props and make implicit
            val namespace = wsk.namespace.list().stdout.trim.split("\n").last
            val triggerName = s"dummyCloudantTrigger-${System.currentTimeMillis}"
            val trigger = "/" + namespace + "/" + triggerName
            val packageName = "/" + namespace + "/dummyCloudantPackage"
            val feed = "changes"
            try {
                CloudantUtil.setUp(myCloudantCreds)

                val packageGetResult = wsk.pkg.get("/whisk.system/cloudant")
                println("Fetching cloudant package.")
                packageGetResult.stdout should include("ok")

                println("Creating cloudant package binding.")
                assetHelper.withCleaner(wsk.pkg, packageName) {
                    (pkg, name) => pkg.bind("/whisk.system/cloudant", name)
                }

                println("Creating cloudant trigger feed.")
                val feedCreationResult = wsk.trigger.create(trigger,
                    feed = Some(s"$packageName/$feed"),
                    parameters = Map(
                        "username" -> myCloudantCreds.user.toJson,
                        "password" -> myCloudantCreds.password.toJson,
                        "host" -> myCloudantCreds.host().toJson,
                        "dbname" -> myCloudantCreds.dbname.toJson,
                        "maxTriggers" -> 1.toJson))
                feedCreationResult.stdout should include("ok")

                println("Getting cloudanttrigger doc from the cloudant")
                val docId = s":${namespace}:${triggerName}"
                val persistedResponse = CloudantUtil.getDocument(cloudantTriggerDBCreds, docId)

                println("Deleting cloudant trigger feed.")
                val feedDeletionResult = wsk.trigger.delete(trigger)
                feedDeletionResult.stdout should include("ok")

                println("Getting cloudanttrigger doc from the cloudant")
                val removedResponse = CloudantUtil.getDocument(cloudantTriggerDBCreds, docId)

                persistedResponse.get("id").getAsString() should be(docId)
                removedResponse.get("error").getAsString() should be("not_found")
            } finally {
                CloudantUtil.unsetUp(myCloudantCreds)
            }
    }

}
