morpheus 0.3.4
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/.rvmrc +1 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +134 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +44 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/autotest/discover.rb +7 -0
- data/lib/ext/typhoeus.rb +37 -0
- data/lib/morpheus/associations/association.rb +110 -0
- data/lib/morpheus/associations/belongs_to_association.rb +45 -0
- data/lib/morpheus/associations/has_many_association.rb +70 -0
- data/lib/morpheus/associations/has_one_association.rb +46 -0
- data/lib/morpheus/base.rb +66 -0
- data/lib/morpheus/client/associations.rb +47 -0
- data/lib/morpheus/client/inflections.rb +3 -0
- data/lib/morpheus/client/log_subscriber.rb +64 -0
- data/lib/morpheus/client/railtie.rb +25 -0
- data/lib/morpheus/configuration.rb +49 -0
- data/lib/morpheus/errors.rb +32 -0
- data/lib/morpheus/filter.rb +18 -0
- data/lib/morpheus/mixins/associations.rb +55 -0
- data/lib/morpheus/mixins/attributes.rb +133 -0
- data/lib/morpheus/mixins/conversion.rb +21 -0
- data/lib/morpheus/mixins/filtering.rb +18 -0
- data/lib/morpheus/mixins/finders.rb +58 -0
- data/lib/morpheus/mixins/introspection.rb +25 -0
- data/lib/morpheus/mixins/persistence.rb +46 -0
- data/lib/morpheus/mixins/reflections.rb +24 -0
- data/lib/morpheus/mixins/request_handling.rb +34 -0
- data/lib/morpheus/mixins/response_parsing.rb +27 -0
- data/lib/morpheus/mixins/url_support.rb +36 -0
- data/lib/morpheus/mock.rb +66 -0
- data/lib/morpheus/reflection.rb +22 -0
- data/lib/morpheus/relation.rb +57 -0
- data/lib/morpheus/request.rb +41 -0
- data/lib/morpheus/request_cache.rb +18 -0
- data/lib/morpheus/request_queue.rb +44 -0
- data/lib/morpheus/response.rb +24 -0
- data/lib/morpheus/response_parser.rb +80 -0
- data/lib/morpheus/type_caster.rb +80 -0
- data/lib/morpheus/url_builder.rb +52 -0
- data/lib/morpheus.rb +64 -0
- data/morpheus.gemspec +191 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/purchase.rb +3 -0
- data/spec/dummy/app/resources/attendee.rb +2 -0
- data/spec/dummy/app/resources/author.rb +5 -0
- data/spec/dummy/app/resources/automobile.rb +6 -0
- data/spec/dummy/app/resources/book.rb +5 -0
- data/spec/dummy/app/resources/conference.rb +3 -0
- data/spec/dummy/app/resources/dog.rb +10 -0
- data/spec/dummy/app/resources/item.rb +5 -0
- data/spec/dummy/app/resources/meeting.rb +7 -0
- data/spec/dummy/app/resources/speaker.rb +3 -0
- data/spec/dummy/app/resources/state.rb +5 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +45 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +22 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +26 -0
- data/spec/dummy/config/environments/production.rb +49 -0
- data/spec/dummy/config/environments/test.rb +35 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/morpheus.rb +3 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/20110605002144_create_purchases.rb +13 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/stylesheets/.gitkeep +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/morpheus/associations/association_spec.rb +44 -0
- data/spec/morpheus/associations/belongs_to_association_spec.rb +5 -0
- data/spec/morpheus/associations/has_many_association_spec.rb +17 -0
- data/spec/morpheus/associations/has_one_association_spec.rb +5 -0
- data/spec/morpheus/base_spec.rb +126 -0
- data/spec/morpheus/client/associations_spec.rb +44 -0
- data/spec/morpheus/configuration_spec.rb +136 -0
- data/spec/morpheus/mixins/associations_spec.rb +141 -0
- data/spec/morpheus/mixins/attributes_spec.rb +99 -0
- data/spec/morpheus/mixins/conversion_spec.rb +76 -0
- data/spec/morpheus/mixins/finders_spec.rb +255 -0
- data/spec/morpheus/mixins/introspection_spec.rb +154 -0
- data/spec/morpheus/mixins/persistence_spec.rb +161 -0
- data/spec/morpheus/mixins/reflection_spec.rb +100 -0
- data/spec/morpheus/mixins/response_parsing_spec.rb +5 -0
- data/spec/morpheus/mock_spec.rb +133 -0
- data/spec/morpheus/relation_spec.rb +71 -0
- data/spec/morpheus/request_cache_spec.rb +5 -0
- data/spec/morpheus/request_spec.rb +5 -0
- data/spec/morpheus/response_spec.rb +73 -0
- data/spec/morpheus/type_caster_spec.rb +343 -0
- data/spec/shared/active_model_lint_test.rb +14 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/configuration.rb +26 -0
- metadata +427 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Morpheus::Attributes, "#property" do
|
|
4
|
+
|
|
5
|
+
it "defines setter and getter methods for the given property" do
|
|
6
|
+
@book = Book.new
|
|
7
|
+
@book.should respond_to(:title)
|
|
8
|
+
@book.title = "Test Title"
|
|
9
|
+
@book.title.should eql("Test Title")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "creates an attribute entry for this property" do
|
|
13
|
+
Book.new.attributes.should include(:title)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe Morpheus::Attributes, "#default_attributes" do
|
|
19
|
+
|
|
20
|
+
it "returns the default attributes has which will be applied as the attributes when a new object is instantiated" do
|
|
21
|
+
Book.default_attributes.should eql(HashWithIndifferentAccess.new({ :id => nil, :title => nil, :author_id => nil }))
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe Morpheus::Attributes, "#typecast_attributes" do
|
|
27
|
+
pending
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe Morpheus::Attributes, "#attribute_defined?" do
|
|
31
|
+
pending
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe Morpheus::Attributes, ".attributes" do
|
|
35
|
+
|
|
36
|
+
it "returns the attributes hash" do
|
|
37
|
+
Book.new.attributes.should eql(HashWithIndifferentAccess.new({ :id => nil, :title => nil, :author_id => nil }))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe Morpheus::Attributes, ".read_attribute_for_validation" do
|
|
43
|
+
pending
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe Morpheus::Attributes, ".typecast" do
|
|
47
|
+
pending
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe Morpheus::Attributes, ".attributes_without_id" do
|
|
51
|
+
pending
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe Morpheus::Attributes, ".update_attribute" do
|
|
55
|
+
|
|
56
|
+
it "updates the attribute with the given value" do
|
|
57
|
+
@book = Book.new(:title => "Horton Hears a Who")
|
|
58
|
+
@book.title.should eql("Horton Hears a Who")
|
|
59
|
+
@book.update_attribute(:title, "Red Fish, Blue Fish, One Fish, Two Fish")
|
|
60
|
+
@book.title.should eql("Red Fish, Blue Fish, One Fish, Two Fish")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe Morpheus::Attributes, ".merge_attributes" do
|
|
66
|
+
|
|
67
|
+
it "updates each attribute with the given value" do
|
|
68
|
+
@book = Book.new(:title => "Green Eggs and Ham")
|
|
69
|
+
@book.id.should be_nil
|
|
70
|
+
@book.title.should eql("Green Eggs and Ham")
|
|
71
|
+
@book.send(:merge_attributes, { :title => "Red Fish, Blue Fish, One Fish, Two Fish", :id => 5 })
|
|
72
|
+
@book.id.should eql(5)
|
|
73
|
+
@book.title.should eql("Red Fish, Blue Fish, One Fish, Two Fish")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe Morpheus::Attributes, "dirty tracking" do
|
|
79
|
+
|
|
80
|
+
it "includes the ActiveModel::Validations module" do
|
|
81
|
+
Morpheus::Base.included_modules.should include(ActiveModel::Dirty)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "tracks dirty state for property values" do
|
|
85
|
+
@book = Book.new
|
|
86
|
+
@book.should_not be_title_changed
|
|
87
|
+
@book.title = "Dirty title"
|
|
88
|
+
@book.should be_title_changed
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
describe Morpheus::Attributes, "validations" do
|
|
94
|
+
|
|
95
|
+
it "includes the ActiveModel::Validations module" do
|
|
96
|
+
Morpheus::Base.included_modules.should include(ActiveModel::Validations)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Morpheus::Conversion, ".to_model" do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
@dog = Dog.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "returns this object" do
|
|
10
|
+
@dog.to_model.should eql(@dog)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe Morpheus::Conversion, ".to_param" do
|
|
16
|
+
|
|
17
|
+
context "when the id attribute is set" do
|
|
18
|
+
|
|
19
|
+
before(:each) do
|
|
20
|
+
Morpheus::Base.stub(:get).and_return(Morpheus::Base.new(:id => 1))
|
|
21
|
+
@base = Morpheus::Base.find(1)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "returns the id as a string" do
|
|
25
|
+
@base.to_param.should eql("1")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when the id attribute is set" do
|
|
31
|
+
|
|
32
|
+
before(:each) do
|
|
33
|
+
@base = Morpheus::Base.new
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "returns the id as a string" do
|
|
37
|
+
@base.to_param.should be_nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe Morpheus::Conversion, ".to_key" do
|
|
45
|
+
|
|
46
|
+
context "when the object is a new record" do
|
|
47
|
+
|
|
48
|
+
before(:each) do
|
|
49
|
+
@dog = Dog.new(:name => "Daisy", :breed => "English Bulldog", :age => 2)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "returns nil" do
|
|
53
|
+
@dog.to_key.should be_nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "when the object is persisted" do
|
|
59
|
+
|
|
60
|
+
before(:each) do
|
|
61
|
+
Dog.stub(:get).and_return(Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog", :age => 2))
|
|
62
|
+
@dog = Dog.find(1)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "returns the attribute keys of the object" do
|
|
66
|
+
@keys = @dog.to_key
|
|
67
|
+
@keys.should have(4).keys
|
|
68
|
+
@keys.should include('id')
|
|
69
|
+
@keys.should include('name')
|
|
70
|
+
@keys.should include('breed')
|
|
71
|
+
@keys.should include('age')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Morpheus::Finders, "#find" do
|
|
4
|
+
|
|
5
|
+
context "when the argument is a single integer" do
|
|
6
|
+
|
|
7
|
+
context "when this record exists on the external service" do
|
|
8
|
+
|
|
9
|
+
before(:each) do
|
|
10
|
+
@dog = Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog")
|
|
11
|
+
Dog.stub(:get).and_return(@dog)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "makes a request to /dogs/1 at the external service" do
|
|
15
|
+
Dog.should_receive(:get).with("/dogs/1", nil, { :id => 1 }).and_return(@dog)
|
|
16
|
+
Dog.find(1)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "returns the instance representing this found record" do
|
|
20
|
+
@dog = Dog.find(1)
|
|
21
|
+
@dog.should be_a(Dog)
|
|
22
|
+
@dog.id.should eql(1)
|
|
23
|
+
@dog.name.should eql("Daisy")
|
|
24
|
+
@dog.breed.should eql("English Bulldog")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when this record does not exist on the external service" do
|
|
30
|
+
|
|
31
|
+
before(:each) do
|
|
32
|
+
Morpheus::Configuration.hydra.stub(:get, "#{Morpheus::Configuration.host}/dogs/1").and_return(build_morpheus_response(404, nil))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "raises a ResourceNotFound error" do
|
|
36
|
+
lambda { Dog.find(1) }.should raise_error(Morpheus::ResourceNotFound, "Couldn't find Dog with ID=1")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "when the argument is a single array" do
|
|
44
|
+
|
|
45
|
+
context "when all records exists on the external service" do
|
|
46
|
+
|
|
47
|
+
before(:each) do
|
|
48
|
+
@dogs = [
|
|
49
|
+
Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog"),
|
|
50
|
+
Dog.new(:id => 2, :name => "Wilbur", :breed => "Hounddog"),
|
|
51
|
+
Dog.new(:id => 3, :name => "Fido", :breed => "Dalmatian")
|
|
52
|
+
]
|
|
53
|
+
Dog.stub(:get).and_return(@dogs)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "makes a request to /dogs?ids=1,2,3 at the external service" do
|
|
57
|
+
Dog.should_receive(:get).with("/dogs", { :ids => [1,2,3] }, { :ids => [1,2,3] }).and_return(@dogs)
|
|
58
|
+
Dog.find([1,2,3])
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "returns an array of instances representing these found records" do
|
|
62
|
+
@dogs = Dog.find([1,2,3])
|
|
63
|
+
@dogs.should be_an(Array)
|
|
64
|
+
@dogs.should have(3).dogs
|
|
65
|
+
@dogs.each do |dog|
|
|
66
|
+
dog.should be_a(Dog)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when there is a requested record that does not exist on the external service" do
|
|
73
|
+
|
|
74
|
+
before(:each) do
|
|
75
|
+
Morpheus::Configuration.hydra.stub(:get, "#{Morpheus::Configuration.host}/dogs?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3").and_return(build_morpheus_response(404, nil))
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "raises a ResourceNotFound error" do
|
|
79
|
+
lambda { Dog.find([1,2,3]) }.should raise_error(Morpheus::ResourceNotFound, "Couldn't find all Dogs with IDs (1, 2, 3)")
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "when there are multiple arguments, each being an integer" do
|
|
87
|
+
|
|
88
|
+
context "when all records exists on the external service" do
|
|
89
|
+
|
|
90
|
+
before(:each) do
|
|
91
|
+
@dogs = [
|
|
92
|
+
Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog"),
|
|
93
|
+
Dog.new(:id => 2, :name => "Wilbur", :breed => "Hounddog"),
|
|
94
|
+
Dog.new(:id => 3, :name => "Fido", :breed => "Dalmatian")
|
|
95
|
+
]
|
|
96
|
+
Dog.stub(:get).and_return(@dogs)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "makes a request to /dogs?ids=1,2,3 at the external service" do
|
|
100
|
+
Dog.should_receive(:get).with("/dogs", { :ids => [1,2,3] }, { :ids => [1,2,3] }).and_return(@dogs)
|
|
101
|
+
Dog.find(1,2,3)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "returns an array of instances representing these found records" do
|
|
105
|
+
@dogs = Dog.find(1,2,3)
|
|
106
|
+
@dogs.should be_an(Array)
|
|
107
|
+
@dogs.should have(3).dogs
|
|
108
|
+
@dogs.each do |dog|
|
|
109
|
+
dog.should be_a(Dog)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "when there is a requested record that does not exist on the external service" do
|
|
116
|
+
|
|
117
|
+
before(:each) do
|
|
118
|
+
Morpheus::Configuration.hydra.stub(:get, "#{Morpheus::Configuration.host}/dogs?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3").and_return(build_morpheus_response(404, nil))
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "raises a ResourceNotFound error" do
|
|
122
|
+
lambda { Dog.find(1,2,3) }.should raise_error(Morpheus::ResourceNotFound, "Couldn't find all Dogs with IDs (1, 2, 3)")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe Morpheus::Finders, "#all" do
|
|
132
|
+
|
|
133
|
+
before(:each) do
|
|
134
|
+
@dogs = [
|
|
135
|
+
Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog"),
|
|
136
|
+
Dog.new(:id => 2, :name => "Wilbur", :breed => "Hounddog"),
|
|
137
|
+
Dog.new(:id => 3, :name => "Fido", :breed => "Dalmatian")
|
|
138
|
+
]
|
|
139
|
+
Dog.stub(:get).and_return(@dogs)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "returns all found records" do
|
|
143
|
+
@dogs = Dog.all
|
|
144
|
+
@dogs.should be_an(Array)
|
|
145
|
+
@dogs.should have(3).dogs
|
|
146
|
+
@dogs.each do |dog|
|
|
147
|
+
dog.should be_a(Dog)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
describe Morpheus::Finders, "#first" do
|
|
154
|
+
|
|
155
|
+
before(:each) do
|
|
156
|
+
@dogs = [Dog.new(:id => 1, :name => "Daisy", :breed => "English Bulldog")]
|
|
157
|
+
Dog.stub(:get).and_return(@dogs)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "returns first found record" do
|
|
161
|
+
@dog = Dog.first
|
|
162
|
+
@dog.should be_a(Dog)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
describe Morpheus::Finders, "#where" do
|
|
168
|
+
|
|
169
|
+
context "when the where attribute is an acceptable attribute" do
|
|
170
|
+
|
|
171
|
+
context "for a where clause with one attribute" do
|
|
172
|
+
|
|
173
|
+
before(:each) do
|
|
174
|
+
@dogs = [Dog.new(:name => "Daisy", :breed => "English Bulldog").attributes.merge(:id => 1)]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "makes a request to find all records with the given query parameter" do
|
|
178
|
+
Dog.should_receive(:get).with("/dogs", { :name => "Daisy" }).and_return(@dogs)
|
|
179
|
+
Dog.where(:name => "Daisy").first
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
context "for a where clause with multiple attributes" do
|
|
185
|
+
|
|
186
|
+
before(:each) do
|
|
187
|
+
@dogs = [Dog.new(:name => "Daisy", :breed => "English Bulldog").attributes.merge(:id => 1)]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "makes a request to find all records with the given query parameters" do
|
|
191
|
+
Dog.should_receive(:get).with("/dogs", { :breed => "English Bulldog", :name => "Daisy" }).and_return(@dogs)
|
|
192
|
+
Dog.where(:name => "Daisy", :breed => "English Bulldog").first
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
describe Morpheus::Finders, "#limit" do
|
|
202
|
+
|
|
203
|
+
before(:each) do
|
|
204
|
+
@dogs = [
|
|
205
|
+
Dog.new(:name => "Daisy", :breed => "English Bulldog").attributes.merge(:id => 1),
|
|
206
|
+
Dog.new(:name => "Wilbur", :breed => "Hounddog").attributes.merge(:id => 2),
|
|
207
|
+
Dog.new(:name => "Fido", :breed => "Dalmatian").attributes.merge(:id => 3)
|
|
208
|
+
]
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it "makes a request to find all of the given records, but with a given limit" do
|
|
212
|
+
Dog.should_receive(:get).with("/dogs", { :limit => 10 }).and_return(@dogs)
|
|
213
|
+
Dog.limit(10).all
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
describe Morpheus::Finders, "#page" do
|
|
219
|
+
|
|
220
|
+
before(:each) do
|
|
221
|
+
Dog.results_per_page = 10
|
|
222
|
+
|
|
223
|
+
@dogs = [
|
|
224
|
+
Dog.new(:name => "Daisy", :breed => "English Bulldog").attributes.merge(:id => 1),
|
|
225
|
+
Dog.new(:name => "Wilbur", :breed => "Hounddog").attributes.merge(:id => 2),
|
|
226
|
+
Dog.new(:name => "Fido", :breed => "Dalmatian").attributes.merge(:id => 3)
|
|
227
|
+
]
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it "makes a request to find all of the given records, but with a given limit and offset" do
|
|
231
|
+
Dog.should_receive(:get).with("/dogs", { :limit => 10, :offset => 20 }).and_return(@dogs)
|
|
232
|
+
Dog.page(3).all
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
describe Morpheus::Finders, "#results_per_page" do
|
|
238
|
+
|
|
239
|
+
it "defaults to 10" do
|
|
240
|
+
Dog.results_per_page.should eql(10)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context "when set to something other than the default" do
|
|
244
|
+
|
|
245
|
+
before(:each) do
|
|
246
|
+
Dog.results_per_page = 25
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "returns the number of results to be returned on a page request" do
|
|
250
|
+
Dog.results_per_page.should eql(25)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Morpheus::Introspection, ".valid?" do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
@dog = Dog.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
context "when the errors hash is empty" do
|
|
10
|
+
|
|
11
|
+
it "returns true" do
|
|
12
|
+
@dog.name = "Fido"
|
|
13
|
+
@dog.should be_valid
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "when the errors hash is not empty" do
|
|
19
|
+
|
|
20
|
+
it "returns false" do
|
|
21
|
+
@dog.should_not be_valid
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe Morpheus::Introspection, ".persisted?" do
|
|
29
|
+
|
|
30
|
+
before(:each) do
|
|
31
|
+
@attendee = Attendee.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when the record is not persisted" do
|
|
35
|
+
|
|
36
|
+
it "returns false" do
|
|
37
|
+
@attendee.should_not be_persisted
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context "when the record is persisted" do
|
|
43
|
+
|
|
44
|
+
before(:each) do
|
|
45
|
+
stub_web!
|
|
46
|
+
@attendee.save
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "returns true" do
|
|
50
|
+
@attendee.should be_persisted
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def stub_web!
|
|
56
|
+
Morpheus::Configuration.hydra.stub(:post, "#{Morpheus::Configuration.host}/attendees").and_return(build_morpheus_response(
|
|
57
|
+
201,
|
|
58
|
+
{
|
|
59
|
+
:id => 1,
|
|
60
|
+
:valid => true,
|
|
61
|
+
:errors => {}
|
|
62
|
+
}
|
|
63
|
+
))
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe Morpheus::Introspection, ".new_record?" do
|
|
69
|
+
|
|
70
|
+
before(:each) do
|
|
71
|
+
@attendee = Attendee.new
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "when the record is new" do
|
|
75
|
+
|
|
76
|
+
it "returns true" do
|
|
77
|
+
@attendee.should be_new_record
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "when the record is not new" do
|
|
83
|
+
|
|
84
|
+
before(:each) do
|
|
85
|
+
stub_web!
|
|
86
|
+
@attendee.save
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "returns false" do
|
|
90
|
+
@attendee.should_not be_new_record
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def stub_web!
|
|
96
|
+
Morpheus::Configuration.hydra.stub(:post, "#{Morpheus::Configuration.host}/attendees").and_return(build_morpheus_response(
|
|
97
|
+
201,
|
|
98
|
+
{
|
|
99
|
+
:id => 1,
|
|
100
|
+
:valid => true,
|
|
101
|
+
:errors => {}
|
|
102
|
+
}
|
|
103
|
+
))
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe Morpheus::Introspection, ".destroyed?" do
|
|
109
|
+
|
|
110
|
+
it "returns false" do
|
|
111
|
+
Dog.new.should_not be_destroyed
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe Morpheus::Introspection, ".respond_to?" do
|
|
117
|
+
|
|
118
|
+
before(:each) do
|
|
119
|
+
@dog = Dog.new(:name => "Fido", :age => 10)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context "if the query method is a method on the object" do
|
|
123
|
+
|
|
124
|
+
it "returns true" do
|
|
125
|
+
@dog.should respond_to(:bark!)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context "if the query method is not a method on the object" do
|
|
131
|
+
|
|
132
|
+
it "returns false" do
|
|
133
|
+
@dog.should_not respond_to(:bite!)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context "if the query method is an attribute on the object" do
|
|
139
|
+
|
|
140
|
+
it "returns true" do
|
|
141
|
+
@dog.should respond_to(:age)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
context "if the query method is not an attribute on the object" do
|
|
147
|
+
|
|
148
|
+
it "returns false" do
|
|
149
|
+
@dog.should_not respond_to(:weight)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|