1// Copyright 2022 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package git
5
6import (
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11)
12
13func TestRunWithContextStd(t *testing.T) {
14 cmd := NewCommand(t.Context(), "--version")
15 stdout, stderr, err := cmd.RunStdString(&RunOpts{})
16 require.NoError(t, err)
17 assert.Empty(t, stderr)
18 assert.Contains(t, stdout, "git version")
19
20 cmd = NewCommand(t.Context(), "--no-such-arg")
21 stdout, stderr, err = cmd.RunStdString(&RunOpts{})
22 if assert.Error(t, err) {
23 assert.Equal(t, stderr, err.Stderr())
24 assert.Contains(t, err.Stderr(), "unknown option:")
25 assert.Contains(t, err.Error(), "exit status 129 - unknown option:")
26 assert.Empty(t, stdout)
27 }
28
29 cmd = NewCommand(t.Context())
30 cmd.AddDynamicArguments("-test")
31 require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand)
32
33 cmd = NewCommand(t.Context())
34 cmd.AddDynamicArguments("--test")
35 require.ErrorIs(t, cmd.Run(&RunOpts{}), ErrBrokenCommand)
36
37 subCmd := "version"
38 cmd = NewCommand(t.Context()).AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production
39 stdout, stderr, err = cmd.RunStdString(&RunOpts{})
40 require.NoError(t, err)
41 assert.Empty(t, stderr)
42 assert.Contains(t, stdout, "git version")
43}
44
45func TestGitArgument(t *testing.T) {
46 assert.True(t, isValidArgumentOption("-x"))
47 assert.True(t, isValidArgumentOption("--xx"))
48 assert.False(t, isValidArgumentOption(""))
49 assert.False(t, isValidArgumentOption("x"))
50
51 assert.True(t, isSafeArgumentValue(""))
52 assert.True(t, isSafeArgumentValue("x"))
53 assert.False(t, isSafeArgumentValue("-x"))
54}
55
56func TestCommandString(t *testing.T) {
57 cmd := NewCommandContextNoGlobals(t.Context(), "a", "-m msg", "it's a test", `say "hello"`)
58 assert.Equal(t, cmd.prog+` a "-m msg" "it's a test" "say \"hello\""`, cmd.String())
59
60 cmd = NewCommandContextNoGlobals(t.Context(), "url: https://a:b@c/")
61 assert.Equal(t, cmd.prog+` "url: https://sanitized-credential@c/"`, cmd.toString(true))
62}
63
64func TestGrepOnlyFunction(t *testing.T) {
65 cmd := NewCommand(t.Context(), "anything-but-grep")
66 assert.Panics(t, func() {
67 cmd.AddGitGrepExpression("whatever")
68 })
69}