extended_her 0.5

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 (66) hide show
  1. data/.gitignore +8 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +8 -0
  4. data/CONTRIBUTING.md +26 -0
  5. data/Gemfile +2 -0
  6. data/LICENSE +7 -0
  7. data/README.md +723 -0
  8. data/Rakefile +11 -0
  9. data/UPGRADE.md +32 -0
  10. data/examples/twitter-oauth/Gemfile +13 -0
  11. data/examples/twitter-oauth/app.rb +50 -0
  12. data/examples/twitter-oauth/config.ru +5 -0
  13. data/examples/twitter-oauth/views/index.haml +9 -0
  14. data/examples/twitter-search/Gemfile +12 -0
  15. data/examples/twitter-search/app.rb +55 -0
  16. data/examples/twitter-search/config.ru +5 -0
  17. data/examples/twitter-search/views/index.haml +9 -0
  18. data/extended_her.gemspec +27 -0
  19. data/lib/her.rb +23 -0
  20. data/lib/her/api.rb +108 -0
  21. data/lib/her/base.rb +17 -0
  22. data/lib/her/collection.rb +12 -0
  23. data/lib/her/errors.rb +5 -0
  24. data/lib/her/exceptions/exception.rb +4 -0
  25. data/lib/her/exceptions/record_invalid.rb +8 -0
  26. data/lib/her/exceptions/record_not_found.rb +13 -0
  27. data/lib/her/middleware.rb +9 -0
  28. data/lib/her/middleware/accept_json.rb +15 -0
  29. data/lib/her/middleware/first_level_parse_json.rb +34 -0
  30. data/lib/her/middleware/second_level_parse_json.rb +28 -0
  31. data/lib/her/model.rb +69 -0
  32. data/lib/her/model/base.rb +7 -0
  33. data/lib/her/model/hooks.rb +114 -0
  34. data/lib/her/model/http.rb +284 -0
  35. data/lib/her/model/introspection.rb +57 -0
  36. data/lib/her/model/orm.rb +191 -0
  37. data/lib/her/model/orm/comparison_methods.rb +20 -0
  38. data/lib/her/model/orm/create_methods.rb +29 -0
  39. data/lib/her/model/orm/destroy_methods.rb +53 -0
  40. data/lib/her/model/orm/error_methods.rb +19 -0
  41. data/lib/her/model/orm/fields_definition.rb +15 -0
  42. data/lib/her/model/orm/find_methods.rb +46 -0
  43. data/lib/her/model/orm/persistance_methods.rb +22 -0
  44. data/lib/her/model/orm/relation_mapper.rb +21 -0
  45. data/lib/her/model/orm/save_methods.rb +58 -0
  46. data/lib/her/model/orm/serialization_methods.rb +28 -0
  47. data/lib/her/model/orm/update_methods.rb +31 -0
  48. data/lib/her/model/paths.rb +82 -0
  49. data/lib/her/model/relationships.rb +191 -0
  50. data/lib/her/paginated_collection.rb +20 -0
  51. data/lib/her/relation.rb +94 -0
  52. data/lib/her/version.rb +3 -0
  53. data/spec/api_spec.rb +131 -0
  54. data/spec/collection_spec.rb +26 -0
  55. data/spec/middleware/accept_json_spec.rb +10 -0
  56. data/spec/middleware/first_level_parse_json_spec.rb +42 -0
  57. data/spec/middleware/second_level_parse_json_spec.rb +25 -0
  58. data/spec/model/hooks_spec.rb +406 -0
  59. data/spec/model/http_spec.rb +184 -0
  60. data/spec/model/introspection_spec.rb +59 -0
  61. data/spec/model/orm_spec.rb +552 -0
  62. data/spec/model/paths_spec.rb +286 -0
  63. data/spec/model/relationships_spec.rb +222 -0
  64. data/spec/model_spec.rb +31 -0
  65. data/spec/spec_helper.rb +46 -0
  66. metadata +222 -0
@@ -0,0 +1,3 @@
1
+ module Her
2
+ VERSION = '0.5'
3
+ end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+ require File.join(File.dirname(__FILE__), "spec_helper.rb")
3
+
4
+ describe Her::API do
5
+ subject { Her::API.new }
6
+
7
+ context "initialization" do
8
+ describe ".setup" do
9
+ it "creates a default connection" do
10
+ Her::API.setup :url => "https://api.example.com"
11
+ Her::API.default_api.base_uri.should == "https://api.example.com"
12
+ end
13
+ end
14
+
15
+ describe "#setup" do
16
+ context "when using :url option" do
17
+ before { subject.setup :url => "https://api.example.com" }
18
+ its(:base_uri) { should == "https://api.example.com" }
19
+ end
20
+
21
+ context "when using the legacy :base_uri option" do
22
+ before { subject.setup :base_uri => "https://api.example.com" }
23
+ its(:base_uri) { should == "https://api.example.com" }
24
+ end
25
+
26
+ context "when setting custom middleware" do
27
+ before do
28
+ class Foo; end;
29
+ class Bar; end;
30
+
31
+ subject.setup :url => "https://api.example.com" do |connection|
32
+ connection.use Foo
33
+ connection.use Bar
34
+ end
35
+ end
36
+
37
+ specify { subject.connection.builder.handlers.should == [Foo, Bar] }
38
+ end
39
+
40
+ context "when setting custom options" do
41
+ before { subject.setup :foo => { :bar => "baz" }, :url => "https://api.example.com" }
42
+ its(:options) { should == { :foo => { :bar => "baz" }, :url => "https://api.example.com" } }
43
+ end
44
+ end
45
+
46
+ describe "#request" do
47
+ before do
48
+ class SimpleParser < Faraday::Response::Middleware
49
+ def on_complete(env)
50
+ env[:body] = { :data => env[:body] }
51
+ end
52
+ end
53
+ end
54
+
55
+ context "making HTTP requests" do
56
+ let(:parsed_data) { subject.request(:_method => :get, :_path => "/foo") }
57
+ before do
58
+ subject.setup :url => "https://api.example.com" do |builder|
59
+ builder.use SimpleParser
60
+ builder.adapter(:test) { |stub| stub.get("/foo") { |env| [200, {}, "Foo, it is."] } }
61
+ end
62
+ end
63
+
64
+ specify { parsed_data[:data].should == "Foo, it is." }
65
+ end
66
+
67
+ context "making HTTP requests while specifying custom HTTP headers" do
68
+ let(:parsed_data) { subject.request(:_method => :get, :_path => "/foo", :_headers => { "X-Page" => 2 }) }
69
+
70
+ before do
71
+ subject.setup :url => "https://api.example.com" do |builder|
72
+ builder.use SimpleParser
73
+ builder.adapter(:test) { |stub| stub.get("/foo") { |env| [200, {}, "Foo, it is page #{env[:request_headers]["X-Page"]}."] } }
74
+ end
75
+ end
76
+
77
+ specify { parsed_data[:data].should == "Foo, it is page 2." }
78
+ end
79
+
80
+ context "parsing a request with the default parser" do
81
+ let(:parsed_data) { subject.request(:_method => :get, :_path => "users/1") }
82
+ before do
83
+ subject.setup :url => "https://api.example.com" do |builder|
84
+ builder.use Her::Middleware::FirstLevelParseJSON
85
+ builder.adapter :test do |stub|
86
+ stub.get("/users/1") { |env| [200, {}, MultiJson.dump({ :id => 1, :name => "George Michael Bluth", :errors => ["This is a single error"], :metadata => { :page => 1, :per_page => 10 } })] }
87
+ end
88
+ end
89
+ end
90
+
91
+ specify do
92
+ parsed_data[:data].should == { :id => 1, :name => "George Michael Bluth" }
93
+ parsed_data[:errors].should == ["This is a single error"]
94
+ parsed_data[:metadata].should == { :page => 1, :per_page => 10 }
95
+ end
96
+ end
97
+
98
+ context "parsing a request with a custom parser" do
99
+ let(:parsed_data) { subject.request(:_method => :get, :_path => "users/1") }
100
+ before do
101
+ class CustomParser < Faraday::Response::Middleware
102
+ def on_complete(env)
103
+ json = MultiJson.load(env[:body], :symbolize_keys => true)
104
+ errors = json.delete(:errors) || []
105
+ metadata = json.delete(:metadata) || {}
106
+ env[:body] = {
107
+ :data => json,
108
+ :errors => errors,
109
+ :metadata => metadata,
110
+ }
111
+ end
112
+ end
113
+
114
+ subject.setup :url => "https://api.example.com" do |builder|
115
+ builder.use CustomParser
116
+ builder.use Faraday::Request::UrlEncoded
117
+ builder.adapter :test do |stub|
118
+ stub.get("/users/1") { |env| [200, {}, MultiJson.dump(:id => 1, :name => "George Michael Bluth")] }
119
+ end
120
+ end
121
+ end
122
+
123
+ specify do
124
+ parsed_data[:data].should == { :id => 1, :name => "George Michael Bluth" }
125
+ parsed_data[:errors].should == []
126
+ parsed_data[:metadata].should == {}
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Her::Collection do
4
+
5
+ let(:items) { [1, 2, 3, 4] }
6
+ let(:metadata) { { :name => 'Testname' } }
7
+ let(:errors) { { :name => ['not_present'] } }
8
+
9
+ describe "#new" do
10
+ context "without parameters" do
11
+ subject { Her::Collection.new }
12
+
13
+ it { should eq([]) }
14
+ its(:metadata) { should eq({}) }
15
+ its(:errors) { should eq({}) }
16
+ end
17
+
18
+ context "with parameters" do
19
+ subject { Her::Collection.new(items, metadata, errors) }
20
+
21
+ it { should eq([1,2,3,4]) }
22
+ its(:metadata) { should eq({ :name => 'Testname' }) }
23
+ its(:errors) { should eq({ :name => ['not_present'] }) }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Her::Middleware::AcceptJSON do
5
+ it "adds an Accept header" do
6
+ described_class.new.add_header({}).tap do |headers|
7
+ headers["Accept"].should == "application/json"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Her::Middleware::FirstLevelParseJSON do
5
+ subject { described_class.new }
6
+ let(:body_without_errors) { "{\"id\": 1, \"name\": \"Tobias Fünke\", \"metadata\": 3}" }
7
+ let(:body_with_errors) { "{\"id\": 1, \"name\": \"Tobias Fünke\", \"errors\": { \"name\": [ \"not_valid\", \"should_be_present\" ] }, \"metadata\": 3}" }
8
+
9
+ it "parses body as json" do
10
+ subject.parse(body_without_errors).tap do |json|
11
+ json[:data].should == { :id => 1, :name => "Tobias Fünke" }
12
+ json[:metadata].should == 3
13
+ end
14
+ end
15
+
16
+ it "parses :body key as json in the env hash" do
17
+ env = { :body => body_without_errors }
18
+ subject.on_complete(env)
19
+ env[:body].tap do |json|
20
+ json[:data].should == { :id => 1, :name => "Tobias Fünke" }
21
+ json[:metadata].should == 3
22
+ end
23
+ end
24
+
25
+ it 'ensures the errors are a hash if there are no errors' do
26
+ subject.parse(body_without_errors)[:errors].should eq({})
27
+ end
28
+
29
+ it 'ensures the errors are a hash if there are no errors' do
30
+ subject.parse(body_with_errors)[:errors].should eq({:name => [ 'not_valid', 'should_be_present']})
31
+ end
32
+
33
+ context 'with status code 204' do
34
+ it 'returns an empty body' do
35
+ env = { :status => 204 }
36
+ subject.on_complete(env)
37
+ env[:body].tap do |json|
38
+ json[:data].should == { }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Her::Middleware::SecondLevelParseJSON do
5
+ subject { described_class.new }
6
+ let(:body) { "{\"data\": 1, \"errors\": 2, \"metadata\": 3}" }
7
+
8
+ it "parses body as json" do
9
+ subject.parse(body).tap do |json|
10
+ json[:data].should == 1
11
+ json[:errors].should == 2
12
+ json[:metadata].should == 3
13
+ end
14
+ end
15
+
16
+ it "parses :body key as json in the env hash" do
17
+ env = { :body => body }
18
+ subject.on_complete(env)
19
+ env[:body].tap do |json|
20
+ json[:data].should == 1
21
+ json[:errors].should == 2
22
+ json[:metadata].should == 3
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,406 @@
1
+ # encoding: utf-8
2
+ require File.join(File.dirname(__FILE__), "../spec_helper.rb")
3
+
4
+ describe Her::Model::Hooks do
5
+ context "adding hooks to a model" do
6
+ before do
7
+ spawn_model "Foo::User"
8
+ end
9
+
10
+ describe "method hooks" do
11
+ it "handles “before save” method hooks" do
12
+ Foo::User.before_save :set_internal_id
13
+ Foo::User.hooks[:before_save].length.should == 1
14
+ Foo::User.hooks[:before_save].first.class.should == Symbol
15
+ end
16
+
17
+ it "handles “before create” method hooks" do
18
+ Foo::User.before_create :set_internal_id
19
+ Foo::User.hooks[:before_create].length.should == 1
20
+ Foo::User.hooks[:before_create].first.class.should == Symbol
21
+ end
22
+
23
+ it "handles “before update” method hooks" do
24
+ Foo::User.before_update :set_internal_id
25
+ Foo::User.hooks[:before_update].length.should == 1
26
+ Foo::User.hooks[:before_update].first.class.should == Symbol
27
+ end
28
+
29
+ it "handles “before destroy” method hooks" do
30
+ Foo::User.before_destroy :set_internal_id
31
+ Foo::User.hooks[:before_destroy].length.should == 1
32
+ Foo::User.hooks[:before_destroy].first.class.should == Symbol
33
+ end
34
+
35
+ it "does not handle “before find” method hooks" do
36
+ expect {
37
+ Foo::User.before_find :set_internal_id
38
+ }.to raise_error(NoMethodError)
39
+ end
40
+
41
+ it "handles “after save” method hooks" do
42
+ Foo::User.after_save :set_internal_id
43
+ Foo::User.hooks[:after_save].length.should == 1
44
+ Foo::User.hooks[:after_save].first.class.should == Symbol
45
+ end
46
+
47
+ it "handles “after create” method hooks" do
48
+ Foo::User.after_create :set_internal_id
49
+ Foo::User.hooks[:after_create].length.should == 1
50
+ Foo::User.hooks[:after_create].first.class.should == Symbol
51
+ end
52
+
53
+ it "handles “after update” method hooks" do
54
+ Foo::User.after_update :set_internal_id
55
+ Foo::User.hooks[:after_update].length.should == 1
56
+ Foo::User.hooks[:after_update].first.class.should == Symbol
57
+ end
58
+
59
+ it "handles “after destroy” method hooks" do
60
+ Foo::User.after_destroy :set_internal_id
61
+ Foo::User.hooks[:after_destroy].length.should == 1
62
+ Foo::User.hooks[:after_destroy].first.class.should == Symbol
63
+ end
64
+
65
+ it "handles “after find” method hooks" do
66
+ Foo::User.after_find :set_internal_id
67
+ Foo::User.hooks[:after_find].length.should == 1
68
+ Foo::User.hooks[:after_find].first.class.should == Symbol
69
+ end
70
+ end
71
+
72
+ describe "block hooks" do
73
+ it "handles “before save” block hooks" do
74
+ Foo::User.before_save { |record| record.internal_id = 42 }
75
+ Foo::User.hooks[:before_save].length.should == 1
76
+ Foo::User.hooks[:before_save].first.class.should == Proc
77
+ end
78
+
79
+ it "handles “before create” block hooks" do
80
+ Foo::User.before_create { |record| record.internal_id = 42 }
81
+ Foo::User.hooks[:before_create].length.should == 1
82
+ Foo::User.hooks[:before_create].first.class.should == Proc
83
+ end
84
+
85
+ it "handles “before update” block hooks" do
86
+ Foo::User.before_update { |record| record.internal_id = 42 }
87
+ Foo::User.hooks[:before_update].length.should == 1
88
+ Foo::User.hooks[:before_update].first.class.should == Proc
89
+ end
90
+
91
+ it "handles “before destroy” block hooks" do
92
+ Foo::User.before_destroy { |record| record.internal_id = 42 }
93
+ Foo::User.hooks[:before_destroy].length.should == 1
94
+ Foo::User.hooks[:before_destroy].first.class.should == Proc
95
+ end
96
+
97
+ it "does not handle “before find” block hooks" do
98
+ expect {
99
+ Foo::User.before_find :set_internal_id
100
+ }.to raise_error(NoMethodError)
101
+ end
102
+
103
+ it "handles “after save” block hooks" do
104
+ Foo::User.after_save { |record| record.internal_id = 42 }
105
+ Foo::User.hooks[:after_save].length.should == 1
106
+ Foo::User.hooks[:after_save].first.class.should == Proc
107
+ end
108
+
109
+ it "handles “after create” block hooks" do
110
+ Foo::User.after_create { |record| record.internal_id = 42 }
111
+ Foo::User.hooks[:after_create].length.should == 1
112
+ Foo::User.hooks[:after_create].first.class.should == Proc
113
+ end
114
+
115
+ it "handles “after update” block hooks" do
116
+ Foo::User.after_update { |record| record.internal_id = 42 }
117
+ Foo::User.hooks[:after_update].length.should == 1
118
+ Foo::User.hooks[:after_update].first.class.should == Proc
119
+ end
120
+
121
+ it "handles “after destroy” block hooks" do
122
+ Foo::User.after_destroy { |record| record.internal_id = 42 }
123
+ Foo::User.hooks[:after_destroy].length.should == 1
124
+ Foo::User.hooks[:after_destroy].first.class.should == Proc
125
+ end
126
+
127
+ it "handles “after find” block hooks" do
128
+ Foo::User.after_find { |record| record.internal_id = 42 }
129
+ Foo::User.hooks[:after_find].length.should == 1
130
+ Foo::User.hooks[:after_find].first.class.should == Proc
131
+ end
132
+ end
133
+
134
+ context "inheriting hooks from a superclass" do
135
+ it "copies hooks to the subclass" do
136
+ Foo::User.before_save :set_internal_id
137
+ Foo::User.after_create { |record| record.internal_id = 42 }
138
+ subclass = Class.new(Foo::User)
139
+ subclass.hooks.object_id.should_not == Foo::User.hooks.object_id
140
+ subclass.hooks[:before_save].should == [:set_internal_id]
141
+ subclass.hooks[:after_create].length.should == 1
142
+ end
143
+ end
144
+ end
145
+
146
+ context "perform hooks on a model" do
147
+ before do
148
+ Her::API.setup :url => "https://api.example.com" do |builder|
149
+ builder.use Her::Middleware::FirstLevelParseJSON
150
+ builder.use Faraday::Request::UrlEncoded
151
+ builder.adapter :test do |stub|
152
+ stub.get("/users") { |env| [200, {}, [{ :id => 1, :name => "Tobias Fünke" }, { :id => 2, :name => "Lindsay Fünke" }].to_json] }
153
+ stub.post("/users") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
154
+ stub.get("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
155
+ stub.get("/users/2") { |env| [200, {}, { :id => 2, :name => "Lindsay Fünke" }.to_json] }
156
+ stub.put("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
157
+ stub.delete("/users/1") { |env| [200, {}, { :id => 1, :name => "Tobias Fünke" }.to_json] }
158
+ end
159
+ end
160
+
161
+ spawn_model "Foo::User" do
162
+ attr_accessor :internal_save_id, :internal_create_id, :internal_update_id, :internal_destroy_id
163
+ attr_accessor :internal_after_save_id, :internal_after_create_id, :internal_after_update_id, :internal_after_destroy_id
164
+ attr_accessor :internal_after_find_id
165
+
166
+ def change_internal_save_id; @internal_save_id = 100; end
167
+ def change_internal_create_id; @internal_create_id = 101; end
168
+ def change_internal_update_id; @internal_update_id = 102; end
169
+ def change_internal_destroy_id; @internal_destroy_id = 103; end
170
+
171
+ def change_internal_after_save_id; @internal_after_save_id = 100; end
172
+ def change_internal_after_create_id; @internal_after_create_id = 101; end
173
+ def change_internal_after_update_id; @internal_after_update_id = 102; end
174
+ def change_internal_after_destroy_id; @internal_after_destroy_id = 103; end
175
+
176
+ def change_internal_after_find_id; @internal_after_find_id = 104; end
177
+ end
178
+ end
179
+
180
+ describe "method hooks" do
181
+ before do
182
+ Foo::User.before_save :change_internal_save_id
183
+ Foo::User.before_update :change_internal_update_id
184
+ Foo::User.before_create :change_internal_create_id
185
+ Foo::User.before_destroy :change_internal_destroy_id
186
+
187
+ Foo::User.after_save :change_internal_after_save_id
188
+ Foo::User.after_update :change_internal_after_update_id
189
+ Foo::User.after_create :change_internal_after_create_id
190
+ Foo::User.after_destroy :change_internal_after_destroy_id
191
+
192
+ Foo::User.after_find :change_internal_after_find_id
193
+ end
194
+
195
+ it "perform “before save” “before create” method hook on Model#save without an ID" do
196
+ @user = Foo::User.new(:fullname => "Tobias Fünke")
197
+ @user.save
198
+ @user.internal_save_id.should == 100
199
+ @user.internal_create_id.should == 101
200
+ @user.internal_update_id.should == nil
201
+ @user.internal_after_find_id.should == nil
202
+ end
203
+
204
+ it "perform “before save” and “before update” method hook on Model#save with an ID" do
205
+ @user = Foo::User.find(1)
206
+ @user.save
207
+ @user.internal_save_id.should == 100
208
+ @user.internal_create_id.should == nil
209
+ @user.internal_update_id.should == 102
210
+ @user.internal_after_find_id.should == 104
211
+ end
212
+
213
+ it "perform “before destroy” method hook on Model#destroy" do
214
+ @user = Foo::User.find(1)
215
+ @user.destroy
216
+ @user.internal_save_id.should == nil
217
+ @user.internal_create_id.should == nil
218
+ @user.internal_update_id.should == nil
219
+ @user.internal_destroy_id.should == 103
220
+ @user.internal_after_find_id.should == 104
221
+ end
222
+
223
+ it "perform “after save” “after create” method hook on Model#save without an ID" do
224
+ @user = Foo::User.new(:fullname => "Tobias Fünke")
225
+ @user.save
226
+ @user.internal_after_save_id.should == 100
227
+ @user.internal_after_create_id.should == 101
228
+ @user.internal_after_update_id.should == nil
229
+ @user.internal_after_find_id.should == nil
230
+ end
231
+
232
+ it "perform “after save” “after update” method hook on Model#save with an ID" do
233
+ @user = Foo::User.find(1)
234
+ @user.save
235
+ @user.internal_after_save_id.should == 100
236
+ @user.internal_after_create_id.should == nil
237
+ @user.internal_after_update_id.should == 102
238
+ @user.internal_after_find_id.should == 104
239
+ end
240
+
241
+ it "perform “after save” “after update” method hook on Model.save_existing" do
242
+ @user = Foo::User.save_existing(1, { :fullname => "Tobias Fünke" })
243
+ @user.internal_after_save_id.should == 100
244
+ @user.internal_after_create_id.should == nil
245
+ @user.internal_after_update_id.should == 102
246
+ @user.internal_after_find_id.should == nil
247
+ end
248
+
249
+ it "perform “after save” “after create” method hook on Model.create" do
250
+ @user = Foo::User.create({ :fullname => "Tobias Fünke" })
251
+ @user.internal_after_save_id.should == 100
252
+ @user.internal_after_create_id.should == 101
253
+ @user.internal_after_update_id.should == nil
254
+ @user.internal_after_find_id.should == nil
255
+ end
256
+
257
+ it "perform “after find” method hook on Model.find" do
258
+ @user = Foo::User.find(1)
259
+ @user.internal_after_find_id.should == 104
260
+ @user.internal_save_id.should == nil
261
+ @user.internal_create_id.should == nil
262
+ @user.internal_update_id.should == nil
263
+ @user.internal_destroy_id.should == nil
264
+ end
265
+
266
+ it "perform “after find” method hook on Model#find with IDs" do
267
+ @users = Foo::User.find([1,2])
268
+ @users.each do |user|
269
+ user.internal_after_find_id.should == 104
270
+ user.internal_save_id.should == nil
271
+ user.internal_create_id.should == nil
272
+ user.internal_update_id.should == nil
273
+ user.internal_destroy_id.should == nil
274
+ end
275
+ end
276
+
277
+ it "perform “after find” method hook on Model.all" do
278
+ @users = Foo::User.all
279
+ @users.each do |user|
280
+ user.internal_after_find_id.should == 104
281
+ user.internal_save_id.should == nil
282
+ user.internal_create_id.should == nil
283
+ user.internal_update_id.should == nil
284
+ user.internal_destroy_id.should == nil
285
+ end
286
+ end
287
+ end
288
+
289
+ describe "block hooks" do
290
+ before do
291
+ Foo::User.before_save { |record| record.internal_save_id = 200 }
292
+ Foo::User.before_create { |record| record.internal_create_id = 201 }
293
+ Foo::User.before_update { |record| record.internal_update_id = 202 }
294
+ Foo::User.before_destroy { |record| record.internal_destroy_id = 203 }
295
+
296
+ Foo::User.after_save { |record| record.internal_after_save_id = 200 }
297
+ Foo::User.after_create { |record| record.internal_after_create_id = 201 }
298
+ Foo::User.after_update { |record| record.internal_after_update_id = 202 }
299
+ Foo::User.after_destroy { |record| record.internal_after_destroy_id = 203 }
300
+ Foo::User.after_find { |record| record.internal_after_find_id = 204 }
301
+ end
302
+
303
+ it "perform “before save” and “before create” block hook on Model#save without an ID" do
304
+ @user = Foo::User.new(:fullname => "Tobias Fünke")
305
+ @user.save
306
+ @user.internal_save_id.should == 200
307
+ @user.internal_create_id.should == 201
308
+ @user.internal_update_id.should == nil
309
+ @user.internal_after_find_id.should == nil
310
+ end
311
+
312
+ it "perform “before save” and “before update” block hook on Model#save with an ID" do
313
+ @user = Foo::User.find(1)
314
+ @user.save
315
+ @user.internal_save_id.should == 200
316
+ @user.internal_create_id.should == nil
317
+ @user.internal_update_id.should == 202
318
+ @user.internal_after_find_id.should == 204
319
+ end
320
+
321
+ it "perform “before destroy” block hook on Model#destroy" do
322
+ @user = Foo::User.find(1)
323
+ @user.destroy
324
+ @user.internal_save_id.should == nil
325
+ @user.internal_create_id.should == nil
326
+ @user.internal_update_id.should == nil
327
+ @user.internal_destroy_id.should == 203
328
+ @user.internal_after_find_id.should == 204
329
+ end
330
+
331
+ it "perform “after save” “after create” block hook on Model#save without an ID" do
332
+ @user = Foo::User.new(:fullname => "Tobias Fünke")
333
+ @user.save
334
+ @user.internal_after_save_id.should == 200
335
+ @user.internal_after_create_id.should == 201
336
+ @user.internal_after_update_id.should == nil
337
+ @user.internal_after_find_id.should == nil
338
+ end
339
+
340
+ it "perform “after save” “after update” block hook on Model#save with an ID" do
341
+ @user = Foo::User.find(1)
342
+ @user.save
343
+ @user.internal_after_find_id.should == 204
344
+ @user.internal_after_save_id.should == 200
345
+ @user.internal_after_create_id.should == nil
346
+ @user.internal_after_update_id.should == 202
347
+ end
348
+
349
+ it "perform “after find” block hook on Model#find" do
350
+ @user = Foo::User.find(1)
351
+ @user.internal_after_find_id.should == 204
352
+ @user.internal_save_id.should == nil
353
+ @user.internal_create_id.should == nil
354
+ @user.internal_update_id.should == nil
355
+ end
356
+
357
+ it "perform “after find” method hook on Model#find with IDs" do
358
+ @users = Foo::User.find([1,2])
359
+ @users.each do |user|
360
+ user.internal_after_find_id.should == 204
361
+ user.internal_save_id.should == nil
362
+ user.internal_create_id.should == nil
363
+ user.internal_update_id.should == nil
364
+ end
365
+ end
366
+
367
+ it "perform “after find” method hook on Model.all" do
368
+ @users = Foo::User.all
369
+ @users.each do |user|
370
+ user.internal_after_find_id.should == 204
371
+ user.internal_save_id.should == nil
372
+ user.internal_create_id.should == nil
373
+ user.internal_update_id.should == nil
374
+ end
375
+ end
376
+
377
+ it "perform “after find” block hook on Model#find" do
378
+ @user = Foo::User.find(1)
379
+ @user.internal_after_find_id.should == 204
380
+ @user.internal_save_id.should == nil
381
+ @user.internal_create_id.should == nil
382
+ @user.internal_update_id.should == nil
383
+ end
384
+
385
+ it "perform “after find” method hook on Model#find with IDs" do
386
+ @users = Foo::User.find([1,2])
387
+ @users.each do |user|
388
+ user.internal_after_find_id.should == 204
389
+ user.internal_save_id.should == nil
390
+ user.internal_create_id.should == nil
391
+ user.internal_update_id.should == nil
392
+ end
393
+ end
394
+
395
+ it "perform “after find” method hook on Model.all" do
396
+ @users = Foo::User.all
397
+ @users.each do |user|
398
+ user.internal_after_find_id.should == 204
399
+ user.internal_save_id.should == nil
400
+ user.internal_create_id.should == nil
401
+ user.internal_update_id.should == nil
402
+ end
403
+ end
404
+ end
405
+ end
406
+ end