mavenlink 0.0.1 → 0.2.0
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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +10 -3
- data/Gemfile.lock +38 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +69 -0
- data/Rakefile +50 -24
- data/TODO +18 -0
- data/VERSION +1 -0
- data/lib/mavenlink.rb +2 -134
- data/lib/mavenlink/base.rb +184 -0
- data/lib/mavenlink/client.rb +202 -96
- data/mavenlink.gemspec +85 -19
- data/spec/mavenlink/base_spec.rb +223 -0
- data/spec/mavenlink/client_spec.rb +183 -0
- data/spec/spec_helper.rb +13 -25
- metadata +243 -232
- checksums.yaml +0 -7
- data/.gitignore +0 -11
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/README.md +0 -241
- data/bin/mavenlink-console +0 -18
- data/doc/ml_logo_lb-primary.png +0 -0
- data/lib/config/specification.yml +0 -1665
- data/lib/mavenlink/account_invitation.rb +0 -4
- data/lib/mavenlink/account_membership.rb +0 -4
- data/lib/mavenlink/additional_item.rb +0 -4
- data/lib/mavenlink/assignment.rb +0 -5
- data/lib/mavenlink/attachment.rb +0 -11
- data/lib/mavenlink/backup_approver_association.rb +0 -4
- data/lib/mavenlink/concerns/custom_fieldable.rb +0 -9
- data/lib/mavenlink/concerns/indestructible.rb +0 -11
- data/lib/mavenlink/concerns/locked_record.rb +0 -30
- data/lib/mavenlink/cost_rate.rb +0 -4
- data/lib/mavenlink/custom_field.rb +0 -4
- data/lib/mavenlink/custom_field_choice.rb +0 -5
- data/lib/mavenlink/custom_field_value.rb +0 -4
- data/lib/mavenlink/errors.rb +0 -47
- data/lib/mavenlink/expense.rb +0 -4
- data/lib/mavenlink/expense_category.rb +0 -4
- data/lib/mavenlink/expense_report_submission.rb +0 -7
- data/lib/mavenlink/external_payment.rb +0 -4
- data/lib/mavenlink/external_reference.rb +0 -24
- data/lib/mavenlink/fixed_fee_item.rb +0 -4
- data/lib/mavenlink/holiday.rb +0 -4
- data/lib/mavenlink/holiday_calendar.rb +0 -4
- data/lib/mavenlink/holiday_calendar_association.rb +0 -4
- data/lib/mavenlink/holiday_calendar_membership.rb +0 -4
- data/lib/mavenlink/invoice.rb +0 -4
- data/lib/mavenlink/logger.rb +0 -62
- data/lib/mavenlink/model.rb +0 -279
- data/lib/mavenlink/organization.rb +0 -4
- data/lib/mavenlink/organization_membership.rb +0 -4
- data/lib/mavenlink/participation.rb +0 -4
- data/lib/mavenlink/post.rb +0 -4
- data/lib/mavenlink/project_template.rb +0 -4
- data/lib/mavenlink/project_template_assignment.rb +0 -4
- data/lib/mavenlink/railtie.rb +0 -7
- data/lib/mavenlink/rate_card.rb +0 -4
- data/lib/mavenlink/rate_card_role.rb +0 -4
- data/lib/mavenlink/rate_card_set.rb +0 -4
- data/lib/mavenlink/rate_card_set_version.rb +0 -30
- data/lib/mavenlink/rate_card_version.rb +0 -4
- data/lib/mavenlink/request.rb +0 -241
- data/lib/mavenlink/resolution.rb +0 -4
- data/lib/mavenlink/response.rb +0 -22
- data/lib/mavenlink/role.rb +0 -5
- data/lib/mavenlink/settings.rb +0 -11
- data/lib/mavenlink/skill.rb +0 -4
- data/lib/mavenlink/skill_category.rb +0 -4
- data/lib/mavenlink/skill_membership.rb +0 -4
- data/lib/mavenlink/specificators/association.rb +0 -13
- data/lib/mavenlink/specificators/attribute.rb +0 -13
- data/lib/mavenlink/specificators/base.rb +0 -24
- data/lib/mavenlink/specificators/validation.rb +0 -27
- data/lib/mavenlink/status_report.rb +0 -4
- data/lib/mavenlink/story.rb +0 -8
- data/lib/mavenlink/story_allocation_day.rb +0 -5
- data/lib/mavenlink/story_dependency.rb +0 -5
- data/lib/mavenlink/story_task.rb +0 -5
- data/lib/mavenlink/tag.rb +0 -5
- data/lib/mavenlink/time_adjustment.rb +0 -4
- data/lib/mavenlink/time_entry.rb +0 -4
- data/lib/mavenlink/time_off_entry.rb +0 -4
- data/lib/mavenlink/timesheet_submission.rb +0 -4
- data/lib/mavenlink/user.rb +0 -5
- data/lib/mavenlink/vendor.rb +0 -4
- data/lib/mavenlink/workspace.rb +0 -21
- data/lib/mavenlink/workspace_group.rb +0 -5
- data/lib/mavenlink/workspace_invoice_preference.rb +0 -4
- data/lib/mavenlink/workweek.rb +0 -4
- data/lib/mavenlink/workweek_membership.rb +0 -4
- data/spec/lib/mavenlink/account_membership_spec.rb +0 -8
- data/spec/lib/mavenlink/assignment_spec.rb +0 -17
- data/spec/lib/mavenlink/attachment_spec.rb +0 -30
- data/spec/lib/mavenlink/backup_approver_association_spec.rb +0 -9
- data/spec/lib/mavenlink/client_spec.rb +0 -187
- data/spec/lib/mavenlink/concerns/indestructible_spec.rb +0 -13
- data/spec/lib/mavenlink/concerns/locked_record_spec.rb +0 -28
- data/spec/lib/mavenlink/cost_rate_spec.rb +0 -9
- data/spec/lib/mavenlink/custom_field_value_spec.rb +0 -10
- data/spec/lib/mavenlink/expense_report_submission_spec.rb +0 -16
- data/spec/lib/mavenlink/expense_spec.rb +0 -23
- data/spec/lib/mavenlink/external_references_spec.rb +0 -144
- data/spec/lib/mavenlink/holiday_calendar_association_spec.rb +0 -8
- data/spec/lib/mavenlink/holiday_calendar_membership_spec.rb +0 -8
- data/spec/lib/mavenlink/holiday_spec.rb +0 -7
- data/spec/lib/mavenlink/invalid_request_error_spec.rb +0 -9
- data/spec/lib/mavenlink/invoice_spec.rb +0 -176
- data/spec/lib/mavenlink/model_spec.rb +0 -439
- data/spec/lib/mavenlink/post_spec.rb +0 -23
- data/spec/lib/mavenlink/rate_card_set_version_spec.rb +0 -119
- data/spec/lib/mavenlink/record_invalid_error_spec.rb +0 -16
- data/spec/lib/mavenlink/record_not_found_error_spec.rb +0 -9
- data/spec/lib/mavenlink/request_spec.rb +0 -381
- data/spec/lib/mavenlink/response_spec.rb +0 -50
- data/spec/lib/mavenlink/role_spec.rb +0 -9
- data/spec/lib/mavenlink/settings_spec.rb +0 -23
- data/spec/lib/mavenlink/skill_category_spec.rb +0 -7
- data/spec/lib/mavenlink/skill_membership_spec.rb +0 -9
- data/spec/lib/mavenlink/skill_spec.rb +0 -8
- data/spec/lib/mavenlink/specificators/association_spec.rb +0 -25
- data/spec/lib/mavenlink/specificators/attribute_spec.rb +0 -25
- data/spec/lib/mavenlink/specificators/validation_spec.rb +0 -39
- data/spec/lib/mavenlink/story_allocation_day_spec.rb +0 -64
- data/spec/lib/mavenlink/story_dependency_spec.rb +0 -16
- data/spec/lib/mavenlink/story_spec.rb +0 -69
- data/spec/lib/mavenlink/time_adjustment_spec.rb +0 -13
- data/spec/lib/mavenlink/time_entry_spec.rb +0 -43
- data/spec/lib/mavenlink/time_off_entry_spec.rb +0 -9
- data/spec/lib/mavenlink/user_spec.rb +0 -138
- data/spec/lib/mavenlink/workspace_group_spec.rb +0 -25
- data/spec/lib/mavenlink/workspace_spec.rb +0 -431
- data/spec/lib/mavenlink_spec.rb +0 -43
- data/spec/support/shared_examples.rb +0 -148
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::CustomFieldValue, stub_requests: true do
|
|
4
|
-
it_should_behave_like 'model', 'custom_field_values'
|
|
5
|
-
|
|
6
|
-
describe 'associations' do
|
|
7
|
-
it { should respond_to :setter }
|
|
8
|
-
it { should respond_to :custom_field }
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::ExpenseReportSubmission, stub_requests: true do
|
|
4
|
-
let(:report) { described_class.new(id: 4) }
|
|
5
|
-
|
|
6
|
-
describe "#reject_submission" do
|
|
7
|
-
before do
|
|
8
|
-
allow(report.client).to receive(:put)
|
|
9
|
-
report.reject_submission
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "uses a put method with the correct api endpoint and id" do
|
|
13
|
-
expect(report.client).to have_received(:put).with("expense_report_submissions/4/reject")
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::Expense, stub_requests: true do
|
|
4
|
-
it_should_behave_like 'model', 'expenses'
|
|
5
|
-
|
|
6
|
-
describe 'validations' do
|
|
7
|
-
it { should validate_presence_of :workspace_id }
|
|
8
|
-
it { should validate_presence_of :date }
|
|
9
|
-
it { should validate_presence_of :category }
|
|
10
|
-
it { should validate_presence_of :amount_in_cents }
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
describe 'associations' do
|
|
14
|
-
it { should respond_to :expense_category }
|
|
15
|
-
it { should respond_to :workspace }
|
|
16
|
-
it { should respond_to :user }
|
|
17
|
-
it { should respond_to :receipt }
|
|
18
|
-
it { should respond_to :external_references }
|
|
19
|
-
it { should respond_to :active_submission }
|
|
20
|
-
it { should respond_to :role }
|
|
21
|
-
it { should respond_to :vendor }
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::ExternalReference, stub_requests: true do
|
|
4
|
-
let(:model) { described_class }
|
|
5
|
-
let(:external_reference) { model.new(attributes) }
|
|
6
|
-
let(:uri) { "external_references/create_or_update" }
|
|
7
|
-
let(:attributes) {
|
|
8
|
-
{
|
|
9
|
-
"subject_type" => "TimeEntry",
|
|
10
|
-
"subject_id" => 1,
|
|
11
|
-
"service_name" => "Netsuite",
|
|
12
|
-
"service_model_ref" => "1",
|
|
13
|
-
"service_model" => "TimeBill"
|
|
14
|
-
}.merge(attribute_options)
|
|
15
|
-
}
|
|
16
|
-
let(:attribute_options) { {} }
|
|
17
|
-
let(:response) do
|
|
18
|
-
{
|
|
19
|
-
"count" => 1,
|
|
20
|
-
"results" => [{"key" => "external_references", "id" => "7"}],
|
|
21
|
-
"external_references" => {
|
|
22
|
-
"7" => {
|
|
23
|
-
"id" => "7",
|
|
24
|
-
"subject_id" => "1",
|
|
25
|
-
"subject_type" => "TimeEntry",
|
|
26
|
-
"service_model_ref" => "1",
|
|
27
|
-
"service_name" => "Netsuite",
|
|
28
|
-
"service_model" => "TimeBill"
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
describe "validations" do
|
|
35
|
-
it { should validate_presence_of :service_model_ref }
|
|
36
|
-
it { should validate_presence_of :service_name }
|
|
37
|
-
it { should validate_presence_of :service_model }
|
|
38
|
-
it { should validate_presence_of :subject_id }
|
|
39
|
-
it { should validate_presence_of :subject_type }
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
describe "#save" do
|
|
43
|
-
before do
|
|
44
|
-
allow(external_reference.client).to receive(:post).and_call_original
|
|
45
|
-
stub_request :post, "/api/v1/external_references/create_or_update", response
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
context "when the model is valid" do
|
|
49
|
-
it "the record is valid" do
|
|
50
|
-
external_reference.save
|
|
51
|
-
expect(external_reference).to be_a model
|
|
52
|
-
expect(external_reference).to be_valid
|
|
53
|
-
expect(external_reference).to be_persisted
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "makes the request with the correct params" do
|
|
57
|
-
external_reference.save
|
|
58
|
-
expect(external_reference.client).to have_received(:post).with(uri, { external_reference: attributes })
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
it "returns true" do
|
|
62
|
-
expect(external_reference.save).to be_true
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "loads the response attributes into the integrated resource model" do
|
|
66
|
-
external_reference.save
|
|
67
|
-
expect(external_reference).to eq(response["external_references"]["7"])
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
context "when an invalid attribute is set on the model" do
|
|
72
|
-
let(:attribute_options) { { foo: 666 } }
|
|
73
|
-
|
|
74
|
-
it "the record is valid" do
|
|
75
|
-
external_reference.save
|
|
76
|
-
expect(external_reference).to be_a model
|
|
77
|
-
expect(external_reference).to be_valid
|
|
78
|
-
expect(external_reference).to be_persisted
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
it "ignores invalid attributes when making the request" do
|
|
82
|
-
external_reference.save
|
|
83
|
-
expect(external_reference.client).to have_received(:post).with(uri, { external_reference: attributes.except(:foo)})
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "returns true" do
|
|
87
|
-
expect(external_reference.save).to be_true
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
it "loads the response attributes into the integrated resource model" do
|
|
91
|
-
external_reference.save
|
|
92
|
-
expect(external_reference).to include(response["external_references"]["7"])
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
context "when required attributes are missing" do
|
|
97
|
-
let(:attribute_options) { { subject_type: nil } }
|
|
98
|
-
|
|
99
|
-
it "the record is not valid" do
|
|
100
|
-
external_reference.save
|
|
101
|
-
expect(external_reference).to be_a model
|
|
102
|
-
expect(external_reference).to_not be_valid
|
|
103
|
-
expect(external_reference).to_not be_persisted
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "does not make the request" do
|
|
107
|
-
external_reference.save
|
|
108
|
-
expect(external_reference.client).to_not have_received(:post)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "returns false" do
|
|
112
|
-
expect(external_reference.save).to be_false
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "logs an error on the modal" do
|
|
116
|
-
external_reference.save
|
|
117
|
-
expect(external_reference.errors.full_messages).to eq(["Subject type can't be blank"])
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
context "when the server responds with error" do
|
|
122
|
-
let(:response) do
|
|
123
|
-
{
|
|
124
|
-
"errors" => [
|
|
125
|
-
{
|
|
126
|
-
"type" => "syntax",
|
|
127
|
-
"message" => "Missing required parameters. Please see our documentation at http://developer.mavenlink.com"
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
}
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
after do
|
|
134
|
-
expect(external_reference).to be_a model
|
|
135
|
-
expect(external_reference).to be_valid
|
|
136
|
-
expect(external_reference).to_not be_persisted
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
it "raise a Mavenlink InvalidRequestError" do
|
|
140
|
-
expect { external_reference.save }.to raise_error Mavenlink::InvalidRequestError, /Missing required parameters/
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
end
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::Invoice, stub_requests: true do
|
|
4
|
-
subject { described_class.send(:new) }
|
|
5
|
-
|
|
6
|
-
describe 'associations' do
|
|
7
|
-
it { should respond_to :workspaces }
|
|
8
|
-
it { should respond_to :user }
|
|
9
|
-
it { should respond_to :recipient }
|
|
10
|
-
it { should respond_to :time_entries }
|
|
11
|
-
it { should respond_to :expenses }
|
|
12
|
-
it { should respond_to :fixed_fee_items }
|
|
13
|
-
it { should respond_to :additional_items }
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
let(:collection_name) { 'invoices' }
|
|
17
|
-
|
|
18
|
-
let(:model) { described_class }
|
|
19
|
-
|
|
20
|
-
let(:response) {
|
|
21
|
-
{
|
|
22
|
-
'count' => 1,
|
|
23
|
-
'results' => [{'key' => collection_name, 'id' => '7'}],
|
|
24
|
-
collection_name => {
|
|
25
|
-
'7' => {'title' => 'My new record', 'id' => '7'}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
before do
|
|
31
|
-
stub_request :get, "/api/v1/#{collection_name}?only=7", response
|
|
32
|
-
stub_request :get, "/api/v1/#{collection_name}?only=8", {'count' => 0, 'results' => []}
|
|
33
|
-
stub_request :post, "/api/v1/#{collection_name}", response
|
|
34
|
-
stub_request :delete, "/api/v1/#{collection_name}/4", {}
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
describe 'class methods' do
|
|
38
|
-
subject { model }
|
|
39
|
-
its(:collection_name) { should == collection_name }
|
|
40
|
-
|
|
41
|
-
describe '.scoped' do
|
|
42
|
-
subject { model.scoped }
|
|
43
|
-
|
|
44
|
-
it { should be_a Mavenlink::Request }
|
|
45
|
-
its(:collection_name) { should == collection_name }
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
describe '.find' do
|
|
49
|
-
specify do
|
|
50
|
-
expect(model.find(7)).to be_a model
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
specify do
|
|
54
|
-
expect(model.find(7).id).to eq('7')
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
specify do
|
|
58
|
-
expect(model.find(8)).to be_nil
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
describe '.models' do
|
|
63
|
-
specify do
|
|
64
|
-
expect(model.models).to be_empty
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
specify do
|
|
68
|
-
expect(Mavenlink::Model.models).to include({collection_name => model})
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
describe '.specification' do
|
|
73
|
-
specify do
|
|
74
|
-
expect(model.specification).to be_a Hash
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
specify do
|
|
78
|
-
expect(model.specification).not_to be_empty
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
describe '.attributes' do
|
|
83
|
-
specify do
|
|
84
|
-
expect(model.attributes).to be_an Array
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
specify do
|
|
88
|
-
expect(model.attributes).not_to be_empty
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
describe '.available_attributes' do
|
|
93
|
-
specify do
|
|
94
|
-
expect(model.available_attributes).to be_an Array
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
specify do
|
|
98
|
-
expect(model.available_attributes).not_to be_empty
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
describe '.wrap' do
|
|
103
|
-
context 'existing record' do
|
|
104
|
-
let(:brainstem_record) do
|
|
105
|
-
BrainstemAdaptor::Record.new(collection_name, '7', Mavenlink::Response.new(response))
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
specify do
|
|
109
|
-
expect(model.wrap(brainstem_record)).not_to be_a_new_record
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
specify do
|
|
113
|
-
expect(model.wrap(brainstem_record)).to be_a model
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
describe '#initialize' do
|
|
120
|
-
it 'accepts attributes' do
|
|
121
|
-
expect(model.send(:new, any_custom_key: 'value set')).to include(any_custom_key: 'value set')
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
describe '#persisted?' do
|
|
126
|
-
before do
|
|
127
|
-
@instance = model.new
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
context 'when the model does not have an ID' do
|
|
131
|
-
before do
|
|
132
|
-
expect(@instance.id).to be_nil
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
it 'is false' do
|
|
136
|
-
expect(@instance).to_not be_persisted
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
context 'when the model has an ID' do
|
|
141
|
-
before do
|
|
142
|
-
@instance.id = 5
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
it 'is true' do
|
|
146
|
-
expect(@instance).to be_persisted
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
describe '#new_record?' do
|
|
152
|
-
before do
|
|
153
|
-
@instance = model.new
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
context 'when the model does not have an ID' do
|
|
157
|
-
before do
|
|
158
|
-
expect(@instance.id).to be_nil
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it 'is true' do
|
|
162
|
-
expect(@instance).to be_new_record
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
context 'when the model has an ID' do
|
|
167
|
-
before do
|
|
168
|
-
@instance.id = 5
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
it 'is false' do
|
|
172
|
-
expect(@instance).to_not be_new_record
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
end
|
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Mavenlink::Model, stub_requests: true do
|
|
4
|
-
# see workspace_model_spec.rb
|
|
5
|
-
|
|
6
|
-
before do
|
|
7
|
-
Mavenlink.stub(:specification).and_return({ 'monkeys' => {'validations' => {'name' => {'presence' => true}},
|
|
8
|
-
'attributes' => ['name'],
|
|
9
|
-
'create_attributes' => ['name'],
|
|
10
|
-
'update_attributes' => ['name', 'age']} })
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
subject :model do
|
|
14
|
-
class Monkey < Mavenlink::Model
|
|
15
|
-
def self.name
|
|
16
|
-
'Mavenlink::Monkey'
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
Monkey
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
its(:collection_name) { should == 'monkeys'}
|
|
23
|
-
|
|
24
|
-
let(:response) {
|
|
25
|
-
{
|
|
26
|
-
'count' => 1,
|
|
27
|
-
'results' => [{'key' => 'monkeys', 'id' => '7'}],
|
|
28
|
-
'monkeys' => {
|
|
29
|
-
'7' => {'name' => 'Masha', 'id' => '7'}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
let(:updated_response) {
|
|
35
|
-
{
|
|
36
|
-
'count' => 1,
|
|
37
|
-
'results' => [{'key' => 'monkeys', 'id' => '7'}],
|
|
38
|
-
'monkeys' => {
|
|
39
|
-
'7' => {'name' => 'Mashka', 'id' => '7'}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
before do
|
|
45
|
-
stub_request :get, '/api/v1/monkeys?only=7', response
|
|
46
|
-
stub_request :get, '/api/v1/monkeys?only=8', {'count' => 0, 'results' => []}
|
|
47
|
-
stub_request :post, '/api/v1/monkeys', response
|
|
48
|
-
stub_request :put, '/api/v1/monkeys/7', updated_response
|
|
49
|
-
stub_request :delete, '/api/v1/monkeys/7', {}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
describe '.find' do
|
|
53
|
-
specify do
|
|
54
|
-
expect(model.find(7)).to be_a model
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
specify do
|
|
58
|
-
expect(model.find(7).id).to eq('7')
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
specify do
|
|
62
|
-
expect(model.find(8)).to be_nil
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
describe '.create' do
|
|
67
|
-
context 'valid record' do
|
|
68
|
-
specify do
|
|
69
|
-
expect(model.create(name: 'Masha')).to be_a model
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
specify do
|
|
73
|
-
expect(model.create(name: 'Masha')).to be_valid
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
specify do
|
|
77
|
-
expect(model.create(name: 'Masha')).to be_persisted
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
context 'invalid record' do
|
|
82
|
-
specify do
|
|
83
|
-
expect(model.create(name: '')).to be_a model
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
specify do
|
|
87
|
-
expect(model.create(name: '')).not_to be_valid
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
specify do
|
|
91
|
-
expect(model.create(name: '')).to be_a_new_record
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
describe '.create!' do
|
|
97
|
-
context 'valid record' do
|
|
98
|
-
specify do
|
|
99
|
-
expect { model.create!(name: 'Masha') }.not_to raise_error
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
context 'invalid record' do
|
|
104
|
-
specify do
|
|
105
|
-
expect { model.create!(name: '') }.to raise_error Mavenlink::RecordInvalidError, /Name.*blank/
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
describe '.models' do
|
|
111
|
-
specify do
|
|
112
|
-
expect(model.models).to be_empty
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
specify do
|
|
116
|
-
expect(Mavenlink::Model.models).to include({'monkeys' => Monkey})
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
describe '.specification' do
|
|
121
|
-
specify do
|
|
122
|
-
expect(model.specification).to be_a Hash
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
specify do
|
|
126
|
-
expect(model.specification).not_to be_empty
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
describe '.attributes' do
|
|
131
|
-
specify do
|
|
132
|
-
expect(model.attributes).to eq(['name'])
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
describe '.available_attributes' do
|
|
137
|
-
specify do
|
|
138
|
-
expect(model.available_attributes).to eq(['name', 'age'])
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
describe '.create_attributes' do
|
|
143
|
-
specify do
|
|
144
|
-
expect(model.create_attributes).to eq(['name'])
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
describe '.update_attributes' do
|
|
149
|
-
specify do
|
|
150
|
-
expect(model.update_attributes).to eq(['name', 'age'])
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
describe '.wrap' do
|
|
155
|
-
specify do
|
|
156
|
-
expect(model.wrap(nil)).to be_a_new_record
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
context 'existing record' do
|
|
160
|
-
let(:brainstem_record) do
|
|
161
|
-
BrainstemAdaptor::Record.new('monkeys', '7', Mavenlink::Response.new(response))
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
specify do
|
|
165
|
-
expect(model.wrap(brainstem_record)).not_to be_a_new_record
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
specify do
|
|
169
|
-
expect(model.wrap(brainstem_record)).to be_a Monkey
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
describe '#initialize' do
|
|
175
|
-
it 'accepts attributes' do
|
|
176
|
-
expect(model.new(any_custom_key: 'value set')).to include(any_custom_key: 'value set')
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
it 'checks for client' do
|
|
180
|
-
expect(model.new).to respond_to (:client)
|
|
181
|
-
expect(model.new.client).to be_a Mavenlink::Client
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
describe '#client' do
|
|
186
|
-
specify 'default client' do
|
|
187
|
-
expect(model.new.client).to be_a Mavenlink::Client
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
context 'custom client set' do
|
|
191
|
-
let(:client) { Mavenlink::Client.new(oauth_token: 'new one') }
|
|
192
|
-
subject { described_class.new({test: 'set'}, nil, client) }
|
|
193
|
-
|
|
194
|
-
its(:client) { should eq(client) }
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
describe '#persisted?' do
|
|
199
|
-
specify do
|
|
200
|
-
expect(model.new).not_to be_persisted
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
specify do
|
|
204
|
-
expect(model.new(id: 1)).to be_persisted
|
|
205
|
-
end
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
describe '#new_record?' do
|
|
209
|
-
specify do
|
|
210
|
-
expect(model.new).to be_new_record
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
specify do
|
|
214
|
-
expect(model.new(id: 1)).not_to be_new_record
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
describe 'attributes' do
|
|
219
|
-
specify do
|
|
220
|
-
expect(model.new).to respond_to :name
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
specify do
|
|
224
|
-
expect(model.new).to respond_to :age
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
describe '#attributes=' do
|
|
229
|
-
subject { model.new(name: 'old') }
|
|
230
|
-
|
|
231
|
-
specify do
|
|
232
|
-
expect { subject.attributes = {name: 'new'} }.to change { subject['name'] }.from('old').to('new')
|
|
233
|
-
end
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
describe '#to_param' do
|
|
237
|
-
specify do
|
|
238
|
-
expect(model.new(id: 1).to_param).to eq('1')
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
specify do
|
|
242
|
-
expect(model.new(id: nil).to_param).to eq(nil)
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
describe '#save' do
|
|
247
|
-
context 'valid record' do
|
|
248
|
-
context 'new record' do
|
|
249
|
-
subject { model.new(name: 'Maria') }
|
|
250
|
-
|
|
251
|
-
specify do
|
|
252
|
-
expect(subject.save).to eq(true)
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
specify do
|
|
256
|
-
expect { subject.save }.to change(subject, :persisted?).from(false).to(true)
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
it 'reloads record fields taking it from response' do
|
|
260
|
-
expect { subject.save }.to change { subject.name }.from('Maria').to('Masha')
|
|
261
|
-
end
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
context 'persisted record' do
|
|
265
|
-
subject { model.create(name: 'Maria') }
|
|
266
|
-
|
|
267
|
-
it { should be_persisted }
|
|
268
|
-
|
|
269
|
-
specify do
|
|
270
|
-
expect(subject.save).to eq(true)
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
specify do
|
|
274
|
-
expect { subject.save }.not_to change(subject, :persisted?)
|
|
275
|
-
end
|
|
276
|
-
|
|
277
|
-
it 'reloads record fields taking it from response' do
|
|
278
|
-
expect { subject.save }.to change { subject.name }.from('Masha').to('Mashka')
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
|
|
283
|
-
context 'invalid record' do
|
|
284
|
-
context 'new record' do
|
|
285
|
-
subject { model.new(name: '') }
|
|
286
|
-
|
|
287
|
-
specify do
|
|
288
|
-
expect(subject.save).to eq(false)
|
|
289
|
-
end
|
|
290
|
-
|
|
291
|
-
specify do
|
|
292
|
-
expect { subject.save }.not_to change(subject, :persisted?)
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
it 'does not perform any requests' do
|
|
296
|
-
expect { subject.save }.not_to change { subject.name }
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
context 'persisted record' do
|
|
301
|
-
subject { model.create(name: 'Maria') }
|
|
302
|
-
before { subject.name = '' }
|
|
303
|
-
|
|
304
|
-
it { should be_persisted }
|
|
305
|
-
|
|
306
|
-
specify do
|
|
307
|
-
expect(subject.save).to eq(false)
|
|
308
|
-
end
|
|
309
|
-
|
|
310
|
-
specify do
|
|
311
|
-
expect { subject.save }.not_to change(subject, :persisted?)
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
it 'does not change anything' do
|
|
315
|
-
expect { subject.save }.not_to change { subject.name }
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
describe '#save!' do
|
|
322
|
-
context 'valid record' do
|
|
323
|
-
context 'new record' do
|
|
324
|
-
subject { model.new(name: 'Maria') }
|
|
325
|
-
|
|
326
|
-
specify do
|
|
327
|
-
expect(subject.save!).to eq(true)
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
specify do
|
|
331
|
-
expect { subject.save! }.to change(subject, :persisted?).from(false).to(true)
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
it 'reloads record fields taking it from response' do
|
|
335
|
-
expect { subject.save! }.to change { subject.name }.from('Maria').to('Masha')
|
|
336
|
-
end
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
context 'persisted record' do
|
|
340
|
-
subject { model.create(name: 'Maria') }
|
|
341
|
-
|
|
342
|
-
it { should be_persisted }
|
|
343
|
-
|
|
344
|
-
specify do
|
|
345
|
-
expect(subject.save!).to eq(true)
|
|
346
|
-
end
|
|
347
|
-
|
|
348
|
-
specify do
|
|
349
|
-
expect { subject.save! }.not_to change(subject, :persisted?)
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
it 'reloads record fields taking it from response' do
|
|
353
|
-
expect { subject.save! }.to change { subject.name }.from('Masha').to('Mashka')
|
|
354
|
-
end
|
|
355
|
-
end
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
context 'invalid record' do
|
|
359
|
-
context 'new record' do
|
|
360
|
-
subject { model.new(name: '') }
|
|
361
|
-
|
|
362
|
-
specify do
|
|
363
|
-
expect { subject.save! }.to raise_error Mavenlink::RecordInvalidError, /Name.*blank/
|
|
364
|
-
end
|
|
365
|
-
|
|
366
|
-
specify do
|
|
367
|
-
expect { subject.save! rescue nil }.not_to change(subject, :persisted?)
|
|
368
|
-
end
|
|
369
|
-
|
|
370
|
-
it 'does not perform any requests' do
|
|
371
|
-
expect { subject.save! rescue nil }.not_to change { subject.name }
|
|
372
|
-
end
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
context 'persisted record' do
|
|
376
|
-
subject { model.create(name: 'Maria') }
|
|
377
|
-
before { subject.name = '' }
|
|
378
|
-
|
|
379
|
-
it { should be_persisted }
|
|
380
|
-
|
|
381
|
-
specify do
|
|
382
|
-
expect { subject.save! }.to raise_error Mavenlink::RecordInvalidError, /Name.*blank/
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
specify do
|
|
386
|
-
expect { subject.save! rescue nil }.not_to change(subject, :persisted?)
|
|
387
|
-
end
|
|
388
|
-
|
|
389
|
-
it 'does not change anything' do
|
|
390
|
-
expect { subject.save! rescue nil }.not_to change { subject.name }
|
|
391
|
-
end
|
|
392
|
-
end
|
|
393
|
-
end
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
describe '#update_attributes' do
|
|
397
|
-
context 'valid record' do
|
|
398
|
-
context 'new record' do
|
|
399
|
-
subject { model.new }
|
|
400
|
-
|
|
401
|
-
specify do
|
|
402
|
-
expect(subject.update_attributes(name: 'Maria')).to eq(true)
|
|
403
|
-
end
|
|
404
|
-
|
|
405
|
-
specify do
|
|
406
|
-
expect { subject.update_attributes(name: 'Maria') }.to change(subject, :persisted?).from(false).to(true)
|
|
407
|
-
end
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
context 'persisted record' do
|
|
411
|
-
subject { model.create(name: 'Maria') }
|
|
412
|
-
|
|
413
|
-
it { should be_persisted }
|
|
414
|
-
|
|
415
|
-
specify do
|
|
416
|
-
expect(subject.update_attributes(name: 'mashka')).to eq(true)
|
|
417
|
-
end
|
|
418
|
-
|
|
419
|
-
specify do
|
|
420
|
-
expect { subject.update_attributes(name: 'test') }.not_to change(subject, :persisted?)
|
|
421
|
-
end
|
|
422
|
-
|
|
423
|
-
it 'reloads record fields taking it from response' do
|
|
424
|
-
expect { subject.update_attributes(name: 'test') }.to change { subject.name }.from('Masha').to('Mashka')
|
|
425
|
-
end
|
|
426
|
-
end
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
# TODO: invalid record, update_attributes!
|
|
430
|
-
end
|
|
431
|
-
|
|
432
|
-
describe '#destroy' do
|
|
433
|
-
subject { model.create(name: 'Maria') }
|
|
434
|
-
|
|
435
|
-
specify do
|
|
436
|
-
expect { subject.destroy }.not_to raise_error
|
|
437
|
-
end
|
|
438
|
-
end
|
|
439
|
-
end
|