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.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +0 -1
  5. data/Guardfile +6 -0
  6. data/LICENSE.txt +1 -0
  7. data/README.md +46 -3
  8. data/Rakefile +11 -0
  9. data/bin/troo +12 -0
  10. data/configuration.yml.example +7 -0
  11. data/features/add_board.feature +1 -0
  12. data/features/add_card.feature +1 -0
  13. data/features/add_comment.feature +1 -0
  14. data/features/add_list.feature +1 -0
  15. data/features/cleanup.feature +0 -0
  16. data/features/move_card_to_list.feature +1 -0
  17. data/features/refresh.feature +1 -0
  18. data/features/set_default.feature +7 -0
  19. data/features/show_board.feature +1 -0
  20. data/features/show_boards.feature +1 -0
  21. data/features/show_card.feature +1 -0
  22. data/features/show_comments.feature +1 -0
  23. data/features/show_list.feature +1 -0
  24. data/features/status.feature +1 -0
  25. data/features/step_definitions/troo_steps.rb +0 -0
  26. data/features/support/env.rb +31 -0
  27. data/features/troo.feature +1 -0
  28. data/features/version.feature +8 -0
  29. data/lib/troo.rb +24 -2
  30. data/lib/troo/actions/create_board.rb +43 -0
  31. data/lib/troo/actions/create_card.rb +43 -0
  32. data/lib/troo/actions/create_comment.rb +44 -0
  33. data/lib/troo/actions/create_list.rb +41 -0
  34. data/lib/troo/actions/move_card.rb +36 -0
  35. data/lib/troo/actions/refresh_all.rb +79 -0
  36. data/lib/troo/actions/set_default.rb +35 -0
  37. data/lib/troo/cli/add_cli.rb +83 -0
  38. data/lib/troo/cli/default_cli.rb +37 -0
  39. data/lib/troo/cli/main_cli.rb +130 -0
  40. data/lib/troo/cli/show_cli.rb +83 -0
  41. data/lib/troo/cli/thor_fixes.rb +9 -0
  42. data/lib/troo/display/board_decorator.rb +58 -0
  43. data/lib/troo/display/board_presenter.rb +65 -0
  44. data/lib/troo/display/card_decorator.rb +105 -0
  45. data/lib/troo/display/card_presenter.rb +27 -0
  46. data/lib/troo/display/comment_decorator.rb +32 -0
  47. data/lib/troo/display/comment_presenter.rb +35 -0
  48. data/lib/troo/display/decorator_helpers.rb +76 -0
  49. data/lib/troo/display/list_decorator.rb +53 -0
  50. data/lib/troo/display/list_presenter.rb +43 -0
  51. data/lib/troo/display/member_decorator.rb +24 -0
  52. data/lib/troo/display/member_presenter.rb +59 -0
  53. data/lib/troo/external/board.rb +49 -0
  54. data/lib/troo/external/board_adaptor.rb +43 -0
  55. data/lib/troo/external/card.rb +70 -0
  56. data/lib/troo/external/card_adaptor.rb +78 -0
  57. data/lib/troo/external/comment.rb +64 -0
  58. data/lib/troo/external/comment_adaptor.rb +53 -0
  59. data/lib/troo/external/list.rb +58 -0
  60. data/lib/troo/external/list_adaptor.rb +48 -0
  61. data/lib/troo/external/member.rb +52 -0
  62. data/lib/troo/external/member_adaptor.rb +63 -0
  63. data/lib/troo/models/board.rb +26 -0
  64. data/lib/troo/models/board_persistence.rb +53 -0
  65. data/lib/troo/models/board_retrieval.rb +45 -0
  66. data/lib/troo/models/card.rb +54 -0
  67. data/lib/troo/models/card_persistence.rb +53 -0
  68. data/lib/troo/models/card_retrieval.rb +49 -0
  69. data/lib/troo/models/comment.rb +32 -0
  70. data/lib/troo/models/comment_persistence.rb +53 -0
  71. data/lib/troo/models/comment_retrieval.rb +32 -0
  72. data/lib/troo/models/list.rb +27 -0
  73. data/lib/troo/models/list_persistence.rb +53 -0
  74. data/lib/troo/models/list_retrieval.rb +45 -0
  75. data/lib/troo/models/member.rb +18 -0
  76. data/lib/troo/models/member_persistence.rb +53 -0
  77. data/lib/troo/models/member_retrieval.rb +36 -0
  78. data/lib/troo/models/model_helpers.rb +32 -0
  79. data/lib/troo/models/refresh.rb +23 -0
  80. data/lib/troo/presentation/template.rb +31 -0
  81. data/lib/troo/troo.rb +69 -0
  82. data/lib/troo/version.rb +2 -1
  83. data/lib/troo/views/card.erb +17 -0
  84. data/lib/troo/views/comment.erb +3 -0
  85. data/logs/.gitkeep +0 -0
  86. data/test/cassettes/board_by_id.yml +59 -0
  87. data/test/cassettes/boards_all.yml +118 -0
  88. data/test/cassettes/card_by_card_id.yml +58 -0
  89. data/test/cassettes/cards_by_board_id.yml +117 -0
  90. data/test/cassettes/cards_by_list_id.yml +114 -0
  91. data/test/cassettes/comments_by_board_id.yml +122 -0
  92. data/test/cassettes/comments_by_card_id.yml +114 -0
  93. data/test/cassettes/comments_by_list_id.yml +109 -0
  94. data/test/cassettes/create_board.yml +62 -0
  95. data/test/cassettes/create_card.yml +63 -0
  96. data/test/cassettes/create_comment.yml +67 -0
  97. data/test/cassettes/create_list.yml +60 -0
  98. data/test/cassettes/list_by_list_id.yml +56 -0
  99. data/test/cassettes/lists_by_board_id.yml +118 -0
  100. data/test/cassettes/member_by_member_id.yml +60 -0
  101. data/test/cassettes/members_by_board_id.yml +109 -0
  102. data/test/cassettes/move_card.yml +61 -0
  103. data/test/lib/troo/actions/create_board_test.rb +47 -0
  104. data/test/lib/troo/actions/create_card_test.rb +54 -0
  105. data/test/lib/troo/actions/create_comment_test.rb +49 -0
  106. data/test/lib/troo/actions/create_list_test.rb +49 -0
  107. data/test/lib/troo/actions/move_card_test.rb +46 -0
  108. data/test/lib/troo/actions/refresh_all_test.rb +68 -0
  109. data/test/lib/troo/actions/set_default_test.rb +44 -0
  110. data/test/lib/troo/cli/add_cli_test.rb +216 -0
  111. data/test/lib/troo/cli/default_cli_test.rb +79 -0
  112. data/test/lib/troo/cli/main_cli_test.rb +232 -0
  113. data/test/lib/troo/cli/show_cli_test.rb +221 -0
  114. data/test/lib/troo/cli/thor_fixes_test.rb +21 -0
  115. data/test/lib/troo/display/board_decorator_test.rb +126 -0
  116. data/test/lib/troo/display/board_presenter_test.rb +77 -0
  117. data/test/lib/troo/display/card_decorator_test.rb +221 -0
  118. data/test/lib/troo/display/card_presenter_test.rb +38 -0
  119. data/test/lib/troo/display/comment_decorator_test.rb +65 -0
  120. data/test/lib/troo/display/comment_presenter_test.rb +47 -0
  121. data/test/lib/troo/display/decorator_helpers_test.rb +7 -0
  122. data/test/lib/troo/display/list_decorator_test.rb +98 -0
  123. data/test/lib/troo/display/list_presenter_test.rb +48 -0
  124. data/test/lib/troo/display/member_decorator_test.rb +42 -0
  125. data/test/lib/troo/display/member_presenter_test.rb +70 -0
  126. data/test/lib/troo/external/board_adaptor_test.rb +36 -0
  127. data/test/lib/troo/external/board_test.rb +69 -0
  128. data/test/lib/troo/external/card_adaptor_test.rb +50 -0
  129. data/test/lib/troo/external/card_test.rb +108 -0
  130. data/test/lib/troo/external/comment_adaptor_test.rb +41 -0
  131. data/test/lib/troo/external/comment_test.rb +88 -0
  132. data/test/lib/troo/external/list_adaptor_test.rb +38 -0
  133. data/test/lib/troo/external/list_test.rb +65 -0
  134. data/test/lib/troo/external/member_adaptor_test.rb +44 -0
  135. data/test/lib/troo/external/member_test.rb +65 -0
  136. data/test/lib/troo/models/board_persistence_test.rb +61 -0
  137. data/test/lib/troo/models/board_retrieval_test.rb +93 -0
  138. data/test/lib/troo/models/board_test.rb +50 -0
  139. data/test/lib/troo/models/card_persistence_test.rb +60 -0
  140. data/test/lib/troo/models/card_retrieval_test.rb +101 -0
  141. data/test/lib/troo/models/card_test.rb +102 -0
  142. data/test/lib/troo/models/comment_persistence_test.rb +65 -0
  143. data/test/lib/troo/models/comment_retrieval_test.rb +46 -0
  144. data/test/lib/troo/models/comment_test.rb +59 -0
  145. data/test/lib/troo/models/list_persistence_test.rb +60 -0
  146. data/test/lib/troo/models/list_retrieval_test.rb +93 -0
  147. data/test/lib/troo/models/list_test.rb +53 -0
  148. data/test/lib/troo/models/member_persistence_test.rb +59 -0
  149. data/test/lib/troo/models/member_retrieval_test.rb +58 -0
  150. data/test/lib/troo/models/member_test.rb +44 -0
  151. data/test/lib/troo/models/model_helpers_test.rb +103 -0
  152. data/test/lib/troo/models/refresh_test.rb +45 -0
  153. data/test/lib/troo/presentation/template_test.rb +40 -0
  154. data/test/support/fabrication.rb +56 -0
  155. data/test/support/template.erb +3 -0
  156. data/test/support/vcr_setup.rb +36 -0
  157. data/test/test_helper.rb +30 -0
  158. data/troo.gemspec +24 -5
  159. 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