@@ -209,6 +209,108 @@ func TestDownload(t *testing.T) {
209209 }
210210}
211211
212+ func TestDownloadToExistingDirectory (t * testing.T ) {
213+ co := newCapturedOutput ()
214+ co .override ()
215+ defer co .reset ()
216+
217+ testCases := []struct {
218+ exerciseDir string
219+ flags map [string ]string
220+ }{
221+ {
222+ exerciseDir : filepath .Join ("bogus-track" , "bogus-exercise" ),
223+ flags : map [string ]string {"exercise" : "bogus-exercise" , "track" : "bogus-track" },
224+ },
225+ {
226+ exerciseDir : filepath .Join ("teams" , "bogus-team" , "bogus-track" , "bogus-exercise" ),
227+ flags : map [string ]string {"exercise" : "bogus-exercise" , "track" : "bogus-track" , "team" : "bogus-team" },
228+ },
229+ }
230+
231+ for _ , tc := range testCases {
232+ tmpDir , err := ioutil .TempDir ("" , "download-cmd" )
233+ defer os .RemoveAll (tmpDir )
234+ assert .NoError (t , err )
235+
236+ err = os .MkdirAll (filepath .Join (tmpDir , tc .exerciseDir ), os .FileMode (0755 ))
237+ assert .NoError (t , err )
238+
239+ ts := fakeDownloadServer ("true" , "" )
240+ defer ts .Close ()
241+
242+ v := viper .New ()
243+ v .Set ("workspace" , tmpDir )
244+ v .Set ("apibaseurl" , ts .URL )
245+ v .Set ("token" , "abc123" )
246+
247+ cfg := config.Config {
248+ UserViperConfig : v ,
249+ }
250+ flags := pflag .NewFlagSet ("fake" , pflag .PanicOnError )
251+ setupDownloadFlags (flags )
252+ for name , value := range tc .flags {
253+ flags .Set (name , value )
254+ }
255+
256+ err = runDownload (cfg , flags , []string {})
257+
258+ if assert .Error (t , err ) {
259+ assert .Regexp (t , "directory '.+' already exists" , err .Error ())
260+ }
261+ }
262+ }
263+
264+ func TestDownloadToExistingDirectoryWithForce (t * testing.T ) {
265+ co := newCapturedOutput ()
266+ co .override ()
267+ defer co .reset ()
268+
269+ testCases := []struct {
270+ exerciseDir string
271+ flags map [string ]string
272+ }{
273+ {
274+ exerciseDir : filepath .Join ("bogus-track" , "bogus-exercise" ),
275+ flags : map [string ]string {"exercise" : "bogus-exercise" , "track" : "bogus-track" },
276+ },
277+ {
278+ exerciseDir : filepath .Join ("teams" , "bogus-team" , "bogus-track" , "bogus-exercise" ),
279+ flags : map [string ]string {"exercise" : "bogus-exercise" , "track" : "bogus-track" , "team" : "bogus-team" },
280+ },
281+ }
282+
283+ for _ , tc := range testCases {
284+ tmpDir , err := ioutil .TempDir ("" , "download-cmd" )
285+ defer os .RemoveAll (tmpDir )
286+ assert .NoError (t , err )
287+
288+ err = os .MkdirAll (filepath .Join (tmpDir , tc .exerciseDir ), os .FileMode (0755 ))
289+ assert .NoError (t , err )
290+
291+ ts := fakeDownloadServer ("true" , "" )
292+ defer ts .Close ()
293+
294+ v := viper .New ()
295+ v .Set ("workspace" , tmpDir )
296+ v .Set ("apibaseurl" , ts .URL )
297+ v .Set ("token" , "abc123" )
298+
299+ cfg := config.Config {
300+ UserViperConfig : v ,
301+ }
302+ flags := pflag .NewFlagSet ("fake" , pflag .PanicOnError )
303+ setupDownloadFlags (flags )
304+ for name , value := range tc .flags {
305+ flags .Set (name , value )
306+ }
307+ flags .Set ("force" , "true" )
308+
309+ err = runDownload (cfg , flags , []string {})
310+ assert .NoError (t , err )
311+ }
312+ }
313+
212314func fakeDownloadServer (requestor , teamSlug string ) * httptest.Server {
213315 mux := http .NewServeMux ()
214316 server := httptest .NewServer (mux )
0 commit comments