troo 0.0.8 → 0.0.9

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.ruby-version +1 -1
  4. data/.trooconf.example +18 -0
  5. data/Gemfile.lock +178 -0
  6. data/README.md +77 -21
  7. data/Rakefile +1 -1
  8. data/bin/completion.bash +10 -0
  9. data/bin/completion.zsh +10 -0
  10. data/bin/init.sh +15 -0
  11. data/bin/troo +12 -3
  12. data/config/cucumber.yml +3 -3
  13. data/config/en.yml +29 -0
  14. data/config/trello_api.yml +19 -0
  15. data/features/add/board.feature +3 -19
  16. data/features/add/card.feature +14 -18
  17. data/features/add/comment.feature +14 -14
  18. data/features/add/list.feature +11 -14
  19. data/features/default/board.feature +4 -4
  20. data/features/default/card.feature +4 -4
  21. data/features/default/list.feature +4 -4
  22. data/features/move/card.feature +54 -0
  23. data/features/refresh/all.feature +8 -4
  24. data/features/refresh/board.feature +9 -6
  25. data/features/refresh/card.feature +9 -6
  26. data/features/refresh/list.feature +9 -6
  27. data/features/show/board.feature +7 -7
  28. data/features/show/boards.feature +19 -0
  29. data/features/show/card.feature +86 -15
  30. data/features/show/comment.feature +14 -12
  31. data/features/show/list.feature +19 -14
  32. data/features/status.feature +27 -13
  33. data/features/step_definitions/fabrication_steps.rb +43 -8
  34. data/features/step_definitions/troo_steps.rb +3 -2
  35. data/features/support/env.rb +1 -0
  36. data/features/troo.feature +0 -12
  37. data/lib/troo.rb +32 -29
  38. data/lib/troo/api/client.rb +117 -0
  39. data/lib/troo/api/endpoints.rb +39 -0
  40. data/lib/troo/api/headers.rb +44 -0
  41. data/lib/troo/api/oauth_settings.rb +36 -0
  42. data/lib/troo/api/request.rb +37 -0
  43. data/lib/troo/api/response.rb +31 -0
  44. data/lib/troo/cli/add.rb +8 -12
  45. data/lib/troo/cli/commands/add.rb +95 -0
  46. data/lib/troo/cli/commands/default.rb +44 -0
  47. data/lib/troo/cli/commands/move/card.rb +95 -0
  48. data/lib/troo/cli/commands/refresh.rb +80 -0
  49. data/lib/troo/cli/commands/refresh/all.rb +52 -0
  50. data/lib/troo/cli/commands/show.rb +56 -0
  51. data/lib/troo/cli/commands/show/show_boards.rb +36 -0
  52. data/lib/troo/cli/commands/show/show_comments.rb +54 -0
  53. data/lib/troo/cli/commands/status.rb +68 -0
  54. data/lib/troo/cli/default.rb +3 -3
  55. data/lib/troo/cli/main.rb +60 -9
  56. data/lib/troo/cli/refresh.rb +4 -4
  57. data/lib/troo/cli/show.rb +7 -7
  58. data/lib/troo/cli/thor_fixes.rb +1 -5
  59. data/lib/troo/configuration.rb +53 -0
  60. data/lib/troo/debug.rb +18 -0
  61. data/lib/troo/decorators/member.rb +2 -19
  62. data/lib/troo/decorators/resource.rb +130 -0
  63. data/lib/troo/helpers/decorator_helpers.rb +21 -74
  64. data/lib/troo/helpers/model_helpers.rb +19 -4
  65. data/lib/troo/helpers/remote_model_helpers.rb +54 -0
  66. data/lib/troo/models/board.rb +19 -11
  67. data/lib/troo/models/card.rb +20 -17
  68. data/lib/troo/models/comment.rb +28 -8
  69. data/lib/troo/models/list.rb +22 -14
  70. data/lib/troo/models/member.rb +21 -5
  71. data/lib/troo/models/refresh.rb +3 -4
  72. data/lib/troo/persistence/local.rb +63 -0
  73. data/lib/troo/presentation/formatter.rb +132 -0
  74. data/lib/troo/presentation/template.rb +0 -4
  75. data/lib/troo/presenters/board.rb +32 -51
  76. data/lib/troo/presenters/card.rb +4 -11
  77. data/lib/troo/presenters/comment.rb +30 -16
  78. data/lib/troo/presenters/list.rb +25 -21
  79. data/lib/troo/presenters/member.rb +1 -8
  80. data/lib/troo/remote/all.rb +16 -0
  81. data/lib/troo/remote/board.rb +64 -0
  82. data/lib/troo/remote/card.rb +81 -0
  83. data/lib/troo/remote/comment.rb +70 -0
  84. data/lib/troo/remote/comment_data.rb +11 -0
  85. data/lib/troo/remote/comment_data_board.rb +13 -0
  86. data/lib/troo/remote/comment_data_card.rb +15 -0
  87. data/lib/troo/remote/list.rb +49 -0
  88. data/lib/troo/remote/member.rb +75 -0
  89. data/lib/troo/remote/persistence/board.rb +57 -0
  90. data/lib/troo/remote/persistence/card.rb +59 -0
  91. data/lib/troo/remote/persistence/comment.rb +58 -0
  92. data/lib/troo/remote/persistence/list.rb +57 -0
  93. data/lib/troo/remote/persistence/move_card.rb +85 -0
  94. data/lib/troo/retrieval/local.rb +100 -0
  95. data/lib/troo/retrieval/remote.rb +91 -0
  96. data/lib/troo/troo.rb +42 -42
  97. data/lib/troo/version.rb +1 -1
  98. data/lib/troo/views/card.erb +8 -10
  99. data/lib/troo/views/comments.erb +4 -0
  100. data/test/cassettes/board_by_id.yml +21 -30
  101. data/test/cassettes/boards_all.yml +22 -90
  102. data/test/cassettes/card_by_id.yml +49 -0
  103. data/test/cassettes/cards_by_board_id.yml +22 -90
  104. data/test/cassettes/cards_by_list_id.yml +22 -87
  105. data/test/cassettes/comments_by_board_id.yml +22 -95
  106. data/test/cassettes/comments_by_card_id.yml +22 -87
  107. data/test/cassettes/create_board.yml +20 -32
  108. data/test/cassettes/create_card.yml +21 -35
  109. data/test/cassettes/create_comment.yml +19 -37
  110. data/test/cassettes/create_list.yml +18 -32
  111. data/test/cassettes/list_by_id.yml +46 -0
  112. data/test/cassettes/lists_by_board_id.yml +19 -91
  113. data/test/cassettes/member_by_id.yml +48 -0
  114. data/test/cassettes/members_by_board_id.yml +21 -82
  115. data/test/cassettes/move_card_board.yml +49 -0
  116. data/test/cassettes/move_card_list.yml +49 -0
  117. data/test/lib/troo/api/client_test.rb +75 -0
  118. data/test/lib/troo/api/endpoints_test.rb +48 -0
  119. data/test/lib/troo/api/headers_test.rb +27 -0
  120. data/test/lib/troo/api/oauth_settings_test.rb +10 -0
  121. data/test/lib/troo/api/request_test.rb +63 -0
  122. data/test/lib/troo/api/response_test.rb +15 -0
  123. data/test/lib/troo/cli/add_test.rb +113 -0
  124. data/test/lib/troo/cli/commands/add_test.rb +66 -0
  125. data/test/lib/troo/cli/commands/default_test.rb +39 -0
  126. data/test/lib/troo/cli/commands/move/card_test.rb +86 -0
  127. data/test/lib/troo/cli/commands/refresh/all_test.rb +37 -0
  128. data/test/lib/troo/cli/commands/refresh_test.rb +59 -0
  129. data/test/lib/troo/cli/commands/show/show_boards_test.rb +35 -0
  130. data/test/lib/troo/cli/commands/show/show_comments_test.rb +63 -0
  131. data/test/lib/troo/cli/commands/show_test.rb +65 -0
  132. data/test/lib/troo/cli/commands/status_test.rb +48 -0
  133. data/test/lib/troo/cli/default_test.rb +39 -0
  134. data/test/lib/troo/cli/main_test.rb +102 -0
  135. data/test/lib/troo/cli/refresh_test.rb +43 -0
  136. data/test/lib/troo/cli/show_test.rb +49 -0
  137. data/test/lib/troo/cli/thor_fixes_test.rb +38 -0
  138. data/test/lib/troo/configuration_test.rb +43 -0
  139. data/test/lib/troo/debug_test.rb +25 -0
  140. data/test/lib/troo/decorators/card_test.rb +105 -229
  141. data/test/lib/troo/decorators/member_test.rb +20 -35
  142. data/test/lib/troo/decorators/resource_test.rb +157 -0
  143. data/test/lib/troo/helpers/decorator_helpers_test.rb +10 -19
  144. data/test/lib/troo/helpers/model_helpers_test.rb +18 -8
  145. data/test/lib/troo/helpers/remote_model_helpers_test.rb +68 -0
  146. data/test/lib/troo/models/behaviours/set_default_test.rb +0 -10
  147. data/test/lib/troo/models/board_test.rb +2 -2
  148. data/test/lib/troo/models/card_test.rb +2 -2
  149. data/test/lib/troo/models/comment_test.rb +6 -2
  150. data/test/lib/troo/models/list_test.rb +2 -2
  151. data/test/lib/troo/models/member_test.rb +6 -2
  152. data/test/lib/troo/persistence/local_test.rb +31 -0
  153. data/test/lib/troo/presentation/formatter_test.rb +31 -0
  154. data/test/lib/troo/presentation/sentence_test.rb +0 -12
  155. data/test/lib/troo/presentation/template_test.rb +1 -14
  156. data/test/lib/troo/presenters/board_test.rb +17 -36
  157. data/test/lib/troo/presenters/card_test.rb +1 -31
  158. data/test/lib/troo/presenters/comment_test.rb +19 -19
  159. data/test/lib/troo/presenters/list_test.rb +18 -18
  160. data/test/lib/troo/presenters/member_test.rb +1 -14
  161. data/test/lib/troo/remote/board_test.rb +66 -0
  162. data/test/lib/troo/remote/card_test.rb +81 -0
  163. data/test/lib/troo/remote/comment_data_board.rb +9 -0
  164. data/test/lib/troo/remote/comment_data_card_test.rb +9 -0
  165. data/test/lib/troo/remote/comment_data_test.rb +9 -0
  166. data/test/lib/troo/remote/comment_test.rb +100 -0
  167. data/test/lib/troo/remote/list_test.rb +67 -0
  168. data/test/lib/troo/remote/member_test.rb +70 -0
  169. data/test/lib/troo/remote/persistence/board_test.rb +39 -0
  170. data/test/lib/troo/remote/persistence/card_test.rb +50 -0
  171. data/test/lib/troo/remote/persistence/comment_test.rb +45 -0
  172. data/test/lib/troo/remote/persistence/list_test.rb +45 -0
  173. data/test/lib/troo/remote/persistence/move_card_test.rb +78 -0
  174. data/test/lib/troo/retrieval/local_test.rb +192 -0
  175. data/test/lib/troo/retrieval/remote_test.rb +49 -0
  176. data/test/support/fabrication.rb +17 -17
  177. data/test/support/fake_trello/fake_response.rb +38 -0
  178. data/test/support/fake_trello/server.rb +124 -0
  179. data/test/support/remotes/all_boards.json +41 -0
  180. data/test/support/remotes/board.json +140 -0
  181. data/test/support/remotes/board_by_id.json +75 -0
  182. data/test/support/remotes/card.json +40 -0
  183. data/test/support/remotes/card_by_card_id.json +302 -0
  184. data/test/support/remotes/comment.json +27 -0
  185. data/test/support/remotes/create_board.json +38 -0
  186. data/test/support/remotes/list.json +7 -0
  187. data/test/support/remotes/member.json +50 -0
  188. data/test/system_test.sh +21 -1
  189. data/test/test_helper.rb +2 -1
  190. data/troo.gemspec +28 -20
  191. metadata +376 -269
  192. data/configuration.yml.example +0 -7
  193. data/features/cleanup.feature +0 -13
  194. data/lib/troo/actions/create_board.rb +0 -46
  195. data/lib/troo/actions/create_card.rb +0 -44
  196. data/lib/troo/actions/create_comment.rb +0 -46
  197. data/lib/troo/actions/create_list.rb +0 -42
  198. data/lib/troo/actions/move_card.rb +0 -37
  199. data/lib/troo/adaptors/board.rb +0 -32
  200. data/lib/troo/adaptors/card.rb +0 -67
  201. data/lib/troo/adaptors/comment.rb +0 -42
  202. data/lib/troo/adaptors/list.rb +0 -37
  203. data/lib/troo/adaptors/member.rb +0 -52
  204. data/lib/troo/adaptors/resource.rb +0 -17
  205. data/lib/troo/commands/add/board.rb +0 -26
  206. data/lib/troo/commands/add/card.rb +0 -33
  207. data/lib/troo/commands/add/comment.rb +0 -33
  208. data/lib/troo/commands/add/list.rb +0 -33
  209. data/lib/troo/commands/add/resource.rb +0 -21
  210. data/lib/troo/commands/commands.rb +0 -28
  211. data/lib/troo/commands/default/board.rb +0 -25
  212. data/lib/troo/commands/default/card.rb +0 -25
  213. data/lib/troo/commands/default/list.rb +0 -25
  214. data/lib/troo/commands/default/resource.rb +0 -26
  215. data/lib/troo/commands/refresh/all.rb +0 -41
  216. data/lib/troo/commands/refresh/board.rb +0 -28
  217. data/lib/troo/commands/refresh/card.rb +0 -29
  218. data/lib/troo/commands/refresh/list.rb +0 -29
  219. data/lib/troo/commands/refresh/resource.rb +0 -42
  220. data/lib/troo/commands/show/board.rb +0 -13
  221. data/lib/troo/commands/show/boards.rb +0 -35
  222. data/lib/troo/commands/show/card.rb +0 -13
  223. data/lib/troo/commands/show/comments.rb +0 -21
  224. data/lib/troo/commands/show/list.rb +0 -13
  225. data/lib/troo/commands/show/resource.rb +0 -41
  226. data/lib/troo/commands/status/board.rb +0 -30
  227. data/lib/troo/commands/status/card.rb +0 -30
  228. data/lib/troo/commands/status/list.rb +0 -30
  229. data/lib/troo/commands/status/resource.rb +0 -34
  230. data/lib/troo/decorators/board.rb +0 -66
  231. data/lib/troo/decorators/card.rb +0 -105
  232. data/lib/troo/decorators/comment.rb +0 -36
  233. data/lib/troo/decorators/list.rb +0 -60
  234. data/lib/troo/external/board.rb +0 -31
  235. data/lib/troo/external/card.rb +0 -31
  236. data/lib/troo/external/comment.rb +0 -27
  237. data/lib/troo/external/list.rb +0 -27
  238. data/lib/troo/external/member.rb +0 -27
  239. data/lib/troo/external/resource.rb +0 -42
  240. data/lib/troo/helpers/command_helpers.rb +0 -37
  241. data/lib/troo/models/persistence/board.rb +0 -19
  242. data/lib/troo/models/persistence/card.rb +0 -19
  243. data/lib/troo/models/persistence/comment.rb +0 -19
  244. data/lib/troo/models/persistence/list.rb +0 -19
  245. data/lib/troo/models/persistence/member.rb +0 -19
  246. data/lib/troo/models/persistence/resource.rb +0 -50
  247. data/lib/troo/models/remote/comment.rb +0 -21
  248. data/lib/troo/models/remote/resource.rb +0 -25
  249. data/lib/troo/models/retrieval/board.rb +0 -29
  250. data/lib/troo/models/retrieval/card.rb +0 -33
  251. data/lib/troo/models/retrieval/comment.rb +0 -25
  252. data/lib/troo/models/retrieval/list.rb +0 -29
  253. data/lib/troo/models/retrieval/member.rb +0 -25
  254. data/lib/troo/models/retrieval/resource.rb +0 -36
  255. data/lib/troo/views/comment.erb +0 -3
  256. data/test/cassettes/card_by_card_id.yml +0 -58
  257. data/test/cassettes/comments_by_list_id.yml +0 -109
  258. data/test/cassettes/list_by_list_id.yml +0 -56
  259. data/test/cassettes/member_by_member_id.yml +0 -60
  260. data/test/cassettes/move_card.yml +0 -61
  261. data/test/lib/troo/actions/create_board_test.rb +0 -66
  262. data/test/lib/troo/actions/create_card_test.rb +0 -71
  263. data/test/lib/troo/actions/create_comment_test.rb +0 -71
  264. data/test/lib/troo/actions/create_list_test.rb +0 -65
  265. data/test/lib/troo/actions/move_card_test.rb +0 -54
  266. data/test/lib/troo/adaptors/board_test.rb +0 -38
  267. data/test/lib/troo/adaptors/card_test.rb +0 -49
  268. data/test/lib/troo/adaptors/comment_test.rb +0 -41
  269. data/test/lib/troo/adaptors/list_test.rb +0 -38
  270. data/test/lib/troo/adaptors/member_test.rb +0 -44
  271. data/test/lib/troo/commands/add/board_test.rb +0 -43
  272. data/test/lib/troo/commands/add/card_test.rb +0 -44
  273. data/test/lib/troo/commands/add/comment_test.rb +0 -44
  274. data/test/lib/troo/commands/add/list_test.rb +0 -44
  275. data/test/lib/troo/commands/add/resource_test.rb +0 -25
  276. data/test/lib/troo/commands/default/board_test.rb +0 -37
  277. data/test/lib/troo/commands/default/card_test.rb +0 -37
  278. data/test/lib/troo/commands/default/list_test.rb +0 -37
  279. data/test/lib/troo/commands/default/resource_test.rb +0 -20
  280. data/test/lib/troo/commands/refresh/all_test.rb +0 -39
  281. data/test/lib/troo/commands/refresh/board_test.rb +0 -62
  282. data/test/lib/troo/commands/refresh/card_test.rb +0 -62
  283. data/test/lib/troo/commands/refresh/list_test.rb +0 -62
  284. data/test/lib/troo/commands/refresh/resource_test.rb +0 -20
  285. data/test/lib/troo/commands/show/board_test.rb +0 -65
  286. data/test/lib/troo/commands/show/boards_test.rb +0 -36
  287. data/test/lib/troo/commands/show/card_test.rb +0 -64
  288. data/test/lib/troo/commands/show/comments_test.rb +0 -64
  289. data/test/lib/troo/commands/show/list_test.rb +0 -64
  290. data/test/lib/troo/commands/show/resource_test.rb +0 -25
  291. data/test/lib/troo/commands/status/board_test.rb +0 -43
  292. data/test/lib/troo/commands/status/card_test.rb +0 -43
  293. data/test/lib/troo/commands/status/list_test.rb +0 -43
  294. data/test/lib/troo/commands/status/resource_test.rb +0 -19
  295. data/test/lib/troo/decorators/board_test.rb +0 -129
  296. data/test/lib/troo/decorators/comment_test.rb +0 -74
  297. data/test/lib/troo/decorators/list_test.rb +0 -102
  298. data/test/lib/troo/external/board_test.rb +0 -102
  299. data/test/lib/troo/external/card_test.rb +0 -131
  300. data/test/lib/troo/external/comment_test.rb +0 -109
  301. data/test/lib/troo/external/list_test.rb +0 -94
  302. data/test/lib/troo/external/member_test.rb +0 -94
  303. data/test/lib/troo/external/resource_test.rb +0 -25
  304. data/test/lib/troo/helpers/command_helpers_test.rb +0 -82
  305. data/test/lib/troo/models/persistence/board_test.rb +0 -62
  306. data/test/lib/troo/models/persistence/card_test.rb +0 -61
  307. data/test/lib/troo/models/persistence/comment_test.rb +0 -69
  308. data/test/lib/troo/models/persistence/list_test.rb +0 -60
  309. data/test/lib/troo/models/persistence/member_test.rb +0 -60
  310. data/test/lib/troo/models/remote/comment_test.rb +0 -56
  311. data/test/lib/troo/models/remote/resource_test.rb +0 -26
  312. data/test/lib/troo/models/retrieval/board_test.rb +0 -93
  313. data/test/lib/troo/models/retrieval/card_test.rb +0 -101
  314. data/test/lib/troo/models/retrieval/comment_test.rb +0 -46
  315. data/test/lib/troo/models/retrieval/list_test.rb +0 -93
  316. data/test/lib/troo/models/retrieval/member_test.rb +0 -58
@@ -0,0 +1,78 @@
1
+ require_relative '../../../../test_helper'
2
+
3
+ module Troo
4
+ module Remote
5
+ module Persistence
6
+ describe MoveCard do
7
+ let(:described_class) { MoveCard }
8
+ let(:external_board_id) { '526d8e130a14a9d846001d96' }
9
+ let(:external_card_id) { '526d8f19ddb279532e005259' }
10
+ let(:external_list_id) { '526d8e130a14a9d846001d97' }
11
+ let(:card) { [Fabricate.build(:card)] }
12
+
13
+ before do
14
+ Troo::Persistence::Local.stubs(:with_collection)
15
+ .returns(card)
16
+ end
17
+
18
+ after { database_cleanup }
19
+
20
+ describe '.with' do
21
+ let(:board) {}
22
+
23
+ subject do
24
+ described_class.with(external_card_id,
25
+ external_list_id,
26
+ external_board_id)
27
+ end
28
+
29
+ context 'when a board was specified' do
30
+ let(:board) { @board }
31
+
32
+ before do
33
+ VCR.insert_cassette(:move_card_board,
34
+ decode_compressed_response: true)
35
+ end
36
+
37
+ after { VCR.eject_cassette }
38
+
39
+ context 'and the card was moved' do
40
+ it 'returns the updated card' do
41
+ subject.must_be_instance_of Troo::Card
42
+ end
43
+ end
44
+
45
+ context 'and the card was not moved' do
46
+ before { API::Client.stubs(:perform).returns([]) }
47
+
48
+ it { subject.must_equal false }
49
+ end
50
+ end
51
+
52
+ context 'when a board was not specified' do
53
+ let(:external_board_id) {}
54
+
55
+ before do
56
+ VCR.insert_cassette(:move_card_list,
57
+ decode_compressed_response: true)
58
+ end
59
+
60
+ after { VCR.eject_cassette }
61
+
62
+ context 'and the card was moved' do
63
+ it 'returns the updated card' do
64
+ subject.must_be_instance_of Troo::Card
65
+ end
66
+ end
67
+
68
+ context 'and the card was not moved' do
69
+ before { API::Client.stubs(:perform).returns([]) }
70
+
71
+ it { subject.must_equal false }
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,192 @@
1
+ require_relative '../../../test_helper'
2
+
3
+ module Troo
4
+ module Retrieval
5
+ describe Local do
6
+ let(:described_class) { Local }
7
+ let(:klass) { stub(type: type) }
8
+ let(:id) {}
9
+ let(:options) { {} }
10
+ let(:type) { :resource_type }
11
+ let(:default_board) {}
12
+ let(:local_resource) {}
13
+ let(:remote_resource) { [] }
14
+ let(:default_resource) {}
15
+
16
+ before do
17
+ Troo::Board.stubs(:default).returns(default_board)
18
+ klass.stubs(:remote).returns(stub)
19
+ klass.stubs(:default).returns(default_resource)
20
+ klass.stubs(:first).returns(local_resource)
21
+ klass.stubs(:[]).returns(local_resource)
22
+ klass.stubs(:by_external_id).returns(local_resource)
23
+ Retrieval::Remote.stubs(:fetch).returns(remote_resource)
24
+ end
25
+
26
+ describe '.all' do
27
+ before { klass.stubs(:all).returns(collection) }
28
+
29
+ subject { described_class.all(klass) }
30
+
31
+ context 'when local resources exist' do
32
+ let(:collection) { [:resource, :resource] }
33
+
34
+ it 'returns all the local resources' do
35
+ subject.must_equal(collection)
36
+ end
37
+ end
38
+
39
+ context 'when no local resources exist' do
40
+ let(:collection) { [] }
41
+
42
+ it 'returns an empty collection' do
43
+ subject.must_equal []
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '.default' do
49
+ subject { described_class.default(klass, options) }
50
+
51
+ context 'when the default is set' do
52
+ let(:default_resource) { stub }
53
+
54
+ it 'returns the resource marked as default' do
55
+ subject.wont_equal nil
56
+ end
57
+ end
58
+
59
+ context 'when the default is not set' do
60
+ it { subject.must_equal nil }
61
+ end
62
+ end
63
+
64
+ describe '.retrieve' do
65
+ subject { described_class.retrieve(klass, id, options) }
66
+
67
+ context 'without an ID' do
68
+ context 'when the default is set' do
69
+ let(:default_resource) { stub }
70
+
71
+ it 'returns the resource marked as default' do
72
+ subject.wont_equal nil
73
+ end
74
+ end
75
+
76
+ context 'when the default is not set' do
77
+ it { subject.must_equal nil }
78
+ end
79
+ end
80
+
81
+ context 'with an ID' do
82
+ let(:id) { 67 }
83
+
84
+ context 'attempts local retrieval by short_id' do
85
+ context 'when the resource type is not a card' do
86
+ context 'when the resource exists' do
87
+ let(:local_resource) { stub }
88
+
89
+ it 'returns the resource' do
90
+ subject.must_equal(local_resource)
91
+ end
92
+ end
93
+
94
+ context 'when the resource does not exist' do
95
+ it { subject.must_equal nil }
96
+ end
97
+ end
98
+
99
+ context 'when the resource type is a card' do
100
+ let(:type) { :card }
101
+
102
+ context 'and a default board exists' do
103
+ let(:default_board) { stub(external_id: 27) }
104
+
105
+ context 'and the resource exists' do
106
+ let(:local_resource) { stub }
107
+
108
+ it 'returns the resource' do
109
+ subject.must_equal(local_resource)
110
+ end
111
+ end
112
+
113
+ context 'but the resource does not exist' do
114
+ it { subject.must_equal nil }
115
+ end
116
+ end
117
+
118
+ context 'and no default board exists' do
119
+ context 'and the resource exists' do
120
+ let(:local_resource) { stub }
121
+
122
+ it 'returns the resource' do
123
+ subject.must_equal(local_resource)
124
+ end
125
+ end
126
+
127
+ context 'and the resource does not exist' do
128
+ it { subject.must_equal nil }
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ context 'attempts local retrieval by database ID' do
135
+ context 'when the resource exists' do
136
+ let(:local_resource) { stub }
137
+
138
+ it 'returns the resource' do
139
+ subject.must_equal(local_resource)
140
+ end
141
+ end
142
+
143
+ context 'when the resource does not exist' do
144
+ it { subject.must_equal nil }
145
+ end
146
+ end
147
+
148
+ context 'attempts local retrieval by external ID' do
149
+ context 'when the resource exists' do
150
+ let(:local_resource) { stub }
151
+
152
+ it 'returns the resource' do
153
+ subject.must_equal(local_resource)
154
+ end
155
+ end
156
+
157
+ context 'when the resource does not exist' do
158
+ it { subject.must_equal nil }
159
+ end
160
+ end
161
+
162
+ context 'when remote access is allowed' do
163
+ context 'attempts remote retrieval by ID' do
164
+ context 'when the resource exists' do
165
+ let(:resource) { stub }
166
+ let(:remote_resource) { [resource] }
167
+
168
+ it 'returns the resource' do
169
+ subject.must_equal(resource)
170
+ end
171
+ end
172
+
173
+ context 'when the resource does not exist' do
174
+ it { subject.must_equal nil }
175
+ end
176
+ end
177
+ end
178
+
179
+ context 'when remote access is not allowed' do
180
+ let(:options) { { allow_remote: false } }
181
+
182
+ it { subject.must_equal nil }
183
+ end
184
+
185
+ context 'finally when the resource cannot be found' do
186
+ it { subject.must_equal nil }
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,49 @@
1
+ require_relative '../../../test_helper'
2
+
3
+ module Troo
4
+ module Retrieval
5
+ describe Remote do
6
+ let(:described_class) { Remote }
7
+ let(:klass) do
8
+ mock('klass', all: {},
9
+ by_board_id: {},
10
+ by_list_id: {},
11
+ by_card_id: {},
12
+ by_member_id: {})
13
+ end
14
+ let(:external_id) { '526d8e130a14a9d846001d96' }
15
+ let(:options) { { mode: :board } }
16
+ let(:resources) { [:not_persisted] }
17
+ let(:persisted) { [:persisted] }
18
+
19
+ before do
20
+ klass.stubs(:remote_options).returns({})
21
+ API::Client.stubs(:perform).returns(resources)
22
+ Troo::Persistence::Local.stubs(:with_collection)
23
+ .returns(persisted)
24
+ end
25
+
26
+ describe '#fetch' do
27
+ subject { described_class.fetch(klass, external_id, options) }
28
+
29
+ context 'when no resources were retrieved' do
30
+ let(:resources) { [] }
31
+
32
+ it { subject.must_equal [] }
33
+ end
34
+
35
+ context 'when resources were retrieved' do
36
+ context 'and persistence is allowed' do
37
+ it { subject.must_equal [:persisted] }
38
+ end
39
+
40
+ context 'and persistence is not allowed' do
41
+ let(:options) { { persist: false } }
42
+
43
+ it { subject.must_equal [:not_persisted] }
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,5 +1,5 @@
1
1
  Fabricator(:board, from: Troo::Board) do
2
- external_board_id '526d8e130a14a9d846001d96'
2
+ external_id '526d8e130a14a9d846001d96'
3
3
  name 'My Test Board'
4
4
  description 'A very brief description...'
5
5
  default false
@@ -8,7 +8,7 @@ end
8
8
 
9
9
  Fabricator(:list, from: Troo::List) do
10
10
  external_board_id '526d8e130a14a9d846001d96'
11
- external_list_id '526d8e130a14a9d846001d97'
11
+ external_id '526d8e130a14a9d846001d97'
12
12
  name 'My Test List'
13
13
  position 32_768
14
14
  default false
@@ -18,7 +18,7 @@ end
18
18
  Fabricator(:card, from: Troo::Card) do
19
19
  external_board_id '526d8e130a14a9d846001d96'
20
20
  external_list_id '526d8e130a14a9d846001d97'
21
- external_card_id '526d8f19ddb279532e005259'
21
+ external_id '526d8f19ddb279532e005259'
22
22
  external_member_ids ['5195fdb5a8c01a2318004f5d']
23
23
  short_id '67'
24
24
  name 'My Test Card'
@@ -31,23 +31,23 @@ Fabricator(:card, from: Troo::Card) do
31
31
  end
32
32
 
33
33
  Fabricator(:comment, from: Troo::Comment) do
34
- external_board_id '526d8e130a14a9d846001d96'
35
- external_card_id '526d8f19ddb279532e005259'
36
- external_comment_id '51f9277b2822b8654f0023af'
37
- external_member_id '5195fdb5a8c01a2318004f5d'
38
- text 'My Test Comment'
39
- date '2013-12-17 22:01:13 UTC'
34
+ external_board_id '526d8e130a14a9d846001d96'
35
+ external_card_id '526d8f19ddb279532e005259'
36
+ external_id '51f9277b2822b8654f0023af'
37
+ external_member_id '5195fdb5a8c01a2318004f5d'
38
+ text 'My Test Comment'
39
+ date '2013-12-17 22:01:13 UTC'
40
40
  end
41
41
 
42
42
  Fabricator(:member, from: Troo::Member) do
43
- external_member_id '5195fdb5a8c01a2318004f5d'
44
- username 'gavinlaking1'
45
- email 'gavinlaking@gmail.com'
46
- full_name 'Gavin Laking'
47
- initials 'GL'
48
- avatar_id 'some_avatar_id'
49
- bio 'some bio'
50
- url 'http://www.gavinlaking.name/'
43
+ external_id '5195fdb5a8c01a2318004f5d'
44
+ username 'gavinlaking1'
45
+ email 'gavinlaking@gmail.com'
46
+ full_name 'Gavin Laking'
47
+ initials 'GL'
48
+ avatar_id 'some_avatar_id'
49
+ bio 'some bio'
50
+ url 'http://www.gavinlaking.name/'
51
51
  end
52
52
 
53
53
  Fabricator(:refresh, from: Troo::Refresh) do
@@ -0,0 +1,38 @@
1
+ require 'json'
2
+ require 'yajl'
3
+
4
+ class FakeResponse
5
+ def self.render(resource, id = nil, collection = false)
6
+ new(resource, id, collection).render
7
+ end
8
+
9
+ def initialize(resource, id = nil, collection = false)
10
+ @resource, @id, @collection = resource, id, collection
11
+ end
12
+
13
+ def render
14
+ collection ? '[' + output + ']' : output
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :resource, :id, :collection
20
+
21
+ def output
22
+ return converted if id
23
+ raw
24
+ end
25
+
26
+ def converted
27
+ JSON(parsed)
28
+ end
29
+
30
+ def parsed
31
+ @parsed ||= Yajl::Parser.parse(raw).merge!('id' => id)
32
+ end
33
+
34
+ def raw
35
+ @raw ||= File
36
+ .read(File.dirname(__FILE__) + "/../remotes/#{resource}.json")
37
+ end
38
+ end
@@ -0,0 +1,124 @@
1
+ require 'sinatra/base'
2
+ require 'webrick'
3
+ require 'webrick/https'
4
+ require 'openssl'
5
+
6
+ require_relative 'fake_response'
7
+
8
+ trap('INT') { exit! }
9
+
10
+ my_server_crt = File.open(File.join('./', 'my-server.crt')).read
11
+ my_server_key = File.open(File.join('./', 'my-server.key')).read
12
+ webrick_options = {
13
+ Port: 8443,
14
+ Logger: WEBrick::Log.new($stderr, WEBrick::Log::DEBUG),
15
+ DocumentRoot: '/',
16
+ SSLEnable: true,
17
+ SSLVerifyClient: OpenSSL::SSL::VERIFY_NONE,
18
+ SSLCertificate: OpenSSL::X509::Certificate.new(my_server_crt),
19
+ SSLPrivateKey: OpenSSL::PKey::RSA.new(my_server_key),
20
+ SSLCertName: [['CN', WEBrick::Utils.getservername]]
21
+ }
22
+
23
+ class MyFakeTrello < Sinatra::Base
24
+ helpers do
25
+ def fake(resource, id = nil, collection = false)
26
+ halt(400, 'Bad Request') if id == '400'
27
+ halt(401, 'Unauthorized') if id == '401'
28
+
29
+ FakeResponse.render(resource, id, collection)
30
+ end
31
+ end
32
+
33
+ # boards_all
34
+ get '/1/members/me/boards' do
35
+ fake('all_boards', nil, true)
36
+ end
37
+
38
+ # board_by_id
39
+ get '/1/boards/:id' do
40
+ fake('board', params['id'])
41
+ end
42
+
43
+ # card_by_id
44
+ get '/1/cards/:id' do
45
+ fake('card_by_card_id', params['id'])
46
+ end
47
+
48
+ # list_by_id
49
+ get '/1/lists/:id' do
50
+ fake('list', params['id'])
51
+ end
52
+
53
+ # member_by_id
54
+ get '/1/members/:id' do
55
+ fake('member', params['id'])
56
+ end
57
+
58
+ # cards_by_board_id
59
+ get '/1/boards/:id/cards' do
60
+ fake('card', params['id'], true)
61
+ end
62
+
63
+ # cards_by_list_id
64
+ get '/1/lists/:id/cards' do
65
+ fake('card', params['id'], true)
66
+ end
67
+
68
+ # comments_by_board_id
69
+ get '/1/boards/:id/actions' do
70
+ fake('comment', params['id'])
71
+ end
72
+
73
+ # comments_by_card_id
74
+ get '/1/cards/:id/actions' do
75
+ fake('comment', params['id'])
76
+ end
77
+
78
+ # comments_by_list_id
79
+ get '/1/lists/:id/actions' do
80
+ fake('comment', params['id'])
81
+ end
82
+
83
+ # lists_by_board_id
84
+ get '/1/boards/:id/lists' do
85
+ fake('list', params['id'], true)
86
+ end
87
+
88
+ # members_by_board_id
89
+ get '/1/boards/:id/members' do
90
+ fake('member', params['id'], true)
91
+ end
92
+
93
+ # create_board
94
+ post '/1/boards' do
95
+ fake('board')
96
+ end
97
+
98
+ # create_card
99
+ post '/1/cards' do
100
+ fake('card')
101
+ end
102
+
103
+ # create_comment
104
+ post '/1/cards/:id/actions/comments' do
105
+ fake('comment')
106
+ end
107
+
108
+ # create_list
109
+ post '/1/lists' do
110
+ fake('list')
111
+ end
112
+
113
+ # move_card_list
114
+ put '/1/cards/:id/idList' do
115
+ fake('card')
116
+ end
117
+
118
+ # move_card_board
119
+ put '/1/cards/:id/idBoard' do
120
+ fake('card')
121
+ end
122
+ end
123
+
124
+ Rack::Handler::WEBrick.run MyFakeTrello, webrick_options