1package cmd
2
3import (
4	"fmt"
5	"testing"
6
7	"github.com/spf13/cobra"
8	"github.com/stretchr/testify/assert"
9	"github.com/stretchr/testify/require"
10)
11
12func TestChattrCmdValidArgs(t *testing.T) {
13	for _, tc := range []struct {
14		args                       []string
15		toComplete                 string
16		expectedCompletions        []string
17		expectedShellCompDirective cobra.ShellCompDirective
18	}{
19		{
20			toComplete:                 "a",
21			expectedCompletions:        []string{"after"},
22			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
23		},
24		{
25			toComplete:                 "e",
26			expectedCompletions:        []string{"empty", "encrypted", "exact", "executable"},
27			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
28		},
29		{
30			toComplete:                 "-c",
31			expectedCompletions:        []string{"-create"},
32			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
33		},
34		{
35			toComplete:                 "+o",
36			expectedCompletions:        []string{"+once", "+onchange"},
37			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
38		},
39		{
40			toComplete:                 "nop",
41			expectedCompletions:        []string{"noprivate"},
42			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
43		},
44		{
45			toComplete:                 "empty,s",
46			expectedCompletions:        []string{"empty,script", "empty,symlink"},
47			expectedShellCompDirective: cobra.ShellCompDirectiveNoFileComp,
48		},
49	} {
50		name := fmt.Sprintf("chattrValidArgs(_, %+v, %q)", tc.args, tc.toComplete)
51		t.Run(name, func(t *testing.T) {
52			c := &Config{}
53			actualCompletions, actualShellCompDirective := c.chattrCmdValidArgs(&cobra.Command{}, tc.args, tc.toComplete)
54			assert.Equal(t, tc.expectedCompletions, actualCompletions)
55			assert.Equal(t, tc.expectedShellCompDirective, actualShellCompDirective)
56		})
57	}
58}
59
60func TestParseAttrModifier(t *testing.T) {
61	for _, tc := range []struct {
62		s           string
63		expected    *modifier
64		expectedErr bool
65	}{
66		{
67			s: "empty",
68			expected: &modifier{
69				empty: boolModifierSet,
70			},
71		},
72		{
73			s: "+empty",
74			expected: &modifier{
75				empty: boolModifierSet,
76			},
77		},
78		{
79			s: "-empty",
80			expected: &modifier{
81				empty: boolModifierClear,
82			},
83		},
84		{
85			s: "noempty",
86			expected: &modifier{
87				empty: boolModifierClear,
88			},
89		},
90		{
91			s: "e",
92			expected: &modifier{
93				empty: boolModifierSet,
94			},
95		},
96		{
97			s: "encrypted",
98			expected: &modifier{
99				encrypted: boolModifierSet,
100			},
101		},
102		{
103			s: "executable",
104			expected: &modifier{
105				executable: boolModifierSet,
106			},
107		},
108		{
109			s: "x",
110			expected: &modifier{
111				executable: boolModifierSet,
112			},
113		},
114		{
115			s: "b",
116			expected: &modifier{
117				order: orderModifierSetBefore,
118			},
119		},
120		{
121			s: "-b",
122			expected: &modifier{
123				order: orderModifierClearBefore,
124			},
125		},
126		{
127			s: "after",
128			expected: &modifier{
129				order: orderModifierSetAfter,
130			},
131		},
132		{
133			s: "noafter",
134			expected: &modifier{
135				order: orderModifierClearAfter,
136			},
137		},
138		{
139			s: "once",
140			expected: &modifier{
141				condition: conditionModifierSetOnce,
142			},
143		},
144		{
145			s: "private",
146			expected: &modifier{
147				private: boolModifierSet,
148			},
149		},
150		{
151			s: "p",
152			expected: &modifier{
153				private: boolModifierSet,
154			},
155		},
156		{
157			s: "template",
158			expected: &modifier{
159				template: boolModifierSet,
160			},
161		},
162		{
163			s: "t",
164			expected: &modifier{
165				template: boolModifierSet,
166			},
167		},
168		{
169			s: "create",
170			expected: &modifier{
171				sourceFileType: sourceFileTypeModifierSetCreate,
172			},
173		},
174		{
175			s: "-create",
176			expected: &modifier{
177				sourceFileType: sourceFileTypeModifierClearCreate,
178			},
179		},
180		{
181			s: "modify",
182			expected: &modifier{
183				sourceFileType: sourceFileTypeModifierSetModify,
184			},
185		},
186		{
187			s: "-script",
188			expected: &modifier{
189				sourceFileType: sourceFileTypeModifierClearScript,
190			},
191		},
192		{
193			s: "+symlink",
194			expected: &modifier{
195				sourceFileType: sourceFileTypeModifierSetSymlink,
196			},
197		},
198		{
199			s: "empty,+executable,noprivate,-t",
200			expected: &modifier{
201				empty:      boolModifierSet,
202				executable: boolModifierSet,
203				private:    boolModifierClear,
204				template:   boolModifierClear,
205			},
206		},
207		{
208			s: " empty , -private, notemplate ",
209			expected: &modifier{
210				empty:    boolModifierSet,
211				private:  boolModifierClear,
212				template: boolModifierClear,
213			},
214		},
215		{
216			s: "p,,-t",
217			expected: &modifier{
218				private:  boolModifierSet,
219				template: boolModifierClear,
220			},
221		},
222		{
223			s:           "unknown",
224			expectedErr: true,
225		},
226	} {
227		t.Run(tc.s, func(t *testing.T) {
228			actual, err := parseModifier(tc.s)
229			if tc.expectedErr {
230				require.Error(t, err)
231			} else {
232				require.NoError(t, err)
233				assert.Equal(t, tc.expected, actual)
234			}
235		})
236	}
237}
238