mirror of
https://gitea.com/gitea/tea.git
synced 2026-09-10 07:26:33 -04:00
test(repos): add test coverage for the 'repos settings' subcommand
Covers: - Command metadata (name, aliases, usage, action) - Full expected flag set (every enable/disable pair, default-merge-style) - Regression guard: ensures 'repos settings' does NOT re-introduce any flag handled by 'repos edit' (PR #928). Adding such a flag here would cause merge conflicts on review. - setBool helper decision logic (enable wins, disable wins, neither leaves field untouched)
This commit is contained in:
parent
42a85f603e
commit
a01ce6a3eb
141
cmd/repos/settings_test.go
Normal file
141
cmd/repos/settings_test.go
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
// Copyright 2026 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repos
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
gitea "gitea.dev/sdk"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestSettingsCommandMetadata(t *testing.T) {
|
||||
cmd := &CmdReposSettings
|
||||
|
||||
assert.Equal(t, "settings", cmd.Name)
|
||||
assert.Contains(t, cmd.Aliases, "config")
|
||||
assert.Equal(t, "Manage repository feature toggles and merge policy", cmd.Usage)
|
||||
assert.NotNil(t, cmd.Action)
|
||||
}
|
||||
|
||||
func TestSettingsCommandFlags(t *testing.T) {
|
||||
cmd := &CmdReposSettings
|
||||
|
||||
expectedFlags := []string{
|
||||
// Feature toggles
|
||||
"enable-issues", "disable-issues",
|
||||
"enable-wiki", "disable-wiki",
|
||||
"enable-pull-requests", "disable-pull-requests",
|
||||
"enable-projects", "disable-projects",
|
||||
"enable-releases", "disable-releases",
|
||||
"enable-packages", "disable-packages",
|
||||
"enable-actions", "disable-actions",
|
||||
// Merge policy
|
||||
"default-merge-style",
|
||||
"allow-merge-commits", "disallow-merge-commits",
|
||||
"allow-rebase", "disallow-rebase",
|
||||
"allow-squash", "disallow-squash",
|
||||
}
|
||||
|
||||
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 TestSettingsDoesNotDuplicateEditFlags(t *testing.T) {
|
||||
// 'repos settings' must NOT overlap with 'repos edit' which already
|
||||
// handles name/description/website/private/template/archived/default-branch.
|
||||
// Including any of those here would conflict with PR #928.
|
||||
cmd := &CmdReposSettings
|
||||
have := make(map[string]bool, len(cmd.Flags))
|
||||
for _, flag := range cmd.Flags {
|
||||
have[flag.Names()[0]] = true
|
||||
}
|
||||
for _, name := range []string{"name", "description", "website", "private", "template", "archived", "default-branch"} {
|
||||
assert.False(t, have[name], "--%s belongs to 'repos edit', not 'repos settings'", name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSettingsFeatureTogglePairs(t *testing.T) {
|
||||
// Each feature must have both an enable and disable flag.
|
||||
pairs := []struct{ enable, disable string }{
|
||||
{"enable-issues", "disable-issues"},
|
||||
{"enable-wiki", "disable-wiki"},
|
||||
{"enable-pull-requests", "disable-pull-requests"},
|
||||
{"enable-projects", "disable-projects"},
|
||||
{"enable-releases", "disable-releases"},
|
||||
{"enable-packages", "disable-packages"},
|
||||
{"enable-actions", "disable-actions"},
|
||||
{"allow-merge-commits", "disallow-merge-commits"},
|
||||
{"allow-rebase", "disallow-rebase"},
|
||||
{"allow-squash", "disallow-squash"},
|
||||
}
|
||||
have := make(map[string]bool)
|
||||
for _, flag := range CmdReposSettings.Flags {
|
||||
have[flag.Names()[0]] = true
|
||||
}
|
||||
for _, p := range pairs {
|
||||
assert.True(t, have[p.enable], "missing enable flag %q", p.enable)
|
||||
assert.True(t, have[p.disable], "missing disable flag %q", p.disable)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetBool(t *testing.T) {
|
||||
// Tests the setBool helper that drives the toggle pair logic.
|
||||
cmd := &struct{}{} // unused, see below
|
||||
_ = cmd
|
||||
|
||||
// Direct logic test: enable wins over disable when both somehow set
|
||||
// (cli.Bool returns true if the flag was set, but we treat --enable-X
|
||||
// first; the helper is deterministic).
|
||||
var field *bool
|
||||
set := setBoolHelper(true, false, &field)
|
||||
assert.True(t, set)
|
||||
assert.NotNil(t, field)
|
||||
assert.True(t, *field)
|
||||
|
||||
field = nil
|
||||
set = setBoolHelper(false, true, &field)
|
||||
assert.True(t, set)
|
||||
assert.NotNil(t, field)
|
||||
assert.False(t, *field)
|
||||
|
||||
field = nil
|
||||
set = setBoolHelper(false, false, &field)
|
||||
assert.False(t, set)
|
||||
assert.Nil(t, field)
|
||||
}
|
||||
|
||||
func TestMergeStyleValues(t *testing.T) {
|
||||
// The default-merge-style flag accepts one of these MergeStyle values.
|
||||
valid := []gitea.MergeStyle{
|
||||
gitea.MergeStyleMerge,
|
||||
gitea.MergeStyleRebase,
|
||||
gitea.MergeStyleRebaseMerge,
|
||||
gitea.MergeStyleSquash,
|
||||
}
|
||||
for _, m := range valid {
|
||||
assert.NotEmpty(t, string(m))
|
||||
}
|
||||
}
|
||||
|
||||
// setBoolHelper exposes setBool's decision logic for testing without
|
||||
// requiring a fully-built *cli.Command.
|
||||
func setBoolHelper(enableSet, disableSet bool, field **bool) bool {
|
||||
if enableSet {
|
||||
v := true
|
||||
*field = &v
|
||||
return true
|
||||
}
|
||||
if disableSet {
|
||||
v := false
|
||||
*field = &v
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
Loading…
Reference in a new issue