mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 11:01:25 +01:00
Reverts #1126, #1125, #1124, #1123 and #1122. `go.mod` keeps the Go 1.26 line with toolchain `go1.26.9` (instead of the original `go1.26.6`) so the security fix from #1131 isn't lost. reopens #69 reopens #141 reopens #162 reopens #172 reopens #197 reopens #232 reopens #240 reopens #246 reopens #323 reopens #325 reopens #326 reopens #328 reopens #344 reopens #351 reopens #373 reopens #403 reopens #406 reopens #417 reopens #430 reopens #457 reopens #480 reopens #482 reopens #489 reopens #490 reopens #498 reopens #500 reopens #504 reopens #510 reopens #516 reopens #523 reopens #556 reopens #560 reopens #569 reopens #571 reopens #602 reopens #632 reopens #633 reopens #643 reopens #666 reopens #670 reopens #672 reopens #677 reopens #683 reopens #697 reopens #726 reopens #737 reopens #770 reopens #779 reopens #804 reopens #817 reopens #831 reopens #833 reopens #834 reopens #908 reopens #966 reopens #1023 reopens #1029 reopens #1032 reopens #1050 reopens #1052 reopens #1069 reopens #1073 reopens #1087 reopens #1091 reopens #1094 reopens #1110 reopens #1115 reopens #1116 reopens #1118 Reviewed-on: https://gitea.com/gitea/tea/pulls/1146 Reviewed-by: TheFox0x7 <95654+thefox0x7@noreply.gitea.com>
214 lines
4.3 KiB
Go
214 lines
4.3 KiB
Go
// Copyright 2025 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package variables
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateVariableName(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "valid name",
|
|
input: "VALID_VARIABLE_NAME",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid name with numbers",
|
|
input: "VARIABLE_123",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid lowercase",
|
|
input: "valid_variable",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid mixed case",
|
|
input: "Mixed_Case_Variable",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "invalid - spaces",
|
|
input: "INVALID VARIABLE",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid - special chars",
|
|
input: "INVALID-VARIABLE!",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid - starts with number",
|
|
input: "1INVALID",
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid - empty",
|
|
input: "",
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := validateVariableName(tt.input)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("validateVariableName(%q) error = %v, wantErr %v", tt.input, err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetVariableSourceArgs(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
args []string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "valid args",
|
|
args: []string{"VALID_VARIABLE", "variable_value"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid lowercase",
|
|
args: []string{"valid_variable", "value"},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "missing name",
|
|
args: []string{},
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "too many args",
|
|
args: []string{"VARIABLE_NAME", "value", "extra"},
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "invalid variable name",
|
|
args: []string{"invalid-variable", "value"},
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// Test argument validation only
|
|
if len(tt.args) == 0 {
|
|
if !tt.wantErr {
|
|
t.Error("Expected error for empty args")
|
|
}
|
|
return
|
|
}
|
|
|
|
if len(tt.args) > 2 {
|
|
if !tt.wantErr {
|
|
t.Error("Expected error for too many args")
|
|
}
|
|
return
|
|
}
|
|
|
|
// Test variable name validation
|
|
err := validateVariableName(tt.args[0])
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("validateVariableName() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestVariableNameValidation(t *testing.T) {
|
|
// Test that variable names follow GitHub Actions/Gitea Actions conventions
|
|
validNames := []string{
|
|
"VALID_VARIABLE",
|
|
"API_URL",
|
|
"DATABASE_HOST",
|
|
"VARIABLE_123",
|
|
"mixed_Case_Variable",
|
|
"lowercase_variable",
|
|
"UPPERCASE_VARIABLE",
|
|
}
|
|
|
|
invalidNames := []string{
|
|
"Invalid-Dashes",
|
|
"INVALID SPACES",
|
|
"123_STARTS_WITH_NUMBER",
|
|
"", // Empty
|
|
"INVALID!@#", // Special chars
|
|
}
|
|
|
|
for _, name := range validNames {
|
|
t.Run("valid_"+name, func(t *testing.T) {
|
|
err := validateVariableName(name)
|
|
if err != nil {
|
|
t.Errorf("validateVariableName(%q) should be valid, got error: %v", name, err)
|
|
}
|
|
})
|
|
}
|
|
|
|
for _, name := range invalidNames {
|
|
t.Run("invalid_"+name, func(t *testing.T) {
|
|
err := validateVariableName(name)
|
|
if err == nil {
|
|
t.Errorf("validateVariableName(%q) should be invalid, got no error", name)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestVariableValueValidation(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
value string
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "valid value",
|
|
value: "variable123",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid complex value",
|
|
value: "https://api.example.com/v1",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "valid multiline value",
|
|
value: "line1\nline2\nline3",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "empty value allowed",
|
|
value: "",
|
|
wantErr: false, // Variables can be empty unlike secrets
|
|
},
|
|
{
|
|
name: "whitespace only allowed",
|
|
value: " \t\n ",
|
|
wantErr: false, // Variables can contain whitespace
|
|
},
|
|
{
|
|
name: "very long value",
|
|
value: strings.Repeat("a", 65537), // Over 64KB
|
|
wantErr: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
err := validateVariableValue(tt.value)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("validateVariableValue() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|