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