github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/interact/query_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package interact 5 6 import ( 7 "bufio" 8 "bytes" 9 "io/ioutil" 10 "strings" 11 12 "github.com/juju/testing" 13 jc "github.com/juju/testing/checkers" 14 gc "gopkg.in/check.v1" 15 ) 16 17 type Suite struct { 18 testing.IsolationSuite 19 } 20 21 var _ = gc.Suite(Suite{}) 22 23 func (Suite) TestAnswer(c *gc.C) { 24 scanner := bufio.NewScanner(strings.NewReader("hi!\n")) 25 answer, err := QueryVerify("boo: ", scanner, ioutil.Discard, ioutil.Discard, nil) 26 c.Assert(err, jc.ErrorIsNil) 27 c.Assert(answer, gc.Equals, "hi!") 28 } 29 30 func (Suite) TestVerify(c *gc.C) { 31 scanner := bufio.NewScanner(strings.NewReader("hi!\nok!\n")) 32 out := bytes.Buffer{} 33 verify := func(s string) (ok bool, errmsg string, err error) { 34 if s == "ok!" { 35 return true, "", nil 36 } 37 return false, "No!", nil 38 } 39 answer, err := QueryVerify("boo: ", scanner, &out, &out, verify) 40 c.Assert(err, jc.ErrorIsNil) 41 c.Assert(answer, gc.Equals, "ok!") 42 // in practice, "No!" will be on a separate line, since the cursor will get 43 // moved down by the user hitting return for their answer, but the output 44 // we generate doesn't do that itself.' 45 expected := ` 46 boo: No! 47 48 boo: 49 `[1:] 50 c.Assert(out.String(), gc.Equals, expected) 51 } 52 53 func (Suite) TestQueryMultiple(c *gc.C) { 54 scanner := bufio.NewScanner(strings.NewReader(` 55 hi! 56 ok! 57 bob 58 `[1:])) 59 verify := func(s string) (ok bool, errmsg string, err error) { 60 if s == "ok!" { 61 return true, "", nil 62 } 63 return false, "No!", nil 64 } 65 answer, err := QueryVerify("boo: ", scanner, ioutil.Discard, ioutil.Discard, verify) 66 c.Assert(err, jc.ErrorIsNil) 67 c.Assert(answer, gc.Equals, "ok!") 68 69 answer, err = QueryVerify("name: ", scanner, ioutil.Discard, ioutil.Discard, nil) 70 c.Assert(err, jc.ErrorIsNil) 71 c.Assert(answer, gc.Equals, "bob") 72 } 73 74 func (Suite) TestMatchOptions(c *gc.C) { 75 f := MatchOptions([]string{"foo", "BAR"}, "nope") 76 for _, s := range []string{"foo", "FOO", "BAR", "bar"} { 77 ok, msg, err := f(s) 78 c.Check(err, jc.ErrorIsNil) 79 c.Check(msg, gc.Equals, "") 80 c.Check(ok, jc.IsTrue) 81 } 82 ok, msg, err := f("baz") 83 c.Check(err, jc.ErrorIsNil) 84 c.Check(msg, gc.Equals, "nope") 85 c.Check(ok, jc.IsFalse) 86 } 87 88 func (Suite) TestFindMatch(c *gc.C) { 89 options := []string{"foo", "BAR"} 90 m, ok := FindMatch("foo", options) 91 c.Check(m, gc.Equals, "foo") 92 c.Check(ok, jc.IsTrue) 93 94 m, ok = FindMatch("FOO", options) 95 c.Check(m, gc.Equals, "foo") 96 c.Check(ok, jc.IsTrue) 97 98 m, ok = FindMatch("bar", options) 99 c.Check(m, gc.Equals, "BAR") 100 c.Check(ok, jc.IsTrue) 101 102 m, ok = FindMatch("BAR", options) 103 c.Check(m, gc.Equals, "BAR") 104 c.Check(ok, jc.IsTrue) 105 106 m, ok = FindMatch("baz", options) 107 c.Check(ok, jc.IsFalse) 108 }