troo 0.0.9 → 0.0.10

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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/Gemfile.lock +40 -32
  4. data/Guardfile +9 -1
  5. data/README.md +15 -10
  6. data/bin/troo +22 -2
  7. data/config/en.yml +11 -1
  8. data/config/help +16 -0
  9. data/{.trooconf.example → config/trooconf.yml} +4 -2
  10. data/features/add/card.feature +1 -1
  11. data/features/add/comment.feature +1 -1
  12. data/features/add/list.feature +1 -1
  13. data/features/default/board.feature +1 -1
  14. data/features/default/card.feature +1 -1
  15. data/features/default/list.feature +1 -1
  16. data/features/move/card.feature +5 -5
  17. data/features/refresh/board.feature +1 -1
  18. data/features/refresh/card.feature +1 -1
  19. data/features/refresh/list.feature +1 -1
  20. data/features/show/board.feature +11 -3
  21. data/features/show/boards.feature +1 -0
  22. data/features/show/card.feature +7 -7
  23. data/features/show/comment.feature +15 -6
  24. data/features/show/list.feature +3 -1
  25. data/features/status.feature +2 -2
  26. data/features/step_definitions/fabrication_steps.rb +11 -11
  27. data/features/step_definitions/troo_steps.rb +1 -1
  28. data/features/support/cassettes/200_board_by_id.yml +56 -0
  29. data/features/support/cassettes/200_card_by_id.yml +77 -0
  30. data/features/support/cassettes/200_create_board.yml +186 -0
  31. data/features/support/cassettes/200_create_card.yml +86 -0
  32. data/features/support/cassettes/200_create_comment.yml +73 -0
  33. data/features/support/cassettes/200_create_list.yml +53 -0
  34. data/{test/cassettes/list_by_id.yml → features/support/cassettes/200_list_by_id.yml} +6 -6
  35. data/features/support/cassettes/200_move_card_200_board.yml +86 -0
  36. data/features/support/cassettes/200_move_card_200_list.yml +86 -0
  37. data/features/support/cassettes/200_move_card_400_list.yml +46 -0
  38. data/{test/cassettes/lists_by_board_id.yml → features/support/cassettes/400_board_by_id.yml} +10 -10
  39. data/features/support/cassettes/400_card_by_id.yml +46 -0
  40. data/features/support/cassettes/400_create_card.yml +46 -0
  41. data/features/support/cassettes/400_create_comment.yml +46 -0
  42. data/features/support/cassettes/400_create_list.yml +46 -0
  43. data/features/support/cassettes/400_list_by_id.yml +46 -0
  44. data/features/support/cassettes/400_move_card_200_list.yml +46 -0
  45. data/features/support/cassettes/400_move_card_400_board.yml +46 -0
  46. data/features/support/cassettes/boards_all.yml +286 -0
  47. data/features/support/env.rb +1 -2
  48. data/lib/troo/cli/commands/refresh/all.rb +2 -0
  49. data/lib/troo/cli/main.rb +2 -23
  50. data/lib/troo/configuration.rb +5 -0
  51. data/lib/troo/database.rb +29 -0
  52. data/lib/troo/decorators/resource.rb +24 -10
  53. data/lib/troo/helpers/model_helpers.rb +3 -2
  54. data/lib/troo/models/board.rb +1 -1
  55. data/lib/troo/models/card.rb +1 -1
  56. data/lib/troo/models/comment.rb +0 -4
  57. data/lib/troo/models/list.rb +1 -1
  58. data/lib/troo/presentation/formatter.rb +99 -4
  59. data/lib/troo/presentation/template.rb +8 -9
  60. data/lib/troo/presenters/board.rb +24 -26
  61. data/lib/troo/presenters/card.rb +3 -1
  62. data/lib/troo/presenters/list.rb +30 -17
  63. data/lib/troo/presenters/resource.rb +90 -0
  64. data/lib/troo/retrieval/local.rb +5 -1
  65. data/lib/troo/troo.rb +2 -0
  66. data/lib/troo/version.rb +1 -1
  67. data/lib/troo.rb +7 -4
  68. data/test/cassettes/create_board.yml +15 -9
  69. data/test/cassettes/create_card.yml +10 -10
  70. data/test/cassettes/create_comment.yml +9 -9
  71. data/test/cassettes/create_list.yml +5 -5
  72. data/test/cassettes/move_card_board.yml +11 -11
  73. data/test/cassettes/move_card_list.yml +11 -11
  74. data/test/lib/troo/api/endpoints_test.rb +2 -2
  75. data/test/lib/troo/cli/commands/add_test.rb +2 -2
  76. data/test/lib/troo/cli/commands/refresh/all_test.rb +4 -9
  77. data/test/lib/troo/cli/main_test.rb +0 -25
  78. data/test/lib/troo/configuration_test.rb +18 -13
  79. data/test/lib/troo/decorators/member_test.rb +0 -27
  80. data/test/lib/troo/decorators/resource_test.rb +0 -32
  81. data/test/lib/troo/helpers/model_helpers_test.rb +15 -3
  82. data/test/lib/troo/models/board_test.rb +45 -1
  83. data/test/lib/troo/models/card_test.rb +60 -6
  84. data/test/lib/troo/models/comment_test.rb +44 -4
  85. data/test/lib/troo/models/database_test.rb +19 -0
  86. data/test/lib/troo/models/list_test.rb +46 -2
  87. data/test/lib/troo/models/member_test.rb +51 -1
  88. data/test/lib/troo/presentation/formatter_test.rb +54 -2
  89. data/test/lib/troo/presentation/template_test.rb +4 -4
  90. data/test/lib/troo/presenters/board_test.rb +4 -3
  91. data/test/lib/troo/presenters/list_test.rb +3 -3
  92. data/test/lib/troo/presenters/member_test.rb +1 -1
  93. data/test/lib/troo/presenters/resource_test.rb +79 -0
  94. data/test/lib/troo/remote/board_test.rb +5 -8
  95. data/test/lib/troo/remote/card_test.rb +7 -11
  96. data/test/lib/troo/remote/comment_test.rb +10 -14
  97. data/test/lib/troo/remote/list_test.rb +5 -9
  98. data/test/lib/troo/remote/member_test.rb +5 -9
  99. data/test/lib/troo/remote/persistence/card_test.rb +1 -1
  100. data/test/lib/troo/remote/persistence/comment_test.rb +1 -1
  101. data/test/lib/troo/remote/persistence/list_test.rb +1 -1
  102. data/test/lib/troo/remote/persistence/move_card_test.rb +3 -3
  103. data/test/lib/troo/retrieval/local_test.rb +13 -1
  104. data/test/lib/troo/retrieval/remote_test.rb +1 -1
  105. data/test/support/fabrication.rb +12 -12
  106. data/test/support/fake_trello/fake_response.rb +18 -1
  107. data/test/support/fake_trello/server.rb +2 -0
  108. data/test/support/remotes/all_boards.json +103 -4
  109. data/test/support/remotes/{board.json → all_boards_200.json} +13 -13
  110. data/test/support/remotes/board_200.json +140 -0
  111. data/test/support/remotes/board_by_id.json +9 -9
  112. data/test/support/remotes/board_by_id_200.json +75 -0
  113. data/test/support/remotes/card.json +4 -4
  114. data/test/support/remotes/card_200.json +40 -0
  115. data/test/support/remotes/card_by_card_id.json +64 -64
  116. data/test/support/remotes/card_by_card_id_200.json +302 -0
  117. data/test/support/remotes/comment.json +6 -6
  118. data/test/support/remotes/comment_200.json +27 -0
  119. data/test/support/remotes/create_board.json +1 -1
  120. data/test/support/remotes/create_board_200.json +38 -0
  121. data/test/support/remotes/list.json +2 -2
  122. data/test/support/remotes/list_200.json +7 -0
  123. data/test/support/remotes/member.json +4 -4
  124. data/test/support/remotes/member_200.json +50 -0
  125. data/test/test_helper.rb +9 -2
  126. data/troo.gemspec +4 -3
  127. metadata +92 -41
  128. data/test/cassettes/board_by_id.yml +0 -50
  129. data/test/cassettes/boards_all.yml +0 -50
  130. data/test/cassettes/card_by_id.yml +0 -49
  131. data/test/cassettes/cards_by_board_id.yml +0 -49
  132. data/test/cassettes/cards_by_list_id.yml +0 -49
  133. data/test/cassettes/comments_by_board_id.yml +0 -49
  134. data/test/cassettes/comments_by_card_id.yml +0 -49
  135. data/test/cassettes/member_by_id.yml +0 -48
  136. data/test/cassettes/members_by_board_id.yml +0 -48
  137. data/test/lib/troo/decorators/card_test.rb +0 -113
@@ -12,11 +12,11 @@ module Troo
12
12
  let(:resource) { stub('resource', external_id: '200') }
13
13
 
14
14
  before do
15
- ['Board', 'Card', 'List'].each do |type|
15
+ %w{Board Card List}.each do |type|
16
16
  Object.const_get("Troo::#{type}").stubs(:retrieve)
17
17
  .returns(resource)
18
18
  end
19
- ['Board', 'Card', 'List', 'Comment'].each do |type|
19
+ %w{Board Card List Comment}.each do |type|
20
20
  Object.const_get("Troo::Remote::Persistence::#{type}")
21
21
  .stubs(:with).returns(outcome)
22
22
  end
@@ -3,18 +3,13 @@ require_relative '../../../../../test_helper'
3
3
  module Troo
4
4
  module Commands
5
5
  describe RefreshAll do
6
- def load_mock_trello_response
7
- json = File.read('./test/support/remotes/board.json')
8
- hash = Yajl::Parser.parse(json)
9
- Troo::Remote::Board.new(hash)
10
- end
11
6
  let(:described_class) { RefreshAll }
12
- let(:resource) { [load_mock_trello_response] }
13
-
14
- before do
15
- Retrieval::Remote.stubs(:fetch).returns(resource)
7
+ let(:resource) do
8
+ [mock_trello_response('board_200.json', Troo::Remote::Board)]
16
9
  end
17
10
 
11
+ before { Retrieval::Remote.stubs(:fetch).returns(resource) }
12
+
18
13
  describe '.dispatch' do
19
14
  subject { described_class.dispatch }
20
15
 
@@ -5,31 +5,6 @@ module Troo
5
5
  describe Main do
6
6
  let(:described_class) { Main }
7
7
 
8
- describe '#init' do
9
- let(:exists) { false }
10
-
11
- before do
12
- File.stubs(:exist?).returns(exists)
13
- FileUtils.stubs(:cp)
14
- end
15
-
16
- subject { capture_io { described_class.new.init }.join }
17
-
18
- context 'when a configuration file exists' do
19
- let(:exists) { true }
20
-
21
- it 'returns the output of the command' do
22
- subject.must_match(/already exists/)
23
- end
24
- end
25
-
26
- context 'when a configuration file does not exist' do
27
- it 'returns the output of the command' do
28
- subject.must_match(/does not exist/)
29
- end
30
- end
31
- end
32
-
33
8
  describe '#status' do
34
9
  before { Commands::Status.stubs(:dispatch) }
35
10
 
@@ -4,39 +4,44 @@ module Troo
4
4
  describe Configuration do
5
5
  let(:described_class) { Configuration }
6
6
 
7
- subject { described_class.load('test/support/.trooconf', :test) }
7
+ subject { described_class.load('config/trooconf.yml', :test) }
8
8
 
9
- context 'attributes' do
10
- it 'configures the API url' do
11
- subject.api_url.must_equal('http://www.example.com')
9
+ context 'configures' do
10
+ it 'the name of the configuration' do
11
+ subject.name.must_equal('My Example Test Configuration')
12
12
  end
13
13
 
14
- it 'configures the API key' do
14
+ it 'the API url' do
15
+ subject.api_url.must_equal('https://api.trello.com/1')
16
+ end
17
+
18
+ it 'the API key' do
15
19
  subject.api_key.must_equal('some_key')
16
20
  end
17
21
 
18
- it 'configures the API token' do
22
+ it 'the API token' do
19
23
  subject.api_token.must_equal('some_secret')
20
24
  end
21
25
 
22
- it 'configures the API OAuth token' do
26
+ it 'the API OAuth token' do
23
27
  subject.api_oauth_token.must_equal('some_oauth_token')
24
28
  end
25
29
 
26
- it 'configures the API OAuth token secret' do
27
- subject.api_oauth_token_secret.must_equal('some_oauth_token_secret')
30
+ it 'the API OAuth token secret' do
31
+ subject.api_oauth_token_secret
32
+ .must_equal('some_oauth_token_secret')
28
33
  end
29
34
 
30
- it 'configures the database to use' do
35
+ it 'the database to use' do
31
36
  subject.database.must_equal(2)
32
37
  end
33
38
 
34
- it 'configures communication with the Trello API' do
39
+ it 'communication with the Trello API' do
35
40
  subject.allow_remote.must_equal(true)
36
41
  end
37
42
 
38
- it 'configures log output' do
39
- subject.logs.must_equal(false)
43
+ it 'log output' do
44
+ subject.logs.must_equal(true)
40
45
  end
41
46
  end
42
47
  end
@@ -3,33 +3,6 @@ require_relative '../../../test_helper'
3
3
  module Troo
4
4
  module Decorators
5
5
  describe Member do
6
- let(:described_class) { Member }
7
- let(:options) { {} }
8
- let(:member) { Fabricate.build(:member) }
9
-
10
- # describe '#username' do
11
- # subject { described_class.new(member).username }
12
-
13
- # it "returns the member's username" do
14
- # subject.must_equal("@#{member.username}")
15
- # end
16
- # end
17
-
18
- # describe '#name' do
19
- # subject { described_class.new(member).name }
20
-
21
- # it "returns the member's full name" do
22
- # subject.must_equal(member.full_name)
23
- # end
24
- # end
25
-
26
- # describe '#initials' do
27
- # subject { described_class.new(member).initials }
28
-
29
- # it "returns the member's initials" do
30
- # subject.must_equal(member.initials)
31
- # end
32
- # end
33
6
  end
34
7
  end
35
8
  end
@@ -87,38 +87,6 @@ module Troo
87
87
  end
88
88
  end
89
89
 
90
- describe '#board' do
91
- subject { described_instance.board }
92
-
93
- it 'returns the board details' do
94
- skip
95
- end
96
- end
97
-
98
- describe '#list' do
99
- subject { described_instance.list }
100
-
101
- it 'returns the list details' do
102
- skip
103
- end
104
- end
105
-
106
- describe '#lists' do
107
- subject { described_instance.lists }
108
-
109
- it 'returns the lists details' do
110
- skip
111
- end
112
- end
113
-
114
- describe '#cards' do
115
- subject { described_instance.cards }
116
-
117
- it 'returns the cards details' do
118
- skip
119
- end
120
- end
121
-
122
90
  describe '#as_view' do
123
91
  before { Template.stubs(:parse).returns('some output') }
124
92
 
@@ -99,10 +99,22 @@ module Troo
99
99
  end
100
100
 
101
101
  describe '.count' do
102
- subject { described_class.count }
102
+ let(:criteria) { {} }
103
103
 
104
- it 'returns the number of this model persisted' do
105
- subject.must_equal(2)
104
+ subject { described_class.count(criteria) }
105
+
106
+ context 'when no criteria is specified' do
107
+ it 'returns the number of this model persisted' do
108
+ subject.must_equal(2)
109
+ end
110
+ end
111
+
112
+ context 'when criteria is specified' do
113
+ let(:criteria) { { name: 'My Dumber Model' } }
114
+
115
+ it 'returns the number of this model persisted' do
116
+ subject.must_equal(1)
117
+ end
106
118
  end
107
119
  end
108
120
 
@@ -25,7 +25,23 @@ module Troo
25
25
  end
26
26
 
27
27
  it 'should have an external_id attribute' do
28
- subject.external_id.must_equal '526d8e130a14a9d846001d96'
28
+ subject.external_id.must_equal '20010'
29
+ end
30
+ end
31
+
32
+ describe '.remote' do
33
+ subject { described_class.remote }
34
+
35
+ it 'returns the remote class for this model' do
36
+ subject.must_equal(Remote::Board)
37
+ end
38
+ end
39
+
40
+ describe '.type' do
41
+ subject { described_class.type }
42
+
43
+ it 'returns the type of model' do
44
+ subject.must_equal(:board)
29
45
  end
30
46
  end
31
47
 
@@ -45,5 +61,33 @@ module Troo
45
61
  subject.cards.size.must_equal 1
46
62
  end
47
63
  end
64
+
65
+ describe '#decorator' do
66
+ let(:options) { {} }
67
+
68
+ subject { described_class.new.decorator(options) }
69
+
70
+ it 'returns a new instance of the decorator for this model' do
71
+ subject.must_be_instance_of(Decorators::Resource)
72
+ end
73
+ end
74
+
75
+ describe '#presenter' do
76
+ let(:options) { {} }
77
+
78
+ subject { described_class.new.presenter(options) }
79
+
80
+ it 'returns a new instance of the presenter for this model' do
81
+ subject.must_be_instance_of(Presenters::Board)
82
+ end
83
+ end
84
+
85
+ describe '#type' do
86
+ subject { described_class.new.type }
87
+
88
+ it 'returns the type of the model instance' do
89
+ subject.must_equal(:board)
90
+ end
91
+ end
48
92
  end
49
93
  end
@@ -29,12 +29,12 @@ module Troo
29
29
  context 'and the attribute is an array' do
30
30
  it 'returns the attribute' do
31
31
  subject.external_member_ids
32
- .must_equal(['5195fdb5a8c01a2318004f5d'])
32
+ .must_equal(['20050'])
33
33
  end
34
34
  end
35
35
 
36
36
  context 'and the attribute is a string' do
37
- let(:member_ids) { "[\"5195fdb5a8c01a2318004f5d\"]" }
37
+ let(:member_ids) { "[\"20050\"]" }
38
38
  let(:described_instance) do
39
39
  Fabricate.build(:card,
40
40
  external_member_ids: member_ids)
@@ -42,7 +42,7 @@ module Troo
42
42
 
43
43
  it 'converts to an array and returns the attribute' do
44
44
  subject.external_member_ids
45
- .must_equal(['5195fdb5a8c01a2318004f5d'])
45
+ .must_equal(['20050'])
46
46
  end
47
47
  end
48
48
  end
@@ -77,15 +77,31 @@ module Troo
77
77
 
78
78
  it 'should have an external_board_id attribute' do
79
79
  subject.external_board_id
80
- .must_equal '526d8e130a14a9d846001d96'
80
+ .must_equal '20010'
81
81
  end
82
82
 
83
83
  it 'should have an external_list_id attribute' do
84
- subject.external_list_id.must_equal '526d8e130a14a9d846001d97'
84
+ subject.external_list_id.must_equal '20040'
85
85
  end
86
86
 
87
87
  it 'should have an external_id attribute' do
88
- subject.external_id.must_equal '526d8f19ddb279532e005259'
88
+ subject.external_id.must_equal '20020'
89
+ end
90
+ end
91
+
92
+ describe '.remote' do
93
+ subject { described_class.remote }
94
+
95
+ it 'returns the remote class for this model' do
96
+ subject.must_equal(Remote::Card)
97
+ end
98
+ end
99
+
100
+ describe '.type' do
101
+ subject { described_class.type }
102
+
103
+ it 'returns the type of model' do
104
+ subject.must_equal(:card)
89
105
  end
90
106
  end
91
107
 
@@ -129,5 +145,43 @@ module Troo
129
145
  end
130
146
  end
131
147
  end
148
+
149
+ describe '#decorator' do
150
+ let(:options) { {} }
151
+
152
+ subject { described_class.new.decorator(options) }
153
+
154
+ it 'returns a new instance of the decorator for this model' do
155
+ subject.must_be_instance_of(Decorators::Resource)
156
+ end
157
+ end
158
+
159
+ describe '#presenter' do
160
+ let(:options) { {} }
161
+
162
+ subject { described_class.new.presenter(options) }
163
+
164
+ it 'returns a new instance of the presenter for this model' do
165
+ subject.must_be_instance_of(Presenters::Card)
166
+ end
167
+ end
168
+
169
+ describe '#comment_presenter' do
170
+ let(:options) { {} }
171
+
172
+ subject { described_class.new.comment_presenter(options) }
173
+
174
+ it 'returns a new instance of the comment presenter' do
175
+ subject.must_be_instance_of(Presenters::Comment)
176
+ end
177
+ end
178
+
179
+ describe '#type' do
180
+ subject { described_class.new.type }
181
+
182
+ it 'returns the type of the model instance' do
183
+ subject.must_equal(:card)
184
+ end
185
+ end
132
186
  end
133
187
  end
@@ -17,19 +17,19 @@ module Troo
17
17
  end
18
18
 
19
19
  it 'should have an external_board_id attribute' do
20
- subject.external_board_id.must_equal '526d8e130a14a9d846001d96'
20
+ subject.external_board_id.must_equal '20010'
21
21
  end
22
22
 
23
23
  it 'should have an external_card_id attribute' do
24
- subject.external_card_id.must_equal '526d8f19ddb279532e005259'
24
+ subject.external_card_id.must_equal '20020'
25
25
  end
26
26
 
27
27
  it 'should have an external_id attribute' do
28
- subject.external_id.must_equal '51f9277b2822b8654f0023af'
28
+ subject.external_id.must_equal '20030'
29
29
  end
30
30
 
31
31
  it 'should have a external_member_id attribute' do
32
- subject.external_member_id.must_equal '5195fdb5a8c01a2318004f5d'
32
+ subject.external_member_id.must_equal '20050'
33
33
  end
34
34
 
35
35
  it 'should always respond false to default?' do
@@ -37,6 +37,22 @@ module Troo
37
37
  end
38
38
  end
39
39
 
40
+ describe '.remote' do
41
+ subject { described_class.remote }
42
+
43
+ it 'returns the remote class for this model' do
44
+ subject.must_equal(Remote::Comment)
45
+ end
46
+ end
47
+
48
+ describe '.type' do
49
+ subject { described_class.type }
50
+
51
+ it 'returns the type of model' do
52
+ subject.must_equal(:comments)
53
+ end
54
+ end
55
+
40
56
  context 'associations' do
41
57
  before do
42
58
  @board = Fabricate(:board)
@@ -58,5 +74,29 @@ module Troo
58
74
  subject.member.must_equal @member
59
75
  end
60
76
  end
77
+
78
+ describe '#decorator' do
79
+ let(:options) { {} }
80
+
81
+ subject { described_class.new.decorator(options) }
82
+
83
+ it 'returns a new instance of the decorator for this model' do
84
+ subject.must_be_instance_of(Decorators::Resource)
85
+ end
86
+ end
87
+
88
+ describe '#default?' do
89
+ subject { described_class.new.default? }
90
+
91
+ it { subject.must_equal false }
92
+ end
93
+
94
+ describe '#type' do
95
+ subject { described_class.new.type }
96
+
97
+ it 'returns the type of the model instance' do
98
+ subject.must_equal(:comments)
99
+ end
100
+ end
61
101
  end
62
102
  end
@@ -0,0 +1,19 @@
1
+ require_relative '../../../test_helper'
2
+
3
+ module Troo
4
+ describe Database do
5
+ let(:described_class) { Database }
6
+ let(:configuration) { stub(database: '1') }
7
+ let(:options) { {} }
8
+
9
+ before { Ohm.stubs(:connect) }
10
+
11
+ describe '#connect' do
12
+ subject { described_class.connect(configuration, options) }
13
+
14
+ it 'connects to the persistence layer' do
15
+ subject.must_equal(nil)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -25,11 +25,27 @@ module Troo
25
25
  end
26
26
 
27
27
  it 'should have a external_board_id attribute' do
28
- subject.external_board_id.must_equal '526d8e130a14a9d846001d96'
28
+ subject.external_board_id.must_equal '20010'
29
29
  end
30
30
 
31
31
  it 'should have an external_id attribute' do
32
- subject.external_id.must_equal '526d8e130a14a9d846001d97'
32
+ subject.external_id.must_equal '20040'
33
+ end
34
+ end
35
+
36
+ describe '.remote' do
37
+ subject { described_class.remote }
38
+
39
+ it 'returns the remote class for this model' do
40
+ subject.must_equal(Remote::List)
41
+ end
42
+ end
43
+
44
+ describe '.type' do
45
+ subject { described_class.type }
46
+
47
+ it 'returns the type of model' do
48
+ subject.must_equal(:list)
33
49
  end
34
50
  end
35
51
 
@@ -49,5 +65,33 @@ module Troo
49
65
  subject.cards.size.must_equal 1
50
66
  end
51
67
  end
68
+
69
+ describe '#decorator' do
70
+ let(:options) { {} }
71
+
72
+ subject { described_class.new.decorator(options) }
73
+
74
+ it 'returns a new instance of the decorator for this model' do
75
+ subject.must_be_instance_of(Decorators::Resource)
76
+ end
77
+ end
78
+
79
+ describe '#presenter' do
80
+ let(:options) { {} }
81
+
82
+ subject { described_class.new.presenter(options) }
83
+
84
+ it 'returns a new instance of the presenter for this model' do
85
+ subject.must_be_instance_of(Presenters::List)
86
+ end
87
+ end
88
+
89
+ describe '#type' do
90
+ subject { described_class.new.type }
91
+
92
+ it 'returns the type of the model instance' do
93
+ subject.must_equal(:list)
94
+ end
95
+ end
52
96
  end
53
97
  end
@@ -37,12 +37,62 @@ module Troo
37
37
  end
38
38
 
39
39
  it 'should have an external_id attribute' do
40
- subject.external_id.must_equal '5195fdb5a8c01a2318004f5d'
40
+ subject.external_id.must_equal '20050'
41
41
  end
42
42
 
43
43
  it 'should always respond false to default?' do
44
44
  subject.default?.must_equal false
45
45
  end
46
46
  end
47
+
48
+ describe '.remote' do
49
+ subject { described_class.remote }
50
+
51
+ it 'returns the remote class for this model' do
52
+ subject.must_equal(Remote::Member)
53
+ end
54
+ end
55
+
56
+ describe '.type' do
57
+ subject { described_class.type }
58
+
59
+ it 'returns the type of model' do
60
+ subject.must_equal(:member)
61
+ end
62
+ end
63
+
64
+ describe '#decorator' do
65
+ let(:options) { {} }
66
+
67
+ subject { described_class.new.decorator(options) }
68
+
69
+ it 'returns a new instance of the decorator for this model' do
70
+ subject.must_be_instance_of(Decorators::Member)
71
+ end
72
+ end
73
+
74
+ describe '#presenter' do
75
+ let(:options) { {} }
76
+
77
+ subject { described_class.new.presenter(options) }
78
+
79
+ it 'returns a new instance of the presenter for this model' do
80
+ subject.must_be_instance_of(Presenters::Member)
81
+ end
82
+ end
83
+
84
+ describe '#default?' do
85
+ subject { described_class.new.default? }
86
+
87
+ it { subject.must_equal false }
88
+ end
89
+
90
+ describe '#type' do
91
+ subject { described_class.new.type }
92
+
93
+ it 'returns the type of the model instance' do
94
+ subject.must_equal(:member)
95
+ end
96
+ end
47
97
  end
48
98
  end
@@ -19,8 +19,60 @@ module Troo
19
19
  end
20
20
 
21
21
  module Troo
22
- describe Formatter do
23
- let(:described_class) { Formatter }
22
+ describe Wordwrap do
23
+ let(:described_class) { Wordwrap }
24
+ let(:value) do
25
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' \
26
+ "Curabitur aliquet turpis id dui condimentum elementum.\n" \
27
+ 'Pellentesque blandit vulputate imperdiet. Quisque ut arcu ' \
28
+ "dolor. Morbi nec vulputate purus.\n\nQuisque porta feugiat " \
29
+ 'egestas. Aenean ac ipsum varius, lobortis lacus at, mattis ' \
30
+ "est.\nQuisque viverra facilisis tortor, id convallis metus " \
31
+ 'laoreet quis. Curabitur auctor nunc blandit enim volutpat ' \
32
+ 'hendrerit. Phasellus accumsan tempor iaculis. Ut in semper ' \
33
+ "massa. Cras quis viverra elit.\n\nInteger vitae mattis est. " \
34
+ 'Cras id nisl porttitor lectus placerat gravida sit amet ' \
35
+ "quis diam.\n\nDonec mollis, nisi sit amet congue sagittis, " \
36
+ 'sapien magna rhoncus justo, vel molestie metus sapien eget ' \
37
+ "libero.\n\n\n"
38
+ end
39
+ let(:options) { {} }
40
+
41
+ describe '#wordwrap' do
42
+ let(:formatted_value) do
43
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " \
44
+ "Curabitur\naliquet turpis id dui condimentum elementum.\n" \
45
+ "Pellentesque blandit vulputate imperdiet. Quisque ut arcu " \
46
+ "dolor.\nMorbi nec vulputate purus.\n\nQuisque porta " \
47
+ "feugiat egestas. Aenean ac ipsum varius, lobortis\nlacus " \
48
+ "at, mattis est.\nQuisque viverra facilisis tortor, id " \
49
+ "convallis metus laoreet quis.\nCurabitur auctor nunc " \
50
+ "blandit enim volutpat hendrerit. Phasellus\naccumsan " \
51
+ "tempor iaculis. Ut in semper massa. Cras quis viverra " \
52
+ "elit.\n\nInteger vitae mattis est. Cras id nisl porttitor " \
53
+ "lectus placerat\ngravida sit amet quis diam.\n\nDonec " \
54
+ "mollis, nisi sit amet congue sagittis, sapien magna " \
55
+ "rhoncus\njusto, vel molestie metus sapien eget libero."
56
+ end
57
+
58
+ subject { described_class.this(value, options) }
59
+
60
+ it 'returns formatted text' do
61
+ subject.must_equal(formatted_value)
62
+ end
63
+
64
+ context 'when the content should be pruned' do
65
+ let(:options) { { width: 70, prune: true } }
66
+ let(:formatted_value) do
67
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' \
68
+ " Curabitur a...\e[0m"
69
+ end
70
+
71
+ it 'returns formatted text' do
72
+ subject.must_equal(formatted_value)
73
+ end
74
+ end
75
+ end
24
76
  end
25
77
  end
26
78