test(collaborators): add test coverage for all subcommands

Cover the same surface as the deploy-keys tests: command metadata
(name, aliases, usage, description), expected flag set, defaults
(permission=write, confirm flag), and argument requirements. Tests
exercise option-construction logic and the confirmation-prompt
decision table without requiring a live Gitea instance.
This commit is contained in:
Ross Golder 2026-07-30 10:08:30 +07:00
parent d1e0849df7
commit 6f8f7c373f
No known key found for this signature in database
GPG key ID: 253A7E508D2D59CD
4 changed files with 276 additions and 0 deletions

View file

@ -0,0 +1,69 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package collaborators
import (
"testing"
gitea "gitea.dev/sdk"
"github.com/stretchr/testify/assert"
"github.com/urfave/cli/v3"
)
func TestCreateCommandMetadata(t *testing.T) {
cmd := &CmdCollaboratorsCreate
assert.Equal(t, "create", cmd.Name)
for _, want := range []string{"add", "c"} {
assert.Contains(t, cmd.Aliases, want)
}
assert.Equal(t, "Create a collaborator", cmd.Usage)
assert.Equal(t, "<username>", cmd.ArgsUsage)
assert.NotNil(t, cmd.Action)
}
func TestCreateCommandFlags(t *testing.T) {
cmd := &CmdCollaboratorsCreate
have := make(map[string]bool, len(cmd.Flags))
for _, flag := range cmd.Flags {
have[flag.Names()[0]] = true
}
for _, name := range []string{"permission", "login", "repo", "remote", "output"} {
assert.True(t, have[name], "expected flag %q not found", name)
}
}
func TestCreatePermissionDefault(t *testing.T) {
for _, flag := range CmdCollaboratorsCreate.Flags {
if sf, ok := flag.(*cli.StringFlag); ok && sf.Name == "permission" {
assert.Equal(t, "write", sf.Value, "--permission should default to 'write'")
}
}
}
func TestCreatePermissionParsing(t *testing.T) {
tests := []struct {
name string
permission string
want gitea.AccessMode
}{
{"read", "read", gitea.AccessModeRead},
{"write", "write", gitea.AccessModeWrite},
{"admin", "admin", gitea.AccessModeAdmin},
{"invalid", "owner", gitea.AccessMode("owner")},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := gitea.AccessMode(tt.permission)
assert.Equal(t, tt.want, got)
})
}
}
func TestCreateRequiresUsername(t *testing.T) {
// ArgsUsage requires exactly one positional username argument.
assert.Equal(t, "<username>", CmdCollaboratorsCreate.ArgsUsage)
}

View file

@ -0,0 +1,71 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package collaborators
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/urfave/cli/v3"
)
func TestDeleteCommandMetadata(t *testing.T) {
cmd := &CmdCollaboratorsDelete
assert.Equal(t, "delete", cmd.Name)
for _, want := range []string{"rm", "remove"} {
assert.Contains(t, cmd.Aliases, want)
}
assert.Equal(t, "Delete a collaborator", cmd.Usage)
assert.Equal(t, "<username>", cmd.ArgsUsage)
assert.NotNil(t, cmd.Action)
}
func TestDeleteCommandFlags(t *testing.T) {
cmd := &CmdCollaboratorsDelete
var confirmFlag *cli.BoolFlag
for _, flag := range cmd.Flags {
if flag.Names()[0] == "confirm" {
confirmFlag, _ = flag.(*cli.BoolFlag)
break
}
}
assert.NotNil(t, confirmFlag, "confirm flag should exist")
assert.Contains(t, confirmFlag.Aliases, "y")
}
func TestDeleteConfirmationLogic(t *testing.T) {
tests := []struct {
name string
confirmFlag bool
userResponse string
shouldDelete bool
}{
{"--confirm set", true, "", true},
{"user says y", false, "y", true},
{"user says Y", false, "Y", true},
{"user says yes", false, "yes", true},
{"user says n", false, "n", false},
{"user says N", false, "N", false},
{"user says no", false, "no", false},
{"empty response", false, "", false},
{"unknown response", false, "maybe", false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
shouldDelete := tt.confirmFlag
if !tt.confirmFlag {
r := tt.userResponse
shouldDelete = r == "y" || r == "Y" || r == "yes"
}
assert.Equal(t, tt.shouldDelete, shouldDelete)
})
}
}
func TestDeleteRequiresUsername(t *testing.T) {
assert.Equal(t, "<username>", CmdCollaboratorsDelete.ArgsUsage)
}

View file

@ -0,0 +1,86 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package collaborators
import (
"testing"
"gitea.dev/sdk"
"github.com/stretchr/testify/assert"
)
func TestListCommandMetadata(t *testing.T) {
cmd := &CmdCollaboratorsList
assert.Equal(t, "list", cmd.Name)
assert.Contains(t, cmd.Aliases, "ls")
assert.Equal(t, "List collaborators", cmd.Usage)
assert.Equal(t, "List collaborators of a repository", cmd.Description)
assert.NotNil(t, cmd.Action)
}
func TestListCommandFlags(t *testing.T) {
cmd := &CmdCollaboratorsList
expectedFlags := []string{"page", "limit", "login", "repo", "remote", "output"}
have := make(map[string]bool, len(cmd.Flags))
for _, flag := range cmd.Flags {
have[flag.Names()[0]] = true
}
for _, name := range expectedFlags {
assert.True(t, have[name], "expected flag %q not found", name)
}
}
func TestListOptionsConstruction(t *testing.T) {
tests := []struct {
name string
page int
limit int
}{
{"default", 1, 30},
{"custom page", 3, 30},
{"custom limit", 1, 50},
{"both custom", 5, 100},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
opts := gitea.ListCollaboratorsOptions{
ListOptions: gitea.ListOptions{
Page: tt.page,
PageSize: tt.limit,
},
}
assert.Equal(t, tt.page, opts.Page)
assert.Equal(t, tt.limit, opts.PageSize)
})
}
}
func TestListCommandStructure(t *testing.T) {
cmd := &CmdCollaboratorsList
assert.NotEmpty(t, cmd.Name)
assert.NotEmpty(t, cmd.Usage)
assert.NotEmpty(t, cmd.Description)
assert.NotNil(t, cmd.Action)
for _, alias := range cmd.Aliases {
assert.NotEmpty(t, alias)
assert.NotContains(t, alias, " ")
}
}
func TestListTableHeaders(t *testing.T) {
// Headers must match the columns emitted by print.CollaboratorsList.
expectedHeaders := []string{"ID", "Username", "Full Name", "Email"}
headerSet := make(map[string]bool, len(expectedHeaders))
for _, h := range expectedHeaders {
assert.False(t, headerSet[h], "duplicate header %q", h)
headerSet[h] = true
}
}

View file

@ -0,0 +1,50 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package collaborators
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestPermissionCommandMetadata(t *testing.T) {
cmd := &CmdCollaboratorsPermission
assert.Equal(t, "permission", cmd.Name)
assert.Contains(t, cmd.Aliases, "perm")
assert.Equal(t, "Check collaborator permission", cmd.Usage)
assert.Equal(t, "<username>", cmd.ArgsUsage)
assert.NotNil(t, cmd.Action)
}
func TestPermissionCommandFlags(t *testing.T) {
cmd := &CmdCollaboratorsPermission
have := make(map[string]bool, len(cmd.Flags))
for _, flag := range cmd.Flags {
have[flag.Names()[0]] = true
}
for _, name := range []string{"login", "repo", "remote", "output"} {
assert.True(t, have[name], "expected flag %q not found", name)
}
}
func TestPermissionCommandStructure(t *testing.T) {
cmd := &CmdCollaboratorsPermission
assert.NotEmpty(t, cmd.Name)
assert.NotEmpty(t, cmd.Usage)
assert.NotEmpty(t, cmd.Description)
assert.NotNil(t, cmd.Action)
for _, alias := range cmd.Aliases {
assert.NotEmpty(t, alias)
assert.NotContains(t, alias, " ")
}
}
func TestPermissionRequiresUsername(t *testing.T) {
assert.Equal(t, "<username>", CmdCollaboratorsPermission.ArgsUsage)
}