blob: 95ff63b9f7bf703c85e5443aab253ab6b63671c7 [file] [log] [blame]
/*
* 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 catalog.CloudantUtil
import common._
import org.junit.runner.RunWith
import org.scalatest.FlatSpec
import org.scalatest.junit.JUnitRunner
import spray.json.DefaultJsonProtocol.StringJsonFormat
import spray.json.{JsArray, JsNumber, JsString, JsValue, pimpAny}
import whisk.utils.JsHelpers
import scala.collection.mutable.HashSet
@RunWith(classOf[JUnitRunner])
class CloudantAccountActionsTests extends FlatSpec
with TestHelpers
with WskTestHelpers {
val wskprops = WskProps()
val wsk = new Wsk
val credential = CloudantUtil.Credential.makeFromVCAPFile("cloudantNoSQLDB", this.getClass.getSimpleName)
behavior of "Cloudant account actions"
it should """create cloudant database""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
val dbName = credential.dbname.concat("create_db")
try {
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
//create database
println("Invoking the create-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-database",
Map("dbname" -> dbName.toJson))) {
activation =>
activation.response.success shouldBe true
}
val response = CloudantUtil.readTestDatabase(credential, dbName)
response.getStatusCode should be (200)
}
finally {
CloudantUtil.deleteTestDatabase(credential, dbName)
}
}
it should """create cloudant database with undefined dbname""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
//create database
println("Invoking the create-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-database")) {
activation =>
activation.response.success shouldBe false
val result = activation.response.result.get
result.fields.get("error") shouldBe Some(JsString("dbname is required."))
}
}
it should """read cloudant database""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
try {
CloudantUtil.setUp(credential)
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
println("Invoking the read-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-database",
Map("dbname" -> credential.dbname.toJson))) {
activation =>
activation.response.success shouldBe true
val result = activation.response.result.get
result.fields.get("db_name") shouldBe Some(JsString(credential.dbname))
}
}
finally {
CloudantUtil.unsetUp(credential)
}
}
it should """read cloudant database that does not exist""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
println("Invoking the read-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-database",
Map("dbname" -> "doesNotExistDB".toJson))) {
activation =>
activation.response.success shouldBe false
val result = activation.response.result.get
JsHelpers.getFieldPath(result, "error", "statusCode") shouldBe Some(JsNumber(404))
}
}
it should """delete cloudant database""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
try {
CloudantUtil.setUp(credential)
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
println("Invoking the delete-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-database",
Map("dbname" -> credential.dbname.toJson))) {
activation =>
activation.response.success shouldBe true
}
val response = CloudantUtil.readTestDatabase(credential)
response.get("error").getAsString() shouldBe "not_found"
response.get("reason").getAsString() shouldBe "Database does not exist."
}
finally {
CloudantUtil.unsetUp(credential)
}
}
it should """delete cloudant database with incorrect hostname""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
try {
CloudantUtil.setUp(credential)
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> "invalidHost".toJson))
}
println("Invoking the delete-database action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-database",
Map("dbname" -> credential.dbname.toJson))) {
activation =>
activation.response.success shouldBe false
val result = activation.response.result.get
result.fields.get("error") shouldBe defined
}
}
finally {
CloudantUtil.unsetUp(credential)
}
}
it should """list all cloudant databases""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
try {
CloudantUtil.setUp(credential)
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,
Map("username" -> credential.user.toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
println("Invoking the list-all-databases action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-all-databases")) {
activation =>
activation.response.success shouldBe true
val result = activation.response.result.get
val matchedDBs = new HashSet[JsValue]
val databases = result.fields("all_databases").asInstanceOf[JsArray].elements
databases map {
case x@JsString(credential.dbname) => matchedDBs.add(x)
case _ => None
}
matchedDBs.size should be > 0
}
}
finally {
CloudantUtil.unsetUp(credential)
}
}
it should """list all cloudant databases with incorrect user""" in withAssetCleaner(wskprops) {
(wp, assetHelper) =>
implicit val wskprops = wp
val packageName = "dummyCloudantPackage"
try {
CloudantUtil.setUp(credential)
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,
Map("username" -> "invalidUser".toJson,
"password" -> credential.password.toJson,
"host" -> credential.host().toJson))
}
println("Invoking the list-all-databases action.")
withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-all-databases")) {
activation =>
activation.response.success shouldBe false
val result = activation.response.result.get
JsHelpers.getFieldPath(result, "error", "statusCode") shouldBe Some(JsNumber(401))
}
}
finally {
CloudantUtil.unsetUp(credential)
}
}
}