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  }