From 702b43d995658dc9cca64997c5e706debe3958ee Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Tue, 21 Apr 2026 06:33:30 +0000 Subject: [PATCH 1/2] test(cli): cover root command registration --- cmd/snack/main.go | 10 +++-- cmd/snack/main_test.go | 87 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/cmd/snack/main.go b/cmd/snack/main.go index ec21892..822ce35 100644 --- a/cmd/snack/main.go +++ b/cmd/snack/main.go @@ -22,6 +22,12 @@ var ( ) func main() { + if err := fang.Execute(context.Background(), newRootCmd()); err != nil { + os.Exit(1) + } +} + +func newRootCmd() *cobra.Command { rootCmd := &cobra.Command{ Use: "snack", Short: "A unified CLI for system package managers", @@ -54,9 +60,7 @@ behind a single, consistent interface.`, versionCmd(), ) - if err := fang.Execute(context.Background(), rootCmd); err != nil { - os.Exit(1) - } + return rootCmd } func getManager() (snack.Manager, error) { diff --git a/cmd/snack/main_test.go b/cmd/snack/main_test.go index f81a70a..35d8601 100644 --- a/cmd/snack/main_test.go +++ b/cmd/snack/main_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/gogrlx/snack" + "github.com/spf13/cobra" ) func TestTargets(t *testing.T) { @@ -148,3 +149,89 @@ func TestVersionString(t *testing.T) { t.Error("version should not be empty") } } + +func TestNewRootCmdRegistersPersistentFlags(t *testing.T) { + cmd := newRootCmd() + + for _, flagName := range []string{"manager", "sudo", "yes", "dry-run"} { + if cmd.PersistentFlags().Lookup(flagName) == nil { + t.Fatalf("expected persistent flag %q to be registered", flagName) + } + } +} + +func TestNewRootCmdRegistersExpectedCommands(t *testing.T) { + cmd := newRootCmd() + + want := map[string]struct{}{ + "install": {}, + "remove": {}, + "purge": {}, + "upgrade": {}, + "update": {}, + "list": {}, + "search": {}, + "info": {}, + "which": {}, + "hold": {}, + "unhold": {}, + "clean": {}, + "repo": {}, + "key": {}, + "group": {}, + "detect": {}, + "version": {}, + } + + if len(cmd.Commands()) != len(want) { + t.Fatalf("newRootCmd() registered %d commands, want %d", len(cmd.Commands()), len(want)) + } + + for _, subcmd := range cmd.Commands() { + if _, ok := want[subcmd.Name()]; !ok { + t.Fatalf("unexpected subcommand %q", subcmd.Name()) + } + delete(want, subcmd.Name()) + } + + if len(want) != 0 { + t.Fatalf("missing subcommands: %v", want) + } +} + +func TestNestedCommandRegistration(t *testing.T) { + tests := []struct { + name string + cmd *cobra.Command + want []string + }{ + { + name: "repo", + cmd: repoCmd(), + want: []string{"add", "list", "remove"}, + }, + { + name: "key", + cmd: keyCmd(), + want: []string{"add", "list", "remove"}, + }, + { + name: "group", + cmd: groupCmd(), + want: []string{"info", "install", "list"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if len(tt.cmd.Commands()) != len(tt.want) { + t.Fatalf("%s registered %d subcommands, want %d", tt.name, len(tt.cmd.Commands()), len(tt.want)) + } + for _, name := range tt.want { + if _, _, err := tt.cmd.Find([]string{name}); err != nil { + t.Fatalf("expected %s to register subcommand %q: %v", tt.name, name, err) + } + } + }) + } +} From aef60384b00759b9b128402cd198df2b32b39f0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 20:58:52 +0000 Subject: [PATCH 2/2] chore(deps): bump go.opentelemetry.io/otel/sdk from 1.40.0 to 1.43.0 Bumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.40.0 to 1.43.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.40.0...v1.43.0) --- updated-dependencies: - dependency-name: go.opentelemetry.io/otel/sdk dependency-version: 1.43.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 05b327a..25ffcd3 100644 --- a/go.mod +++ b/go.mod @@ -90,11 +90,11 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.40.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect - go.opentelemetry.io/otel/metric v1.40.0 // indirect - go.opentelemetry.io/otel/sdk v1.40.0 // indirect - go.opentelemetry.io/otel/trace v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.9.0 // indirect golang.org/x/crypto v0.48.0 // indirect golang.org/x/net v0.51.0 // indirect diff --git a/go.sum b/go.sum index a9e22f6..f1e026d 100644 --- a/go.sum +++ b/go.sum @@ -215,18 +215,18 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms= -go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= -go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g= -go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc= -go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8= -go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE= -go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw= -go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=