package github
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCleanToolsets(t *testing.T) {
tests := []struct {
name string
input []string
expected []string
expectedInvalid []string
}{
{
name: "empty slice",
input: []string{},
expected: []string{},
},
{
name: "nil input slice",
input: nil,
expected: []string{},
},
// CleanToolsets only cleans - it does NOT filter out special keywords
{
name: "default keyword preserved",
input: []string{"default"},
expected: []string{"default"},
},
{
name: "default with additional toolsets",
input: []string{"default", "actions", "gists"},
expected: []string{"default", "actions", "gists"},
},
{
name: "all keyword preserved",
input: []string{"all", "actions"},
expected: []string{"all", "actions"},
},
{
name: "no special keywords",
input: []string{"actions", "gists", "notifications"},
expected: []string{"actions", "gists", "notifications"},
},
{
name: "duplicate toolsets without special keywords",
input: []string{"actions", "gists", "actions"},
expected: []string{"actions", "gists"},
},
{
name: "duplicate toolsets with default",
input: []string{"context", "repos", "issues", "pull_requests", "users", "default"},
expected: []string{"context", "repos", "issues", "pull_requests", "users", "default"},
},
{
name: "default appears multiple times - duplicates removed",
input: []string{"default", "actions", "default", "gists", "default"},
expected: []string{"default", "actions", "gists"},
},
// Whitespace test cases
{
name: "whitespace check - leading and trailing whitespace on regular toolsets",
input: []string{" actions ", " gists ", "notifications"},
expected: []string{"actions", "gists", "notifications"},
},
{
name: "whitespace check - default toolset with whitespace",
input: []string{" actions ", " default ", "notifications"},
expected: []string{"actions", "default", "notifications"},
},
{
name: "whitespace check - all toolset with whitespace",
input: []string{" all ", " actions "},
expected: []string{"all", "actions"},
},
// Invalid toolset test cases
{
name: "mix of valid and invalid toolsets",
input: []string{"actions", "invalid_toolset", "gists", "typo_repo"},
expected: []string{"actions", "invalid_toolset", "gists", "typo_repo"},
expectedInvalid: []string{"invalid_toolset", "typo_repo"},
},
{
name: "invalid with whitespace",
input: []string{" invalid_tool ", " actions ", " typo_gist "},
expected: []string{"invalid_tool", "actions", "typo_gist"},
expectedInvalid: []string{"invalid_tool", "typo_gist"},
},
{
name: "empty string in toolsets",
input: []string{"", "actions", " ", "gists"},
expected: []string{"actions", "gists"},
expectedInvalid: []string{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, invalid := CleanToolsets(tt.input)
require.Len(t, result, len(tt.expected), "result length should match expected length")
if tt.expectedInvalid == nil {
tt.expectedInvalid = []string{}
}
require.Len(t, invalid, len(tt.expectedInvalid), "invalid length should match expected invalid length")
resultMap := make(map[string]bool)
for _, toolset := range result {
resultMap[toolset] = true
}
expectedMap := make(map[string]bool)
for _, toolset := range tt.expected {
expectedMap[toolset] = true
}
invalidMap := make(map[string]bool)
for _, toolset := range invalid {
invalidMap[toolset] = true
}
expectedInvalidMap := make(map[string]bool)
for _, toolset := range tt.expectedInvalid {
expectedInvalidMap[toolset] = true
}
assert.Equal(t, expectedMap, resultMap, "result should contain all expected toolsets without duplicates")
assert.Equal(t, expectedInvalidMap, invalidMap, "invalid should contain all expected invalid toolsets")
assert.Len(t, resultMap, len(result), "result should not contain duplicates")
})
}
}
func TestAddDefaultToolset(t *testing.T) {
tests := []struct {
name string
input []string
expected []string
}{
{
name: "no default keyword - return unchanged",
input: []string{"actions", "gists"},
expected: []string{"actions", "gists"},
},
{
name: "default keyword present - expand and remove default",
input: []string{"default"},
expected: []string{
"context",
"repos",
"issues",
"pull_requests",
"users",
},
},
{
name: "default with additional toolsets",
input: []string{"default", "actions", "gists"},
expected: []string{
"actions",
"gists",
"context",
"repos",
"issues",
"pull_requests",
"users",
},
},
{
name: "default with overlapping toolsets - should not duplicate",
input: []string{"default", "context", "repos"},
expected: []string{
"context",
"repos",
"issues",
"pull_requests",
"users",
},
},
{
name: "empty input",
input: []string{},
expected: []string{},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := AddDefaultToolset(tt.input)
require.Len(t, result, len(tt.expected), "result length should match expected length")
resultMap := make(map[string]bool)
for _, toolset := range result {
resultMap[toolset] = true
}
expectedMap := make(map[string]bool)
for _, toolset := range tt.expected {
expectedMap[toolset] = true
}
assert.Equal(t, expectedMap, resultMap, "result should contain all expected toolsets")
assert.False(t, resultMap["default"], "result should not contain 'default' keyword")
})
}
}
func TestRemoveToolset(t *testing.T) {
tests := []struct {
name string
tools []string
toRemove string
expected []string
}{
{
name: "remove existing toolset",
tools: []string{"actions", "gists", "notifications"},
toRemove: "gists",
expected: []string{"actions", "notifications"},
},
{
name: "remove from empty slice",
tools: []string{},
toRemove: "actions",
expected: []string{},
},
{
name: "remove duplicate entries",
tools: []string{"actions", "gists", "actions", "notifications"},
toRemove: "actions",
expected: []string{"gists", "notifications"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := RemoveToolset(tt.tools, tt.toRemove)
assert.Equal(t, tt.expected, result)
})
}
}
func TestContainsToolset(t *testing.T) {
tests := []struct {
name string
tools []string
toCheck string
expected bool
}{
{
name: "toolset exists",
tools: []string{"actions", "gists", "notifications"},
toCheck: "gists",
expected: true,
},
{
name: "toolset does not exist",
tools: []string{"actions", "gists", "notifications"},
toCheck: "repos",
expected: false,
},
{
name: "empty slice",
tools: []string{},
toCheck: "actions",
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := ContainsToolset(tt.tools, tt.toCheck)
assert.Equal(t, tt.expected, result)
})
}
}