troo 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +0 -1
- data/Guardfile +6 -0
- data/LICENSE.txt +1 -0
- data/README.md +46 -3
- data/Rakefile +11 -0
- data/bin/troo +12 -0
- data/configuration.yml.example +7 -0
- data/features/add_board.feature +1 -0
- data/features/add_card.feature +1 -0
- data/features/add_comment.feature +1 -0
- data/features/add_list.feature +1 -0
- data/features/cleanup.feature +0 -0
- data/features/move_card_to_list.feature +1 -0
- data/features/refresh.feature +1 -0
- data/features/set_default.feature +7 -0
- data/features/show_board.feature +1 -0
- data/features/show_boards.feature +1 -0
- data/features/show_card.feature +1 -0
- data/features/show_comments.feature +1 -0
- data/features/show_list.feature +1 -0
- data/features/status.feature +1 -0
- data/features/step_definitions/troo_steps.rb +0 -0
- data/features/support/env.rb +31 -0
- data/features/troo.feature +1 -0
- data/features/version.feature +8 -0
- data/lib/troo.rb +24 -2
- data/lib/troo/actions/create_board.rb +43 -0
- data/lib/troo/actions/create_card.rb +43 -0
- data/lib/troo/actions/create_comment.rb +44 -0
- data/lib/troo/actions/create_list.rb +41 -0
- data/lib/troo/actions/move_card.rb +36 -0
- data/lib/troo/actions/refresh_all.rb +79 -0
- data/lib/troo/actions/set_default.rb +35 -0
- data/lib/troo/cli/add_cli.rb +83 -0
- data/lib/troo/cli/default_cli.rb +37 -0
- data/lib/troo/cli/main_cli.rb +130 -0
- data/lib/troo/cli/show_cli.rb +83 -0
- data/lib/troo/cli/thor_fixes.rb +9 -0
- data/lib/troo/display/board_decorator.rb +58 -0
- data/lib/troo/display/board_presenter.rb +65 -0
- data/lib/troo/display/card_decorator.rb +105 -0
- data/lib/troo/display/card_presenter.rb +27 -0
- data/lib/troo/display/comment_decorator.rb +32 -0
- data/lib/troo/display/comment_presenter.rb +35 -0
- data/lib/troo/display/decorator_helpers.rb +76 -0
- data/lib/troo/display/list_decorator.rb +53 -0
- data/lib/troo/display/list_presenter.rb +43 -0
- data/lib/troo/display/member_decorator.rb +24 -0
- data/lib/troo/display/member_presenter.rb +59 -0
- data/lib/troo/external/board.rb +49 -0
- data/lib/troo/external/board_adaptor.rb +43 -0
- data/lib/troo/external/card.rb +70 -0
- data/lib/troo/external/card_adaptor.rb +78 -0
- data/lib/troo/external/comment.rb +64 -0
- data/lib/troo/external/comment_adaptor.rb +53 -0
- data/lib/troo/external/list.rb +58 -0
- data/lib/troo/external/list_adaptor.rb +48 -0
- data/lib/troo/external/member.rb +52 -0
- data/lib/troo/external/member_adaptor.rb +63 -0
- data/lib/troo/models/board.rb +26 -0
- data/lib/troo/models/board_persistence.rb +53 -0
- data/lib/troo/models/board_retrieval.rb +45 -0
- data/lib/troo/models/card.rb +54 -0
- data/lib/troo/models/card_persistence.rb +53 -0
- data/lib/troo/models/card_retrieval.rb +49 -0
- data/lib/troo/models/comment.rb +32 -0
- data/lib/troo/models/comment_persistence.rb +53 -0
- data/lib/troo/models/comment_retrieval.rb +32 -0
- data/lib/troo/models/list.rb +27 -0
- data/lib/troo/models/list_persistence.rb +53 -0
- data/lib/troo/models/list_retrieval.rb +45 -0
- data/lib/troo/models/member.rb +18 -0
- data/lib/troo/models/member_persistence.rb +53 -0
- data/lib/troo/models/member_retrieval.rb +36 -0
- data/lib/troo/models/model_helpers.rb +32 -0
- data/lib/troo/models/refresh.rb +23 -0
- data/lib/troo/presentation/template.rb +31 -0
- data/lib/troo/troo.rb +69 -0
- data/lib/troo/version.rb +2 -1
- data/lib/troo/views/card.erb +17 -0
- data/lib/troo/views/comment.erb +3 -0
- data/logs/.gitkeep +0 -0
- data/test/cassettes/board_by_id.yml +59 -0
- data/test/cassettes/boards_all.yml +118 -0
- data/test/cassettes/card_by_card_id.yml +58 -0
- data/test/cassettes/cards_by_board_id.yml +117 -0
- data/test/cassettes/cards_by_list_id.yml +114 -0
- data/test/cassettes/comments_by_board_id.yml +122 -0
- data/test/cassettes/comments_by_card_id.yml +114 -0
- data/test/cassettes/comments_by_list_id.yml +109 -0
- data/test/cassettes/create_board.yml +62 -0
- data/test/cassettes/create_card.yml +63 -0
- data/test/cassettes/create_comment.yml +67 -0
- data/test/cassettes/create_list.yml +60 -0
- data/test/cassettes/list_by_list_id.yml +56 -0
- data/test/cassettes/lists_by_board_id.yml +118 -0
- data/test/cassettes/member_by_member_id.yml +60 -0
- data/test/cassettes/members_by_board_id.yml +109 -0
- data/test/cassettes/move_card.yml +61 -0
- data/test/lib/troo/actions/create_board_test.rb +47 -0
- data/test/lib/troo/actions/create_card_test.rb +54 -0
- data/test/lib/troo/actions/create_comment_test.rb +49 -0
- data/test/lib/troo/actions/create_list_test.rb +49 -0
- data/test/lib/troo/actions/move_card_test.rb +46 -0
- data/test/lib/troo/actions/refresh_all_test.rb +68 -0
- data/test/lib/troo/actions/set_default_test.rb +44 -0
- data/test/lib/troo/cli/add_cli_test.rb +216 -0
- data/test/lib/troo/cli/default_cli_test.rb +79 -0
- data/test/lib/troo/cli/main_cli_test.rb +232 -0
- data/test/lib/troo/cli/show_cli_test.rb +221 -0
- data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
- data/test/lib/troo/display/board_decorator_test.rb +126 -0
- data/test/lib/troo/display/board_presenter_test.rb +77 -0
- data/test/lib/troo/display/card_decorator_test.rb +221 -0
- data/test/lib/troo/display/card_presenter_test.rb +38 -0
- data/test/lib/troo/display/comment_decorator_test.rb +65 -0
- data/test/lib/troo/display/comment_presenter_test.rb +47 -0
- data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
- data/test/lib/troo/display/list_decorator_test.rb +98 -0
- data/test/lib/troo/display/list_presenter_test.rb +48 -0
- data/test/lib/troo/display/member_decorator_test.rb +42 -0
- data/test/lib/troo/display/member_presenter_test.rb +70 -0
- data/test/lib/troo/external/board_adaptor_test.rb +36 -0
- data/test/lib/troo/external/board_test.rb +69 -0
- data/test/lib/troo/external/card_adaptor_test.rb +50 -0
- data/test/lib/troo/external/card_test.rb +108 -0
- data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
- data/test/lib/troo/external/comment_test.rb +88 -0
- data/test/lib/troo/external/list_adaptor_test.rb +38 -0
- data/test/lib/troo/external/list_test.rb +65 -0
- data/test/lib/troo/external/member_adaptor_test.rb +44 -0
- data/test/lib/troo/external/member_test.rb +65 -0
- data/test/lib/troo/models/board_persistence_test.rb +61 -0
- data/test/lib/troo/models/board_retrieval_test.rb +93 -0
- data/test/lib/troo/models/board_test.rb +50 -0
- data/test/lib/troo/models/card_persistence_test.rb +60 -0
- data/test/lib/troo/models/card_retrieval_test.rb +101 -0
- data/test/lib/troo/models/card_test.rb +102 -0
- data/test/lib/troo/models/comment_persistence_test.rb +65 -0
- data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
- data/test/lib/troo/models/comment_test.rb +59 -0
- data/test/lib/troo/models/list_persistence_test.rb +60 -0
- data/test/lib/troo/models/list_retrieval_test.rb +93 -0
- data/test/lib/troo/models/list_test.rb +53 -0
- data/test/lib/troo/models/member_persistence_test.rb +59 -0
- data/test/lib/troo/models/member_retrieval_test.rb +58 -0
- data/test/lib/troo/models/member_test.rb +44 -0
- data/test/lib/troo/models/model_helpers_test.rb +103 -0
- data/test/lib/troo/models/refresh_test.rb +45 -0
- data/test/lib/troo/presentation/template_test.rb +40 -0
- data/test/support/fabrication.rb +56 -0
- data/test/support/template.erb +3 -0
- data/test/support/vcr_setup.rb +36 -0
- data/test/test_helper.rb +30 -0
- data/troo.gemspec +24 -5
- metadata +501 -23
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
|
3
|
+
module Troo
|
4
|
+
describe SetDefault do
|
5
|
+
let(:described_class) { SetDefault }
|
6
|
+
|
7
|
+
describe ".initialize" do
|
8
|
+
let(:entity) { :some_model }
|
9
|
+
|
10
|
+
subject { described_class.new(entity) }
|
11
|
+
|
12
|
+
it "assigns the entity to an instance variable" do
|
13
|
+
subject.instance_variable_get("@entity").must_equal(entity)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#set_default!" do
|
18
|
+
before do
|
19
|
+
@board_1 = Fabricate(:board, default: true)
|
20
|
+
@board_2 = Fabricate(:board, default: false)
|
21
|
+
end
|
22
|
+
|
23
|
+
after { database_cleanup }
|
24
|
+
|
25
|
+
subject { described_class.for(entity) }
|
26
|
+
|
27
|
+
context "when the entity is already the default" do
|
28
|
+
let(:entity) { @board_1 }
|
29
|
+
|
30
|
+
it { subject.must_equal false }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when the entity is not already the default" do
|
34
|
+
let(:entity) { @board_2 }
|
35
|
+
|
36
|
+
it "sets the specified entity to be the default" do
|
37
|
+
subject.default.must_equal(true)
|
38
|
+
|
39
|
+
subject.must_equal(@board_2)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
require "thor"
|
3
|
+
|
4
|
+
module Troo
|
5
|
+
module CLI
|
6
|
+
describe Add do
|
7
|
+
let(:described_class) { Add }
|
8
|
+
|
9
|
+
before do
|
10
|
+
@board = Fabricate.build(:board, name: "My New Test Board")
|
11
|
+
@card = Fabricate.build(:card, name: "My New Test Card")
|
12
|
+
@comment = Fabricate.build(:comment)
|
13
|
+
@list = Fabricate.build(:list, name: "My New Test List")
|
14
|
+
|
15
|
+
Troo::CreateBoard.stubs(:with).returns(@board)
|
16
|
+
Troo::CreateCard.stubs(:for).returns(@card)
|
17
|
+
Troo::CreateComment.stubs(:for).returns(@comment)
|
18
|
+
Troo::CreateList.stubs(:for).returns(@list)
|
19
|
+
end
|
20
|
+
|
21
|
+
after { database_cleanup }
|
22
|
+
|
23
|
+
describe "#board" do
|
24
|
+
let(:board_name) { "My New Test Board" }
|
25
|
+
|
26
|
+
subject { capture_io { described_class.new.board(board_name) }.join }
|
27
|
+
|
28
|
+
context "when the name was not provided" do
|
29
|
+
let(:board_name) { }
|
30
|
+
|
31
|
+
before { $stdin.stubs(:gets).returns(@board.name) }
|
32
|
+
|
33
|
+
it "prompts the user" do
|
34
|
+
subject.must_match /enter a name/
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "when the board was created" do
|
39
|
+
it "returns a polite message" do
|
40
|
+
subject.must_match /New board '#{@board.name}' created/
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the board was not created" do
|
45
|
+
before { Troo::CreateBoard.stubs(:with).returns(false) }
|
46
|
+
|
47
|
+
it "returns a polite message" do
|
48
|
+
subject.must_match /Board could not be created/
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when the Trello access token credentials are invalid" do
|
53
|
+
before { Troo::CreateBoard.stubs(:with).raises(Troo::InvalidAccessToken) }
|
54
|
+
|
55
|
+
it "returns a polite message" do
|
56
|
+
subject.must_match /access credentials have expired, please renew/
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#card" do
|
62
|
+
let(:list_id) { "526d8e130a14a9d846001d97" }
|
63
|
+
let(:card_name) { "My New Test Card" }
|
64
|
+
let(:description) { "A very brief description..." }
|
65
|
+
|
66
|
+
before { Troo::ListRetrieval.stubs(:retrieve).returns(@list) }
|
67
|
+
|
68
|
+
subject { capture_io { described_class.new.card(list_id, card_name, description) }.join }
|
69
|
+
|
70
|
+
context "when the list was found" do
|
71
|
+
context "when the name was not provided" do
|
72
|
+
let(:card_name) { }
|
73
|
+
|
74
|
+
before { $stdin.stubs(:gets).returns(@card.name) }
|
75
|
+
|
76
|
+
it "prompts the user" do
|
77
|
+
subject.must_match /enter a name/
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "when the card was created" do
|
82
|
+
it "returns a polite message" do
|
83
|
+
subject.must_match /New card '#{@card.name}' created/
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when the card was not created" do
|
88
|
+
before { Troo::CreateCard.stubs(:for).returns(false) }
|
89
|
+
|
90
|
+
it "returns a polite message" do
|
91
|
+
subject.must_match /Card could not be created/
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "when the Trello access token credentials are invalid" do
|
96
|
+
before { Troo::CreateCard.stubs(:for).raises(Troo::InvalidAccessToken) }
|
97
|
+
|
98
|
+
it "returns a polite message" do
|
99
|
+
subject.must_match /access credentials have expired, please renew/
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "when the list was not found" do
|
105
|
+
before { Troo::ListRetrieval.stubs(:retrieve).returns(nil) }
|
106
|
+
|
107
|
+
it "returns a polite message" do
|
108
|
+
subject.must_match /list was not found/
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "#comment" do
|
114
|
+
let(:card_id) { "526d8f19ddb279532e005259" }
|
115
|
+
let(:comment) { "A very brief description..." }
|
116
|
+
|
117
|
+
before { Troo::CardRetrieval.stubs(:retrieve).returns(@card) }
|
118
|
+
|
119
|
+
subject { capture_io { described_class.new.comment(card_id, comment) }.join }
|
120
|
+
|
121
|
+
context "when the card was found" do
|
122
|
+
context "when the name was not provided" do
|
123
|
+
let(:comment) { }
|
124
|
+
|
125
|
+
before { $stdin.stubs(:gets).returns(@comment.text) }
|
126
|
+
|
127
|
+
it "prompts the user" do
|
128
|
+
subject.must_match /enter a comment/
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context "when the comment was created" do
|
133
|
+
it "returns a polite message" do
|
134
|
+
subject.must_match /New comment created/
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context "when the comment was not created" do
|
139
|
+
before { Troo::CreateComment.stubs(:for).returns(false) }
|
140
|
+
|
141
|
+
it "returns a polite message" do
|
142
|
+
subject.must_match /Comment could not be created/
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context "when the Trello access token credentials are invalid" do
|
147
|
+
before { Troo::CreateComment.stubs(:for).raises(Troo::InvalidAccessToken) }
|
148
|
+
|
149
|
+
it "returns a polite message" do
|
150
|
+
subject.must_match /access credentials have expired, please renew/
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "when the card was not found" do
|
156
|
+
before { Troo::CardRetrieval.stubs(:retrieve).returns(nil) }
|
157
|
+
|
158
|
+
it "returns a polite message" do
|
159
|
+
subject.must_match /card was not found/
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe "#list" do
|
165
|
+
let(:board_id) { "526d8e130a14a9d846001d96" }
|
166
|
+
let(:list_name) { "My New List" }
|
167
|
+
|
168
|
+
before { Troo::BoardRetrieval.stubs(:retrieve).returns(@board) }
|
169
|
+
|
170
|
+
subject { capture_io { described_class.new.list(board_id, list_name) }.join }
|
171
|
+
|
172
|
+
context "when the board was found" do
|
173
|
+
context "when the name was not provided" do
|
174
|
+
let(:list_name) { }
|
175
|
+
|
176
|
+
before { $stdin.stubs(:gets).returns(@list.name) }
|
177
|
+
|
178
|
+
it "prompts the user" do
|
179
|
+
subject.must_match /enter a name/
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context "when the list was created" do
|
184
|
+
it "returns a polite message" do
|
185
|
+
subject.must_match /New list '#{@list.name}' created/
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
context "when the list was not created" do
|
190
|
+
before { Troo::CreateList.stubs(:for).returns(false) }
|
191
|
+
|
192
|
+
it "returns a polite message" do
|
193
|
+
subject.must_match /List could not be created/
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context "when the Trello access token credentials are invalid" do
|
198
|
+
before { Troo::CreateList.stubs(:for).raises(Troo::InvalidAccessToken) }
|
199
|
+
|
200
|
+
it "returns a polite message" do
|
201
|
+
subject.must_match /access credentials have expired, please renew/
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "when the board was not found" do
|
207
|
+
before { Troo::BoardRetrieval.stubs(:retrieve).returns(nil) }
|
208
|
+
|
209
|
+
it "returns a polite message" do
|
210
|
+
subject.must_match /board was not found/
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
require "thor"
|
3
|
+
|
4
|
+
module Troo
|
5
|
+
module CLI
|
6
|
+
describe Default do
|
7
|
+
let(:described_class) { Default }
|
8
|
+
let(:board_id) { "526d8e130a14a9d846001d96" }
|
9
|
+
let(:card_id) { "526d8f19ddb279532e005259" }
|
10
|
+
let(:list_id) { "526d8e130a14a9d846001d97" }
|
11
|
+
|
12
|
+
before do
|
13
|
+
@board = Fabricate.build(:board)
|
14
|
+
@list = Fabricate.build(:list)
|
15
|
+
@card = Fabricate.build(:card)
|
16
|
+
|
17
|
+
Troo::BoardRetrieval.stubs(:retrieve).returns(@board)
|
18
|
+
Troo::CardRetrieval.stubs(:retrieve).returns(@card)
|
19
|
+
Troo::ListRetrieval.stubs(:retrieve).returns(@list)
|
20
|
+
end
|
21
|
+
|
22
|
+
after { database_cleanup }
|
23
|
+
|
24
|
+
describe "#board" do
|
25
|
+
subject { capture_io { described_class.new.board(board_id) }.join }
|
26
|
+
|
27
|
+
context "when the board_id cannot be found" do
|
28
|
+
before { Troo::BoardRetrieval.stubs(:retrieve).returns(nil) }
|
29
|
+
|
30
|
+
it "returns a polite message" do
|
31
|
+
subject.must_match /Board cannot be found/
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when the board_id was found" do
|
36
|
+
it "returns a polite message" do
|
37
|
+
subject.must_match /Board '#{@board.name}' set to default/
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#card" do
|
43
|
+
subject { capture_io { described_class.new.card(card_id) }.join }
|
44
|
+
|
45
|
+
context "when the card_id cannot be found" do
|
46
|
+
before { Troo::CardRetrieval.stubs(:retrieve).returns(nil) }
|
47
|
+
|
48
|
+
it "returns a polite message" do
|
49
|
+
subject.must_match /Card cannot be found/
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when the card_id was found" do
|
54
|
+
it "returns a polite message" do
|
55
|
+
subject.must_match /Card '#{@card.name}' set to default/
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#list" do
|
61
|
+
subject { capture_io { described_class.new.list(list_id) }.join }
|
62
|
+
|
63
|
+
context "when the list_id cannot be found" do
|
64
|
+
before { Troo::ListRetrieval.stubs(:retrieve).returns(nil) }
|
65
|
+
|
66
|
+
it "returns a polite message" do
|
67
|
+
subject.must_match /List cannot be found/
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "when the list_id was found" do
|
72
|
+
it "returns a polite message" do
|
73
|
+
subject.must_match /List '#{@list.name}' set to default/
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require_relative "../../../test_helper"
|
2
|
+
require "thor"
|
3
|
+
|
4
|
+
module Troo
|
5
|
+
module CLI
|
6
|
+
describe Main do
|
7
|
+
let(:described_class) { Main }
|
8
|
+
let(:described_instance) { described_class.new }
|
9
|
+
|
10
|
+
before { @board = Fabricate(:board) }
|
11
|
+
after { database_cleanup }
|
12
|
+
|
13
|
+
describe "#status" do
|
14
|
+
before do
|
15
|
+
@board = Fabricate(:board, default: true)
|
16
|
+
@list = Fabricate(:list, default: true)
|
17
|
+
@card = Fabricate(:card, default: true)
|
18
|
+
end
|
19
|
+
|
20
|
+
subject { capture_io { described_instance.status }.join }
|
21
|
+
|
22
|
+
context "when a default board is set" do
|
23
|
+
it "returns a polite message" do
|
24
|
+
subject.must_match /My Test Board/
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when a default board is not set" do
|
29
|
+
before { Troo::BoardRetrieval.stubs(:default).returns(nil) }
|
30
|
+
|
31
|
+
it "returns a polite message" do
|
32
|
+
subject.must_match /Board: No default/
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when a default list is set" do
|
37
|
+
it "returns a polite message" do
|
38
|
+
subject.must_match /My Test List/
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when a default list is not set" do
|
43
|
+
before { Troo::ListRetrieval.stubs(:default).returns(nil) }
|
44
|
+
|
45
|
+
it "returns a polite message" do
|
46
|
+
subject.must_match /List: No default/
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when a default card is set" do
|
51
|
+
it "returns a polite message" do
|
52
|
+
subject.must_match /My Test Card/
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when a default card is not set" do
|
57
|
+
before { Troo::CardRetrieval.stubs(:default).returns(nil) }
|
58
|
+
|
59
|
+
it "returns a polite message" do
|
60
|
+
subject.must_match /Card: No default/
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when there are no boards" do
|
65
|
+
before { Troo::Board.stubs(:count).returns(0) }
|
66
|
+
|
67
|
+
it "returns a polite message" do
|
68
|
+
subject.must_match /No local board data/
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when there are no lists" do
|
73
|
+
before { Troo::List.stubs(:count).returns(0) }
|
74
|
+
|
75
|
+
it "returns a polite message" do
|
76
|
+
subject.must_match /No local list data/
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when there are no cards" do
|
81
|
+
before { Troo::Card.stubs(:count).returns(0) }
|
82
|
+
|
83
|
+
it "returns a polite message" do
|
84
|
+
subject.must_match /No local card data/
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#refresh" do
|
90
|
+
let(:default) { @board }
|
91
|
+
|
92
|
+
subject { capture_io { described_instance.refresh }.join }
|
93
|
+
|
94
|
+
before do
|
95
|
+
RefreshAll.stubs(:all)
|
96
|
+
RefreshAll.stubs(:default)
|
97
|
+
Troo::BoardRetrieval.stubs(:default).returns(default)
|
98
|
+
RefreshAll.stubs(:lists)
|
99
|
+
RefreshAll.stubs(:cards)
|
100
|
+
end
|
101
|
+
|
102
|
+
context "when the --all option is set" do
|
103
|
+
before { described_instance.stubs(:options).returns({"all" => true}) }
|
104
|
+
|
105
|
+
it "refreshes all local data" do
|
106
|
+
subject.must_match /All local data has been refreshed./
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when the default board is set" do
|
111
|
+
context "when the --lists option is set" do
|
112
|
+
before { described_instance.stubs(:options).returns({"lists" => true}) }
|
113
|
+
|
114
|
+
it "refresh all the lists for the default board" do
|
115
|
+
subject.must_match /lists for the default board have been refreshed/
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "when the --cards option is set" do
|
120
|
+
before { described_instance.stubs(:options).returns({"cards" => true}) }
|
121
|
+
|
122
|
+
it "retreshes all the cards for the default board" do
|
123
|
+
subject.must_match /cards for the default board have been refreshed/
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "when no additional options are set" do
|
128
|
+
it "refreshes all local data" do
|
129
|
+
subject.must_match /All data for the default board has been refreshed./
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context "when the default board is not set" do
|
135
|
+
let(:default) { }
|
136
|
+
|
137
|
+
it "returns a polite message" do
|
138
|
+
subject.must_match /to set a default board first/
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context "when the Trello access token credentials are invalid" do
|
143
|
+
before do
|
144
|
+
described_instance.stubs(:options).returns({"all" => true})
|
145
|
+
Troo::RefreshAll.stubs(:all).raises(Troo::InvalidAccessToken)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "returns a polite message" do
|
149
|
+
subject.must_match /access credentials have expired, please renew/
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "#cleanup" do
|
155
|
+
subject { capture_io { described_class.new.cleanup }.join }
|
156
|
+
|
157
|
+
context "when the user confirms their intentions" do
|
158
|
+
before { $stdin.stubs(:gets).returns("y\n") }
|
159
|
+
|
160
|
+
it "removes all local data" do
|
161
|
+
subject.must_match /All local data has been removed./
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when the user denies their intentions" do
|
166
|
+
before { $stdin.stubs(:gets).returns("n\n") }
|
167
|
+
|
168
|
+
it "does not remove the local data" do
|
169
|
+
subject.must_match("")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe "#version" do
|
175
|
+
subject { capture_io { described_class.new.version }.join }
|
176
|
+
|
177
|
+
it "prints the version" do
|
178
|
+
subject.must_match /troo #{Troo::VERSION}/
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "#move" do
|
183
|
+
let(:card_id) { "526d8f19ddb279532e005259" }
|
184
|
+
let(:list_id) { "526d8e130a14a9d846001d98" }
|
185
|
+
|
186
|
+
before do
|
187
|
+
@card = Fabricate(:card)
|
188
|
+
@list = Fabricate(:list)
|
189
|
+
Troo::MoveCard.stubs(:with).returns(true)
|
190
|
+
Troo::CardRetrieval.stubs(:retrieve).returns(@card)
|
191
|
+
Troo::ListRetrieval.stubs(:retrieve).returns(@list)
|
192
|
+
end
|
193
|
+
|
194
|
+
subject { capture_io { described_class.new.move(card_id, list_id) }.join }
|
195
|
+
|
196
|
+
context "when the card was found" do
|
197
|
+
context "when the list was found" do
|
198
|
+
context "when the card could be moved" do
|
199
|
+
it "returns a polite message" do
|
200
|
+
subject.must_match /Card moved from/
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context "when the card could not be moved" do
|
205
|
+
before { Troo::MoveCard.stubs(:with).returns(false) }
|
206
|
+
|
207
|
+
it "returns a polite message" do
|
208
|
+
subject.must_match /could not be moved/
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context "when the list was not found" do
|
214
|
+
before { Troo::ListRetrieval.stubs(:retrieve).returns(nil) }
|
215
|
+
|
216
|
+
it "returns a polite message" do
|
217
|
+
subject.must_match /list was not found/
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context "when the card was not found" do
|
223
|
+
before { Troo::CardRetrieval.stubs(:retrieve).returns(nil) }
|
224
|
+
|
225
|
+
it "returns a polite message" do
|
226
|
+
subject.must_match /card was not found/
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|