mavenlink 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +3 -0
  6. data/README.md +241 -0
  7. data/Rakefile +28 -0
  8. data/bin/mavenlink-console +18 -0
  9. data/doc/ml_logo_lb-primary.png +0 -0
  10. data/lib/config/specification.yml +1665 -0
  11. data/lib/mavenlink.rb +134 -0
  12. data/lib/mavenlink/account_invitation.rb +4 -0
  13. data/lib/mavenlink/account_membership.rb +4 -0
  14. data/lib/mavenlink/additional_item.rb +4 -0
  15. data/lib/mavenlink/assignment.rb +5 -0
  16. data/lib/mavenlink/attachment.rb +11 -0
  17. data/lib/mavenlink/backup_approver_association.rb +4 -0
  18. data/lib/mavenlink/client.rb +116 -0
  19. data/lib/mavenlink/concerns/custom_fieldable.rb +9 -0
  20. data/lib/mavenlink/concerns/indestructible.rb +11 -0
  21. data/lib/mavenlink/concerns/locked_record.rb +30 -0
  22. data/lib/mavenlink/cost_rate.rb +4 -0
  23. data/lib/mavenlink/custom_field.rb +4 -0
  24. data/lib/mavenlink/custom_field_choice.rb +5 -0
  25. data/lib/mavenlink/custom_field_value.rb +4 -0
  26. data/lib/mavenlink/errors.rb +47 -0
  27. data/lib/mavenlink/expense.rb +4 -0
  28. data/lib/mavenlink/expense_category.rb +4 -0
  29. data/lib/mavenlink/expense_report_submission.rb +7 -0
  30. data/lib/mavenlink/external_payment.rb +4 -0
  31. data/lib/mavenlink/external_reference.rb +24 -0
  32. data/lib/mavenlink/fixed_fee_item.rb +4 -0
  33. data/lib/mavenlink/holiday.rb +4 -0
  34. data/lib/mavenlink/holiday_calendar.rb +4 -0
  35. data/lib/mavenlink/holiday_calendar_association.rb +4 -0
  36. data/lib/mavenlink/holiday_calendar_membership.rb +4 -0
  37. data/lib/mavenlink/invoice.rb +4 -0
  38. data/lib/mavenlink/logger.rb +62 -0
  39. data/lib/mavenlink/model.rb +279 -0
  40. data/lib/mavenlink/organization.rb +4 -0
  41. data/lib/mavenlink/organization_membership.rb +4 -0
  42. data/lib/mavenlink/participation.rb +4 -0
  43. data/lib/mavenlink/post.rb +4 -0
  44. data/lib/mavenlink/project_template.rb +4 -0
  45. data/lib/mavenlink/project_template_assignment.rb +4 -0
  46. data/lib/mavenlink/railtie.rb +7 -0
  47. data/lib/mavenlink/rate_card.rb +4 -0
  48. data/lib/mavenlink/rate_card_role.rb +4 -0
  49. data/lib/mavenlink/rate_card_set.rb +4 -0
  50. data/lib/mavenlink/rate_card_set_version.rb +30 -0
  51. data/lib/mavenlink/rate_card_version.rb +4 -0
  52. data/lib/mavenlink/request.rb +241 -0
  53. data/lib/mavenlink/resolution.rb +4 -0
  54. data/lib/mavenlink/response.rb +22 -0
  55. data/lib/mavenlink/role.rb +5 -0
  56. data/lib/mavenlink/settings.rb +11 -0
  57. data/lib/mavenlink/skill.rb +4 -0
  58. data/lib/mavenlink/skill_category.rb +4 -0
  59. data/lib/mavenlink/skill_membership.rb +4 -0
  60. data/lib/mavenlink/specificators/association.rb +13 -0
  61. data/lib/mavenlink/specificators/attribute.rb +13 -0
  62. data/lib/mavenlink/specificators/base.rb +24 -0
  63. data/lib/mavenlink/specificators/validation.rb +27 -0
  64. data/lib/mavenlink/status_report.rb +4 -0
  65. data/lib/mavenlink/story.rb +8 -0
  66. data/lib/mavenlink/story_allocation_day.rb +5 -0
  67. data/lib/mavenlink/story_dependency.rb +5 -0
  68. data/lib/mavenlink/story_task.rb +5 -0
  69. data/lib/mavenlink/tag.rb +5 -0
  70. data/lib/mavenlink/time_adjustment.rb +4 -0
  71. data/lib/mavenlink/time_entry.rb +4 -0
  72. data/lib/mavenlink/time_off_entry.rb +4 -0
  73. data/lib/mavenlink/timesheet_submission.rb +4 -0
  74. data/lib/mavenlink/user.rb +5 -0
  75. data/lib/mavenlink/vendor.rb +4 -0
  76. data/lib/mavenlink/workspace.rb +21 -0
  77. data/lib/mavenlink/workspace_group.rb +5 -0
  78. data/lib/mavenlink/workspace_invoice_preference.rb +4 -0
  79. data/lib/mavenlink/workweek.rb +4 -0
  80. data/lib/mavenlink/workweek_membership.rb +4 -0
  81. data/mavenlink.gemspec +29 -0
  82. data/spec/lib/mavenlink/account_membership_spec.rb +8 -0
  83. data/spec/lib/mavenlink/assignment_spec.rb +17 -0
  84. data/spec/lib/mavenlink/attachment_spec.rb +30 -0
  85. data/spec/lib/mavenlink/backup_approver_association_spec.rb +9 -0
  86. data/spec/lib/mavenlink/client_spec.rb +187 -0
  87. data/spec/lib/mavenlink/concerns/indestructible_spec.rb +13 -0
  88. data/spec/lib/mavenlink/concerns/locked_record_spec.rb +28 -0
  89. data/spec/lib/mavenlink/cost_rate_spec.rb +9 -0
  90. data/spec/lib/mavenlink/custom_field_value_spec.rb +10 -0
  91. data/spec/lib/mavenlink/expense_report_submission_spec.rb +16 -0
  92. data/spec/lib/mavenlink/expense_spec.rb +23 -0
  93. data/spec/lib/mavenlink/external_references_spec.rb +144 -0
  94. data/spec/lib/mavenlink/holiday_calendar_association_spec.rb +8 -0
  95. data/spec/lib/mavenlink/holiday_calendar_membership_spec.rb +8 -0
  96. data/spec/lib/mavenlink/holiday_spec.rb +7 -0
  97. data/spec/lib/mavenlink/invalid_request_error_spec.rb +9 -0
  98. data/spec/lib/mavenlink/invoice_spec.rb +176 -0
  99. data/spec/lib/mavenlink/model_spec.rb +439 -0
  100. data/spec/lib/mavenlink/post_spec.rb +23 -0
  101. data/spec/lib/mavenlink/rate_card_set_version_spec.rb +119 -0
  102. data/spec/lib/mavenlink/record_invalid_error_spec.rb +16 -0
  103. data/spec/lib/mavenlink/record_not_found_error_spec.rb +9 -0
  104. data/spec/lib/mavenlink/request_spec.rb +381 -0
  105. data/spec/lib/mavenlink/response_spec.rb +50 -0
  106. data/spec/lib/mavenlink/role_spec.rb +9 -0
  107. data/spec/lib/mavenlink/settings_spec.rb +23 -0
  108. data/spec/lib/mavenlink/skill_category_spec.rb +7 -0
  109. data/spec/lib/mavenlink/skill_membership_spec.rb +9 -0
  110. data/spec/lib/mavenlink/skill_spec.rb +8 -0
  111. data/spec/lib/mavenlink/specificators/association_spec.rb +25 -0
  112. data/spec/lib/mavenlink/specificators/attribute_spec.rb +25 -0
  113. data/spec/lib/mavenlink/specificators/validation_spec.rb +39 -0
  114. data/spec/lib/mavenlink/story_allocation_day_spec.rb +64 -0
  115. data/spec/lib/mavenlink/story_dependency_spec.rb +16 -0
  116. data/spec/lib/mavenlink/story_spec.rb +69 -0
  117. data/spec/lib/mavenlink/time_adjustment_spec.rb +13 -0
  118. data/spec/lib/mavenlink/time_entry_spec.rb +43 -0
  119. data/spec/lib/mavenlink/time_off_entry_spec.rb +9 -0
  120. data/spec/lib/mavenlink/user_spec.rb +138 -0
  121. data/spec/lib/mavenlink/workspace_group_spec.rb +25 -0
  122. data/spec/lib/mavenlink/workspace_spec.rb +431 -0
  123. data/spec/lib/mavenlink_spec.rb +43 -0
  124. data/spec/spec_helper.rb +31 -0
  125. data/spec/support/shared_examples.rb +148 -0
  126. metadata +267 -0
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mavenlink::Post, stub_requests: true do
4
+ it_should_behave_like 'model', 'posts'
5
+
6
+ describe 'validations' do
7
+ it { should validate_presence_of :message }
8
+ it { should validate_presence_of :workspace_id }
9
+ end
10
+
11
+ describe 'associations' do
12
+ it { should respond_to :subject }
13
+ it { should respond_to :user }
14
+ it { should respond_to :workspace }
15
+ it { should respond_to :story }
16
+ it { should respond_to :replies }
17
+ it { should respond_to :newest_reply }
18
+ it { should respond_to :newest_reply_user }
19
+ it { should respond_to :recipients }
20
+ it { should respond_to :google_documents }
21
+ it { should respond_to :attachments }
22
+ end
23
+ end
@@ -0,0 +1,119 @@
1
+ require "spec_helper"
2
+
3
+ describe Mavenlink::RateCardSetVersion, stub_requests: true do
4
+ subject { described_class.new(id: "7", rate_card_set_id: "1") }
5
+ let(:client) { double(Mavenlink::Client) }
6
+
7
+ describe "#publish" do
8
+ context "when the publish is successful" do
9
+ let(:publish_response) { { "activated" => true } }
10
+
11
+ before do
12
+ allow(subject).to receive(:persisted?) { true }
13
+ stub_request :put, "/api/v1/rate_card_set_versions/7/publish", publish_response
14
+ end
15
+
16
+ it "returns true" do
17
+ expect(subject.publish).to eq(true)
18
+ end
19
+ end
20
+
21
+ context "when the publish fails" do
22
+ before do
23
+ allow(subject).to receive(:client) { client }
24
+ allow(client).to receive(:put).and_raise(Faraday::Error)
25
+ end
26
+
27
+ it "returns false" do
28
+ expect(subject.publish).to eq(false)
29
+ end
30
+ end
31
+
32
+ context "when the record is not persisted" do
33
+ before do
34
+ allow(subject).to receive(:persisted?) { false }
35
+ end
36
+
37
+ it "returns false" do
38
+ expect(subject.publish).to eq(false)
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "#clone" do
44
+ context "when `clone` is successful" do
45
+ let(:clone_response) { {
46
+ "count" => 1,
47
+ "results" => [
48
+ {
49
+ "key" => "rate_card_set_versions",
50
+ "id" => "8"
51
+ }
52
+ ],
53
+ "rate_card_set_versions" => {
54
+ "8" => {
55
+ "id" => "8",
56
+ "effective_date" => "2018-09-04",
57
+ "rate_card_set_id" => "1"
58
+ }
59
+ }
60
+ } }
61
+
62
+ before do
63
+ stub_request :post, "/api/v1/rate_card_set_versions", clone_response
64
+ end
65
+
66
+ it "returns the new rate card set version" do
67
+ expect_any_instance_of(Mavenlink::Client).to receive(:post).with("rate_card_set_versions",
68
+ clone_id: subject.id,
69
+ rate_card_set_version: {
70
+ rate_card_set_id: subject.rate_card_set_id,
71
+ effective_date: nil
72
+ }).and_call_original
73
+ expect(subject.clone_version).to eq(described_class.new(id: "8", effective_date: "2018-09-04", rate_card_set_id: "1"))
74
+ end
75
+
76
+ it "sends the effective_date parameter" do
77
+ date = Date.new(2018, 9, 5)
78
+ expect_any_instance_of(Mavenlink::Client).to receive(:post).with("rate_card_set_versions",
79
+ clone_id: subject.id,
80
+ rate_card_set_version: {
81
+ rate_card_set_id: subject.rate_card_set_id,
82
+ effective_date: date
83
+ }).and_call_original
84
+ subject.clone_version(date)
85
+ end
86
+ end
87
+
88
+ context "when `clone` is not successful" do
89
+ context "when the response is an error" do
90
+ let(:clone_response) { {
91
+ "errors" => [
92
+ {
93
+ "type" => "system",
94
+ "message" => "not found"
95
+ }
96
+ ],
97
+ } }
98
+
99
+ before do
100
+ stub_request :post, "/api/v1/rate_card_set_versions", clone_response
101
+ end
102
+
103
+ it "returns false" do
104
+ expect(subject.clone_version).to eq(false)
105
+ end
106
+ end
107
+
108
+ context "when the record is not persisted" do
109
+ before do
110
+ allow(subject).to receive(:persisted?) { false }
111
+ end
112
+
113
+ it "returns false" do
114
+ expect(subject.clone_version).to eq(false)
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mavenlink::RecordInvalidError do
4
+ let(:client) { Object.new }
5
+ let(:record) { Mavenlink::Workspace.new({ title: nil }, nil, client) }
6
+ before { record.valid? }
7
+
8
+ subject { described_class.new(record) }
9
+
10
+ its(:record) { should == record }
11
+ its(:message) { should == "Title can't be blank" }
12
+
13
+ specify do
14
+ expect { raise subject }.to raise_error described_class, /Title.*blank/
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mavenlink::RecordNotFoundError do
4
+ subject { described_class.new({response: :data}) }
5
+
6
+ specify do
7
+ expect { raise subject }.to raise_error Mavenlink::RecordNotFoundError, /response.*data/
8
+ end
9
+ end
@@ -0,0 +1,381 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mavenlink::Request, stub_requests: true do
4
+ let(:collection_name) { 'workspaces' }
5
+ let(:client) { Mavenlink.client }
6
+
7
+ subject(:request) { described_class.new(collection_name, client) }
8
+
9
+ let(:response) {
10
+ {
11
+ 'count' => 2,
12
+ 'results' => [{'key' => 'workspaces', 'id' => '7'}, {'key' => 'workspaces', 'id' => '9'}],
13
+ 'workspaces' => {
14
+ '7' => {'title' => 'My new project'},
15
+ '9' => {'title' => 'My second project'},
16
+ }
17
+ }
18
+ }
19
+
20
+ let(:one_record_response) {
21
+ {
22
+ 'count' => 1,
23
+ 'results' => [{'key' => 'workspaces', 'id' => '7'}],
24
+ 'workspaces' => {
25
+ '7' => {'title' => 'My new project'}
26
+ }
27
+ }
28
+ }
29
+
30
+ let(:first_page) {
31
+ {
32
+ 'count' => 3,
33
+ 'results' => [{'key' => 'workspaces', 'id' => '7'}, {'key' => 'workspaces', 'id' => '9'}],
34
+ 'workspaces' => {
35
+ '7' => {'title' => 'My new project!'},
36
+ '9' => {'title' => 'My second project!'},
37
+ }
38
+ }
39
+ }
40
+
41
+ let(:second_page) {
42
+ {
43
+ 'count' => 3,
44
+ 'results' => [{'key' => 'workspaces', 'id' => '10'}],
45
+ 'workspaces' => {
46
+ '10' => {'title' => 'My last project!'}
47
+ }
48
+ }
49
+ }
50
+
51
+ let(:third_invalid_page) {
52
+ {
53
+ 'count' => 3,
54
+ 'results' => [{'key' => 'workspaces', 'id' => '11'}],
55
+ 'workspaces' => {
56
+ '11' => {'title' => 'Not existed project'}
57
+ }
58
+ }
59
+ }
60
+
61
+ before do
62
+ stub_request :get, '/api/v1/workspaces?page=1', first_page
63
+ stub_request :get, '/api/v1/workspaces?page=2', second_page
64
+ stub_request :get, '/api/v1/workspaces?page=3', third_invalid_page
65
+ stub_request :get, '/api/v1/workspaces?only=7', one_record_response
66
+ stub_request :get, '/api/v1/workspaces?only=8', { 'count' => 0, 'results' => [] }
67
+ stub_request :put, '/api/v1/workspaces/7', one_record_response
68
+ stub_request :delete, '/api/v1/workspaces/7', {}
69
+ stub_request :get, '/api/v1/workspaces', response
70
+ stub_request :post, '/api/v1/workspaces', one_record_response
71
+ end
72
+
73
+ describe '#initialize' do
74
+ let(:client) { double('client') }
75
+
76
+ its(:collection_name) { should == 'workspaces' }
77
+ its(:client) { should == client }
78
+ its(:scope) { should == {} }
79
+
80
+ context 'no client specified' do
81
+ subject { described_class.new(collection_name) }
82
+ its(:client) { should == Mavenlink.client }
83
+ end
84
+ end
85
+
86
+ describe '#current_page' do
87
+ specify do
88
+ expect(request.current_page).to eq(1)
89
+ end
90
+
91
+ specify do
92
+ expect(request.page(2).current_page).to eq(2)
93
+ end
94
+ end
95
+
96
+ describe '#chain' do
97
+ specify do
98
+ expect(request.chain({})).to be_a described_class
99
+ end
100
+
101
+ specify do
102
+ expect(request.chain({})).not_to eq(request)
103
+ end
104
+
105
+ it 'does not change source scope' do
106
+ expect { request.chain({changed: true}) }.not_to change { request.scope }
107
+ end
108
+
109
+ it 'merges passed scope' do
110
+ expect(request.chain(changed: true).scope).to have_key(:changed)
111
+ expect(request.chain(changed: true).scope).to have_key('changed')
112
+ end
113
+
114
+ it 'assigns the same collection name' do
115
+ expect(request.chain({}).collection_name).to eq(request.collection_name)
116
+ end
117
+
118
+ it 'assigns the same client' do
119
+ expect(request.chain({}).client).to eq(request.client)
120
+ end
121
+ end
122
+
123
+ describe '#only' do
124
+ context 'empty input' do
125
+ it 'resets the scope' do
126
+ expect(request.only(1).only([]).scope).not_to have_key(:only)
127
+ end
128
+ end
129
+ end
130
+
131
+ describe '#without' do
132
+ it 'removes condition from the scope' do
133
+ expect(subject.only(1).without(:only).scope).not_to have_key(:only)
134
+ end
135
+ end
136
+
137
+ describe '#find' do
138
+ context 'existed record' do
139
+ it 'returns record wrapped in a model' do
140
+ expect(request.find(7)).to be_a Mavenlink::Workspace
141
+ end
142
+ end
143
+
144
+ context 'record does not exist' do
145
+ specify do
146
+ expect(request.find(8)).to be_nil
147
+ end
148
+ end
149
+ end
150
+
151
+ describe '#search' do
152
+ specify do
153
+ expect(request.search('text').scope).to include(search: 'text')
154
+ end
155
+ end
156
+
157
+ describe '#filter' do
158
+ specify do
159
+ expect(request.filter(recent: true).scope).to include(recent: true)
160
+ end
161
+ end
162
+
163
+ describe '#include' do
164
+ specify do
165
+ expect(request.include(:users).scope).to include(include: 'users')
166
+ end
167
+
168
+ specify do
169
+ expect(request.include('users').scope).to include(include: 'users')
170
+ end
171
+
172
+ specify do
173
+ expect(request.include(%w(users clients)).scope).to include(include: 'users,clients')
174
+ end
175
+
176
+ specify do
177
+ expect(request.include('users', 'clients').scope).to include(include: 'users,clients')
178
+ end
179
+ end
180
+
181
+ describe '#page' do
182
+ specify do
183
+ expect(request.page(5).scope).to include(page: 5)
184
+ end
185
+ end
186
+
187
+ describe '#per_page' do
188
+ specify do
189
+ expect(request.per_page(5).scope).to include(per_page: 5)
190
+ end
191
+ end
192
+
193
+ describe '#limit' do
194
+ specify do
195
+ expect(request.limit(5).scope).to include(limit: 5)
196
+ end
197
+ end
198
+
199
+ describe '#offset' do
200
+ specify do
201
+ expect(request.offset(5).scope).to include(offset: 5)
202
+ end
203
+ end
204
+
205
+ describe '#order' do
206
+ specify do
207
+ expect(request.order(:id, :desc).scope).to include(order: 'id:desc')
208
+ end
209
+
210
+ specify do
211
+ expect(request.order(:id, 'desc').scope).to include(order: 'id:desc')
212
+ end
213
+
214
+ specify do
215
+ expect(request.order(:id, 'DESC').scope).to include(order: 'id:desc')
216
+ end
217
+
218
+ specify do
219
+ expect(request.order(:id, true).scope).to include(order: 'id:desc')
220
+ end
221
+
222
+ specify do
223
+ expect(request.order(:id, false).scope).to include(order: 'id')
224
+ end
225
+
226
+ specify do
227
+ expect(request.order(:id, 'asc').scope).to include(order: 'id')
228
+ end
229
+
230
+ specify do
231
+ expect(request.order(:id, 'ASC').scope).to include(order: 'id')
232
+ end
233
+
234
+ specify do
235
+ expect(request.order(:id, :asc).scope).to include(order: 'id')
236
+ end
237
+ end
238
+
239
+ describe '#build' do
240
+ it 'returns a model object of the same type as the collection name' do
241
+ expect(request.build(title: 'New Workspace')).to be_a Mavenlink::Workspace
242
+ end
243
+ end
244
+
245
+ describe '#create' do
246
+ specify do
247
+ expect(request.create({})).to be_a Mavenlink::Response
248
+ end
249
+
250
+ specify do
251
+ expect(request.create({})).to eq(one_record_response)
252
+ end
253
+ end
254
+
255
+ describe '#update' do
256
+ specify do
257
+ expect(request.only(7).update(title: 'New title')).to be_a Mavenlink::Response
258
+ end
259
+
260
+ specify do
261
+ expect(request.only(7).update(title: 'New title')).to eq(one_record_response)
262
+ end
263
+
264
+ context 'no id specified' do
265
+ specify do
266
+ # NOTE(SZ): should we raise InvalidRequestError instead?
267
+ expect { request.update(title: 'New one') }.to raise_error ArgumentError, /route.*ID/
268
+ end
269
+ end
270
+ end
271
+
272
+ describe '#delete' do
273
+ specify do
274
+ expect(request.only(7).delete).to be_blank
275
+ end
276
+
277
+ context 'no id specified' do
278
+ specify do
279
+ # NOTE(SZ): should we raise InvalidRequestError instead?
280
+ expect { request.delete }.to raise_error ArgumentError, /route.*ID/
281
+ end
282
+ end
283
+ end
284
+
285
+ describe '#response' do
286
+ subject { request.response }
287
+
288
+ specify do
289
+ expect(subject).to be_a Mavenlink::Response
290
+ end
291
+
292
+ specify do
293
+ expect(subject).to eq(response)
294
+ end
295
+ end
296
+
297
+ describe '#perform' do
298
+ specify do
299
+ expect(request.perform).to be_a Mavenlink::Response
300
+ end
301
+
302
+ specify do
303
+ expect(request.perform).to eq(response)
304
+ end
305
+
306
+ specify do
307
+ expect(request.perform { one_record_response }).to be_a Mavenlink::Response
308
+ end
309
+
310
+ specify do
311
+ expect(request.perform { one_record_response }).to eq(one_record_response)
312
+ end
313
+ end
314
+
315
+ describe '#results' do
316
+ specify do
317
+ expect(request.results).to have(2).workspaces
318
+ end
319
+
320
+ # NOTE(SZ): missing specs
321
+ end
322
+
323
+ describe '#reload' do
324
+ specify do
325
+ expect(request.reload).to have(2).workspaces
326
+ end
327
+
328
+ # NOTE(SZ): missing specs
329
+ end
330
+
331
+ describe '#total_pages' do
332
+ specify do
333
+ expect(request.total_pages).to eq(1)
334
+ end
335
+
336
+ # NOTE(SZ): missing specs
337
+ end
338
+
339
+ describe '#limit_value' do
340
+ specify do
341
+ expect(request.limit_value).to eq(2)
342
+ end
343
+
344
+ specify do
345
+ expect(request.limit(5).limit_value).to eq(5)
346
+ end
347
+ end
348
+
349
+ describe '#scoped' do
350
+ specify do
351
+ expect(request.scoped).to eq(request)
352
+ end
353
+ end
354
+
355
+ describe '#to_hash' do
356
+ specify do
357
+ expect(request.to_hash).to eq(request.scope)
358
+ end
359
+ end
360
+
361
+ describe '#inspect' do
362
+ specify do
363
+ expect(request.inspect).to eq('#<Mavenlink::Request [<Mavenlink::Workspace:>, <Mavenlink::Workspace:>]>')
364
+ end
365
+ end
366
+
367
+ describe '#each_page' do
368
+ specify do
369
+ expect(subject.each_page.to_a).to eq [[{"title"=>"My new project!"}, {"title"=>"My second project!"}],
370
+ [{"title"=>"My last project!"}]]
371
+ end
372
+
373
+ specify do
374
+ subject.each_page.to_a.flatten.tap do |records|
375
+ expect(records[0]).to be_a Mavenlink::Model
376
+ expect(records[1]).to be_a Mavenlink::Model
377
+ expect(records[2]).to be_a Mavenlink::Model
378
+ end
379
+ end
380
+ end
381
+ end