activeresource 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeresource might be problematic. Click here for more details.

@@ -1,52 +0,0 @@
1
- require 'abstract_unit'
2
- require "fixtures/person"
3
- require "fixtures/street_address"
4
-
5
- class BaseEqualityTest < Test::Unit::TestCase
6
- def setup
7
- @new = Person.new
8
- @one = Person.new(:id => 1)
9
- @two = Person.new(:id => 2)
10
- @street = StreetAddress.new(:id => 2)
11
- end
12
-
13
- def test_should_equal_self
14
- assert @new == @new, '@new == @new'
15
- assert @one == @one, '@one == @one'
16
- end
17
-
18
- def test_shouldnt_equal_new_resource
19
- assert @new != @one, '@new != @one'
20
- assert @one != @new, '@one != @new'
21
- end
22
-
23
- def test_shouldnt_equal_different_class
24
- assert @two != @street, 'person != street_address with same id'
25
- assert @street != @two, 'street_address != person with same id'
26
- end
27
-
28
- def test_eql_should_alias_equals_operator
29
- assert_equal @new == @new, @new.eql?(@new)
30
- assert_equal @new == @one, @new.eql?(@one)
31
-
32
- assert_equal @one == @one, @one.eql?(@one)
33
- assert_equal @one == @new, @one.eql?(@new)
34
-
35
- assert_equal @one == @street, @one.eql?(@street)
36
- end
37
-
38
- def test_hash_should_be_id_hash
39
- [@new, @one, @two, @street].each do |resource|
40
- assert_equal resource.id.hash, resource.hash
41
- end
42
- end
43
-
44
- def test_with_prefix_options
45
- assert_equal @one == @one, @one.eql?(@one)
46
- assert_equal @one == @one.dup, @one.eql?(@one.dup)
47
- new_one = @one.dup
48
- new_one.prefix_options = {:foo => 'bar'}
49
- assert_not_equal @one, new_one
50
- end
51
-
52
- end
@@ -1,161 +0,0 @@
1
- require 'abstract_unit'
2
- require "fixtures/person"
3
- require "fixtures/street_address"
4
-
5
- module Highrise
6
- class Note < ActiveResource::Base
7
- self.site = "http://37s.sunrise.i:3000"
8
- end
9
-
10
- class Comment < ActiveResource::Base
11
- self.site = "http://37s.sunrise.i:3000"
12
- end
13
-
14
- module Deeply
15
- module Nested
16
-
17
- class Note < ActiveResource::Base
18
- self.site = "http://37s.sunrise.i:3000"
19
- end
20
-
21
- class Comment < ActiveResource::Base
22
- self.site = "http://37s.sunrise.i:3000"
23
- end
24
-
25
- module TestDifferentLevels
26
-
27
- class Note < ActiveResource::Base
28
- self.site = "http://37s.sunrise.i:3000"
29
- end
30
-
31
- end
32
-
33
- end
34
- end
35
-
36
- end
37
-
38
-
39
- class BaseLoadTest < Test::Unit::TestCase
40
- def setup
41
- @matz = { :id => 1, :name => 'Matz' }
42
-
43
- @first_address = { :id => 1, :street => '12345 Street' }
44
- @addresses = [@first_address, { :id => 2, :street => '67890 Street' }]
45
- @addresses_from_xml = { :street_addresses => @addresses }
46
- @addresses_from_xml_single = { :street_addresses => [ @first_address ] }
47
-
48
- @deep = { :id => 1, :street => {
49
- :id => 1, :state => { :id => 1, :name => 'Oregon',
50
- :notable_rivers => [
51
- { :id => 1, :name => 'Willamette' },
52
- { :id => 2, :name => 'Columbia', :rafted_by => @matz }],
53
- :postal_codes => [ 97018, 1234567890 ],
54
- :places => [ "Columbia City", "Unknown" ]}}}
55
-
56
- @person = Person.new
57
- end
58
-
59
- def test_load_expects_hash
60
- assert_raise(ArgumentError) { @person.load nil }
61
- assert_raise(ArgumentError) { @person.load '<person id="1"/>' }
62
- end
63
-
64
- def test_load_simple_hash
65
- assert_equal Hash.new, @person.attributes
66
- assert_equal @matz.stringify_keys, @person.load(@matz).attributes
67
- end
68
-
69
- def test_load_one_with_existing_resource
70
- address = @person.load(:street_address => @first_address).street_address
71
- assert_kind_of StreetAddress, address
72
- assert_equal @first_address.stringify_keys, address.attributes
73
- end
74
-
75
- def test_load_one_with_unknown_resource
76
- address = silence_warnings { @person.load(:address => @first_address).address }
77
- assert_kind_of Person::Address, address
78
- assert_equal @first_address.stringify_keys, address.attributes
79
- end
80
-
81
- def test_load_collection_with_existing_resource
82
- addresses = @person.load(@addresses_from_xml).street_addresses
83
- assert_kind_of Array, addresses
84
- addresses.each { |address| assert_kind_of StreetAddress, address }
85
- assert_equal @addresses.map(&:stringify_keys), addresses.map(&:attributes)
86
- end
87
-
88
- def test_load_collection_with_unknown_resource
89
- Person.__send__(:remove_const, :Address) if Person.const_defined?(:Address)
90
- assert !Person.const_defined?(:Address), "Address shouldn't exist until autocreated"
91
- addresses = silence_warnings { @person.load(:addresses => @addresses).addresses }
92
- assert Person.const_defined?(:Address), "Address should have been autocreated"
93
- addresses.each { |address| assert_kind_of Person::Address, address }
94
- assert_equal @addresses.map(&:stringify_keys), addresses.map(&:attributes)
95
- end
96
-
97
- def test_load_collection_with_single_existing_resource
98
- addresses = @person.load(@addresses_from_xml_single).street_addresses
99
- assert_kind_of Array, addresses
100
- addresses.each { |address| assert_kind_of StreetAddress, address }
101
- assert_equal [ @first_address ].map(&:stringify_keys), addresses.map(&:attributes)
102
- end
103
-
104
- def test_load_collection_with_single_unknown_resource
105
- Person.__send__(:remove_const, :Address) if Person.const_defined?(:Address)
106
- assert !Person.const_defined?(:Address), "Address shouldn't exist until autocreated"
107
- addresses = silence_warnings { @person.load(:addresses => [ @first_address ]).addresses }
108
- assert Person.const_defined?(:Address), "Address should have been autocreated"
109
- addresses.each { |address| assert_kind_of Person::Address, address }
110
- assert_equal [ @first_address ].map(&:stringify_keys), addresses.map(&:attributes)
111
- end
112
-
113
- def test_recursively_loaded_collections
114
- person = @person.load(@deep)
115
- assert_equal @deep[:id], person.id
116
-
117
- street = person.street
118
- assert_kind_of Person::Street, street
119
- assert_equal @deep[:street][:id], street.id
120
-
121
- state = street.state
122
- assert_kind_of Person::Street::State, state
123
- assert_equal @deep[:street][:state][:id], state.id
124
-
125
- rivers = state.notable_rivers
126
- assert_kind_of Array, rivers
127
- assert_kind_of Person::Street::State::NotableRiver, rivers.first
128
- assert_equal @deep[:street][:state][:notable_rivers].first[:id], rivers.first.id
129
- assert_equal @matz[:id], rivers.last.rafted_by.id
130
-
131
- postal_codes = state.postal_codes
132
- assert_kind_of Array, postal_codes
133
- assert_equal 2, postal_codes.size
134
- assert_kind_of Fixnum, postal_codes.first
135
- assert_equal @deep[:street][:state][:postal_codes].first, postal_codes.first
136
- assert_kind_of Numeric, postal_codes.last
137
- assert_equal @deep[:street][:state][:postal_codes].last, postal_codes.last
138
-
139
- places = state.places
140
- assert_kind_of Array, places
141
- assert_kind_of String, places.first
142
- assert_equal @deep[:street][:state][:places].first, places.first
143
- end
144
-
145
- def test_nested_collections_within_the_same_namespace
146
- n = Highrise::Note.new(:comments => [{ :name => "1" }])
147
- assert_kind_of Highrise::Comment, n.comments.first
148
- end
149
-
150
- def test_nested_collections_within_deeply_nested_namespace
151
- n = Highrise::Deeply::Nested::Note.new(:comments => [{ :name => "1" }])
152
- assert_kind_of Highrise::Deeply::Nested::Comment, n.comments.first
153
- end
154
-
155
- def test_nested_collections_in_different_levels_of_namespaces
156
- n = Highrise::Deeply::Nested::TestDifferentLevels::Note.new(:comments => [{ :name => "1" }])
157
- assert_kind_of Highrise::Deeply::Nested::Comment, n.comments.first
158
- end
159
-
160
-
161
- end
@@ -1,98 +0,0 @@
1
- require 'abstract_unit'
2
- require "fixtures/person"
3
-
4
- class BaseErrorsTest < Test::Unit::TestCase
5
- def setup
6
- ActiveResource::HttpMock.respond_to do |mock|
7
- mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>), 422, {'Content-Type' => 'application/xml; charset=utf-8'}
8
- mock.post "/people.json", {}, %q({"errors":["Age can't be blank","Name can't be blank","Name must start with a letter","Person quota full for today."]}), 422, {'Content-Type' => 'application/json; charset=utf-8'}
9
- end
10
- @person = Person.new(:name => '', :age => '')
11
- assert_equal @person.save, false
12
- end
13
-
14
- def test_should_mark_as_invalid
15
- [ :json, :xml ].each do |format|
16
- invalid_user_using_format(format) do
17
- assert !@person.valid?
18
- end
19
- end
20
- end
21
-
22
- def test_should_parse_xml_errors
23
- [ :json, :xml ].each do |format|
24
- invalid_user_using_format(format) do
25
- assert_kind_of ActiveResource::Errors, @person.errors
26
- assert_equal 4, @person.errors.size
27
- end
28
- end
29
- end
30
-
31
- def test_should_parse_errors_to_individual_attributes
32
- [ :json, :xml ].each do |format|
33
- invalid_user_using_format(format) do
34
- assert @person.errors[:name].any?
35
- assert_equal "can't be blank", @person.errors[:age]
36
- assert_equal ["can't be blank", "must start with a letter"], @person.errors[:name]
37
- assert_equal "Person quota full for today.", @person.errors[:base]
38
- end
39
- end
40
- end
41
-
42
- def test_should_iterate_over_errors
43
- [ :json, :xml ].each do |format|
44
- invalid_user_using_format(format) do
45
- errors = []
46
- @person.errors.each { |attribute, message| errors << [attribute, message] }
47
- assert errors.include?(['name', "can't be blank"])
48
- end
49
- end
50
- end
51
-
52
- def test_should_iterate_over_full_errors
53
- [ :json, :xml ].each do |format|
54
- invalid_user_using_format(format) do
55
- errors = []
56
- @person.errors.to_a.each { |message| errors << message }
57
- assert errors.include?(["name", "can't be blank"])
58
- end
59
- end
60
- end
61
-
62
- def test_should_format_full_errors
63
- [ :json, :xml ].each do |format|
64
- invalid_user_using_format(format) do
65
- full = @person.errors.full_messages
66
- assert full.include?("Age can't be blank")
67
- assert full.include?("Name can't be blank")
68
- assert full.include?("Name must start with a letter")
69
- assert full.include?("Person quota full for today.")
70
- end
71
- end
72
- end
73
-
74
- def test_should_mark_as_invalid_when_content_type_is_unavailable_in_response_header
75
- ActiveResource::HttpMock.respond_to do |mock|
76
- mock.post "/people.xml", {}, %q(<?xml version="1.0" encoding="UTF-8"?><errors><error>Age can't be blank</error><error>Name can't be blank</error><error>Name must start with a letter</error><error>Person quota full for today.</error></errors>), 422, {}
77
- mock.post "/people.json", {}, %q({"errors":["Age can't be blank","Name can't be blank","Name must start with a letter","Person quota full for today."]}), 422, {}
78
- end
79
-
80
- [ :json, :xml ].each do |format|
81
- invalid_user_using_format(format) do
82
- assert !@person.valid?
83
- end
84
- end
85
- end
86
-
87
- private
88
- def invalid_user_using_format(mime_type_reference)
89
- previous_format = Person.format
90
- Person.format = mime_type_reference
91
- @person = Person.new(:name => '', :age => '')
92
- assert_equal false, @person.save
93
-
94
- yield
95
- ensure
96
- Person.format = previous_format
97
- end
98
- end
data/test/base_test.rb DELETED
@@ -1,1087 +0,0 @@
1
- require 'abstract_unit'
2
- require "fixtures/person"
3
- require "fixtures/customer"
4
- require "fixtures/street_address"
5
- require "fixtures/beast"
6
- require "fixtures/proxy"
7
- require 'active_support/json'
8
-
9
- class BaseTest < Test::Unit::TestCase
10
- def setup
11
- @matz = { :id => 1, :name => 'Matz' }.to_xml(:root => 'person')
12
- @david = { :id => 2, :name => 'David' }.to_xml(:root => 'person')
13
- @greg = { :id => 3, :name => 'Greg' }.to_xml(:root => 'person')
14
- @addy = { :id => 1, :street => '12345 Street' }.to_xml(:root => 'address')
15
- @default_request_headers = { 'Content-Type' => 'application/xml' }
16
- @rick = { :name => "Rick", :age => 25 }.to_xml(:root => "person")
17
- @joe = {'person' => { :id => 6, :name => 'Joe' }}.to_json
18
- @people = [{ :id => 1, :name => 'Matz' }, { :id => 2, :name => 'David' }].to_xml(:root => 'people')
19
- @people_david = [{ :id => 2, :name => 'David' }].to_xml(:root => 'people')
20
- @addresses = [{ :id => 1, :street => '12345 Street' }].to_xml(:root => 'addresses')
21
-
22
- # - deep nested resource -
23
- # - Luis (Customer)
24
- # - JK (Customer::Friend)
25
- # - Mateo (Customer::Friend::Brother)
26
- # - Edith (Customer::Friend::Brother::Child)
27
- # - Martha (Customer::Friend::Brother::Child)
28
- # - Felipe (Customer::Friend::Brother)
29
- # - Bryan (Customer::Friend::Brother::Child)
30
- # - Luke (Customer::Friend::Brother::Child)
31
- # - Eduardo (Customer::Friend)
32
- # - Sebas (Customer::Friend::Brother)
33
- # - Andres (Customer::Friend::Brother::Child)
34
- # - Jorge (Customer::Friend::Brother::Child)
35
- # - Elsa (Customer::Friend::Brother)
36
- # - Natacha (Customer::Friend::Brother::Child)
37
- # - Milena (Customer::Friend::Brother)
38
- #
39
- @luis = {:id => 1, :name => 'Luis',
40
- :friends => [{:name => 'JK',
41
- :brothers => [{:name => 'Mateo',
42
- :children => [{:name => 'Edith'},{:name => 'Martha'}]},
43
- {:name => 'Felipe',
44
- :children => [{:name => 'Bryan'},{:name => 'Luke'}]}]},
45
- {:name => 'Eduardo',
46
- :brothers => [{:name => 'Sebas',
47
- :children => [{:name => 'Andres'},{:name => 'Jorge'}]},
48
- {:name => 'Elsa',
49
- :children => [{:name => 'Natacha'}]},
50
- {:name => 'Milena',
51
- :children => []}]}]}.to_xml(:root => 'customer')
52
- # - resource with yaml array of strings; for ActiveRecords using serialize :bar, Array
53
- @marty = <<-eof.strip
54
- <?xml version=\"1.0\" encoding=\"UTF-8\"?>
55
- <person>
56
- <id type=\"integer\">5</id>
57
- <name>Marty</name>
58
- <colors type=\"yaml\">---
59
- - \"red\"
60
- - \"green\"
61
- - \"blue\"
62
- </colors>
63
- </person>
64
- eof
65
-
66
- ActiveResource::HttpMock.respond_to do |mock|
67
- mock.get "/people/1.xml", {}, @matz
68
- mock.get "/people/2.xml", {}, @david
69
- mock.get "/people/6.json", {}, @joe
70
- mock.get "/people/5.xml", {}, @marty
71
- mock.get "/people/Greg.xml", {}, @greg
72
- mock.get "/people/4.xml", {'key' => 'value'}, nil, 404
73
- mock.put "/people/1.xml", {}, nil, 204
74
- mock.delete "/people/1.xml", {}, nil, 200
75
- mock.delete "/people/2.xml", {}, nil, 400
76
- mock.get "/people/99.xml", {}, nil, 404
77
- mock.post "/people.xml", {}, @rick, 201, 'Location' => '/people/5.xml'
78
- mock.get "/people.xml", {}, @people
79
- mock.get "/people/1/addresses.xml", {}, @addresses
80
- mock.get "/people/1/addresses/1.xml", {}, @addy
81
- mock.get "/people/1/addresses/2.xml", {}, nil, 404
82
- mock.get "/people/2/addresses/1.xml", {}, nil, 404
83
- mock.get "/people/Greg/addresses/1.xml", {}, @addy
84
- mock.put "/people/1/addresses/1.xml", {}, nil, 204
85
- mock.delete "/people/1/addresses/1.xml", {}, nil, 200
86
- mock.post "/people/1/addresses.xml", {}, nil, 201, 'Location' => '/people/1/addresses/5'
87
- mock.get "/people//addresses.xml", {}, nil, 404
88
- mock.get "/people//addresses/1.xml", {}, nil, 404
89
- mock.put "/people//addresses/1.xml", {}, nil, 404
90
- mock.delete "/people//addresses/1.xml", {}, nil, 404
91
- mock.post "/people//addresses.xml", {}, nil, 404
92
- mock.head "/people/1.xml", {}, nil, 200
93
- mock.head "/people/Greg.xml", {}, nil, 200
94
- mock.head "/people/99.xml", {}, nil, 404
95
- mock.head "/people/1/addresses/1.xml", {}, nil, 200
96
- mock.head "/people/1/addresses/2.xml", {}, nil, 404
97
- mock.head "/people/2/addresses/1.xml", {}, nil, 404
98
- mock.head "/people/Greg/addresses/1.xml", {}, nil, 200
99
- # customer
100
- mock.get "/customers/1.xml", {}, @luis
101
- end
102
-
103
- Person.user = nil
104
- Person.password = nil
105
- end
106
-
107
-
108
- def test_site_accessor_accepts_uri_or_string_argument
109
- site = URI.parse('http://localhost')
110
-
111
- assert_nothing_raised { Person.site = 'http://localhost' }
112
- assert_equal site, Person.site
113
-
114
- assert_nothing_raised { Person.site = site }
115
- assert_equal site, Person.site
116
- end
117
-
118
- def test_should_use_site_prefix_and_credentials
119
- assert_equal 'http://foo:bar@beast.caboo.se', Forum.site.to_s
120
- assert_equal 'http://foo:bar@beast.caboo.se/forums/:forum_id', Topic.site.to_s
121
- end
122
-
123
- def test_site_variable_can_be_reset
124
- actor = Class.new(ActiveResource::Base)
125
- assert_nil actor.site
126
- actor.site = 'http://localhost:31337'
127
- actor.site = nil
128
- assert_nil actor.site
129
- end
130
-
131
- def test_proxy_accessor_accepts_uri_or_string_argument
132
- proxy = URI.parse('http://localhost')
133
-
134
- assert_nothing_raised { Person.proxy = 'http://localhost' }
135
- assert_equal proxy, Person.proxy
136
-
137
- assert_nothing_raised { Person.proxy = proxy }
138
- assert_equal proxy, Person.proxy
139
- end
140
-
141
- def test_should_use_proxy_prefix_and_credentials
142
- assert_equal 'http://user:password@proxy.local:3000', ProxyResource.proxy.to_s
143
- end
144
-
145
- def test_proxy_variable_can_be_reset
146
- actor = Class.new(ActiveResource::Base)
147
- assert_nil actor.site
148
- actor.proxy = 'http://localhost:31337'
149
- actor.proxy = nil
150
- assert_nil actor.site
151
- end
152
-
153
- def test_should_accept_setting_user
154
- Forum.user = 'david'
155
- assert_equal('david', Forum.user)
156
- assert_equal('david', Forum.connection.user)
157
- end
158
-
159
- def test_should_accept_setting_password
160
- Forum.password = 'test123'
161
- assert_equal('test123', Forum.password)
162
- assert_equal('test123', Forum.connection.password)
163
- end
164
-
165
- def test_should_accept_setting_timeout
166
- Forum.timeout = 5
167
- assert_equal(5, Forum.timeout)
168
- assert_equal(5, Forum.connection.timeout)
169
- end
170
-
171
- def test_should_accept_setting_ssl_options
172
- expected = {:verify => 1}
173
- Forum.ssl_options= expected
174
- assert_equal(expected, Forum.ssl_options)
175
- assert_equal(expected, Forum.connection.ssl_options)
176
- end
177
-
178
- def test_user_variable_can_be_reset
179
- actor = Class.new(ActiveResource::Base)
180
- actor.site = 'http://cinema'
181
- assert_nil actor.user
182
- actor.user = 'username'
183
- actor.user = nil
184
- assert_nil actor.user
185
- assert_nil actor.connection.user
186
- end
187
-
188
- def test_password_variable_can_be_reset
189
- actor = Class.new(ActiveResource::Base)
190
- actor.site = 'http://cinema'
191
- assert_nil actor.password
192
- actor.password = 'username'
193
- actor.password = nil
194
- assert_nil actor.password
195
- assert_nil actor.connection.password
196
- end
197
-
198
- def test_timeout_variable_can_be_reset
199
- actor = Class.new(ActiveResource::Base)
200
- actor.site = 'http://cinema'
201
- assert_nil actor.timeout
202
- actor.timeout = 5
203
- actor.timeout = nil
204
- assert_nil actor.timeout
205
- assert_nil actor.connection.timeout
206
- end
207
-
208
- def test_ssl_options_hash_can_be_reset
209
- actor = Class.new(ActiveResource::Base)
210
- actor.site = 'https://cinema'
211
- assert_nil actor.ssl_options
212
- actor.ssl_options = {:foo => 5}
213
- actor.ssl_options = nil
214
- assert_nil actor.ssl_options
215
- assert_nil actor.connection.ssl_options
216
- end
217
-
218
- def test_credentials_from_site_are_decoded
219
- actor = Class.new(ActiveResource::Base)
220
- actor.site = 'http://my%40email.com:%31%32%33@cinema'
221
- assert_equal("my@email.com", actor.user)
222
- assert_equal("123", actor.password)
223
- end
224
-
225
- def test_site_reader_uses_superclass_site_until_written
226
- # Superclass is Object so returns nil.
227
- assert_nil ActiveResource::Base.site
228
- assert_nil Class.new(ActiveResource::Base).site
229
-
230
- # Subclass uses superclass site.
231
- actor = Class.new(Person)
232
- assert_equal Person.site, actor.site
233
-
234
- # Subclass returns frozen superclass copy.
235
- assert !Person.site.frozen?
236
- assert actor.site.frozen?
237
-
238
- # Changing subclass site doesn't change superclass site.
239
- actor.site = 'http://localhost:31337'
240
- assert_not_equal Person.site, actor.site
241
-
242
- # Changed subclass site is not frozen.
243
- assert !actor.site.frozen?
244
-
245
- # Changing superclass site doesn't overwrite subclass site.
246
- Person.site = 'http://somewhere.else'
247
- assert_not_equal Person.site, actor.site
248
-
249
- # Changing superclass site after subclassing changes subclass site.
250
- jester = Class.new(actor)
251
- actor.site = 'http://nomad'
252
- assert_equal actor.site, jester.site
253
- assert jester.site.frozen?
254
-
255
- # Subclasses are always equal to superclass site when not overridden
256
- fruit = Class.new(ActiveResource::Base)
257
- apple = Class.new(fruit)
258
-
259
- fruit.site = 'http://market'
260
- assert_equal fruit.site, apple.site, 'subclass did not adopt changes from parent class'
261
-
262
- fruit.site = 'http://supermarket'
263
- assert_equal fruit.site, apple.site, 'subclass did not adopt changes from parent class'
264
- end
265
-
266
- def test_proxy_reader_uses_superclass_site_until_written
267
- # Superclass is Object so returns nil.
268
- assert_nil ActiveResource::Base.proxy
269
- assert_nil Class.new(ActiveResource::Base).proxy
270
-
271
- # Subclass uses superclass proxy.
272
- actor = Class.new(Person)
273
- assert_equal Person.proxy, actor.proxy
274
-
275
- # Subclass returns frozen superclass copy.
276
- assert !Person.proxy.frozen?
277
- assert actor.proxy.frozen?
278
-
279
- # Changing subclass proxy doesn't change superclass site.
280
- actor.proxy = 'http://localhost:31337'
281
- assert_not_equal Person.proxy, actor.proxy
282
-
283
- # Changed subclass proxy is not frozen.
284
- assert !actor.proxy.frozen?
285
-
286
- # Changing superclass proxy doesn't overwrite subclass site.
287
- Person.proxy = 'http://somewhere.else'
288
- assert_not_equal Person.proxy, actor.proxy
289
-
290
- # Changing superclass proxy after subclassing changes subclass site.
291
- jester = Class.new(actor)
292
- actor.proxy = 'http://nomad'
293
- assert_equal actor.proxy, jester.proxy
294
- assert jester.proxy.frozen?
295
-
296
- # Subclasses are always equal to superclass proxy when not overridden
297
- fruit = Class.new(ActiveResource::Base)
298
- apple = Class.new(fruit)
299
-
300
- fruit.proxy = 'http://market'
301
- assert_equal fruit.proxy, apple.proxy, 'subclass did not adopt changes from parent class'
302
-
303
- fruit.proxy = 'http://supermarket'
304
- assert_equal fruit.proxy, apple.proxy, 'subclass did not adopt changes from parent class'
305
- end
306
-
307
- def test_user_reader_uses_superclass_user_until_written
308
- # Superclass is Object so returns nil.
309
- assert_nil ActiveResource::Base.user
310
- assert_nil Class.new(ActiveResource::Base).user
311
- Person.user = 'anonymous'
312
-
313
- # Subclass uses superclass user.
314
- actor = Class.new(Person)
315
- assert_equal Person.user, actor.user
316
-
317
- # Subclass returns frozen superclass copy.
318
- assert !Person.user.frozen?
319
- assert actor.user.frozen?
320
-
321
- # Changing subclass user doesn't change superclass user.
322
- actor.user = 'david'
323
- assert_not_equal Person.user, actor.user
324
-
325
- # Changing superclass user doesn't overwrite subclass user.
326
- Person.user = 'john'
327
- assert_not_equal Person.user, actor.user
328
-
329
- # Changing superclass user after subclassing changes subclass user.
330
- jester = Class.new(actor)
331
- actor.user = 'john.doe'
332
- assert_equal actor.user, jester.user
333
-
334
- # Subclasses are always equal to superclass user when not overridden
335
- fruit = Class.new(ActiveResource::Base)
336
- apple = Class.new(fruit)
337
-
338
- fruit.user = 'manager'
339
- assert_equal fruit.user, apple.user, 'subclass did not adopt changes from parent class'
340
-
341
- fruit.user = 'client'
342
- assert_equal fruit.user, apple.user, 'subclass did not adopt changes from parent class'
343
- end
344
-
345
- def test_password_reader_uses_superclass_password_until_written
346
- # Superclass is Object so returns nil.
347
- assert_nil ActiveResource::Base.password
348
- assert_nil Class.new(ActiveResource::Base).password
349
- Person.password = 'my-password'
350
-
351
- # Subclass uses superclass password.
352
- actor = Class.new(Person)
353
- assert_equal Person.password, actor.password
354
-
355
- # Subclass returns frozen superclass copy.
356
- assert !Person.password.frozen?
357
- assert actor.password.frozen?
358
-
359
- # Changing subclass password doesn't change superclass password.
360
- actor.password = 'secret'
361
- assert_not_equal Person.password, actor.password
362
-
363
- # Changing superclass password doesn't overwrite subclass password.
364
- Person.password = 'super-secret'
365
- assert_not_equal Person.password, actor.password
366
-
367
- # Changing superclass password after subclassing changes subclass password.
368
- jester = Class.new(actor)
369
- actor.password = 'even-more-secret'
370
- assert_equal actor.password, jester.password
371
-
372
- # Subclasses are always equal to superclass password when not overridden
373
- fruit = Class.new(ActiveResource::Base)
374
- apple = Class.new(fruit)
375
-
376
- fruit.password = 'mega-secret'
377
- assert_equal fruit.password, apple.password, 'subclass did not adopt changes from parent class'
378
-
379
- fruit.password = 'ok-password'
380
- assert_equal fruit.password, apple.password, 'subclass did not adopt changes from parent class'
381
- end
382
-
383
- def test_timeout_reader_uses_superclass_timeout_until_written
384
- # Superclass is Object so returns nil.
385
- assert_nil ActiveResource::Base.timeout
386
- assert_nil Class.new(ActiveResource::Base).timeout
387
- Person.timeout = 5
388
-
389
- # Subclass uses superclass timeout.
390
- actor = Class.new(Person)
391
- assert_equal Person.timeout, actor.timeout
392
-
393
- # Changing subclass timeout doesn't change superclass timeout.
394
- actor.timeout = 10
395
- assert_not_equal Person.timeout, actor.timeout
396
-
397
- # Changing superclass timeout doesn't overwrite subclass timeout.
398
- Person.timeout = 15
399
- assert_not_equal Person.timeout, actor.timeout
400
-
401
- # Changing superclass timeout after subclassing changes subclass timeout.
402
- jester = Class.new(actor)
403
- actor.timeout = 20
404
- assert_equal actor.timeout, jester.timeout
405
-
406
- # Subclasses are always equal to superclass timeout when not overridden.
407
- fruit = Class.new(ActiveResource::Base)
408
- apple = Class.new(fruit)
409
-
410
- fruit.timeout = 25
411
- assert_equal fruit.timeout, apple.timeout, 'subclass did not adopt changes from parent class'
412
-
413
- fruit.timeout = 30
414
- assert_equal fruit.timeout, apple.timeout, 'subclass did not adopt changes from parent class'
415
- end
416
-
417
- def test_ssl_options_reader_uses_superclass_ssl_options_until_written
418
- # Superclass is Object so returns nil.
419
- assert_nil ActiveResource::Base.ssl_options
420
- assert_nil Class.new(ActiveResource::Base).ssl_options
421
- Person.ssl_options = {:foo => 'bar'}
422
-
423
- # Subclass uses superclass ssl_options.
424
- actor = Class.new(Person)
425
- assert_equal Person.ssl_options, actor.ssl_options
426
-
427
- # Changing subclass ssl_options doesn't change superclass ssl_options.
428
- actor.ssl_options = {:baz => ''}
429
- assert_not_equal Person.ssl_options, actor.ssl_options
430
-
431
- # Changing superclass ssl_options doesn't overwrite subclass ssl_options.
432
- Person.ssl_options = {:color => 'blue'}
433
- assert_not_equal Person.ssl_options, actor.ssl_options
434
-
435
- # Changing superclass ssl_options after subclassing changes subclass ssl_options.
436
- jester = Class.new(actor)
437
- actor.ssl_options = {:color => 'red'}
438
- assert_equal actor.ssl_options, jester.ssl_options
439
-
440
- # Subclasses are always equal to superclass ssl_options when not overridden.
441
- fruit = Class.new(ActiveResource::Base)
442
- apple = Class.new(fruit)
443
-
444
- fruit.ssl_options = {:alpha => 'betas'}
445
- assert_equal fruit.ssl_options, apple.ssl_options, 'subclass did not adopt changes from parent class'
446
-
447
- fruit.ssl_options = {:omega => 'moos'}
448
- assert_equal fruit.ssl_options, apple.ssl_options, 'subclass did not adopt changes from parent class'
449
- end
450
-
451
- def test_updating_baseclass_site_object_wipes_descendent_cached_connection_objects
452
- # Subclasses are always equal to superclass site when not overridden
453
- fruit = Class.new(ActiveResource::Base)
454
- apple = Class.new(fruit)
455
-
456
- fruit.site = 'http://market'
457
- assert_equal fruit.connection.site, apple.connection.site
458
- first_connection = apple.connection.object_id
459
-
460
- fruit.site = 'http://supermarket'
461
- assert_equal fruit.connection.site, apple.connection.site
462
- second_connection = apple.connection.object_id
463
- assert_not_equal(first_connection, second_connection, 'Connection should be re-created')
464
- end
465
-
466
- def test_updating_baseclass_user_wipes_descendent_cached_connection_objects
467
- # Subclasses are always equal to superclass user when not overridden
468
- fruit = Class.new(ActiveResource::Base)
469
- apple = Class.new(fruit)
470
- fruit.site = 'http://market'
471
-
472
- fruit.user = 'david'
473
- assert_equal fruit.connection.user, apple.connection.user
474
- first_connection = apple.connection.object_id
475
-
476
- fruit.user = 'john'
477
- assert_equal fruit.connection.user, apple.connection.user
478
- second_connection = apple.connection.object_id
479
- assert_not_equal(first_connection, second_connection, 'Connection should be re-created')
480
- end
481
-
482
- def test_updating_baseclass_password_wipes_descendent_cached_connection_objects
483
- # Subclasses are always equal to superclass password when not overridden
484
- fruit = Class.new(ActiveResource::Base)
485
- apple = Class.new(fruit)
486
- fruit.site = 'http://market'
487
-
488
- fruit.password = 'secret'
489
- assert_equal fruit.connection.password, apple.connection.password
490
- first_connection = apple.connection.object_id
491
-
492
- fruit.password = 'supersecret'
493
- assert_equal fruit.connection.password, apple.connection.password
494
- second_connection = apple.connection.object_id
495
- assert_not_equal(first_connection, second_connection, 'Connection should be re-created')
496
- end
497
-
498
- def test_updating_baseclass_timeout_wipes_descendent_cached_connection_objects
499
- # Subclasses are always equal to superclass timeout when not overridden
500
- fruit = Class.new(ActiveResource::Base)
501
- apple = Class.new(fruit)
502
- fruit.site = 'http://market'
503
-
504
- fruit.timeout = 5
505
- assert_equal fruit.connection.timeout, apple.connection.timeout
506
- first_connection = apple.connection.object_id
507
-
508
- fruit.timeout = 10
509
- assert_equal fruit.connection.timeout, apple.connection.timeout
510
- second_connection = apple.connection.object_id
511
- assert_not_equal(first_connection, second_connection, 'Connection should be re-created')
512
- end
513
-
514
- def test_collection_name
515
- assert_equal "people", Person.collection_name
516
- end
517
-
518
- def test_collection_path
519
- assert_equal '/people.xml', Person.collection_path
520
- end
521
-
522
- def test_collection_path_with_parameters
523
- assert_equal '/people.xml?gender=male', Person.collection_path(:gender => 'male')
524
- assert_equal '/people.xml?gender=false', Person.collection_path(:gender => false)
525
- assert_equal '/people.xml?gender=', Person.collection_path(:gender => nil)
526
-
527
- assert_equal '/people.xml?gender=male', Person.collection_path('gender' => 'male')
528
-
529
- # Use includes? because ordering of param hash is not guaranteed
530
- assert Person.collection_path(:gender => 'male', :student => true).include?('/people.xml?')
531
- assert Person.collection_path(:gender => 'male', :student => true).include?('gender=male')
532
- assert Person.collection_path(:gender => 'male', :student => true).include?('student=true')
533
-
534
- assert_equal '/people.xml?name%5B%5D=bob&name%5B%5D=your+uncle%2Bme&name%5B%5D=&name%5B%5D=false', Person.collection_path(:name => ['bob', 'your uncle+me', nil, false])
535
-
536
- assert_equal '/people.xml?struct%5Ba%5D%5B%5D=2&struct%5Ba%5D%5B%5D=1&struct%5Bb%5D=fred', Person.collection_path(:struct => {:a => [2,1], 'b' => 'fred'})
537
- end
538
-
539
- def test_custom_element_path
540
- assert_equal '/people/1/addresses/1.xml', StreetAddress.element_path(1, :person_id => 1)
541
- assert_equal '/people/1/addresses/1.xml', StreetAddress.element_path(1, 'person_id' => 1)
542
- assert_equal '/people/Greg/addresses/1.xml', StreetAddress.element_path(1, 'person_id' => 'Greg')
543
- end
544
-
545
- def test_custom_element_path_with_redefined_to_param
546
- Person.module_eval do
547
- alias_method :original_to_param_element_path, :to_param
548
- def to_param
549
- name
550
- end
551
- end
552
-
553
- # Class method.
554
- assert_equal '/people/Greg.xml', Person.element_path('Greg')
555
-
556
- # Protected Instance method.
557
- assert_equal '/people/Greg.xml', Person.find('Greg').send(:element_path)
558
-
559
- ensure
560
- # revert back to original
561
- Person.module_eval do
562
- # save the 'new' to_param so we don't get a warning about discarding the method
563
- alias_method :element_path_to_param, :to_param
564
- alias_method :to_param, :original_to_param_element_path
565
- end
566
- end
567
-
568
- def test_custom_element_path_with_parameters
569
- assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, :person_id => 1, :type => 'work')
570
- assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, 'person_id' => 1, :type => 'work')
571
- assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, :type => 'work', :person_id => 1)
572
- assert_equal '/people/1/addresses/1.xml?type%5B%5D=work&type%5B%5D=play+time', StreetAddress.element_path(1, :person_id => 1, :type => ['work', 'play time'])
573
- end
574
-
575
- def test_custom_element_path_with_prefix_and_parameters
576
- assert_equal '/people/1/addresses/1.xml?type=work', StreetAddress.element_path(1, {:person_id => 1}, {:type => 'work'})
577
- end
578
-
579
- def test_custom_collection_path
580
- assert_equal '/people/1/addresses.xml', StreetAddress.collection_path(:person_id => 1)
581
- assert_equal '/people/1/addresses.xml', StreetAddress.collection_path('person_id' => 1)
582
- end
583
-
584
- def test_custom_collection_path_with_parameters
585
- assert_equal '/people/1/addresses.xml?type=work', StreetAddress.collection_path(:person_id => 1, :type => 'work')
586
- assert_equal '/people/1/addresses.xml?type=work', StreetAddress.collection_path('person_id' => 1, :type => 'work')
587
- end
588
-
589
- def test_custom_collection_path_with_prefix_and_parameters
590
- assert_equal '/people/1/addresses.xml?type=work', StreetAddress.collection_path({:person_id => 1}, {:type => 'work'})
591
- end
592
-
593
- def test_custom_element_name
594
- assert_equal 'address', StreetAddress.element_name
595
- end
596
-
597
- def test_custom_collection_name
598
- assert_equal 'addresses', StreetAddress.collection_name
599
- end
600
-
601
- def test_prefix
602
- assert_equal "/", Person.prefix
603
- assert_equal Set.new, Person.__send__(:prefix_parameters)
604
- end
605
-
606
- def test_set_prefix
607
- SetterTrap.rollback_sets(Person) do |person_class|
608
- person_class.prefix = "the_prefix"
609
- assert_equal "the_prefix", person_class.prefix
610
- end
611
- end
612
-
613
- def test_set_prefix_with_inline_keys
614
- SetterTrap.rollback_sets(Person) do |person_class|
615
- person_class.prefix = "the_prefix:the_param"
616
- assert_equal "the_prefixthe_param_value", person_class.prefix(:the_param => "the_param_value")
617
- end
618
- end
619
-
620
- def test_set_prefix_twice_should_clear_params
621
- SetterTrap.rollback_sets(Person) do |person_class|
622
- person_class.prefix = "the_prefix/:the_param1"
623
- assert_equal Set.new([:the_param1]), person_class.prefix_parameters
624
- person_class.prefix = "the_prefix/:the_param2"
625
- assert_equal Set.new([:the_param2]), person_class.prefix_parameters
626
- end
627
- end
628
-
629
- def test_set_prefix_with_default_value
630
- SetterTrap.rollback_sets(Person) do |person_class|
631
- person_class.set_prefix
632
- assert_equal "/", person_class.prefix
633
- end
634
- end
635
-
636
- def test_custom_prefix
637
- assert_equal '/people//', StreetAddress.prefix
638
- assert_equal '/people/1/', StreetAddress.prefix(:person_id => 1)
639
- assert_equal [:person_id].to_set, StreetAddress.__send__(:prefix_parameters)
640
- end
641
-
642
- def test_find_by_id
643
- matz = Person.find(1)
644
- assert_kind_of Person, matz
645
- assert_equal "Matz", matz.name
646
- assert matz.name?
647
- end
648
-
649
- def test_respond_to
650
- matz = Person.find(1)
651
- assert matz.respond_to?(:name)
652
- assert matz.respond_to?(:name=)
653
- assert matz.respond_to?(:name?)
654
- assert !matz.respond_to?(:super_scalable_stuff)
655
- end
656
-
657
- def test_find_by_id_with_custom_prefix
658
- addy = StreetAddress.find(1, :params => { :person_id => 1 })
659
- assert_kind_of StreetAddress, addy
660
- assert_equal '12345 Street', addy.street
661
- end
662
-
663
- def test_find_all
664
- all = Person.find(:all)
665
- assert_equal 2, all.size
666
- assert_kind_of Person, all.first
667
- assert_equal "Matz", all.first.name
668
- assert_equal "David", all.last.name
669
- end
670
-
671
- def test_find_first
672
- matz = Person.find(:first)
673
- assert_kind_of Person, matz
674
- assert_equal "Matz", matz.name
675
- end
676
-
677
- def test_find_last
678
- david = Person.find(:last)
679
- assert_kind_of Person, david
680
- assert_equal 'David', david.name
681
- end
682
-
683
- def test_custom_header
684
- Person.headers['key'] = 'value'
685
- assert_raise(ActiveResource::ResourceNotFound) { Person.find(4) }
686
- ensure
687
- Person.headers.delete('key')
688
- end
689
-
690
- def test_find_by_id_not_found
691
- assert_raise(ActiveResource::ResourceNotFound) { Person.find(99) }
692
- assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(1) }
693
- end
694
-
695
- def test_find_all_by_from
696
- ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, @people_david }
697
-
698
- people = Person.find(:all, :from => "/companies/1/people.xml")
699
- assert_equal 1, people.size
700
- assert_equal "David", people.first.name
701
- end
702
-
703
- def test_find_all_by_from_with_options
704
- ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/people.xml", {}, @people_david }
705
-
706
- people = Person.find(:all, :from => "/companies/1/people.xml")
707
- assert_equal 1, people.size
708
- assert_equal "David", people.first.name
709
- end
710
-
711
- def test_find_all_by_symbol_from
712
- ActiveResource::HttpMock.respond_to { |m| m.get "/people/managers.xml", {}, @people_david }
713
-
714
- people = Person.find(:all, :from => :managers)
715
- assert_equal 1, people.size
716
- assert_equal "David", people.first.name
717
- end
718
-
719
- def test_find_single_by_from
720
- ActiveResource::HttpMock.respond_to { |m| m.get "/companies/1/manager.xml", {}, @david }
721
-
722
- david = Person.find(:one, :from => "/companies/1/manager.xml")
723
- assert_equal "David", david.name
724
- end
725
-
726
- def test_find_single_by_symbol_from
727
- ActiveResource::HttpMock.respond_to { |m| m.get "/people/leader.xml", {}, @david }
728
-
729
- david = Person.find(:one, :from => :leader)
730
- assert_equal "David", david.name
731
- end
732
-
733
- def test_save
734
- rick = Person.new
735
- assert_equal true, rick.save
736
- assert_equal '5', rick.id
737
- end
738
-
739
- def test_id_from_response
740
- p = Person.new
741
- resp = {'Location' => '/foo/bar/1'}
742
- assert_equal '1', p.__send__(:id_from_response, resp)
743
-
744
- resp['Location'] << '.xml'
745
- assert_equal '1', p.__send__(:id_from_response, resp)
746
- end
747
-
748
- def test_id_from_response_without_location
749
- p = Person.new
750
- resp = {}
751
- assert_equal nil, p.__send__(:id_from_response, resp)
752
- end
753
-
754
- def test_create_with_custom_prefix
755
- matzs_house = StreetAddress.new(:person_id => 1)
756
- matzs_house.save
757
- assert_equal '5', matzs_house.id
758
- end
759
-
760
- # Test that loading a resource preserves its prefix_options.
761
- def test_load_preserves_prefix_options
762
- address = StreetAddress.find(1, :params => { :person_id => 1 })
763
- ryan = Person.new(:id => 1, :name => 'Ryan', :address => address)
764
- assert_equal address.prefix_options, ryan.address.prefix_options
765
- end
766
-
767
- def test_reload_works_with_prefix_options
768
- address = StreetAddress.find(1, :params => { :person_id => 1 })
769
- assert_equal address, address.reload
770
- end
771
-
772
- def test_reload_with_redefined_to_param
773
- Person.module_eval do
774
- alias_method :original_to_param_reload, :to_param
775
- def to_param
776
- name
777
- end
778
- end
779
-
780
- person = Person.find('Greg')
781
- assert_equal person, person.reload
782
-
783
- ensure
784
- # revert back to original
785
- Person.module_eval do
786
- # save the 'new' to_param so we don't get a warning about discarding the method
787
- alias_method :reload_to_param, :to_param
788
- alias_method :to_param, :original_to_param_reload
789
- end
790
- end
791
-
792
- def test_reload_works_without_prefix_options
793
- person = Person.find(:first)
794
- assert_equal person, person.reload
795
- end
796
-
797
- def test_create
798
- rick = Person.create(:name => 'Rick')
799
- assert rick.valid?
800
- assert !rick.new?
801
- assert_equal '5', rick.id
802
-
803
- # test additional attribute returned on create
804
- assert_equal 25, rick.age
805
-
806
- # Test that save exceptions get bubbled up too
807
- ActiveResource::HttpMock.respond_to do |mock|
808
- mock.post "/people.xml", {}, nil, 409
809
- end
810
- assert_raise(ActiveResource::ResourceConflict) { Person.create(:name => 'Rick') }
811
- end
812
-
813
- def test_create_without_location
814
- ActiveResource::HttpMock.respond_to do |mock|
815
- mock.post "/people.xml", {}, nil, 201
816
- end
817
- person = Person.create(:name => 'Rick')
818
- assert_equal nil, person.id
819
- end
820
-
821
- def test_clone
822
- matz = Person.find(1)
823
- matz_c = matz.clone
824
- assert matz_c.new?
825
- matz.attributes.each do |k, v|
826
- assert_equal v, matz_c.send(k) if k != Person.primary_key
827
- end
828
- end
829
-
830
- def test_nested_clone
831
- addy = StreetAddress.find(1, :params => {:person_id => 1})
832
- addy_c = addy.clone
833
- assert addy_c.new?
834
- addy.attributes.each do |k, v|
835
- assert_equal v, addy_c.send(k) if k != StreetAddress.primary_key
836
- end
837
- assert_equal addy.prefix_options, addy_c.prefix_options
838
- end
839
-
840
- def test_complex_clone
841
- matz = Person.find(1)
842
- matz.address = StreetAddress.find(1, :params => {:person_id => matz.id})
843
- matz.non_ar_hash = {:not => "an ARes instance"}
844
- matz.non_ar_arr = ["not", "ARes"]
845
- matz_c = matz.clone
846
- assert matz_c.new?
847
- assert_raise(NoMethodError) {matz_c.address}
848
- assert_equal matz.non_ar_hash, matz_c.non_ar_hash
849
- assert_equal matz.non_ar_arr, matz_c.non_ar_arr
850
-
851
- # Test that actual copy, not just reference copy
852
- matz.non_ar_hash[:not] = "changed"
853
- assert_not_equal matz.non_ar_hash, matz_c.non_ar_hash
854
- end
855
-
856
- def test_update
857
- matz = Person.find(:first)
858
- matz.name = "David"
859
- assert_kind_of Person, matz
860
- assert_equal "David", matz.name
861
- assert_equal true, matz.save
862
- end
863
-
864
- def test_update_with_custom_prefix_with_specific_id
865
- addy = StreetAddress.find(1, :params => { :person_id => 1 })
866
- addy.street = "54321 Street"
867
- assert_kind_of StreetAddress, addy
868
- assert_equal "54321 Street", addy.street
869
- addy.save
870
- end
871
-
872
- def test_update_with_custom_prefix_without_specific_id
873
- addy = StreetAddress.find(:first, :params => { :person_id => 1 })
874
- addy.street = "54321 Lane"
875
- assert_kind_of StreetAddress, addy
876
- assert_equal "54321 Lane", addy.street
877
- addy.save
878
- end
879
-
880
- def test_update_conflict
881
- ActiveResource::HttpMock.respond_to do |mock|
882
- mock.get "/people/2.xml", {}, @david
883
- mock.put "/people/2.xml", @default_request_headers, nil, 409
884
- end
885
- assert_raise(ActiveResource::ResourceConflict) { Person.find(2).save }
886
- end
887
-
888
- def test_destroy
889
- assert Person.find(1).destroy
890
- ActiveResource::HttpMock.respond_to do |mock|
891
- mock.get "/people/1.xml", {}, nil, 404
892
- end
893
- assert_raise(ActiveResource::ResourceNotFound) { Person.find(1).destroy }
894
- end
895
-
896
- def test_destroy_with_custom_prefix
897
- assert StreetAddress.find(1, :params => { :person_id => 1 }).destroy
898
- ActiveResource::HttpMock.respond_to do |mock|
899
- mock.get "/people/1/addresses/1.xml", {}, nil, 404
900
- end
901
- assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(1, :params => { :person_id => 1 }) }
902
- end
903
-
904
- def test_destroy_with_410_gone
905
- assert Person.find(1).destroy
906
- ActiveResource::HttpMock.respond_to do |mock|
907
- mock.get "/people/1.xml", {}, nil, 410
908
- end
909
- assert_raise(ActiveResource::ResourceGone) { Person.find(1).destroy }
910
- end
911
-
912
- def test_delete
913
- assert Person.delete(1)
914
- ActiveResource::HttpMock.respond_to do |mock|
915
- mock.get "/people/1.xml", {}, nil, 404
916
- end
917
- assert_raise(ActiveResource::ResourceNotFound) { Person.find(1) }
918
- end
919
-
920
- def test_delete_with_custom_prefix
921
- assert StreetAddress.delete(1, :person_id => 1)
922
- ActiveResource::HttpMock.respond_to do |mock|
923
- mock.get "/people/1/addresses/1.xml", {}, nil, 404
924
- end
925
- assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(1, :params => { :person_id => 1 }) }
926
- end
927
-
928
- def test_delete_with_410_gone
929
- assert Person.delete(1)
930
- ActiveResource::HttpMock.respond_to do |mock|
931
- mock.get "/people/1.xml", {}, nil, 410
932
- end
933
- assert_raise(ActiveResource::ResourceGone) { Person.find(1) }
934
- end
935
-
936
- def test_exists
937
- # Class method.
938
- assert !Person.exists?(nil)
939
- assert Person.exists?(1)
940
- assert !Person.exists?(99)
941
-
942
- # Instance method.
943
- assert !Person.new.exists?
944
- assert Person.find(1).exists?
945
- assert !Person.new(:id => 99).exists?
946
-
947
- # Nested class method.
948
- assert StreetAddress.exists?(1, :params => { :person_id => 1 })
949
- assert !StreetAddress.exists?(1, :params => { :person_id => 2 })
950
- assert !StreetAddress.exists?(2, :params => { :person_id => 1 })
951
-
952
- # Nested instance method.
953
- assert StreetAddress.find(1, :params => { :person_id => 1 }).exists?
954
- assert !StreetAddress.new({:id => 1, :person_id => 2}).exists?
955
- assert !StreetAddress.new({:id => 2, :person_id => 1}).exists?
956
- end
957
-
958
- def test_exists_with_redefined_to_param
959
- Person.module_eval do
960
- alias_method :original_to_param_exists, :to_param
961
- def to_param
962
- name
963
- end
964
- end
965
-
966
- # Class method.
967
- assert Person.exists?('Greg')
968
-
969
- # Instance method.
970
- assert Person.find('Greg').exists?
971
-
972
- # Nested class method.
973
- assert StreetAddress.exists?(1, :params => { :person_id => Person.find('Greg').to_param })
974
-
975
- # Nested instance method.
976
- assert StreetAddress.find(1, :params => { :person_id => Person.find('Greg').to_param }).exists?
977
-
978
- ensure
979
- # revert back to original
980
- Person.module_eval do
981
- # save the 'new' to_param so we don't get a warning about discarding the method
982
- alias_method :exists_to_param, :to_param
983
- alias_method :to_param, :original_to_param_exists
984
- end
985
- end
986
-
987
- def test_exists_without_http_mock
988
- http = Net::HTTP.new(Person.site.host, Person.site.port)
989
- ActiveResource::Connection.any_instance.expects(:http).returns(http)
990
- http.expects(:request).returns(ActiveResource::Response.new(""))
991
-
992
- assert Person.exists?('not-mocked')
993
- end
994
-
995
- def test_exists_with_410_gone
996
- ActiveResource::HttpMock.respond_to do |mock|
997
- mock.head "/people/1.xml", {}, nil, 410
998
- end
999
-
1000
- assert !Person.exists?(1)
1001
- end
1002
-
1003
- def test_to_xml
1004
- matz = Person.find(1)
1005
- xml = matz.encode
1006
- assert xml.starts_with?('<?xml version="1.0" encoding="UTF-8"?>')
1007
- assert xml.include?('<name>Matz</name>')
1008
- assert xml.include?('<id type="integer">1</id>')
1009
- end
1010
-
1011
- def test_to_xml_with_element_name
1012
- old_elem_name = Person.element_name
1013
- matz = Person.find(1)
1014
- Person.element_name = 'ruby_creator'
1015
- xml = matz.encode
1016
-
1017
- assert xml.include?('<?xml version="1.0" encoding="UTF-8"?>')
1018
- assert xml.include?('<ruby-creator>')
1019
- assert xml.include?('<name>Matz</name>')
1020
- assert xml.include?('<id type="integer">1</id>')
1021
- assert xml.include?('</ruby-creator>')
1022
- ensure
1023
- Person.element_name = old_elem_name
1024
- end
1025
-
1026
- def test_to_json_including_root
1027
- Person.include_root_in_json = true
1028
- Person.format = :json
1029
- joe = Person.find(6)
1030
- json = joe.encode
1031
- assert_match '{"person":{"person":{', json
1032
- assert_match '"name":"Joe"', json
1033
- assert_match '"id":6', json
1034
- ensure
1035
- Person.format = :xml
1036
- Person.include_root_in_json = false
1037
- end
1038
-
1039
- def test_to_json_with_element_name
1040
- old_elem_name = Person.element_name
1041
- Person.include_root_in_json = true
1042
- Person.format = :json
1043
- joe = Person.find(6)
1044
- Person.element_name = 'ruby_creator'
1045
- json = joe.encode
1046
- Person.format = :xml
1047
-
1048
- assert_match %r{^\{"ruby_creator":\{"person":\{}, json
1049
- assert_match %r{"id":6}, json
1050
- assert_match %r{"name":"Joe"}, json
1051
- assert_match %r{\}\}\}$}, json
1052
- ensure
1053
- Person.element_name = old_elem_name
1054
- Person.include_root_in_json = false
1055
- end
1056
-
1057
- def test_to_param_quacks_like_active_record
1058
- new_person = Person.new
1059
- assert_nil new_person.to_param
1060
- matz = Person.find(1)
1061
- assert_equal '1', matz.to_param
1062
- end
1063
-
1064
- def test_parse_deep_nested_resources
1065
- luis = Customer.find(1)
1066
- assert_kind_of Customer, luis
1067
- luis.friends.each do |friend|
1068
- assert_kind_of Customer::Friend, friend
1069
- friend.brothers.each do |brother|
1070
- assert_kind_of Customer::Friend::Brother, brother
1071
- brother.children.each do |child|
1072
- assert_kind_of Customer::Friend::Brother::Child, child
1073
- end
1074
- end
1075
- end
1076
- end
1077
-
1078
- def test_load_yaml_array
1079
- assert_nothing_raised do
1080
- marty = Person.find(5)
1081
- assert_equal 3, marty.colors.size
1082
- marty.colors.each do |color|
1083
- assert_kind_of String, color
1084
- end
1085
- end
1086
- end
1087
- end