diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index b675b69ee..a30fb3f63 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -80,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } restoreJobState := mongoUtils.GetRestoreStatus(model.BackupId, restoreJobs) - return outputResult(p, cmd, model.OutputFormat, restoreJobState, *resp.Item) + return outputResult(p, model.OutputFormat, restoreJobState, *resp.Item) }, } configureFlags(cmd) @@ -125,14 +125,14 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat, restoreStatus string, backup mongodbflex.Backup) error { +func outputResult(p *print.Printer, outputFormat, restoreStatus string, backup mongodbflex.Backup) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(backup, "", " ") if err != nil { return fmt.Errorf("marshal MongoDB Flex backup: %w", err) } - cmd.Println(string(details)) + p.Outputln(string(details)) return nil case print.YAMLOutputFormat: diff --git a/internal/cmd/mongodbflex/backup/describe/describe_test.go b/internal/cmd/mongodbflex/backup/describe/describe_test.go index 1d6dc44e4..0b761904d 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe_test.go +++ b/internal/cmd/mongodbflex/backup/describe/describe_test.go @@ -237,3 +237,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backup mongodbflex.Backup + restoreStatus string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set backup", + args: args{ + backup: mongodbflex.Backup{}, + }, + 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.restoreStatus, tt.args.backup); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index 1b251571a..b145685fb 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -145,6 +145,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, backups []mongodbflex.Backup, restoreJobs *mongodbflex.ListRestoreJobsResponse) error { + if restoreJobs == nil { + return fmt.Errorf("restore jobs is empty") + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(backups, "", " ") diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index 82de1efca..362b35c78 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -207,3 +207,53 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backups []mongodbflex.Backup + restoreJobs *mongodbflex.ListRestoreJobsResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty backups", + args: args{ + backups: []mongodbflex.Backup{}, + }, + wantErr: true, + }, + { + name: "set restore jobs", + args: args{ + restoreJobs: &mongodbflex.ListRestoreJobsResponse{}, + }, + wantErr: false, + }, + { + name: "set restore jobs and empty backups", + args: args{ + backups: []mongodbflex.Backup{}, + restoreJobs: &mongodbflex.ListRestoreJobsResponse{}, + }, + 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.backups, tt.args.restoreJobs); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go index c7c5ec84a..5135be262 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go @@ -207,3 +207,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + restoreJobs []mongodbflex.RestoreInstanceStatus + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty restore jobs", + args: args{ + restoreJobs: []mongodbflex.RestoreInstanceStatus{}, + }, + wantErr: false, + }, + { + name: "set empty restore job", + args: args{ + restoreJobs: []mongodbflex.RestoreInstanceStatus{{}}, + }, + 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.restoreJobs); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 9445055a6..b21167724 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -104,6 +104,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.Instance) error { + if instance == nil { + return fmt.Errorf("instance is nil") + } + output := struct { BackupSchedule string `json:"backup_schedule"` DailySnaphotRetentionDays string `json:"daily_snapshot_retention_days"` @@ -112,12 +116,14 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I SnapshotRetentionDays string `json:"snapshot_retention_days"` WeeklySnapshotRetentionWeeks string `json:"weekly_snapshot_retention_weeks"` }{ - BackupSchedule: *instance.BackupSchedule, - DailySnaphotRetentionDays: (*instance.Options)["dailySnapshotRetentionDays"], - MonthlySnapshotRetentionMonths: (*instance.Options)["monthlySnapshotRetentionDays"], - PointInTimeWindowHours: (*instance.Options)["pointInTimeWindowHours"], - SnapshotRetentionDays: (*instance.Options)["snapshotRetentionDays"], - WeeklySnapshotRetentionWeeks: (*instance.Options)["weeklySnapshotRetentionWeeks"], + BackupSchedule: utils.PtrString(instance.BackupSchedule), + } + if instance.Options != nil { + output.DailySnaphotRetentionDays = (*instance.Options)["dailySnapshotRetentionDays"] + output.MonthlySnapshotRetentionMonths = (*instance.Options)["monthlySnapshotRetentionDays"] + output.PointInTimeWindowHours = (*instance.Options)["pointInTimeWindowHours"] + output.SnapshotRetentionDays = (*instance.Options)["snapshotRetentionDays"] + output.WeeklySnapshotRetentionWeeks = (*instance.Options)["weeklySnapshotRetentionWeeks"] } switch outputFormat { @@ -139,20 +145,19 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I return nil default: table := tables.NewTable() - table.AddRow("BACKUP SCHEDULE (UTC)", utils.PtrString(instance.BackupSchedule)) + table.AddRow("BACKUP SCHEDULE (UTC)", output.BackupSchedule) table.AddSeparator() - if instance.Options != nil { - table.AddRow("DAILY SNAPSHOT RETENTION (DAYS)", (*instance.Options)["dailySnapshotRetentionDays"]) - table.AddSeparator() - table.AddRow("MONTHLY SNAPSHOT RETENTION (MONTHS)", (*instance.Options)["monthlySnapshotRetentionMonths"]) - table.AddSeparator() - table.AddRow("POINT IN TIME WINDOW (HOURS)", (*instance.Options)["pointInTimeWindowHours"]) - table.AddSeparator() - table.AddRow("SNAPSHOT RETENTION (DAYS)", (*instance.Options)["snapshotRetentionDays"]) - table.AddSeparator() - table.AddRow("WEEKLY SNAPSHOT RETENTION (WEEKS)", (*instance.Options)["weeklySnapshotRetentionWeeks"]) - table.AddSeparator() - } + table.AddRow("DAILY SNAPSHOT RETENTION (DAYS)", output.DailySnaphotRetentionDays) + table.AddSeparator() + table.AddRow("MONTHLY SNAPSHOT RETENTION (MONTHS)", output.MonthlySnapshotRetentionMonths) + table.AddSeparator() + table.AddRow("POINT IN TIME WINDOW (HOURS)", output.PointInTimeWindowHours) + table.AddSeparator() + table.AddRow("SNAPSHOT RETENTION (DAYS)", output.SnapshotRetentionDays) + table.AddSeparator() + table.AddRow("WEEKLY SNAPSHOT RETENTION (WEEKS)", output.WeeklySnapshotRetentionWeeks) + table.AddSeparator() + err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go index e25957058..018cefc28 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go @@ -193,3 +193,37 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instance *mongodbflex.Instance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty instance", + args: args{ + instance: &mongodbflex.Instance{}, + }, + 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/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index d601a92a9..c6c4d3322 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,8 +19,6 @@ import ( mongodbflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/wait" ) @@ -133,7 +132,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) @@ -273,8 +272,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC return req, nil } -func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *mongodbflex.CreateInstanceResponse) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, resp *mongodbflex.CreateInstanceResponse) error { + if resp == nil { + return fmt.Errorf("create instance response is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -293,7 +296,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.Id)) diff --git a/internal/cmd/mongodbflex/instance/create/create_test.go b/internal/cmd/mongodbflex/instance/create/create_test.go index 712718e95..23fa109b7 100644 --- a/internal/cmd/mongodbflex/instance/create/create_test.go +++ b/internal/cmd/mongodbflex/instance/create/create_test.go @@ -546,3 +546,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + projectLabel string + createInstanceResponse *mongodbflex.CreateInstanceResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty create instance response", + args: args{ + createInstanceResponse: &mongodbflex.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.createInstanceResponse); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index ca4858da5..79ca55b64 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -100,6 +100,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.Instance) error { + if instance == nil { + return fmt.Errorf("instance is nil") + } + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(instance, "", " ") @@ -118,28 +122,35 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I return nil default: - aclsArray := *instance.Acl.Items - acls := strings.Join(aclsArray, ",") - - instanceType, err := mongodbflexUtils.GetInstanceType(*instance.Replicas) - if err != nil { - // Should never happen - instanceType = "" + var instanceType string + if instance.HasReplicas() { + var err error + instanceType, err = mongodbflexUtils.GetInstanceType(*instance.Replicas) + if err != nil { + // Should never happen + instanceType = "" + } } table := tables.NewTable() - table.AddRow("ID", *instance.Id) + table.AddRow("ID", utils.PtrString(instance.Id)) table.AddSeparator() - table.AddRow("NAME", *instance.Name) + table.AddRow("NAME", utils.PtrString(instance.Name)) table.AddSeparator() - table.AddRow("STATUS", *instance.Status) + table.AddRow("STATUS", utils.PtrString(instance.Status)) table.AddSeparator() - table.AddRow("STORAGE SIZE (GB)", *instance.Storage.Size) - table.AddSeparator() - table.AddRow("VERSION", *instance.Version) - table.AddSeparator() - table.AddRow("ACL", acls) + if instance.HasStorage() { + table.AddRow("STORAGE SIZE (GB)", utils.PtrString(instance.Storage.Size)) + table.AddSeparator() + } + table.AddRow("VERSION", utils.PtrString(instance.Version)) table.AddSeparator() + if instance.HasAcl() { + aclsArray := *instance.Acl.Items + acls := strings.Join(aclsArray, ",") + table.AddRow("ACL", acls) + table.AddSeparator() + } if instance.HasFlavor() && instance.Flavor.HasDescription() { table.AddRow("FLAVOR DESCRIPTION", *instance.Flavor.Description) table.AddSeparator() @@ -158,7 +169,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I } table.AddRow("BACKUP SCHEDULE (UTC)", utils.PtrString(instance.BackupSchedule)) table.AddSeparator() - err = table.Display(p) + err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) } diff --git a/internal/cmd/mongodbflex/instance/describe/describe_test.go b/internal/cmd/mongodbflex/instance/describe/describe_test.go index dbdb934f7..1238f7bc0 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe_test.go +++ b/internal/cmd/mongodbflex/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 *mongodbflex.Instance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty instance", + args: args{ + instance: &mongodbflex.Instance{}, + }, + 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/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index c8e8716d5..e6a9c1416 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -186,3 +186,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instanceList []mongodbflex.InstanceListInstance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty instance list slice", + args: args{ + instanceList: []mongodbflex.InstanceListInstance{}, + }, + wantErr: false, + }, + { + name: "empty instance in instance list slice", + args: args{ + instanceList: []mongodbflex.InstanceListInstance{{}}, + }, + 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.instanceList); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index 68f2f85ba..5f854005c 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -118,7 +118,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, instanceLabel, resp) + return outputResult(p, model.OutputFormat, model.Async, instanceLabel, resp) }, } configureFlags(cmd) @@ -307,8 +307,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC return req, nil } -func outputResult(p *print.Printer, model *inputModel, instanceLabel string, resp *mongodbflex.UpdateInstanceResponse) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat string, async bool, instanceLabel string, resp *mongodbflex.UpdateInstanceResponse) error { + if resp == nil { + return fmt.Errorf("resp is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(resp, "", " ") if err != nil { @@ -327,7 +331,7 @@ func outputResult(p *print.Printer, model *inputModel, instanceLabel string, res return nil default: operationState := "Updated" - if model.Async { + if async { operationState = "Triggered update of" } p.Info("%s instance %q\n", operationState, instanceLabel) diff --git a/internal/cmd/mongodbflex/instance/update/update_test.go b/internal/cmd/mongodbflex/instance/update/update_test.go index 6e15e4408..a36f33454 100644 --- a/internal/cmd/mongodbflex/instance/update/update_test.go +++ b/internal/cmd/mongodbflex/instance/update/update_test.go @@ -590,3 +590,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + instanceLabel string + resp *mongodbflex.UpdateInstanceResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty response", + args: args{ + resp: &mongodbflex.UpdateInstanceResponse{}, + }, + 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.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 1b869a5c1..82b43cbc5 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -170,6 +170,10 @@ func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputM } func outputResult(p *print.Printer, model *inputModel, flavors *mongodbflex.ListFlavorsResponse, versions *mongodbflex.ListVersionsResponse, storages *mongodbflex.ListStoragesResponse) error { + if model == nil || model.GlobalFlagModel == nil { + return fmt.Errorf("model is nil") + } + options := &options{} if flavors != nil { options.Flavors = flavors.Flavors @@ -206,6 +210,12 @@ func outputResult(p *print.Printer, model *inputModel, flavors *mongodbflex.List } func outputResultAsTable(p *print.Printer, model *inputModel, options *options) error { + if model == nil { + return fmt.Errorf("model is nil") + } else if options == nil { + return fmt.Errorf("options is nil") + } + content := []tables.Table{} if model.Flavors && len(*options.Flavors) != 0 { content = append(content, buildFlavorsTable(*options.Flavors)) diff --git a/internal/cmd/mongodbflex/options/options_test.go b/internal/cmd/mongodbflex/options/options_test.go index d750bc6e1..9b48a710b 100644 --- a/internal/cmd/mongodbflex/options/options_test.go +++ b/internal/cmd/mongodbflex/options/options_test.go @@ -322,3 +322,145 @@ func TestBuildAndExecuteRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + inputModel *inputModel + flavors *mongodbflex.ListFlavorsResponse + versions *mongodbflex.ListVersionsResponse + storages *mongodbflex.ListStoragesResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing model", + args: args{ + flavors: &mongodbflex.ListFlavorsResponse{}, + versions: &mongodbflex.ListVersionsResponse{}, + storages: &mongodbflex.ListStoragesResponse{}, + }, + wantErr: true, + }, + { + name: "empty model", + args: args{ + inputModel: &inputModel{}, + flavors: &mongodbflex.ListFlavorsResponse{}, + versions: &mongodbflex.ListVersionsResponse{}, + storages: &mongodbflex.ListStoragesResponse{}, + }, + wantErr: true, + }, + { + name: "ok", + args: args{ + inputModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{}, + }, + flavors: &mongodbflex.ListFlavorsResponse{}, + versions: &mongodbflex.ListVersionsResponse{}, + storages: &mongodbflex.ListStoragesResponse{}, + }, + wantErr: false, + }, + { + name: "missing flavors", + args: args{ + inputModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{}, + }, + versions: &mongodbflex.ListVersionsResponse{}, + storages: &mongodbflex.ListStoragesResponse{}, + }, + wantErr: false, + }, + { + name: "missing versions", + args: args{ + inputModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{}, + }, + flavors: &mongodbflex.ListFlavorsResponse{}, + storages: &mongodbflex.ListStoragesResponse{}, + }, + wantErr: false, + }, + { + name: "missing storages", + args: args{ + inputModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{}, + }, + flavors: &mongodbflex.ListFlavorsResponse{}, + versions: &mongodbflex.ListVersionsResponse{}, + }, + 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.inputModel, tt.args.flavors, tt.args.versions, tt.args.storages); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestOutputResultAsTable(t *testing.T) { + type args struct { + model *inputModel + options *options + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing input model", + args: args{ + options: &options{}, + }, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{}, + }, + wantErr: true, + }, + { + name: "empty input model and empty options", + args: args{ + model: &inputModel{}, + options: &options{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(p) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResultAsTable(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResultAsTable() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index cd383eac2..be494fcdb 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -93,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } user := resp.Item - return outputResult(p, model, instanceLabel, user) + return outputResult(p, model.OutputFormat, instanceLabel, user) }, } @@ -149,8 +149,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, model *inputModel, instanceLabel string, user *mongodbflex.User) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, user *mongodbflex.User) error { + if user == nil { + return fmt.Errorf("user is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(user, "", " ") if err != nil { diff --git a/internal/cmd/mongodbflex/user/create/create_test.go b/internal/cmd/mongodbflex/user/create/create_test.go index de4ab99dc..73f184a65 100644 --- a/internal/cmd/mongodbflex/user/create/create_test.go +++ b/internal/cmd/mongodbflex/user/create/create_test.go @@ -244,3 +244,38 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instanceLabel string + user *mongodbflex.User + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty user", + args: args{ + user: &mongodbflex.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.user); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/user/describe/describe_test.go b/internal/cmd/mongodbflex/user/describe/describe_test.go index c729e1c8e..7d5201075 100644 --- a/internal/cmd/mongodbflex/user/describe/describe_test.go +++ b/internal/cmd/mongodbflex/user/describe/describe_test.go @@ -243,3 +243,37 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instanceResponseUser mongodbflex.InstanceResponseUser + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty user", + args: args{ + instanceResponseUser: mongodbflex.InstanceResponseUser{}, + }, + 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.instanceResponseUser); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index 6c1b85424..8cc901aef 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -203,3 +203,44 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + users []mongodbflex.ListUser + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty user slice", + args: args{ + users: []mongodbflex.ListUser{}, + }, + wantErr: false, + }, + { + name: "empty user in user slice", + args: args{ + users: []mongodbflex.ListUser{{}}, + }, + 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.users); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index f35c252f3..5541b89a3 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -87,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("reset MongoDB Flex user password: %w", err) } - return outputResult(p, model, userLabel, instanceLabel, user) + return outputResult(p, model.OutputFormat, userLabel, instanceLabel, user) }, } @@ -133,8 +133,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, model *inputModel, userLabel, instanceLabel string, user *mongodbflex.User) error { - switch model.OutputFormat { +func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel string, user *mongodbflex.User) error { + if user == nil { + return fmt.Errorf("user is nil") + } + + switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(user, "", " ") if err != nil { diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go index c477b7fa8..98abb2136 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go @@ -243,3 +243,39 @@ func TestBuildRequest(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + userLabel string + instanceLabel string + user *mongodbflex.User + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty user", + args: args{ + user: &mongodbflex.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.userLabel, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +}