This is an automated email from the ASF dual-hosted git repository.

lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-k.git

commit acbb0bc6b756b736e964ce76854e83ff397cf3b8
Author: Andrea Tarocchi <[email protected]>
AuthorDate: Thu Dec 12 23:32:25 2019 +0100

    Refactoring to allow testability of cobra/viper commands and commands flags 
loading.
---
 pkg/cmd/builder.go                   | 10 +++---
 pkg/cmd/delete.go                    | 12 +++----
 pkg/cmd/describe.go                  |  6 ++--
 pkg/cmd/describe_integration.go      | 22 ++++++-------
 pkg/cmd/describe_kit.go              | 20 +++++------
 pkg/cmd/describe_platform.go         | 20 +++++------
 pkg/cmd/get.go                       |  4 +--
 pkg/cmd/install.go                   | 12 +++----
 pkg/cmd/kit.go                       |  6 ++--
 pkg/cmd/kit_create.go                | 20 +++++------
 pkg/cmd/kit_delete.go                | 20 +++++------
 pkg/cmd/kit_get.go                   | 18 +++++-----
 pkg/cmd/log.go                       |  4 +--
 pkg/cmd/rebuild.go                   |  4 +--
 pkg/cmd/reset.go                     |  4 +--
 pkg/cmd/root.go                      | 45 +++++++++++++++++--------
 pkg/cmd/root_test.go                 | 64 ++++++++++++++++++++++++++++++++++--
 pkg/cmd/run.go                       |  4 +--
 pkg/cmd/{kit.go => run_test.go}      | 20 +++++------
 pkg/cmd/util.go                      |  4 +++
 pkg/{cmd/kit.go => util/test/cmd.go} | 31 ++++++++++-------
 21 files changed, 220 insertions(+), 130 deletions(-)

diff --git a/pkg/cmd/builder.go b/pkg/cmd/builder.go
index 9517e7d..5c541f7 100644
--- a/pkg/cmd/builder.go
+++ b/pkg/cmd/builder.go
@@ -22,8 +22,8 @@ import (
        "github.com/spf13/cobra"
 )
 
-func newCmdBuilder(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := builderCmdOptions{
+func newCmdBuilder(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*builderCmdOptions) {
+       options := builderCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
        cmd := cobra.Command{
@@ -31,13 +31,13 @@ func newCmdBuilder(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Short:   "Run the Camel K builder",
                Long:    `Run the Camel K builder`,
                Hidden:  true,
-               PreRunE: decode(&impl),
-               Run:     impl.run,
+               PreRunE: decode(&options),
+               Run:     options.run,
        }
 
        cmd.Flags().String("build-name", "", "The name of the build resource")
 
-       return &cmd
+       return &cmd, &options
 }
 
 type builderCmdOptions struct {
diff --git a/pkg/cmd/delete.go b/pkg/cmd/delete.go
index a3d9a55..aaf9863 100644
--- a/pkg/cmd/delete.go
+++ b/pkg/cmd/delete.go
@@ -31,19 +31,19 @@ import (
 )
 
 // newCmdDelete --
-func newCmdDelete(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := deleteCmdOptions{
+func newCmdDelete(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*deleteCmdOptions) {
+       options := deleteCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
        cmd := cobra.Command{
                Use:     "delete [integration1] [integration2] ...",
                Short:   "Delete integrations deployed on Kubernetes",
-               PreRunE: decode(&impl),
+               PreRunE: decode(&options),
                RunE: func(_ *cobra.Command, args []string) error {
-                       if err := impl.validate(args); err != nil {
+                       if err := options.validate(args); err != nil {
                                return err
                        }
-                       if err := impl.run(args); err != nil {
+                       if err := options.run(args); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -53,7 +53,7 @@ func newCmdDelete(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
 
        cmd.Flags().Bool("all", false, "Delete all integrations")
 
-       return &cmd
+       return &cmd, &options
 }
 
 type deleteCmdOptions struct {
diff --git a/pkg/cmd/describe.go b/pkg/cmd/describe.go
index aa0ae52..13ed541 100644
--- a/pkg/cmd/describe.go
+++ b/pkg/cmd/describe.go
@@ -71,9 +71,9 @@ func newCmdDescribe(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Long:  `Describe a Camel K resource.`,
        }
 
-       cmd.AddCommand(newDescribeKitCmd(rootCmdOptions))
-       cmd.AddCommand(newDescribeIntegrationCmd(rootCmdOptions))
-       cmd.AddCommand(newDescribePlatformCmd(rootCmdOptions))
+       cmd.AddCommand(cmdOnly(newDescribeKitCmd(rootCmdOptions)))
+       cmd.AddCommand(cmdOnly(newDescribeIntegrationCmd(rootCmdOptions)))
+       cmd.AddCommand(cmdOnly(newDescribePlatformCmd(rootCmdOptions)))
 
        return &cmd
 }
diff --git a/pkg/cmd/describe_integration.go b/pkg/cmd/describe_integration.go
index 25882f4..bd4647c 100644
--- a/pkg/cmd/describe_integration.go
+++ b/pkg/cmd/describe_integration.go
@@ -30,9 +30,9 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-func newDescribeIntegrationCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newDescribeIntegrationCmd(rootCmdOptions *RootCmdOptions) 
(*cobra.Command, *describeIntegrationCommandOptions) {
 
-       impl := &describeIntegrationCommand{
+       options := describeIntegrationCommandOptions{
                RootCmdOptions: rootCmdOptions,
        }
 
@@ -41,12 +41,12 @@ func newDescribeIntegrationCmd(rootCmdOptions 
*RootCmdOptions) *cobra.Command {
                Aliases: []string{"it"},
                Short:   "Describe an Integration",
                Long:    `Describe an Integration.`,
-               PreRunE: decode(&impl),
+               PreRunE: decode(&options),
                RunE: func(_ *cobra.Command, args []string) error {
-                       if err := impl.validate(args); err != nil {
+                       if err := options.validate(args); err != nil {
                                return err
                        }
-                       if err := impl.run(args); err != nil {
+                       if err := options.run(args); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -54,24 +54,24 @@ func newDescribeIntegrationCmd(rootCmdOptions 
*RootCmdOptions) *cobra.Command {
                },
        }
 
-       cmd.Flags().BoolVar(&impl.showSourceContent, "show-source-content", 
false, "Print source content")
+       cmd.Flags().BoolVar(&options.showSourceContent, "show-source-content", 
false, "Print source content")
 
-       return &cmd
+       return &cmd, &options
 }
 
-type describeIntegrationCommand struct {
+type describeIntegrationCommandOptions struct {
        *RootCmdOptions
        showSourceContent bool `mapstructure:"show-source-content"`
 }
 
-func (command *describeIntegrationCommand) validate(args []string) error {
+func (command *describeIntegrationCommandOptions) validate(args []string) 
error {
        if len(args) != 1 {
                return fmt.Errorf("accepts at least 1 arg, received %d", 
len(args))
        }
        return nil
 }
 
-func (command *describeIntegrationCommand) run(args []string) error {
+func (command *describeIntegrationCommandOptions) run(args []string) error {
        c, err := command.GetCmdClient()
        if err != nil {
                return err
@@ -92,7 +92,7 @@ func (command *describeIntegrationCommand) run(args []string) 
error {
        return nil
 }
 
-func (command *describeIntegrationCommand) describeIntegration(i 
v1alpha1.Integration) string {
+func (command *describeIntegrationCommandOptions) describeIntegration(i 
v1alpha1.Integration) string {
        return indentedwriter.IndentedString(func(out io.Writer) {
                w := indentedwriter.NewWriter(out)
 
diff --git a/pkg/cmd/describe_kit.go b/pkg/cmd/describe_kit.go
index a3ce855..c0d42f6 100644
--- a/pkg/cmd/describe_kit.go
+++ b/pkg/cmd/describe_kit.go
@@ -28,8 +28,8 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-func newDescribeKitCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := &describeKitCommand{
+func newDescribeKitCmd(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*describeKitCommandOptions) {
+       options := describeKitCommandOptions{
                rootCmdOptions,
        }
 
@@ -37,12 +37,12 @@ func newDescribeKitCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Use:     "kit",
                Short:   "Describe an Integration Kit",
                Long:    `Describe an Integration Kit.`,
-               PreRunE: decode(impl),
+               PreRunE: decode(options),
                RunE: func(_ *cobra.Command, args []string) error {
-                       if err := impl.validate(args); err != nil {
+                       if err := options.validate(args); err != nil {
                                return err
                        }
-                       if err := impl.run(args); err != nil {
+                       if err := options.run(args); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -50,21 +50,21 @@ func newDescribeKitCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                },
        }
 
-       return &cmd
+       return &cmd, &options
 }
 
-type describeKitCommand struct {
+type describeKitCommandOptions struct {
        *RootCmdOptions
 }
 
-func (command *describeKitCommand) validate(args []string) error {
+func (command *describeKitCommandOptions) validate(args []string) error {
        if len(args) != 1 {
                return fmt.Errorf("accepts at least 1 arg, received %d", 
len(args))
        }
        return nil
 }
 
-func (command *describeKitCommand) run(args []string) error {
+func (command *describeKitCommandOptions) run(args []string) error {
        c, err := command.GetCmdClient()
        if err != nil {
                return err
@@ -85,7 +85,7 @@ func (command *describeKitCommand) run(args []string) error {
        return nil
 }
 
-func (command *describeKitCommand) describeIntegrationKit(kit 
v1alpha1.IntegrationKit) string {
+func (command *describeKitCommandOptions) describeIntegrationKit(kit 
v1alpha1.IntegrationKit) string {
        return indentedwriter.IndentedString(func(out io.Writer) {
                w := indentedwriter.NewWriter(out)
 
diff --git a/pkg/cmd/describe_platform.go b/pkg/cmd/describe_platform.go
index 17c639b..ddcb799 100644
--- a/pkg/cmd/describe_platform.go
+++ b/pkg/cmd/describe_platform.go
@@ -28,8 +28,8 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-func newDescribePlatformCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := &describePlatformCommand{
+func newDescribePlatformCmd(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*describePlatformCommandOptions) {
+       options := describePlatformCommandOptions{
                rootCmdOptions,
        }
 
@@ -37,12 +37,12 @@ func newDescribePlatformCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Use:     "platform",
                Short:   "Describe an Integration Platform",
                Long:    `Describe an Integration Platform.`,
-               PreRunE: decode(impl),
+               PreRunE: decode(options),
                RunE: func(_ *cobra.Command, args []string) error {
-                       if err := impl.validate(args); err != nil {
+                       if err := options.validate(args); err != nil {
                                return err
                        }
-                       if err := impl.run(args); err != nil {
+                       if err := options.run(args); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -50,21 +50,21 @@ func newDescribePlatformCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                },
        }
 
-       return &cmd
+       return &cmd, &options
 }
 
-type describePlatformCommand struct {
+type describePlatformCommandOptions struct {
        *RootCmdOptions
 }
 
-func (command *describePlatformCommand) validate(args []string) error {
+func (command *describePlatformCommandOptions) validate(args []string) error {
        if len(args) != 1 {
                return fmt.Errorf("accepts at least 1 arg, received %d", 
len(args))
        }
        return nil
 }
 
-func (command *describePlatformCommand) run(args []string) error {
+func (command *describePlatformCommandOptions) run(args []string) error {
        c, err := command.GetCmdClient()
        if err != nil {
                return err
@@ -85,7 +85,7 @@ func (command *describePlatformCommand) run(args []string) 
error {
        return nil
 }
 
-func (command *describePlatformCommand) describeIntegrationPlatform(platform 
v1alpha1.IntegrationPlatform) string {
+func (command *describePlatformCommandOptions) 
describeIntegrationPlatform(platform v1alpha1.IntegrationPlatform) string {
        return indentedwriter.IndentedString(func(out io.Writer) {
                w := indentedwriter.NewWriter(out)
                describeObjectMeta(w, platform.ObjectMeta)
diff --git a/pkg/cmd/get.go b/pkg/cmd/get.go
index d5dea19..3e10f96 100644
--- a/pkg/cmd/get.go
+++ b/pkg/cmd/get.go
@@ -34,7 +34,7 @@ type getCmdOptions struct {
        *RootCmdOptions
 }
 
-func newCmdGet(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newCmdGet(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*getCmdOptions) {
        options := getCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
@@ -46,7 +46,7 @@ func newCmdGet(rootCmdOptions *RootCmdOptions) *cobra.Command 
{
                RunE:    options.run,
        }
 
-       return &cmd
+       return &cmd, &options
 }
 
 func (o *getCmdOptions) run(cmd *cobra.Command, args []string) error {
diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go
index bc10726..96289da 100644
--- a/pkg/cmd/install.go
+++ b/pkg/cmd/install.go
@@ -44,20 +44,20 @@ import (
        k8serrors "k8s.io/apimachinery/pkg/api/errors"
 )
 
-func newCmdInstall(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := installCmdOptions{
+func newCmdInstall(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*installCmdOptions) {
+       options := installCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
        cmd := cobra.Command{
                Use:     "install",
                Short:   "Installs Camel K on a Kubernetes cluster",
                Long:    `Installs Camel K on a Kubernetes or OpenShift 
cluster.`,
-               PreRunE: impl.decode,
+               PreRunE: options.decode,
                RunE: func(cmd *cobra.Command, args []string) error {
-                       if err := impl.validate(cmd, args); err != nil {
+                       if err := options.validate(cmd, args); err != nil {
                                return err
                        }
-                       if err := impl.install(cmd, args); err != nil {
+                       if err := options.install(cmd, args); err != nil {
                                return err
                        }
                        return nil
@@ -107,7 +107,7 @@ func newCmdInstall(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                },
        )
 
-       return &cmd
+       return &cmd, &options
 }
 
 type installCmdOptions struct {
diff --git a/pkg/cmd/kit.go b/pkg/cmd/kit.go
index 67d7ef1..726f09d 100644
--- a/pkg/cmd/kit.go
+++ b/pkg/cmd/kit.go
@@ -28,9 +28,9 @@ func newCmdKit(rootCmdOptions *RootCmdOptions) *cobra.Command 
{
                Long:  `Configure an Integration Kit.`,
        }
 
-       cmd.AddCommand(newKitCreateCmd(rootCmdOptions))
-       cmd.AddCommand(newKitDeleteCmd(rootCmdOptions))
-       cmd.AddCommand(newKitGetCmd(rootCmdOptions))
+       cmd.AddCommand(cmdOnly(newKitCreateCmd(rootCmdOptions)))
+       cmd.AddCommand(cmdOnly(newKitDeleteCmd(rootCmdOptions)))
+       cmd.AddCommand(cmdOnly(newKitGetCmd(rootCmdOptions)))
 
        return &cmd
 }
diff --git a/pkg/cmd/kit_create.go b/pkg/cmd/kit_create.go
index 3f66c2f..a29c4b3 100644
--- a/pkg/cmd/kit_create.go
+++ b/pkg/cmd/kit_create.go
@@ -33,8 +33,8 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-func newKitCreateCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := &kitCreateCommand{
+func newKitCreateCmd(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*kitCreateCommandOptions) {
+       options := kitCreateCommandOptions{
                RootCmdOptions: rootCmdOptions,
        }
 
@@ -42,9 +42,9 @@ func newKitCreateCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Use:     "create <name>",
                Short:   "Create an Integration Kit",
                Long:    `Create an Integration Kit.`,
-               Args:    impl.validateArgs,
-               PreRunE: decode(impl),
-               RunE:    impl.run,
+               Args:    options.validateArgs,
+               PreRunE: decode(options),
+               RunE:    options.run,
        }
 
        cmd.Flags().String("image", "", "Image used to create the kit")
@@ -58,10 +58,10 @@ func newKitCreateCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
        // completion support
        configureKnownCompletions(&cmd)
 
-       return &cmd
+       return &cmd, &options
 }
 
-type kitCreateCommand struct {
+type kitCreateCommandOptions struct {
        *RootCmdOptions
 
        Image        string   `mapstructure:"image"`
@@ -73,7 +73,7 @@ type kitCreateCommand struct {
        Traits       []string `mapstructure:"traits"`
 }
 
-func (command *kitCreateCommand) validateArgs(_ *cobra.Command, args []string) 
error {
+func (command *kitCreateCommandOptions) validateArgs(_ *cobra.Command, args 
[]string) error {
        if len(args) != 1 {
                return errors.New("create expects a single name argument")
        }
@@ -81,7 +81,7 @@ func (command *kitCreateCommand) validateArgs(_ 
*cobra.Command, args []string) e
        return nil
 }
 
-func (command *kitCreateCommand) run(_ *cobra.Command, args []string) error {
+func (command *kitCreateCommandOptions) run(_ *cobra.Command, args []string) 
error {
        c, err := command.GetCmdClient()
        if err != nil {
                return err
@@ -201,7 +201,7 @@ func (command *kitCreateCommand) run(_ *cobra.Command, args 
[]string) error {
        return nil
 }
 
-func (*kitCreateCommand) configureTrait(ctx *v1alpha1.IntegrationKit, config 
string) error {
+func (*kitCreateCommandOptions) configureTrait(ctx *v1alpha1.IntegrationKit, 
config string) error {
        if ctx.Spec.Traits == nil {
                ctx.Spec.Traits = make(map[string]v1alpha1.TraitSpec)
        }
diff --git a/pkg/cmd/kit_delete.go b/pkg/cmd/kit_delete.go
index 7902fae..3d02d03 100644
--- a/pkg/cmd/kit_delete.go
+++ b/pkg/cmd/kit_delete.go
@@ -29,8 +29,8 @@ import (
        k8errors "k8s.io/apimachinery/pkg/api/errors"
 )
 
-func newKitDeleteCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := kitDeleteCommand{
+func newKitDeleteCmd(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*kitDeleteCommandOptions) {
+       options := kitDeleteCommandOptions{
                RootCmdOptions: rootCmdOptions,
        }
 
@@ -38,12 +38,12 @@ func newKitDeleteCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Use:     "delete",
                Short:   "Delete an Integration Kit",
                Long:    `Delete an Integration Kit.`,
-               PreRunE: decode(&impl),
+               PreRunE: decode(&options),
                RunE: func(_ *cobra.Command, args []string) error {
-                       if err := impl.validate(args); err != nil {
+                       if err := options.validate(args); err != nil {
                                return err
                        }
-                       if err := impl.run(args); err != nil {
+                       if err := options.run(args); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -53,15 +53,15 @@ func newKitDeleteCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
 
        cmd.Flags().Bool("all", false, "Delete all integration Kits")
 
-       return &cmd
+       return &cmd, &options
 }
 
-type kitDeleteCommand struct {
+type kitDeleteCommandOptions struct {
        *RootCmdOptions
        All bool `mapstructure:"all"`
 }
 
-func (command *kitDeleteCommand) validate(args []string) error {
+func (command *kitDeleteCommandOptions) validate(args []string) error {
        if command.All && len(args) > 0 {
                return errors.New("invalid combination: both all flag and named 
Kits are set")
        }
@@ -72,7 +72,7 @@ func (command *kitDeleteCommand) validate(args []string) 
error {
        return nil
 }
 
-func (command *kitDeleteCommand) run(args []string) error {
+func (command *kitDeleteCommandOptions) run(args []string) error {
        names := args
 
        c, err := command.GetCmdClient()
@@ -104,7 +104,7 @@ func (command *kitDeleteCommand) run(args []string) error {
        return nil
 }
 
-func (command *kitDeleteCommand) delete(name string) error {
+func (command *kitDeleteCommandOptions) delete(name string) error {
        ctx := v1alpha1.NewIntegrationKit(command.Namespace, name)
        key := k8sclient.ObjectKey{
                Namespace: command.Namespace,
diff --git a/pkg/cmd/kit_get.go b/pkg/cmd/kit_get.go
index a22af7b..b20489f 100644
--- a/pkg/cmd/kit_get.go
+++ b/pkg/cmd/kit_get.go
@@ -28,8 +28,8 @@ import (
        "github.com/apache/camel-k/pkg/apis/camel/v1alpha1"
 )
 
-func newKitGetCmd(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       impl := kitGetCommand{
+func newKitGetCmd(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*kitGetCommandOptions) {
+       options := kitGetCommandOptions{
                RootCmdOptions: rootCmdOptions,
        }
 
@@ -37,12 +37,12 @@ func newKitGetCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                Use:     "get",
                Short:   "Get defined Integration Kit",
                Long:    `Get defined Integration Kit.`,
-               PreRunE: decode(&impl),
+               PreRunE: decode(&options),
                RunE: func(cmd *cobra.Command, args []string) error {
-                       if err := impl.validate(cmd, args); err != nil {
+                       if err := options.validate(cmd, args); err != nil {
                                return err
                        }
-                       if err := impl.run(cmd); err != nil {
+                       if err := options.run(cmd); err != nil {
                                fmt.Println(err.Error())
                        }
 
@@ -54,21 +54,21 @@ func newKitGetCmd(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
        cmd.Flags().Bool(v1alpha1.IntegrationKitTypeExternal, true, "Includes 
external Kits")
        cmd.Flags().Bool(v1alpha1.IntegrationKitTypePlatform, true, "Includes 
platform Kits")
 
-       return &cmd
+       return &cmd, &options
 }
 
-type kitGetCommand struct {
+type kitGetCommandOptions struct {
        *RootCmdOptions
        User     bool `mapstructure:"user"`
        External bool `mapstructure:"external"`
        Platform bool `mapstructure:"platform"`
 }
 
-func (command *kitGetCommand) validate(cmd *cobra.Command, args []string) 
error {
+func (command *kitGetCommandOptions) validate(cmd *cobra.Command, args 
[]string) error {
        return nil
 }
 
-func (command *kitGetCommand) run(cmd *cobra.Command) error {
+func (command *kitGetCommandOptions) run(cmd *cobra.Command) error {
        kitList := v1alpha1.NewIntegrationKitList()
        c, err := command.GetCmdClient()
        if err != nil {
diff --git a/pkg/cmd/log.go b/pkg/cmd/log.go
index 852c9c3..de6d0db 100644
--- a/pkg/cmd/log.go
+++ b/pkg/cmd/log.go
@@ -27,7 +27,7 @@ import (
        k8sclient "sigs.k8s.io/controller-runtime/pkg/client"
 )
 
-func newCmdLog(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newCmdLog(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*logCmdOptions) {
        options := logCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
@@ -44,7 +44,7 @@ func newCmdLog(rootCmdOptions *RootCmdOptions) *cobra.Command 
{
        // completion support
        configureKnownCompletions(&cmd)
 
-       return &cmd
+       return &cmd, &options
 }
 
 type logCmdOptions struct {
diff --git a/pkg/cmd/rebuild.go b/pkg/cmd/rebuild.go
index d88738a..82e845c 100644
--- a/pkg/cmd/rebuild.go
+++ b/pkg/cmd/rebuild.go
@@ -29,7 +29,7 @@ import (
        "github.com/apache/camel-k/pkg/client"
 )
 
-func newCmdRebuild(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newCmdRebuild(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*rebuildCmdOptions) {
        options := rebuildCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
@@ -41,7 +41,7 @@ func newCmdRebuild(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
                RunE:    options.rebuild,
        }
 
-       return &cmd
+       return &cmd, &options
 }
 
 type rebuildCmdOptions struct {
diff --git a/pkg/cmd/reset.go b/pkg/cmd/reset.go
index 02bd058..0275493 100644
--- a/pkg/cmd/reset.go
+++ b/pkg/cmd/reset.go
@@ -29,7 +29,7 @@ import (
        "github.com/apache/camel-k/pkg/client"
 )
 
-func newCmdReset(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newCmdReset(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*resetCmdOptions) {
        options := resetCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
@@ -44,7 +44,7 @@ func newCmdReset(rootCmdOptions *RootCmdOptions) 
*cobra.Command {
        cmd.Flags().Bool("skip-kits", false, "Do not delete the integration 
kits")
        cmd.Flags().Bool("skip-integrations", false, "Do not delete the 
integrations")
 
-       return &cmd
+       return &cmd, &options
 }
 
 type resetCmdOptions struct {
diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go
index c553c2a..cc8473d 100644
--- a/pkg/cmd/root.go
+++ b/pkg/cmd/root.go
@@ -46,6 +46,17 @@ func NewKamelCommand(ctx context.Context) (*cobra.Command, 
error) {
        options := RootCmdOptions{
                Context: ctx,
        }
+
+       var err error
+       cmd := kamelPreAddCommandInit(options)
+       cmd = addKamelSubcommands(*cmd, options)
+       cmd, err = kamelPostAddCommandInit(*cmd)
+
+       return cmd, err
+}
+
+func kamelPreAddCommandInit(options RootCmdOptions) *cobra.Command {
+
        var cmd = cobra.Command{
                BashCompletionFunction: bashCompletionFunction,
                PersistentPreRunE:      options.preRun,
@@ -57,20 +68,10 @@ func NewKamelCommand(ctx context.Context) (*cobra.Command, 
error) {
        cmd.PersistentFlags().StringVar(&options.KubeConfig, "config", 
os.Getenv("KUBECONFIG"), "Path to the config file to use for CLI requests")
        cmd.PersistentFlags().StringVarP(&options.Namespace, "namespace", "n", 
"", "Namespace to use for all operations")
 
-       cmd.AddCommand(newCmdCompletion(&cmd))
-       cmd.AddCommand(newCmdVersion())
-       cmd.AddCommand(newCmdRun(&options))
-       cmd.AddCommand(newCmdGet(&options))
-       cmd.AddCommand(newCmdDelete(&options))
-       cmd.AddCommand(newCmdInstall(&options))
-       cmd.AddCommand(newCmdLog(&options))
-       cmd.AddCommand(newCmdKit(&options))
-       cmd.AddCommand(newCmdReset(&options))
-       cmd.AddCommand(newCmdDescribe(&options))
-       cmd.AddCommand(newCmdRebuild(&options))
-       cmd.AddCommand(newCmdOperator())
-       cmd.AddCommand(newCmdBuilder(&options))
+       return &cmd
+}
 
+func kamelPostAddCommandInit(cmd cobra.Command) (*cobra.Command, error) {
        if err := bindPFlagsHierarchy(&cmd); err != nil {
                return nil, err
        }
@@ -98,6 +99,24 @@ func NewKamelCommand(ctx context.Context) (*cobra.Command, 
error) {
        return &cmd, nil
 }
 
+func addKamelSubcommands(cmd cobra.Command, options RootCmdOptions) 
*cobra.Command {
+       cmd.AddCommand(newCmdCompletion(&cmd))
+       cmd.AddCommand(newCmdVersion())
+       cmd.AddCommand(cmdOnly(newCmdRun(&options)))
+       cmd.AddCommand(cmdOnly(newCmdGet(&options)))
+       cmd.AddCommand(cmdOnly(newCmdDelete(&options)))
+       cmd.AddCommand(cmdOnly(newCmdInstall(&options)))
+       cmd.AddCommand(cmdOnly(newCmdLog(&options)))
+       cmd.AddCommand(newCmdKit(&options))
+       cmd.AddCommand(cmdOnly(newCmdReset(&options)))
+       cmd.AddCommand(newCmdDescribe(&options))
+       cmd.AddCommand(cmdOnly(newCmdRebuild(&options)))
+       cmd.AddCommand(newCmdOperator())
+       cmd.AddCommand(cmdOnly(newCmdBuilder(&options)))
+
+       return &cmd
+}
+
 func (command *RootCmdOptions) preRun(cmd *cobra.Command, _ []string) error {
        if command.Namespace == "" {
                current, err := client.GetCurrentNamespace(command.KubeConfig)
diff --git a/pkg/cmd/root_test.go b/pkg/cmd/root_test.go
index 57f6621..7505ffb 100644
--- a/pkg/cmd/root_test.go
+++ b/pkg/cmd/root_test.go
@@ -17,7 +17,67 @@ limitations under the License.
 
 package cmd
 
-import "testing"
+import (
+       "context"
+       "github.com/apache/camel-k/pkg/util/test"
+       "github.com/spf13/cobra"
+       "os"
+       "testing"
+)
 
-func TestDecodeRoot(t *testing.T) {
+func kamelTestPostAddCommandInit(rootCmd *cobra.Command) *cobra.Command {
+       rootCmd, _ = kamelPostAddCommandInit(*rootCmd)
+       return rootCmd
+}
+
+func kamelTestPreAddCommandInit() (RootCmdOptions, *cobra.Command) {
+       options := RootCmdOptions{
+               Context: context.Background(),
+       }
+       rootCmd := kamelPreAddCommandInit(options)
+       rootCmd.Run = test.EmptyRun
+       return options, rootCmd
+}
+
+func TestLoadFromCommandLine(t *testing.T) {
+       options, rootCmd := kamelTestPreAddCommandInit()
+
+       runCmdOptions := addTestRunCmd(options, rootCmd)
+
+       rootCmd = kamelTestPostAddCommandInit(rootCmd)
+
+       _, err := test.ExecuteCommand(rootCmd, "run", "route.java", "--env", 
"VAR1=value,othervalue", "--env", "VAR2=value2")
+       if err != nil {
+               t.Fatalf("Unexpected error: %v", err)
+       }
+
+       if len(runCmdOptions.EnvVars) != 2 {
+               t.Errorf("Properties expected to contain: \n %v 
elements\nGot:\n %v elemtns\n", 2, len(runCmdOptions.EnvVars))
+       }
+       if runCmdOptions.EnvVars[0] != "VAR1=value,othervalue" || 
runCmdOptions.EnvVars[1] != "VAR2=value2" {
+               t.Errorf("EnvVars expected to be: \n %v\nGot:\n %v\n", 
"[VAR1=value,othervalue VAR=value2]", runCmdOptions.EnvVars)
+       }
+}
+
+func TestLoadFromEnvVar(t *testing.T) {
+       //shows how to include a "," character inside an env value see VAR1 
value
+       os.Setenv("KAMEL_RUN_ENVS", 
"\"VAR1=value,\"\"othervalue\"\"\",VAR2=value2")
+
+       options, rootCmd := kamelTestPreAddCommandInit()
+
+       runCmdOptions := addTestRunCmd(options, rootCmd)
+
+       rootCmd = kamelTestPostAddCommandInit(rootCmd)
+
+       _, err := test.ExecuteCommand(rootCmd, "run", "route.java")
+       if err != nil {
+               t.Fatalf("Unexpected error: %v", err)
+       }
+
+       if len(runCmdOptions.EnvVars) != 2 {
+               t.Fatalf("Properties expected to contain: \n %v 
elements\nGot:\n %v elemtns\n", 2, len(runCmdOptions.EnvVars))
+       }
+       if runCmdOptions.EnvVars[0] != "VAR1=value,\"othervalue\"" || 
runCmdOptions.EnvVars[1] != "VAR2=value2" {
+               t.Fatalf("EnvVars expected to be: \n %v\nGot:\n %v\n", 
"[VAR1=value,\"othervalue\" VAR=value2]", runCmdOptions.EnvVars)
+       }
 }
diff --git a/pkg/cmd/run.go b/pkg/cmd/run.go
index 4c41081..df1b9b6 100644
--- a/pkg/cmd/run.go
+++ b/pkg/cmd/run.go
@@ -53,7 +53,7 @@ var (
        traitConfigRegexp = 
regexp.MustCompile(`^([a-z-]+)((?:\.[a-z-]+)+)=(.*)$`)
 )
 
-func newCmdRun(rootCmdOptions *RootCmdOptions) *cobra.Command {
+func newCmdRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, 
*runCmdOptions) {
        options := runCmdOptions{
                RootCmdOptions: rootCmdOptions,
        }
@@ -91,7 +91,7 @@ func newCmdRun(rootCmdOptions *RootCmdOptions) *cobra.Command 
{
        // completion support
        configureKnownCompletions(&cmd)
 
-       return &cmd
+       return &cmd, &options
 }
 
 type runCmdOptions struct {
diff --git a/pkg/cmd/kit.go b/pkg/cmd/run_test.go
similarity index 68%
copy from pkg/cmd/kit.go
copy to pkg/cmd/run_test.go
index 67d7ef1..bd32ed4 100644
--- a/pkg/cmd/kit.go
+++ b/pkg/cmd/run_test.go
@@ -18,19 +18,17 @@ limitations under the License.
 package cmd
 
 import (
+       "github.com/apache/camel-k/pkg/util/test"
        "github.com/spf13/cobra"
 )
 
-func newCmdKit(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       cmd := cobra.Command{
-               Use:   "kit",
-               Short: "Configure an Integration Kit",
-               Long:  `Configure an Integration Kit.`,
+func addTestRunCmd(options RootCmdOptions, rootCmd *cobra.Command) 
*runCmdOptions {
+       //add a testing version of run Command
+       runCmd, runCmdOptions := newCmdRun(&options)
+       runCmd.RunE = func(c *cobra.Command, args []string) error {
+               return nil
        }
-
-       cmd.AddCommand(newKitCreateCmd(rootCmdOptions))
-       cmd.AddCommand(newKitDeleteCmd(rootCmdOptions))
-       cmd.AddCommand(newKitGetCmd(rootCmdOptions))
-
-       return &cmd
+       runCmd.Args = test.ArbitraryArgs
+       rootCmd.AddCommand(runCmd)
+       return runCmdOptions
 }
diff --git a/pkg/cmd/util.go b/pkg/cmd/util.go
index a32dcce..8ee87ac 100644
--- a/pkg/cmd/util.go
+++ b/pkg/cmd/util.go
@@ -183,3 +183,7 @@ func stringToSliceHookFunc(comma rune) 
mapstructure.DecodeHookFunc {
                return csvReader.Read()
        }
 }
+
+func cmdOnly(cmd *cobra.Command, options interface{}) *cobra.Command {
+       return cmd
+}
diff --git a/pkg/cmd/kit.go b/pkg/util/test/cmd.go
similarity index 59%
copy from pkg/cmd/kit.go
copy to pkg/util/test/cmd.go
index 67d7ef1..4988d78 100644
--- a/pkg/cmd/kit.go
+++ b/pkg/util/test/cmd.go
@@ -15,22 +15,31 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package cmd
+package test
 
 import (
+       "bytes"
        "github.com/spf13/cobra"
 )
 
-func newCmdKit(rootCmdOptions *RootCmdOptions) *cobra.Command {
-       cmd := cobra.Command{
-               Use:   "kit",
-               Short: "Configure an Integration Kit",
-               Long:  `Configure an Integration Kit.`,
-       }
+func EmptyRun(*cobra.Command, []string) {}
 
-       cmd.AddCommand(newKitCreateCmd(rootCmdOptions))
-       cmd.AddCommand(newKitDeleteCmd(rootCmdOptions))
-       cmd.AddCommand(newKitGetCmd(rootCmdOptions))
+func ArbitraryArgs(cmd *cobra.Command, args []string) error {
+       return nil
+}
+
+func ExecuteCommand(root *cobra.Command, args ...string) (output string, err 
error) {
+       _, output, err = ExecuteCommandC(root, args...)
+       return output, err
+}
+
+func ExecuteCommandC(root *cobra.Command, args ...string) (c *cobra.Command, 
output string, err error) {
+       buf := new(bytes.Buffer)
+       root.SetOut(buf)
+       root.SetErr(buf)
+       root.SetArgs(args)
+
+       c, err = root.ExecuteC()
 
-       return &cmd
+       return c, buf.String(), err
 }

Reply via email to