Skip to content

Commit 621f41d

Browse files
committed
Merge pull request exercism#68 from Tonkpils/fix-panic
Use bufio.ReadString to read user input.
2 parents da145a6 + 157f69e commit 621f41d

2 files changed

Lines changed: 45 additions & 3 deletions

File tree

exercism.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package main
22

33
import (
4+
"bufio"
45
"fmt"
56
"github.com/exercism/cli/configuration"
67
"os"
78
"path/filepath"
9+
"strings"
810
)
911

1012
func logout(path string) {
@@ -21,32 +23,39 @@ func absolutePath(path string) (string, error) {
2123

2224
func askForConfigInfo() (c configuration.Config) {
2325
var un, key, dir string
26+
delim := "\r\n"
27+
28+
bio := bufio.NewReader(os.Stdin)
2429

2530
currentDir, err := os.Getwd()
2631
if err != nil {
2732
panic(err)
2833
}
2934

3035
fmt.Print("Your GitHub username: ")
31-
_, err = fmt.Scanln(&un)
36+
un, err = bio.ReadString('\n')
3237
if err != nil {
3338
panic(err)
3439
}
3540

3641
fmt.Print("Your exercism.io API key: ")
37-
_, err = fmt.Scanln(&key)
42+
key, err = bio.ReadString('\n')
3843
if err != nil {
3944
panic(err)
4045
}
4146

4247
fmt.Println("What is your exercism exercises project path?")
4348
fmt.Printf("Press Enter to select the default (%s):\n", currentDir)
4449
fmt.Print("> ")
45-
_, err = fmt.Scanln(&dir)
50+
dir, err = bio.ReadString('\n')
4651
if err != nil && err.Error() != "unexpected newline" {
4752
panic(err)
4853
}
4954

55+
key = strings.TrimRight(key, delim)
56+
un = strings.TrimRight(un, delim)
57+
dir = strings.TrimRight(dir, delim)
58+
5059
if dir == "" {
5160
dir = currentDir
5261
}

exercism_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"fmt"
45
"github.com/exercism/cli/configuration"
56
"github.com/stretchr/testify/assert"
67
"io/ioutil"
@@ -28,3 +29,35 @@ func TestLogoutDeletesConfigFile(t *testing.T) {
2829

2930
asserFileDoesNotExist(t, configuration.Filename(tmpDir))
3031
}
32+
33+
func TestAskForConfigInfoAllowsSpaces(t *testing.T) {
34+
oldStdin := os.Stdin
35+
dirName := "dirname with spaces"
36+
userName := "TestUsername"
37+
apiKey := "abc123"
38+
39+
fakeStdin, err := ioutil.TempFile("", "stdin_mock")
40+
assert.NoError(t, err)
41+
42+
fakeStdin.WriteString(fmt.Sprintf("%s\r\n%s\r\n%s\r\n", userName, apiKey, dirName))
43+
assert.NoError(t, err)
44+
45+
file, err := os.Open(fakeStdin.Name())
46+
defer file.Close()
47+
48+
os.Stdin = file
49+
50+
c := askForConfigInfo()
51+
os.Stdin = oldStdin
52+
absoluteDirName, _ := absolutePath(dirName)
53+
_, err = os.Stat(absoluteDirName)
54+
if err != nil {
55+
t.Errorf("Excercism directory [%s] was not created.", absoluteDirName)
56+
}
57+
os.Remove(absoluteDirName)
58+
os.Remove(fakeStdin.Name())
59+
60+
assert.Equal(t, c.ExercismDirectory, absoluteDirName)
61+
assert.Equal(t, c.GithubUsername, userName)
62+
assert.Equal(t, c.ApiKey, apiKey)
63+
}

0 commit comments

Comments
 (0)