11package agent
22
33import (
4- "os"
54 "testing"
65
7- "github.com/skevetter/devpod/cmd/flags"
86 "github.com/stretchr/testify/assert"
97 "github.com/stretchr/testify/suite"
108)
@@ -17,122 +15,43 @@ func TestGitSSHSignatureSuite(t *testing.T) {
1715 suite .Run (t , new (GitSSHSignatureTestSuite ))
1816}
1917
20- func (s * GitSSHSignatureTestSuite ) TestAcceptsUnknownFlags () {
21- cmd := NewGitSSHSignatureCmd (& flags.GlobalFlags {})
22-
23- // Git passes: -Y sign -n git -f /path/to/key -U /dev/stdin /tmp/buffer
24- // -U is an unknown flag that consumes /dev/stdin as its value.
25- // /tmp/buffer remains as a positional argument.
26- err := cmd .ParseFlags (
27- []string {
28- "-Y" ,
29- "sign" ,
30- "-n" ,
31- "git" ,
32- "-f" ,
33- "/path/to/key" ,
34- "-U" ,
35- "/dev/stdin" ,
36- "/tmp/buffer" ,
37- },
38- )
39- assert .NoError (s .T (), err , "flag parsing should succeed with unknown flag -U" )
40-
41- args := cmd .Flags ().Args ()
42- s .Require ().NotEmpty (args , "should have positional args" )
43- assert .Equal (s .T (), "/tmp/buffer" , args [len (args )- 1 ],
44- "buffer file should be preserved as last positional arg" )
18+ func (s * GitSSHSignatureTestSuite ) TestParseBasicSignArgs () {
19+ args := []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key.pub" , "/tmp/buffer" }
20+ result := parseSSHKeygenArgs (args )
21+ assert .Equal (s .T (), "sign" , result .command )
22+ assert .Equal (s .T (), "git" , result .namespace )
23+ assert .Equal (s .T (), "/path/to/key.pub" , result .certPath )
24+ assert .Equal (s .T (), "/tmp/buffer" , result .bufferFile )
4525}
4626
47- func (s * GitSSHSignatureTestSuite ) TestBufferFileAsPositionalArg () {
48- cmd := NewGitSSHSignatureCmd (& flags.GlobalFlags {})
49-
50- err := cmd .ParseFlags (
51- []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key" , "/tmp/buffer" },
52- )
53- assert .NoError (s .T (), err )
54-
55- args := cmd .Flags ().Args ()
56- s .Require ().NotEmpty (args , "should have positional args" )
57- assert .Equal (s .T (), "/tmp/buffer" , args [len (args )- 1 ],
58- "last positional arg should be the buffer file" )
27+ func (s * GitSSHSignatureTestSuite ) TestParseWithAgentFlag () {
28+ // When the signing key is loaded in the ssh-agent, git passes -U (a boolean
29+ // "use agent" flag) immediately before the buffer file. The buffer file must
30+ // still be recognised as the last non-flag argument.
31+ args := []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key.pub" , "-U" , "/tmp/buffer" }
32+ result := parseSSHKeygenArgs (args )
33+ assert .Equal (s .T (), "sign" , result .command )
34+ assert .Equal (s .T (), "/path/to/key.pub" , result .certPath )
35+ assert .Equal (s .T (), "/tmp/buffer" , result .bufferFile )
5936}
6037
61- func (s * GitSSHSignatureTestSuite ) TestUnknownBooleanFlagBeforeBuffer () {
62- // When git signs with an ssh-agent key it passes:
63- // -Y sign -n git -f /path/to/key.pub -U /tmp/buffer
64- // Here -U is a boolean flag (use ssh-agent) but cobra doesn't know that,
65- // so it consumes /tmp/buffer as -U's value, leaving no positional args.
66- // This test verifies that extractBufferFileFromArgs handles this correctly
67- // by reading directly from os.Args.
68- cmd := NewGitSSHSignatureCmd (& flags.GlobalFlags {})
69-
70- // Demonstrate that cobra's flag parsing eats the buffer file
71- err := cmd .ParseFlags (
72- []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key.pub" , "-U" , "/tmp/buffer" },
73- )
74- assert .NoError (s .T (), err , "flag parsing should succeed" )
75- cobraArgs := cmd .Flags ().Args ()
76- assert .Empty (s .T (), cobraArgs ,
77- "cobra should have no positional args because -U consumed /tmp/buffer" )
78-
79- // Verify that extractBufferFileFromArgs finds the buffer file from os.Args
80- origArgs := os .Args
81- defer func () { os .Args = origArgs }()
82-
83- os .Args = []string {
84- "devpod" , "agent" , "git-ssh-signature" ,
85- "-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key.pub" , "-U" , "/tmp/buffer" ,
86- }
87- bufferFile , err := extractBufferFileFromArgs ()
88- assert .NoError (s .T (), err )
89- assert .Equal (s .T (), "/tmp/buffer" , bufferFile ,
90- "should extract buffer file even when -U precedes it" )
38+ func (s * GitSSHSignatureTestSuite ) TestParseNonSignCommand () {
39+ args := []string {"-Y" , "verify" , "-n" , "git" , "-f" , "/path/to/key.pub" , "/tmp/buffer" }
40+ result := parseSSHKeygenArgs (args )
41+ assert .Equal (s .T (), "verify" , result .command )
9142}
9243
93- func (s * GitSSHSignatureTestSuite ) TestExtractBufferFileFromArgs () {
94- origArgs := os .Args
95- defer func () { os .Args = origArgs }()
96-
97- // Normal case: buffer file is last arg
98- os .Args = []string {
99- "devpod" , "agent" , "git-ssh-signature" ,
100- "-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key" , "/tmp/buffer" ,
101- }
102- bufferFile , err := extractBufferFileFromArgs ()
103- assert .NoError (s .T (), err )
104- assert .Equal (s .T (), "/tmp/buffer" , bufferFile )
105-
106- // Error case: no non-flag argument after git-ssh-signature (all args are flags)
107- os .Args = []string {
108- "devpod" , "agent" , "git-ssh-signature" ,
109- "-Y" , "-n" , "-f" , "-U" ,
110- }
111- _ , err = extractBufferFileFromArgs ()
112- assert .Error (s .T (), err )
113- assert .Contains (s .T (), err .Error (), "no non-flag argument found" )
114-
115- // Error case: git-ssh-signature not in args
116- os .Args = []string {"some-other-binary" , "-Y" , "sign" }
117- _ , err = extractBufferFileFromArgs ()
118- assert .Error (s .T (), err )
119- assert .Contains (s .T (), err .Error (), "git-ssh-signature not found" )
44+ func (s * GitSSHSignatureTestSuite ) TestParseMissingBufferFile () {
45+ // All args end in a flag — no buffer file present.
46+ args := []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key.pub" , "-U" }
47+ result := parseSSHKeygenArgs (args )
48+ assert .Equal (s .T (), "" , result .bufferFile )
12049}
12150
122- func (s * GitSSHSignatureTestSuite ) TestKnownFlagsParsed () {
123- cmd := NewGitSSHSignatureCmd (& flags.GlobalFlags {})
124-
125- err := cmd .ParseFlags (
126- []string {"-Y" , "sign" , "-n" , "git" , "-f" , "/path/to/key" , "/tmp/buffer" },
127- )
128- assert .NoError (s .T (), err )
129-
130- val , err := cmd .Flags ().GetString ("command" )
131- assert .NoError (s .T (), err )
132- assert .Equal (s .T (), "sign" , val , "command flag should be 'sign'" )
133-
134- args := cmd .Flags ().Args ()
135- s .Require ().NotEmpty (args , "should have positional args" )
136- assert .Equal (s .T (), "/tmp/buffer" , args [len (args )- 1 ],
137- "last positional arg should be the buffer file" )
51+ func (s * GitSSHSignatureTestSuite ) TestParseDefaultsToSign () {
52+ // If -Y is absent the command defaults to "sign".
53+ args := []string {"-n" , "git" , "-f" , "/path/to/key.pub" , "/tmp/buffer" }
54+ result := parseSSHKeygenArgs (args )
55+ assert .Equal (s .T (), "sign" , result .command )
56+ assert .Equal (s .T (), "/tmp/buffer" , result .bufferFile )
13857}
0 commit comments