From 40967dfbcd8bb640bb1b50865317598b4c699384 Mon Sep 17 00:00:00 2001 From: Marcel Jacek Date: Wed, 19 Feb 2025 17:15:24 +0100 Subject: [PATCH 1/2] - add nil pointer checks - add tests for the outputResult functions within the network commands --- internal/cmd/beta/network/create/create.go | 17 ++++++--- .../cmd/beta/network/create/create_test.go | 36 +++++++++++++++++++ internal/cmd/beta/network/delete/delete.go | 3 ++ .../cmd/beta/network/describe/describe.go | 3 ++ .../beta/network/describe/describe_test.go | 34 ++++++++++++++++++ internal/cmd/beta/network/list/list.go | 8 ++--- internal/cmd/beta/network/list/list_test.go | 36 +++++++++++++++++++ internal/cmd/beta/network/update/update.go | 3 ++ 8 files changed, 131 insertions(+), 9 deletions(-) diff --git a/internal/cmd/beta/network/create/create.go b/internal/cmd/beta/network/create/create.go index e3832171b..8aaa5bc21 100644 --- a/internal/cmd/beta/network/create/create.go +++ b/internal/cmd/beta/network/create/create.go @@ -15,6 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" @@ -98,6 +99,9 @@ func NewCmd(p *print.Printer) *cobra.Command { p.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } + if projectLabel == "" { + projectLabel = model.ProjectId + } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network for project %q?", projectLabel) @@ -126,7 +130,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) @@ -234,8 +238,11 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.CreateNetworkPayload(payload) } -func outputResult(p *print.Printer, model *inputModel, projectLabel string, network *iaas.Network) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, network *iaas.Network) error { + if network == nil { + return fmt.Errorf("network cannot be nil") + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(network, "", " ") if err != nil { @@ -254,10 +261,10 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, netw return nil default: operationState := "Created" - if model.Async { + if async { operationState = "Triggered creation of" } - p.Outputf("%s network for project %q.\nNetwork ID: %s\n", operationState, projectLabel, *network.NetworkId) + p.Outputf("%s network for project %q.\nNetwork ID: %s\n", operationState, projectLabel, utils.PtrString(network.NetworkId)) return nil } } diff --git a/internal/cmd/beta/network/create/create_test.go b/internal/cmd/beta/network/create/create_test.go index 2cd2d606e..804cd0d25 100644 --- a/internal/cmd/beta/network/create/create_test.go +++ b/internal/cmd/beta/network/create/create_test.go @@ -423,3 +423,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + projectLabel string + network *iaas.Network + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty network", + args: args{ + network: &iaas.Network{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.network); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/network/delete/delete.go b/internal/cmd/beta/network/delete/delete.go index 001aefa84..1666b4e61 100644 --- a/internal/cmd/beta/network/delete/delete.go +++ b/internal/cmd/beta/network/delete/delete.go @@ -61,6 +61,9 @@ func NewCmd(p *print.Printer) *cobra.Command { p.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId } + if networkLabel == "" { + networkLabel = model.NetworkId + } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete network %q?", networkLabel) diff --git a/internal/cmd/beta/network/describe/describe.go b/internal/cmd/beta/network/describe/describe.go index 6bdb139af..356e2540d 100644 --- a/internal/cmd/beta/network/describe/describe.go +++ b/internal/cmd/beta/network/describe/describe.go @@ -101,6 +101,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) error { + if network == nil { + return fmt.Errorf("network cannot be nil") + } switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(network, "", " ") diff --git a/internal/cmd/beta/network/describe/describe_test.go b/internal/cmd/beta/network/describe/describe_test.go index b0fb47c6a..451b518b3 100644 --- a/internal/cmd/beta/network/describe/describe_test.go +++ b/internal/cmd/beta/network/describe/describe_test.go @@ -216,3 +216,37 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + network *iaas.Network + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty network", + args: args{ + network: &iaas.Network{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.network); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/network/list/list.go b/internal/cmd/beta/network/list/list.go index 71cff5509..a7613a9a5 100644 --- a/internal/cmd/beta/network/list/list.go +++ b/internal/cmd/beta/network/list/list.go @@ -76,6 +76,9 @@ func NewCmd(p *print.Printer) *cobra.Command { p.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } + if projectLabel == "" { + projectLabel = model.ProjectId + } p.Info("No networks found for project %q\n", projectLabel) return nil } @@ -155,10 +158,7 @@ func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED") for _, network := range networks { - publicIp := "" - if network.PublicIp != nil { - publicIp = *network.PublicIp - } + publicIp := utils.PtrString(network.PublicIp) routed := false if network.Routed != nil { diff --git a/internal/cmd/beta/network/list/list_test.go b/internal/cmd/beta/network/list/list_test.go index 22de7baea..0d69a3f5e 100644 --- a/internal/cmd/beta/network/list/list_test.go +++ b/internal/cmd/beta/network/list/list_test.go @@ -188,3 +188,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + networks []iaas.Network + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty network", + args: args{ + networks: []iaas.Network{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.networks); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/network/update/update.go b/internal/cmd/beta/network/update/update.go index 9c7b6247d..62511b6dd 100644 --- a/internal/cmd/beta/network/update/update.go +++ b/internal/cmd/beta/network/update/update.go @@ -86,6 +86,9 @@ func NewCmd(p *print.Printer) *cobra.Command { p.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId } + if networkLabel == "" { + networkLabel = model.NetworkId + } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update network %q?", networkLabel) From e1b7d140551ada54dda0a7a4bdee41fccf0149c4 Mon Sep 17 00:00:00 2001 From: Marcel Jacek Date: Thu, 20 Feb 2025 10:24:03 +0100 Subject: [PATCH 2/2] fix: consistent `else if`-clause for labels --- internal/cmd/beta/network/create/create.go | 3 +-- internal/cmd/beta/network/delete/delete.go | 3 +-- internal/cmd/beta/network/list/list.go | 3 +-- internal/cmd/beta/network/update/update.go | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/internal/cmd/beta/network/create/create.go b/internal/cmd/beta/network/create/create.go index 8aaa5bc21..2d902e599 100644 --- a/internal/cmd/beta/network/create/create.go +++ b/internal/cmd/beta/network/create/create.go @@ -98,8 +98,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId - } - if projectLabel == "" { + } else if projectLabel == "" { projectLabel = model.ProjectId } diff --git a/internal/cmd/beta/network/delete/delete.go b/internal/cmd/beta/network/delete/delete.go index 1666b4e61..17be9f0ed 100644 --- a/internal/cmd/beta/network/delete/delete.go +++ b/internal/cmd/beta/network/delete/delete.go @@ -60,8 +60,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId - } - if networkLabel == "" { + } else if networkLabel == "" { networkLabel = model.NetworkId } diff --git a/internal/cmd/beta/network/list/list.go b/internal/cmd/beta/network/list/list.go index a7613a9a5..9b3a9a0cc 100644 --- a/internal/cmd/beta/network/list/list.go +++ b/internal/cmd/beta/network/list/list.go @@ -75,8 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId - } - if projectLabel == "" { + } else if projectLabel == "" { projectLabel = model.ProjectId } p.Info("No networks found for project %q\n", projectLabel) diff --git a/internal/cmd/beta/network/update/update.go b/internal/cmd/beta/network/update/update.go index 62511b6dd..2148fa58d 100644 --- a/internal/cmd/beta/network/update/update.go +++ b/internal/cmd/beta/network/update/update.go @@ -85,8 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { p.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId - } - if networkLabel == "" { + } else if networkLabel == "" { networkLabel = model.NetworkId }