diff --git a/cmd/uncloud/internal/logs/logs_test.go b/cmd/uncloud/internal/logs/logs_test.go new file mode 100644 index 00000000..f82845f4 --- /dev/null +++ b/cmd/uncloud/internal/logs/logs_test.go @@ -0,0 +1,108 @@ +package logs + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestParseServiceArgs(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + args []string + want []ServiceArg + wantErr string + }{ + { + name: "empty input", + args: nil, + want: []ServiceArg{}, + }, + { + name: "single bareword service", + args: []string{"web"}, + want: []ServiceArg{{Service: "web"}}, + }, + { + name: "single container", + args: []string{"web/abc123"}, + want: []ServiceArg{{Service: "web", Containers: []string{"abc123"}}}, + }, + { + name: "multiple containers same service", + args: []string{"web/abc123", "web/def456"}, + want: []ServiceArg{{Service: "web", Containers: []string{"abc123", "def456"}}}, + }, + { + name: "multiple services interleaved", + args: []string{"web/abc123", "api", " web/def456 ", "db/xyz789 "}, + want: []ServiceArg{ + {Service: "web", Containers: []string{"abc123", "def456"}}, + {Service: "api"}, + {Service: "db", Containers: []string{"xyz789"}}, + }, + }, + { + name: "bareword wins when seen first", + args: []string{"web", "web/abc123"}, + want: []ServiceArg{{Service: "web"}}, + }, + { + name: "bareword wins when seen later", + args: []string{"web/abc123", "web/def456", "web"}, + want: []ServiceArg{{Service: "web"}}, + }, + { + name: "bareword wins followed by more container args", + args: []string{"web/abc123", "web", "web/def456"}, + want: []ServiceArg{{Service: "web"}}, + }, + { + name: "preserves first-seen service order", + args: []string{"db", "api", "web"}, + want: []ServiceArg{ + {Service: "db"}, + {Service: "api"}, + {Service: "web"}, + }, + }, + { + name: "empty arg", + args: []string{""}, + wantErr: "empty service argument", + }, + { + name: "empty spaces arg", + args: []string{" "}, + wantErr: "empty service argument", + }, + { + name: "missing service half", + args: []string{"/abc123"}, + wantErr: "service name is empty", + }, + { + name: "missing container half", + args: []string{"web/"}, + wantErr: "container name or ID is empty", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := ParseServiceArgs(tt.args) + if tt.wantErr != "" { + require.Error(t, err) + assert.ErrorContains(t, err, tt.wantErr) + return + } + require.NoError(t, err) + assert.Equal(t, tt.want, got) + }) + } +}