| /* |
| * 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 java.util.Date |
| |
| import catalog.CloudantUtil |
| 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.DefaultJsonProtocol.ByteJsonFormat |
| import spray.json.{JsArray, JsBoolean, JsNumber, JsObject, JsString, pimpAny, pimpString} |
| import whisk.utils.JsHelpers |
| |
| @RunWith(classOf[JUnitRunner]) |
| class CloudantDatabaseActionsTests 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 database actions" |
| |
| |
| it should """create cloudant document""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val doc = CloudantUtil.createDocParameterForWhisk().get("doc").getAsString |
| val docJSObj = doc.parseJson.asJsObject |
| |
| println("Invoking the create-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-document", |
| Map("doc" -> docJSObj))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("id") shouldBe defined |
| } |
| val getResponse = CloudantUtil.getDocument(credential, "testId") |
| Some(JsString(getResponse.get("date").getAsString)) shouldBe docJSObj.fields.get("date") |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """read cloudant document""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| println("Invoking the read-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-document", |
| Map( |
| "docid" -> response.get("id").getAsString.toJson, |
| "params" -> JsObject("revs_info" -> JsBoolean(true))))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("date") shouldBe defined |
| activation.response.result.get.fields.get("_rev") shouldBe defined |
| activation.response.result.get.fields.get("_revs_info") shouldBe defined |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """read cloudant document with undefined docid""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| println("Invoking the read-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-document")) |
| { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("docid is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """update cloudant document""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| val docJSObj = doc.parseJson.asJsObject |
| val updatedDoc = JsObject(docJSObj.fields |
| + ("_rev" -> JsString(response.get("rev").getAsString)) |
| + ("updated" -> JsBoolean(true))) |
| |
| println("Invoking the update-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/update-document", |
| Map("doc" -> updatedDoc))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("id") shouldBe defined |
| activation.response.result.get.fields.get("rev") shouldBe defined |
| } |
| val getResponse = CloudantUtil.getDocument(credential, "testId") |
| getResponse.get("updated").getAsBoolean shouldBe true |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """update cloudant document with missing revision""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| val docJSObj = doc.parseJson.asJsObject |
| val updatedDoc = JsObject(docJSObj.fields + ("updated" -> JsBoolean(true))) |
| |
| println("Invoking the update-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/update-document", |
| Map("doc" -> updatedDoc))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("doc and doc._rev are required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """delete cloudant document""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| println("Invoking the delete-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-document", |
| Map("docid" -> response.get("id").getAsString.toJson, |
| "docrev" -> response.get("rev").getAsString.toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("id") shouldBe defined |
| activation.response.result.get.fields.get("rev") shouldBe defined |
| } |
| //Assert that document does not exist |
| val getResponse = getDocument(credential, response.get("id").getAsString) |
| getResponse.get("error").getAsString shouldBe "not_found" |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """delete cloudant document with undefined docid""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| println("Invoking the delete-document action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-document", |
| Map("docrev" -> response.get("rev").getAsString.toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("docid is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list cloudant documents""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| val docJSObj = doc.parseJson.asJsObject |
| println("Invoking the list-documents action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-documents", |
| Map("doc" -> docJSObj))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("total_rows") shouldBe Some(JsNumber("1")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list cloudant documents with undefined host""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test doc |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| val docJSObj = doc.parseJson.asJsObject |
| println("Invoking the list-documents action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-documents", |
| Map("doc" -> docJSObj))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("cloudant account host is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list all cloudant design documents""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create design doc |
| val designDoc = CloudantUtil.createDesignFromFile(CloudantUtil.INDEX_DDOC_PATH) |
| val response = CloudantUtil.createIndex(credential, designDoc.toString) |
| response.get("result").getAsString shouldBe "created" |
| |
| println("Invoking the list-design-documents action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-design-documents", |
| Map("includedocs" -> "true".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| val rows = result.fields("rows").asInstanceOf[JsArray].elements(0).asJsObject |
| rows.fields.get("doc") shouldBe defined |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list all cloudant design documents with undefined dbname""" 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-design-documents action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-design-documents", |
| Map("includedocs" -> "true".toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("dbname is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """create cloudant query index""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test design index doc |
| val indexDesignDoc = CloudantUtil.createDesignFromFile(INDEX_DDOC_PATH).toString |
| val indexDocJSObj = indexDesignDoc.parseJson.asJsObject |
| |
| println("Invoking the create-query-index action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-query-index", |
| Map("index" -> indexDocJSObj))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("result") shouldBe Some(JsString("created")) |
| val docResponse = CloudantUtil.getDocument(credential, "_design/test-query-index") |
| docResponse.get("views").toString should include ("test-query-index") |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """create cloudant query index with undefined index""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| println("Invoking the create-query-index action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-query-index")) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("index is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list cloudant query indexes""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test design index doc |
| val indexDesignDoc = CloudantUtil.createDesignFromFile(INDEX_DDOC_PATH).toString |
| val response = CloudantUtil.createDocument(credential, indexDesignDoc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| println("Invoking the list-query-indexes action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-query-indexes")) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| val indexes = result.fields("indexes").asInstanceOf[JsArray].elements(0).asJsObject |
| indexes.fields.get("name") shouldBe Some(JsString("_all_docs")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """list cloudant query indexes with incorrect dbname""" 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, |
| "dbname" -> credential.dbname.substring(1).toJson)) |
| } |
| |
| println("Invoking the list-query-indexes action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/list-query-indexes")) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| JsHelpers.getFieldPath(result, "error", "statusCode") shouldBe Some(JsNumber(404)) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant exec query find""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| val docJSObj = doc.parseJson.asJsObject |
| println("Invoking the exec-query-find action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/exec-query-find", |
| Map("query" -> JsObject("selector" -> JsObject("_id" -> JsObject("$gt" -> JsNumber(0))))))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| val docs = result.fields("docs").asInstanceOf[JsArray].elements(0).asJsObject |
| docs.fields.get("date") shouldBe docJSObj.fields.get("date") |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant exec query search""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test document for search query |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Create test design doc |
| val designDoc = CloudantUtil.createDesignFromFile(VIEW_AND_SEARCH_DDOC_PATH).toString |
| val getResponse = CloudantUtil.createDocument(credential, designDoc) |
| getResponse.get("ok").getAsString shouldBe "true" |
| |
| //Create search query |
| val needle = new Date().toString.substring(0, 2) + '*' |
| println("Invoking the exec-query-search action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/exec-query-search", |
| Map("search" -> JsObject("q" -> s"date:$needle".toJson), |
| "docid" -> "test_design".toJson, |
| "indexname" -> "test_search".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("bookmark") shouldBe defined |
| val rows = result.fields("rows").asInstanceOf[JsArray].elements(0).asJsObject |
| rows.fields.get("id") shouldBe Some(JsString("testId")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant exec query search with undefined search""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test document for search query |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Create test design doc |
| val designDoc = CloudantUtil.createDesignFromFile(VIEW_AND_SEARCH_DDOC_PATH).toString |
| val getResponse = CloudantUtil.createDocument(credential, designDoc) |
| getResponse.get("ok").getAsString shouldBe "true" |
| |
| //Create search query |
| println("Invoking the exec-query-search action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/exec-query-search", |
| Map("docid" -> "test_design".toJson, |
| "indexname" -> "test_search".toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("search query is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant exec query view""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test document for search query |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Create test design doc |
| val designDoc = CloudantUtil.createDesignFromFile(VIEW_AND_SEARCH_DDOC_PATH).toString |
| val getResponse = CloudantUtil.createDocument(credential, designDoc) |
| getResponse.get("ok").getAsString shouldBe "true" |
| |
| //Create search query |
| println("Invoking the exec-query-view action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/exec-query-view", |
| Map("docid" -> "test_design".toJson, |
| "viewname" -> "test_view".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| val rows = result.fields("rows").asInstanceOf[JsArray].elements(0).asJsObject |
| rows.fields.get("key") shouldBe Some(JsString("testId")) |
| rows.fields.get("value") shouldBe Some(JsNumber(1)) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant exec query view with undefined viewname""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test document for search query |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Create test design doc |
| val designDoc = CloudantUtil.createDesignFromFile(VIEW_AND_SEARCH_DDOC_PATH).toString |
| val getResponse = CloudantUtil.createDocument(credential, designDoc) |
| getResponse.get("ok").getAsString shouldBe "true" |
| |
| //Create search query |
| println("Invoking the exec-query-view action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/exec-query-view", |
| Map("docid" -> "test_design".toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("viewname is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete query index""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test index |
| val index = CloudantUtil.createDesignFromFile(CloudantUtil.INDEX_DDOC_PATH) |
| val response = CloudantUtil.createIndex(credential, index.toString) |
| response.get("result").getAsString shouldBe "created" |
| val id = response.get("id").getAsString |
| |
| println("Invoking the delete-query-index action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-query-index", |
| Map("docid" -> id.toJson, |
| "indexname" -> index.get("name").getAsString.toJson, |
| "indextype" -> "json".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("ok") shouldBe Some(JsBoolean(true)) |
| } |
| val getResponse = getDocument(credential, id) |
| getResponse.get("error").getAsString shouldBe "not_found" |
| getResponse.get("reason").getAsString shouldBe "deleted" |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete query index with undefined indextype""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test index |
| val index = CloudantUtil.createDesignFromFile(CloudantUtil.INDEX_DDOC_PATH) |
| val response = CloudantUtil.createIndex(credential, index.toString) |
| response.get("result").getAsString shouldBe "created" |
| val id = response.get("id").getAsString |
| |
| println("Invoking the delete-query-index action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-query-index", |
| Map("docid" -> id.toJson, |
| "indexname" -> index.get("name").getAsString.toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("indextype is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete view""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| //Create test index |
| val view = CloudantUtil.createDesignFromFile(VIEW_AND_SEARCH_DDOC_PATH) |
| val response = CloudantUtil.createDocument(credential, view.toString) |
| response.get("ok").getAsString shouldBe "true" |
| val id = response.get("id").getAsString |
| |
| println("Invoking the delete-view action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-view", |
| Map("docid" -> id.toJson, |
| "viewname" -> "test_view".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("ok") shouldBe Some(JsBoolean(true)) |
| } |
| //Assert that view is deleted |
| val getResponse = getDocument(credential, id) |
| getResponse.get("views").toString shouldBe "{}" |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete view with undefined docic""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| println("Invoking the delete-view action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-view", |
| Map("viewname" -> "test_view".toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("docid is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant create bulk documents""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val numDocs = 5 |
| val docsArray = CloudantUtil.createDocumentArray(numDocs).toString |
| val docsJsArray = docsArray.parseJson.asInstanceOf[JsArray] |
| |
| println("Invoking the manage-bulk-documents.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/manage-bulk-documents", |
| Map("docs" -> JsObject("docs" -> docsJsArray)))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| for (i <- 1 to numDocs) { |
| val response = CloudantUtil.getDocument(credential, s"testId$i") |
| val doc = result.fields("docs").asInstanceOf[JsArray].elements(i-1).asJsObject |
| Some(JsString(response.get("_rev").getAsString)) shouldBe doc.fields.get("rev") |
| } |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant update bulk documents""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val numDocs = 5 |
| val bulkDocs = CloudantUtil.createDocumentArray(numDocs) |
| //Create test docs for updating |
| val responses = CloudantUtil.bulkDocuments(credential, bulkDocs) |
| val updateDocsArray = CloudantUtil.updateDocsWithOnlyIdAndRev(responses).toString |
| val updatedDocsJsArray = updateDocsArray.parseJson.asInstanceOf[JsArray] |
| |
| println("Invoking the manage-bulk-documents.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/manage-bulk-documents", |
| Map("docs" -> JsObject("docs" -> updatedDocsJsArray)))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| for (i <- 1 to numDocs) { |
| val response = CloudantUtil.getDocument(credential, s"testId$i") |
| val doc = result.fields("docs").asInstanceOf[JsArray].elements(i-1).asJsObject |
| Some(JsString(response.get("_rev").getAsString)) shouldBe doc.fields.get("rev") |
| } |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant update bulk documents with malformed JSON params""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val numDocs = 5 |
| val bulkDocs = CloudantUtil.createDocumentArray(numDocs) |
| //Create test docs for updating |
| val responses = CloudantUtil.bulkDocuments(credential, bulkDocs) |
| val updateDocsArray = CloudantUtil.updateDocsWithOnlyIdAndRev(responses).toString |
| val updatedDocsJsArray = updateDocsArray.parseJson.asInstanceOf[JsArray] |
| |
| println("Invoking the manage-bulk-documents.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/manage-bulk-documents", |
| Map("docs" -> updatedDocsJsArray))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| JsHelpers.getFieldPath(result, "error", "statusCode") shouldBe Some(JsNumber(400)) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete bulk documents""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val numDocs = 5 |
| val bulkDocs = CloudantUtil.createDocumentArray(numDocs) |
| //Create test docs for updating |
| val responses = CloudantUtil.bulkDocuments(credential, bulkDocs) |
| //Update document array with deleted field |
| val deleteDocsArray = CloudantUtil.addDeletedPropertyToDocs(responses).toString |
| val deleteddDocsJsArray = deleteDocsArray.parseJson.asInstanceOf[JsArray] |
| |
| println("Invoking the manage-bulk-documents.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/manage-bulk-documents", |
| Map("docs" -> JsObject("docs" -> deleteddDocsJsArray)))) { |
| activation => |
| activation.response.success shouldBe true |
| for (i <- 1 to numDocs) { |
| val response = CloudantUtil.getDocument(credential, s"testId$i") |
| response.get("error").getAsString shouldBe "not_found" |
| response.get("reason").getAsString shouldBe "deleted" |
| } |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """cloudant delete bulk documents with undefined password""" 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, |
| "host" -> credential.host().toJson, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| val numDocs = 5 |
| val bulkDocs = CloudantUtil.createDocumentArray(numDocs) |
| //Create test docs for updating |
| val responses = CloudantUtil.bulkDocuments(credential, bulkDocs) |
| //Update document array with deleted field |
| val deleteDocsArray = CloudantUtil.addDeletedPropertyToDocs(responses).toString |
| val deleteddDocsJsArray = deleteDocsArray.parseJson.asInstanceOf[JsArray] |
| |
| println("Invoking the manage-bulk-documents.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/manage-bulk-documents", |
| Map("docs" -> JsObject("docs" -> deleteddDocsJsArray)))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("cloudant account password is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """read changes feed""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val doc = CloudantUtil.createDocParameterForWhisk().get("doc").getAsString |
| val docJSObj = doc.parseJson.asJsObject |
| |
| println("Invoking the read-changes-feed action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-changes-feed", |
| Map("doc" -> docJSObj))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("last_seq") shouldBe defined |
| result.fields.get("pending") shouldBe Some(JsNumber("0")) |
| result.fields("results").asInstanceOf[JsArray].elements.size shouldBe 0 |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """read changes feed with undefined dbname""" 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)) |
| } |
| |
| val doc = CloudantUtil.createDocParameterForWhisk().get("doc").getAsString |
| val docJSObj = doc.parseJson.asJsObject |
| |
| println("Invoking the read-changes-feed action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-changes-feed", |
| Map("doc" -> docJSObj))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("dbname is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """create attachment""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| //Create test document |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Get attachment text file |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val attachmentData = CloudantUtil.readFile(attachFile).trim() |
| |
| println("Invoking the create-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-attachment", |
| Map("docid" -> response.get("id").getAsString.toJson, |
| "docrev" -> response.get("rev").getAsString.toJson, |
| "attachment" -> attachmentData.toJson, |
| "attachmentname" -> attachFile.getName.toJson, |
| "contenttype" -> "text/plain".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("id") shouldBe defined |
| activation.response.result.get.fields.get("rev") shouldBe defined |
| } |
| val getResponse = CloudantUtil.getDocument(credential, "testId") |
| getResponse.get("_attachments").getAsJsonObject().has(attachFile.getName()) shouldBe true |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """create attachment with undefined attachment""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| //Create test document |
| val doc = CloudantUtil.createDocParameterForWhisk.get("doc").getAsString |
| val response = CloudantUtil.createDocument(credential, doc) |
| response.get("ok").getAsString shouldBe "true" |
| |
| //Get attachment text file |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| |
| println("Invoking the create-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/create-attachment", |
| Map("docid" -> response.get("id").getAsString.toJson, |
| "docrev" -> response.get("rev").getAsString.toJson, |
| "attachmentname" -> attachFile.getName.toJson, |
| "contenttype" -> "text/plain".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 """read attachment""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| val origData = CloudantUtil.readFile(CloudantUtil.ATTACHMENT_FILE_PATH) |
| val bytes = Array.fill[Byte](100)(0) |
| |
| println("Invoking the read-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-attachment", |
| Map("docid" -> id.toJson, |
| "attachmentname" -> attachFile.getName.toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| var i = 0 |
| result.fields("data").asInstanceOf[JsArray].elements.foreach({ x => |
| bytes.update(i, x.convertTo[Byte]) |
| i += 1 |
| }) |
| val byteString = new String(bytes, "utf-8") |
| origData.trim shouldBe byteString.trim |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """read attachment with undefined attachmentname""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| |
| println("Invoking the read-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/read-attachment", |
| Map("docid" -> id.toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("attachmentname is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """update attachment""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| val attachmentName = "attach.txt" |
| val getResponse = CloudantUtil.getDocument(credential, id) |
| val attachment = getResponse.get("_attachments").getAsJsonObject.get(attachmentName).getAsJsonObject |
| |
| println("Invoking the update-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/update-attachment", |
| Map("docid" -> id.toJson, |
| "attachmentname" -> attachFile.getName.toJson, |
| "docrev" -> getResponse.get("_rev").getAsString.toJson, |
| "attachment" -> "new_update_string".toJson, |
| "attachmentname" -> attachmentName.toJson, |
| "contenttype" -> "text/plain".toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| val result = activation.response.result.get |
| result.fields.get("id") shouldBe Some(JsString(id)) |
| } |
| val docResponse = getDocument(credential, id) |
| val updatedAttachment = docResponse.get("_attachments").getAsJsonObject.get(attachmentName).getAsJsonObject |
| getResponse.get("_attachments").getAsJsonObject.has(attachmentName) shouldBe true |
| attachment.get("revpos") should not be updatedAttachment.get("revpos") |
| attachment.get("digest") should not be updatedAttachment.get("digest") |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """update attachment with undefined contenttype""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| val attachmentName = "attach.txt" |
| val getResponse = CloudantUtil.getDocument(credential, id) |
| |
| println("Invoking the update-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/update-attachment", |
| Map("docid" -> id.toJson, |
| "attachmentname" -> attachFile.getName.toJson, |
| "docrev" -> getResponse.get("_rev").getAsString.toJson, |
| "attachment" -> "new_update_string".toJson, |
| "attachmentname" -> attachmentName.toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| result.fields.get("error") shouldBe Some(JsString("contenttype is required.")) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """delete attachment""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| //Create document with attachment |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| val getResponse = CloudantUtil.getDocument(credential, id) |
| |
| println("Invoking the delete-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-attachment", |
| Map("docid" -> getResponse.get("_id").getAsString.toJson, |
| "docrev" -> getResponse.get("_rev").getAsString.toJson, |
| "attachmentname" -> attachFile.getName.toJson))) { |
| activation => |
| activation.response.success shouldBe true |
| activation.response.result.get.fields.get("id") shouldBe defined |
| activation.response.result.get.fields.get("rev") shouldBe defined |
| } |
| //Assert that attachment does not exist in doc |
| val response = getDocument(credential, id).toString |
| val docJSObject = response.parseJson.asJsObject |
| docJSObject.fields.get("_attachments") should not be defined |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| |
| it should """delete attachment with undefined doc revision""" 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, |
| "dbname" -> credential.dbname.toJson)) |
| } |
| |
| //Create document with attachment |
| val attachFile = CloudantUtil.ATTACHMENT_FILE_PATH |
| val id = CloudantUtil.createDocumentWithAttachment(credential, attachFile).getId |
| val getResponse = CloudantUtil.getDocument(credential, id) |
| |
| println("Invoking the delete-attachment action.") |
| withActivation(wsk.activation, wsk.action.invoke(s"${packageName}/delete-attachment", |
| Map("docid" -> getResponse.get("_id").getAsString.toJson, |
| "attachmentname" -> attachFile.getName.toJson))) { |
| activation => |
| activation.response.success shouldBe false |
| val result = activation.response.result.get |
| JsHelpers.getFieldPath(result, "error", "statusCode") shouldBe Some(JsNumber(400)) |
| } |
| } |
| finally { |
| CloudantUtil.unsetUp(credential) |
| } |
| } |
| } |