API GW CLI support
diff --git a/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala b/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
index 0bf4198..baf3aa9 100644
--- a/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
+++ b/tests/src/whisk/core/cli/test/WskBasicUsageTests.scala
@@ -17,6 +17,8 @@
package whisk.core.cli.test
import java.io.File
+import java.io.BufferedWriter
+import java.io.FileWriter
import java.time.Instant
import scala.language.postfixOps
@@ -699,6 +701,85 @@
}
}
+ behavior of "Wsk api"
+
+ it should "reject an api commands with an invalid path parameter" in {
+ val badpath = "badpath"
+
+ var rr = wsk.cli(Seq("api-experimental", "create", "/basepath", badpath, "GET", "action", "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badpath}' must begin with '/'")
+
+ rr = wsk.cli(Seq("api-experimental", "delete", "/basepath", badpath, "GET", "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badpath}' must begin with '/'")
+
+ rr = wsk.cli(Seq("api-experimental", "list", "/basepath", badpath, "GET", "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badpath}' must begin with '/'")
+ }
+
+ it should "reject an api commands with an invalid verb parameter" in {
+ val badverb = "badverb"
+
+ var rr = wsk.cli(Seq("api-experimental", "create", "/basepath", "/path", badverb, "action", "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badverb}' is not a valid API verb. Valid values are:")
+
+ rr = wsk.cli(Seq("api-experimental", "delete", "/basepath", "/path", badverb, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badverb}' is not a valid API verb. Valid values are:")
+
+ rr = wsk.cli(Seq("api-experimental", "list", "/basepath", "/path", badverb, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"'${badverb}' is not a valid API verb. Valid values are:")
+ }
+
+ it should "reject an api create command with an API name argument and an API name option" in {
+ val apiName = "An API Name"
+ val rr = wsk.cli(Seq("api-experimental", "create", apiName, "/path", "GET", "action", "-n", apiName, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"An API name can only be specified once.")
+ }
+
+ it should "reject an api create command that specifies a nonexistent configuration file" in {
+ val configfile = "/nonexistent/file"
+ val rr = wsk.cli(Seq("api-experimental", "create", "-c", configfile, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"Error reading swagger file '${configfile}':")
+ }
+
+ it should "reject an api create command specifying a non-JSON configuration file" in {
+ val file = File.createTempFile("api.json", ".txt")
+ file.deleteOnExit()
+ val filename = file.getAbsolutePath()
+
+ val bw = new BufferedWriter(new FileWriter(file))
+ bw.write("a=A")
+ bw.close()
+
+ val rr = wsk.cli(Seq("api-experimental", "create", "-c", filename, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"Error parsing swagger file '${filename}':")
+ }
+
+ it should "reject an api create command specifying a non-swagger JSON configuration file" in {
+ val file = File.createTempFile("api.json", ".txt")
+ file.deleteOnExit()
+ val filename = file.getAbsolutePath()
+
+ val bw = new BufferedWriter(new FileWriter(file))
+ bw.write("""|{
+ | "swagger": "2.0",
+ | "info": {
+ | "title": "My API",
+ | "version": "1.0.0"
+ | },
+ | "BADbasePath": "/bp",
+ | "paths": {
+ | "/rp": {
+ | "get":{}
+ | }
+ | }
+ |}""".stripMargin
+ )
+ bw.close()
+
+ val rr = wsk.cli(Seq("api-experimental", "create", "-c", filename, "--auth", wskprops.authKey) ++ wskprops.overrides, expectedExitCode = ANY_ERROR_EXIT)
+ rr.stderr should include (s"Swagger file is invalid (missing basePath, info, paths, or swagger fields")
+ }
+
behavior of "Wsk entity list formatting"
it should "create, and list a package with a long name" in withAssetCleaner(wskprops) {
@@ -956,7 +1037,18 @@
val optPayloadMsg = "A payload is optional."
val noArgsReqMsg = "No arguments are required."
val invalidArg = "invalidArg"
+ val apiCreateReqMsg = "Specify a swagger file or specify an API base path with an API path, an API verb, and an action name."
+ val apiGetReqMsg = "An API base path or API name is required."
+ val apiDeleteReqMsg = "An API base path or API name is required. An optional API relative path and operation may also be provided."
+ val apiListReqMsg = "Optional parameters are: API base path (or API name), API relative path and operation."
val invalidArgs = Seq(
+ (Seq("api-experimental", "create"), s"${tooFewArgsMsg} ${apiCreateReqMsg}"),
+ (Seq("api-experimental", "create", "/basepath", "/path", "GET", "action", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${apiCreateReqMsg}"),
+ (Seq("api-experimental", "get"), s"${tooFewArgsMsg} ${apiGetReqMsg}"),
+ (Seq("api-experimental", "get", "/basepath", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${apiGetReqMsg}"),
+ (Seq("api-experimental", "delete"), s"${tooFewArgsMsg} ${apiDeleteReqMsg}"),
+ (Seq("api-experimental", "delete", "/basepath", "/path", "GET", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${apiDeleteReqMsg}"),
+ (Seq("api-experimental", "list", "/basepath", "/path", "GET", invalidArg), s"${tooManyArgsMsg}${invalidArg}. ${apiListReqMsg}"),
(Seq("action", "create"), s"${tooFewArgsMsg} ${actionNameActionReqMsg}"),
(Seq("action", "create", "someAction"), s"${tooFewArgsMsg} ${actionNameActionReqMsg}"),
(Seq("action", "create", "actionName", "artifactName", invalidArg), s"${tooManyArgsMsg}${invalidArg}."),