-
Notifications
You must be signed in to change notification settings - Fork 552
/
thor_spec.rb
130 lines (103 loc) · 3.69 KB
/
thor_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
require File.dirname(__FILE__) + '/spec_helper'
require "thor"
class MyApp < Thor
map "-T" => :animal
desc "zoo", "zoo around"
def zoo
true
end
desc "animal TYPE", "horse around"
def animal(type)
[type]
end
desc "foo BAR", "do some fooing"
method_options :force => :boolean
def foo(bar, opts)
[bar, opts]
end
desc "bar BAZ BAT", "do some barring"
method_options :option1 => :required
def bar(baz, bat, opts)
[baz, bat, opts]
end
desc "baz BAT", "do some bazzing"
method_options :option1 => :optional
def baz(bat, opts)
[bat, opts]
end
def method_missing(meth, *args)
[meth, args]
end
private
desc "what", "what"
def what
end
end
describe "thor" do
it "calls a no-param method when no params are passed" do
ARGV.replace ["zoo"]
MyApp.start.must == true
end
it "calls a single-param method when a single param is passed" do
ARGV.replace ["animal", "fish"]
MyApp.start.must == ["fish"]
end
it "calls the alias of a method if one is provided via .map" do
ARGV.replace ["-T", "fish"]
MyApp.start.must == ["fish"]
end
it "raises an error if a required param is not provided" do
ARGV.replace ["animal"]
stdout_from { MyApp.start }.must =~ /`animal' was called incorrectly\. Call as `animal TYPE'/
end
it "calls a method with an optional boolean param when the param is passed" do
ARGV.replace ["foo", "one", "--force"]
MyApp.start.must == ["one", {"force" => true, "f" => true}]
end
it "calls a method with an optional boolean param when the param is not passed" do
ARGV.replace ["foo", "one"]
MyApp.start.must == ["one", {}]
end
it "calls a method with a required key/value param" do
ARGV.replace ["bar", "one", "two", "--option1", "hello"]
MyApp.start.must == ["one", "two", {"option1" => "hello", "o" => "hello"}]
end
it "errors out when a required key/value option is not passed" do
ARGV.replace ["bar", "one", "two"]
lambda { MyApp.start }.must raise_error(Getopt::Long::Error)
end
it "calls a method with an optional key/value param" do
ARGV.replace ["baz", "one", "--option1", "hello"]
MyApp.start.must == ["one", {"option1" => "hello", "o" => "hello"}]
end
it "calls a method with an empty Hash for options if an optional key/value param is not provided" do
ARGV.replace ["baz", "one"]
MyApp.start.must == ["one", {}]
end
it "calls method_missing if an unknown method is passed in" do
ARGV.replace ["unk", "hello"]
MyApp.start.must == [:unk, ["hello"]]
end
it "does not call a private method no matter what" do
ARGV.replace ["what"]
MyApp.start.must == nil
end
it "provides useful help info for a simple method" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /zoo +zoo around/
end
it "provides useful help info for a method with one param" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /animal TYPE +horse around/
end
it "provides useful help info for a method with boolean options" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /foo BAR \[\-\-force\] +do some fooing/
end
it "provides useful help info for a method with required options" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /bar BAZ BAT \-\-option1=OPTION1 +do some barring/
end
it "provides useful help info for a method with optional options" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /baz BAT \[\-\-option1=OPTION1\] +do some bazzing/
end
it "provides useful help info for the help method itself" do
stdout_from { ARGV.replace ["help"]; MyApp.start }.must =~ /help +show this screen/
end
end