blob: 8bcdd8f1258a9d30b9be7a5eb16eee7086028c2a [file] [log] [blame]
package bashkit
import (
"strings"
"testing"
)
func TestCheck(t *testing.T) {
tests := []struct {
name string
script string
wantErr bool
errMatch string // string to match in error message, if wantErr is true
}{
{
name: "valid script",
script: "echo hello world",
wantErr: false,
errMatch: "",
},
{
name: "invalid syntax",
script: "echo 'unterminated string",
wantErr: false, // As per implementation, syntax errors are not flagged
errMatch: "",
},
{
name: "git config user.name",
script: "git config user.name 'John Doe'",
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "git config user.email",
script: "git config user.email 'john@example.com'",
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "git config with flag user.name",
script: "git config --global user.name 'John Doe'",
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "git config with other setting",
script: "git config core.editor vim",
wantErr: false,
errMatch: "",
},
{
name: "git without config",
script: "git commit -m 'Add feature'",
wantErr: false,
errMatch: "",
},
{
name: "multiline script with proper escaped newlines",
script: "echo 'Setting up git...' && git config user.name 'John Doe' && echo 'Done!'",
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "multiline script with backticks",
script: `echo 'Setting up git...'
git config user.name 'John Doe'
echo 'Done!'`,
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "git config with variable",
script: "NAME='John Doe'\ngit config user.name $NAME",
wantErr: true,
errMatch: "changing git config username/email is not allowed",
},
{
name: "only git command",
script: "git",
wantErr: false,
errMatch: "",
},
{
name: "read git config",
script: "git config user.name",
wantErr: false,
errMatch: "",
},
{
name: "commented git config",
script: "# git config user.name 'John Doe'",
wantErr: false,
errMatch: "",
},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
err := Check(tc.script)
if (err != nil) != tc.wantErr {
t.Errorf("Check() error = %v, wantErr %v", err, tc.wantErr)
return
}
if tc.wantErr && err != nil && !strings.Contains(err.Error(), tc.errMatch) {
t.Errorf("Check() error message = %v, want containing %v", err, tc.errMatch)
}
})
}
}