11package cmd
22
33import (
4+ "encoding/json"
45 "io/ioutil"
56 "net/http"
67 "net/http/httptest"
@@ -9,6 +10,7 @@ import (
910 "testing"
1011
1112 "github.com/exercism/cli/config"
13+ "github.com/exercism/cli/visibility"
1214 "github.com/exercism/cli/workspace"
1315 "github.com/spf13/pflag"
1416 "github.com/spf13/viper"
@@ -234,6 +236,51 @@ func TestSubmitOnlyEmptyFile(t *testing.T) {
234236 assert .Regexp (t , "No files found" , err .Error ())
235237}
236238
239+ func TestSubmitExerciseWithLegacySolutionMetadataFileAndGetsMigrated (t * testing.T ) {
240+ oldOut := Out
241+ oldErr := Err
242+ Out = ioutil .Discard
243+ Err = ioutil .Discard
244+ defer func () {
245+ Out = oldOut
246+ Err = oldErr
247+ }()
248+ // The fake endpoint will populate this when it receives the call from the command.
249+ submittedFiles := map [string ]string {}
250+ ts := fakeSubmitServer (t , submittedFiles )
251+ defer ts .Close ()
252+
253+ tmpDir , err := ioutil .TempDir ("" , "legacy-metadata-file" )
254+ assert .NoError (t , err )
255+
256+ dir := filepath .Join (tmpDir , "bogus-track" , "bogus-exercise" )
257+ os .MkdirAll (dir , os .FileMode (0755 ))
258+ writeFakeLegacySolution (t , dir , "bogus-track" , "bogus-exercise" )
259+
260+ file := filepath .Join (dir , "file.txt" )
261+ err = ioutil .WriteFile (file , []byte ("This is a file." ), os .FileMode (0755 ))
262+ assert .NoError (t , err )
263+
264+ v := viper .New ()
265+ v .Set ("token" , "abc123" )
266+ v .Set ("workspace" , tmpDir )
267+ v .Set ("apibaseurl" , ts .URL )
268+ cfg := config.Configuration {
269+ Persister : config.InMemoryPersister {},
270+ Dir : tmpDir ,
271+ UserViperConfig : v ,
272+ }
273+ solutionRelPath := filepath .Join (workspace .IgnoreSubdir , workspace .SolutionFilename )
274+ expectedSolutionPathAfterMigration := filepath .Join (dir , solutionRelPath )
275+
276+ err = runSubmit (cfg , pflag .NewFlagSet ("fake" , pflag .PanicOnError ), []string {file })
277+ assert .NoError (t , err )
278+ assert .Equal (t , "This is a file." , submittedFiles [string (os .PathSeparator )+ "file.txt" ])
279+
280+ _ , err = os .Stat (expectedSolutionPathAfterMigration )
281+ assert .NoError (t , err )
282+ }
283+
237284func TestSubmitFilesFromDifferentSolutions (t * testing.T ) {
238285 tmpDir , err := ioutil .TempDir ("" , "dir-1-submit" )
239286 assert .NoError (t , err )
@@ -305,3 +352,26 @@ func writeFakeSolution(t *testing.T, dir, trackID, exerciseSlug string) {
305352 err := solution .Write (dir )
306353 assert .NoError (t , err )
307354}
355+
356+ func writeFakeLegacySolution (t * testing.T , dir , trackID , exerciseSlug string ) {
357+ solution := & workspace.Solution {
358+ ID : "bogus-solution-uuid" ,
359+ Track : trackID ,
360+ Exercise : exerciseSlug ,
361+ URL : "http://example.com/bogus-url" ,
362+ IsRequester : true ,
363+ }
364+ legacySolutionFilePath := filepath .Join (dir , ".solution.json" )
365+
366+ // Hack because ioutil.WriteFile fails on hidden files
367+ visibility .ShowFile (legacySolutionFilePath )
368+
369+ b , err := json .Marshal (solution )
370+ assert .NoError (t , err )
371+
372+ err = ioutil .WriteFile (legacySolutionFilePath , b , os .FileMode (0600 ))
373+ assert .NoError (t , err )
374+
375+ err = visibility .HideFile (legacySolutionFilePath )
376+ assert .NoError (t , err )
377+ }
0 commit comments