From 51376fceb119229a7ca149bd0db0e331526ac832 Mon Sep 17 00:00:00 2001 From: Ruben Hoenle Date: Thu, 20 Feb 2025 17:35:13 +0100 Subject: [PATCH] fix(observability): add nil pointer checks for cmd outputs relates to STACKITCLI-106 --- .../credentials/create/create.go | 21 +++--- .../credentials/create/create_test.go | 46 +++++++++++++ .../credentials/list/list_test.go | 42 +++++++++++ .../grafana/describe/describe.go | 16 +++-- .../grafana/describe/describe_test.go | 55 +++++++++++++++ .../observability/instance/create/create.go | 12 ++-- .../instance/create/create_test.go | 36 ++++++++++ .../instance/describe/describe.go | 4 ++ .../instance/describe/describe_test.go | 34 +++++++++ .../observability/instance/list/list_test.go | 41 +++++++++++ .../cmd/observability/plans/plans_test.go | 41 +++++++++++ .../scrape-config/describe/describe.go | 34 +++++---- .../scrape-config/describe/describe_test.go | 35 ++++++++++ .../generate-payload/generate_payload.go | 8 +++ .../generate-payload/generate_payload_test.go | 69 +++++++++++++++++++ .../scrape-config/list/list_test.go | 42 +++++++++++ 16 files changed, 505 insertions(+), 31 deletions(-) diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index b965364a3..9852ee352 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -79,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create credentials for Observability instance: %w", err) } - return outputResult(p, model, instanceLabel, resp) + return outputResult(p, model.OutputFormat, instanceLabel, resp) }, } configureFlags(cmd) @@ -110,8 +110,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili return req } -func outputResult(p *print.Printer, model *inputModel, instanceLabel string, resp *observability.CreateCredentialsResponse) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *observability.CreateCredentialsResponse) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -130,13 +134,14 @@ func outputResult(p *print.Printer, model *inputModel, instanceLabel string, res return nil default: p.Outputf("Created credentials for instance %q.\n\n", instanceLabel) - // The username field cannot be set by the user, so we only display it if it's not returned empty - username := *resp.Credentials.Username - if username != "" { - p.Outputf("Username: %s\n", username) - } if resp.Credentials != nil { + // The username field cannot be set by the user, so we only display it if it's not returned empty + username := *resp.Credentials.Username + if username != "" { + p.Outputf("Username: %s\n", username) + } + p.Outputf("Password: %s\n", utils.PtrString(resp.Credentials.Password)) } return nil diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index 395876a4f..146fc9090 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -5,6 +5,8 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/google/go-cmp/cmp" @@ -188,3 +190,47 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instanceLabel string + resp *observability.CreateCredentialsResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty response", + args: args{ + resp: &observability.CreateCredentialsResponse{}, + }, + wantErr: false, + }, + { + name: "set response with credentials", + args: args{ + resp: &observability.CreateCredentialsResponse{ + Credentials: observability.NewCredentials(utils.Ptr("dummy-pw"), utils.Ptr("dummy-user")), + }, + }, + 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.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/credentials/list/list_test.go b/internal/cmd/observability/credentials/list/list_test.go index 3d188dba3..fa23d5dfe 100644 --- a/internal/cmd/observability/credentials/list/list_test.go +++ b/internal/cmd/observability/credentials/list/list_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -205,3 +206,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + credentials []observability.ServiceKeysList + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty credentials slice", + args: args{ + credentials: []observability.ServiceKeysList{}, + }, + wantErr: false, + }, + { + name: "set empty credential in credentials slice", + args: args{ + credentials: []observability.ServiceKeysList{{}}, + }, + 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.credentials); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 245a4b8b4..9a364499c 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -77,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get instance: %w", err) } - return outputResult(p, model, grafanaConfigsResp, instanceResp) + return outputResult(p, model.OutputFormat, model.ShowPassword, grafanaConfigsResp, instanceResp) }, } configureFlags(cmd) @@ -124,8 +124,14 @@ func buildGetInstanceRequest(ctx context.Context, model *inputModel, apiClient * return req } -func outputResult(p *print.Printer, inputModel *inputModel, grafanaConfigs *observability.GrafanaConfigs, instance *observability.GetInstanceResponse) error { - switch inputModel.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, showPassword bool, grafanaConfigs *observability.GrafanaConfigs, instance *observability.GetInstanceResponse) error { + if instance == nil || instance.Instance == nil { + return fmt.Errorf("instance or instance content is nil") + } else if grafanaConfigs == nil { + return fmt.Errorf("grafanaConfigs is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(grafanaConfigs, "", " ") if err != nil { @@ -143,8 +149,8 @@ func outputResult(p *print.Printer, inputModel *inputModel, grafanaConfigs *obse return nil default: - initialAdminPassword := *instance.Instance.GrafanaAdminPassword - if !inputModel.ShowPassword { + initialAdminPassword := utils.PtrString(instance.Instance.GrafanaAdminPassword) + if !showPassword { initialAdminPassword = "" } diff --git a/internal/cmd/observability/grafana/describe/describe_test.go b/internal/cmd/observability/grafana/describe/describe_test.go index d2b2daec0..f282c2964 100644 --- a/internal/cmd/observability/grafana/describe/describe_test.go +++ b/internal/cmd/observability/grafana/describe/describe_test.go @@ -276,3 +276,58 @@ func TestBuildGetInstanceRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + showPassword bool + grafanaConfig *observability.GrafanaConfigs + instance *observability.GetInstanceResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set grafana configs but no instance", + args: args{ + grafanaConfig: &observability.GrafanaConfigs{}, + }, + wantErr: true, + }, + { + name: "set instance but no grafana config", + args: args{ + instance: &observability.GetInstanceResponse{ + Instance: &observability.InstanceSensitiveData{}, + }, + }, + wantErr: true, + }, + { + name: "set instance and grafana configs", + args: args{ + grafanaConfig: &observability.GrafanaConfigs{}, + instance: &observability.GetInstanceResponse{ + Instance: &observability.InstanceSensitiveData{}, + }, + }, + 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.showPassword, tt.args.grafanaConfig, tt.args.instance); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 99b7fe5f2..57e9d888f 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -105,7 +105,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) @@ -200,8 +200,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient observabilit return req, nil } -func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *observability.CreateInstanceResponse) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, resp *observability.CreateInstanceResponse) error { + if resp == nil { + return fmt.Errorf("resp is empty") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -220,7 +224,7 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp return nil default: operationState := "Created" - if model.Async { + if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.InstanceId)) diff --git a/internal/cmd/observability/instance/create/create_test.go b/internal/cmd/observability/instance/create/create_test.go index 505a03be5..f36d5ae8a 100644 --- a/internal/cmd/observability/instance/create/create_test.go +++ b/internal/cmd/observability/instance/create/create_test.go @@ -334,3 +334,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + projectLabel string + resp *observability.CreateInstanceResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty response", + args: args{ + resp: &observability.CreateInstanceResponse{}, + }, + 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.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index 3b4a62e40..157bd28a4 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -98,6 +98,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, instance *observability.GetInstanceResponse) error { + if instance == nil { + return fmt.Errorf("instance is nil") + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(instance, "", " ") diff --git a/internal/cmd/observability/instance/describe/describe_test.go b/internal/cmd/observability/instance/describe/describe_test.go index f2eea2b4d..c55020fa7 100644 --- a/internal/cmd/observability/instance/describe/describe_test.go +++ b/internal/cmd/observability/instance/describe/describe_test.go @@ -216,3 +216,37 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instance *observability.GetInstanceResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty instance", + args: args{ + instance: &observability.GetInstanceResponse{}, + }, + 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.instance); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/instance/list/list_test.go b/internal/cmd/observability/instance/list/list_test.go index 649f70e55..e8a87f48a 100644 --- a/internal/cmd/observability/instance/list/list_test.go +++ b/internal/cmd/observability/instance/list/list_test.go @@ -185,3 +185,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instances []observability.ProjectInstanceFull + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty instances slice", + args: args{ + instances: []observability.ProjectInstanceFull{}, + }, + wantErr: false, + }, + { + name: "empty instance in instances slice", + args: args{ + instances: []observability.ProjectInstanceFull{{}}, + }, + 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.instances); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/plans/plans_test.go b/internal/cmd/observability/plans/plans_test.go index 3c978a3a7..047c3c5f6 100644 --- a/internal/cmd/observability/plans/plans_test.go +++ b/internal/cmd/observability/plans/plans_test.go @@ -186,3 +186,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + plans []observability.Plan + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty plans slice", + args: args{ + plans: []observability.Plan{}, + }, + wantErr: false, + }, + { + name: "empty plan in plans slice", + args: args{ + plans: []observability.Plan{{}}, + }, + 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.plans); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 7e92bd58f..2687a72a3 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -100,6 +100,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, config *observability.Job) error { + if config == nil { + return fmt.Errorf(`config is nil`) + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(config, "", " ") @@ -127,23 +131,25 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J } var targets []string - for _, target := range *config.StaticConfigs { - targetLabels := []string{} - targetLabelStr := "N/A" - if target.Labels != nil { - // make map prettier - for k, v := range *target.Labels { - targetLabels = append(targetLabels, fmt.Sprintf("%s:%s", k, v)) + if config.StaticConfigs != nil { + for _, target := range *config.StaticConfigs { + targetLabels := []string{} + targetLabelStr := "N/A" + if target.Labels != nil { + // make map prettier + for k, v := range *target.Labels { + targetLabels = append(targetLabels, fmt.Sprintf("%s:%s", k, v)) + } + if targetLabels != nil { + targetLabelStr = strings.Join(targetLabels, ",") + } } - if targetLabels != nil { - targetLabelStr = strings.Join(targetLabels, ",") + targetUrlsStr := "N/A" + if target.Targets != nil { + targetUrlsStr = strings.Join(*target.Targets, ",") } + targets = append(targets, fmt.Sprintf("labels: %s\nurls: %s", targetLabelStr, targetUrlsStr)) } - targetUrlsStr := "N/A" - if target.Targets != nil { - targetUrlsStr = strings.Join(*target.Targets, ",") - } - targets = append(targets, fmt.Sprintf("labels: %s\nurls: %s", targetLabelStr, targetUrlsStr)) } table := tables.NewTable() diff --git a/internal/cmd/observability/scrape-config/describe/describe_test.go b/internal/cmd/observability/scrape-config/describe/describe_test.go index f496da426..a0cf31413 100644 --- a/internal/cmd/observability/scrape-config/describe/describe_test.go +++ b/internal/cmd/observability/scrape-config/describe/describe_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -231,3 +232,37 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + config *observability.Job + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty config", + args: args{ + config: &observability.Job{}, + }, + 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.config); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index 363070be8..fe8a9f5ec 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -125,6 +125,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputCreateResult(p *print.Printer, filePath *string, payload *observability.CreateScrapeConfigPayload) error { + if payload == nil { + return fmt.Errorf("payload is nil") + } + payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) @@ -143,6 +147,10 @@ func outputCreateResult(p *print.Printer, filePath *string, payload *observabili } func outputUpdateResult(p *print.Printer, filePath *string, payload *observability.UpdateScrapeConfigPayload) error { + if payload == nil { + return fmt.Errorf("payload is nil") + } + payloadBytes, err := json.MarshalIndent(*payload, "", " ") if err != nil { return fmt.Errorf("marshal payload: %w", err) diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go index e23f4fabc..b8740da53 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -248,3 +249,71 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputCreateResult(t *testing.T) { + type args struct { + filePath *string + payload *observability.CreateScrapeConfigPayload + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty payload", + args: args{ + payload: &observability.CreateScrapeConfigPayload{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputCreateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { + t.Errorf("outputCreateResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestOutputUpdateResult(t *testing.T) { + type args struct { + filePath *string + payload *observability.UpdateScrapeConfigPayload + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty payload", + args: args{ + payload: &observability.UpdateScrapeConfigPayload{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputUpdateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { + t.Errorf("outputUpdateResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/observability/scrape-config/list/list_test.go b/internal/cmd/observability/scrape-config/list/list_test.go index 86836fc84..69e5b6ab5 100644 --- a/internal/cmd/observability/scrape-config/list/list_test.go +++ b/internal/cmd/observability/scrape-config/list/list_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -208,3 +209,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + configs []observability.Job + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty configs slice", + args: args{ + configs: []observability.Job{}, + }, + wantErr: false, + }, + { + name: "empty config in configs slice", + args: args{ + configs: []observability.Job{{}}, + }, + 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.configs); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +}