command_test.go 3.22 KB
Newer Older
1 2 3 4 5
package commands

import "testing"

func TestOptionValidation(t *testing.T) {
Matt Bell's avatar
Matt Bell committed
6 7 8 9 10
	cmd := Command{
		Options: []Option{
			Option{[]string{"b", "beep"}, Int},
			Option{[]string{"B", "boop"}, String},
		},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
11
		run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
12 13
	}

Matt Bell's avatar
Matt Bell committed
14
	req := NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
15
	req.options["foo"] = 5
16
	res := cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
17
	if res.Error == nil {
Matt Bell's avatar
Matt Bell committed
18
		t.Error("Should have failed (unrecognized option)")
Matt Bell's avatar
Matt Bell committed
19 20
	}

Matt Bell's avatar
Matt Bell committed
21
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
22 23
	req.options["beep"] = 5
	req.options["b"] = 10
24
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
25 26 27 28
	if res.Error == nil {
		t.Error("Should have failed (duplicate options)")
	}

Matt Bell's avatar
Matt Bell committed
29
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
30
	req.options["beep"] = "foo"
31
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
32 33 34 35
	if res.Error == nil {
		t.Error("Should have failed (incorrect type)")
	}

Matt Bell's avatar
Matt Bell committed
36
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
37
	req.options["beep"] = 5
38
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
39
	if res.Error != nil {
Matt Bell's avatar
Matt Bell committed
40
		t.Error(res.Error, "Should have passed")
Matt Bell's avatar
Matt Bell committed
41 42
	}

Matt Bell's avatar
Matt Bell committed
43
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
44 45
	req.options["beep"] = 5
	req.options["boop"] = "test"
46
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
47 48 49 50
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
51
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
52 53
	req.options["b"] = 5
	req.options["B"] = "test"
54
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
55 56 57 58
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
59
	req = NewEmptyRequest()
Matt Bell's avatar
Matt Bell committed
60
	req.options["enc"] = "json"
61
	res = cmd.Call(req)
Matt Bell's avatar
Matt Bell committed
62 63 64
	if res.Error != nil {
		t.Error("Should have passed")
	}
65

Matt Bell's avatar
Matt Bell committed
66
	req = NewEmptyRequest()
67 68 69 70 71 72
	req.options["b"] = "100"
	res = cmd.Call(req)
	if res.Error != nil {
		t.Error("Should have passed")
	}

Matt Bell's avatar
Matt Bell committed
73
	req = NewEmptyRequest()
74 75 76 77 78
	req.options["b"] = ":)"
	res = cmd.Call(req)
	if res.Error == nil {
		t.Error(res.Error, "Should have failed (string value not convertible to int)")
	}
79
}
80 81

func TestRegistration(t *testing.T) {
Matt Bell's avatar
Matt Bell committed
82 83 84 85 86
	cmds := []*Command{
		&Command{
			Options: []Option{
				Option{[]string{"beep"}, Int},
			},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
87
			run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
88 89 90 91 92 93
		},

		&Command{
			Options: []Option{
				Option{[]string{"boop"}, Int},
			},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
94
			run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
95 96 97 98 99 100
		},

		&Command{
			Options: []Option{
				Option{[]string{"boop"}, String},
			},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
101
			run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
102 103 104 105 106 107
		},

		&Command{
			Options: []Option{
				Option{[]string{"bop"}, String},
			},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
108
			run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
109 110 111 112 113 114
		},

		&Command{
			Options: []Option{
				Option{[]string{"enc"}, String},
			},
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
115
			run: func(req *Request, res *Response) {},
Matt Bell's avatar
Matt Bell committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
		},
	}

	err := cmds[0].Register("foo", cmds[1])
	if err != nil {
		t.Error("Should have passed")
	}

	err = cmds[0].Register("bar", cmds[2])
	if err == nil {
		t.Error("Should have failed (option name collision)")
	}

	err = cmds[0].Register("foo", cmds[3])
	if err == nil {
		t.Error("Should have failed (subcommand name collision)")
	}

	err = cmds[0].Register("baz", cmds[4])
	if err == nil {
		t.Error("Should have failed (option name collision with global options)")
	}
138
}
139 140 141 142 143 144 145 146 147 148 149 150 151

func TestResolving(t *testing.T) {
	cmd := &Command{}
	cmdA := &Command{}
	cmdB := &Command{}
	cmdB2 := &Command{}
	cmdC := &Command{}

	cmd.Register("a", cmdA)
	cmdA.Register("B", cmdB2)
	cmdA.Register("b", cmdB)
	cmdB.Register("c", cmdC)

Matt Bell's avatar
Matt Bell committed
152
	cmds, err := cmd.Resolve([]string{"a", "b", "c"})
153 154 155 156 157 158
	if err != nil {
		t.Error(err)
	}
	if len(cmds) != 4 || cmds[0] != cmd || cmds[1] != cmdA || cmds[2] != cmdB || cmds[3] != cmdC {
		t.Error("Returned command path is different than expected", cmds)
	}
Matt Bell's avatar
Matt Bell committed
159
}