diff --git a/cmd/teams/create_test.go b/cmd/teams/create_test.go new file mode 100644 index 00000000..8fc0223f --- /dev/null +++ b/cmd/teams/create_test.go @@ -0,0 +1,54 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package teams + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreateCommandMetadata(t *testing.T) { + cmd := &CmdTeamsCreate + + assert.Equal(t, "create", cmd.Name) + for _, want := range []string{"add", "c"} { + assert.Contains(t, cmd.Aliases, want) + } + assert.Equal(t, "Create a new team", cmd.Usage) + assert.Equal(t, "", cmd.ArgsUsage) + assert.NotNil(t, cmd.Action) +} + +func TestCreateCommandFlags(t *testing.T) { + cmd := &CmdTeamsCreate + + have := make(map[string]bool, len(cmd.Flags)) + for _, flag := range cmd.Flags { + have[flag.Names()[0]] = true + } + for _, name := range []string{"org", "description", "permission", "can-create-repo", "all-repos", "units", "login", "output"} { + assert.True(t, have[name], "expected flag %q not found", name) + } +} + +func TestCreateOrgFlagExists(t *testing.T) { + for _, flag := range CmdTeamsCreate.Flags { + if flag.Names()[0] == "org" { + return + } + } + t.Fatal("expected --org flag on create command") +} + +func TestCreatePermissionFlagHasDefault(t *testing.T) { + for _, flag := range CmdTeamsCreate.Flags { + if flag.Names()[0] != "permission" { + continue + } + assert.NotNil(t, flag) + return + } + t.Fatal("expected --permission flag on create command") +} diff --git a/cmd/teams/delete_test.go b/cmd/teams/delete_test.go new file mode 100644 index 00000000..b60712bd --- /dev/null +++ b/cmd/teams/delete_test.go @@ -0,0 +1,38 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package teams + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDeleteCommandMetadata(t *testing.T) { + cmd := &CmdTeamsDelete + + assert.Equal(t, "delete", cmd.Name) + for _, want := range []string{"rm", "remove"} { + assert.Contains(t, cmd.Aliases, want) + } + assert.Equal(t, "Delete a team", cmd.Usage) + assert.Equal(t, "", cmd.ArgsUsage) + assert.NotNil(t, cmd.Action) +} + +func TestDeleteCommandFlags(t *testing.T) { + cmd := &CmdTeamsDelete + + have := make(map[string]bool, len(cmd.Flags)) + for _, flag := range cmd.Flags { + have[flag.Names()[0]] = true + } + for _, name := range []string{"confirm", "login", "output"} { + assert.True(t, have[name], "expected flag %q not found", name) + } +} + +func TestRequireTeamID(t *testing.T) { + assert.NotNil(t, RequireTeamID) +} diff --git a/cmd/teams/edit_test.go b/cmd/teams/edit_test.go new file mode 100644 index 00000000..5099a52a --- /dev/null +++ b/cmd/teams/edit_test.go @@ -0,0 +1,48 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package teams + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEditCommandMetadata(t *testing.T) { + cmd := &CmdTeamsEdit + + assert.Equal(t, "edit", cmd.Name) + assert.Contains(t, cmd.Aliases, "update") + assert.Equal(t, "Edit a team", cmd.Usage) + assert.Equal(t, "", cmd.ArgsUsage) + assert.NotNil(t, cmd.Action) +} + +func TestEditCommandFlags(t *testing.T) { + cmd := &CmdTeamsEdit + + have := make(map[string]bool, len(cmd.Flags)) + for _, flag := range cmd.Flags { + have[flag.Names()[0]] = true + } + for _, name := range []string{"name", "description", "permission", "can-create-repo", "no-create-repo", "all-repos", "no-all-repos", "units", "login", "output"} { + assert.True(t, have[name], "expected flag %q not found", name) + } +} + +func TestEditHasNegativeFlagPairs(t *testing.T) { + pairs := [][]string{ + {"can-create-repo", "no-create-repo"}, + {"all-repos", "no-all-repos"}, + } + for _, pair := range pairs { + have := make(map[string]bool, 2) + for _, flag := range CmdTeamsEdit.Flags { + have[flag.Names()[0]] = true + } + for _, name := range pair { + assert.True(t, have[name], "expected --%s flag on edit command", name) + } + } +} diff --git a/cmd/teams/list_test.go b/cmd/teams/list_test.go new file mode 100644 index 00000000..c6ef2b69 --- /dev/null +++ b/cmd/teams/list_test.go @@ -0,0 +1,80 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package teams + +import ( + "testing" + + gitea "gitea.dev/sdk" + "github.com/stretchr/testify/assert" +) + +func TestListCommandMetadata(t *testing.T) { + cmd := &CmdTeamsList + + assert.Equal(t, "list", cmd.Name) + assert.Contains(t, cmd.Aliases, "ls") + assert.Equal(t, "List teams in an organization", cmd.Usage) + assert.Equal(t, "List all teams in the specified organization", cmd.Description) + assert.NotNil(t, cmd.Action) +} + +func TestListCommandFlags(t *testing.T) { + cmd := &CmdTeamsList + + have := make(map[string]bool, len(cmd.Flags)) + for _, flag := range cmd.Flags { + have[flag.Names()[0]] = true + } + for _, name := range []string{"page", "limit", "search", "login", "output"} { + assert.True(t, have[name], "expected flag %q not found", name) + } +} + +func TestParseRepoUnits(t *testing.T) { + tests := []struct { + name string + input []string + expected []gitea.RepoUnitType + }{ + { + name: "empty input yields default units", + input: nil, + expected: []gitea.RepoUnitType{gitea.RepoUnitCode, gitea.RepoUnitIssues, gitea.RepoUnitPulls, gitea.RepoUnitReleases}, + }, + { + name: "single code unit", + input: []string{"code"}, + expected: []gitea.RepoUnitType{gitea.RepoUnitCode}, + }, + { + name: "multiple units", + input: []string{"code", "issues", "wiki"}, + expected: []gitea.RepoUnitType{ + gitea.RepoUnitCode, + gitea.RepoUnitIssues, + gitea.RepoUnitWiki, + }, + }, + { + name: "case-insensitive", + input: []string{"CODE", "IsSuEs"}, + expected: []gitea.RepoUnitType{ + gitea.RepoUnitCode, + gitea.RepoUnitIssues, + }, + }, + { + name: "unknown unit is silently dropped", + input: []string{"code", "bogus"}, + expected: []gitea.RepoUnitType{gitea.RepoUnitCode}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.expected, ParseRepoUnits(tt.input)) + }) + } +}