sean-rets 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ require_relative "helper"
2
+
3
+ class TestLockingHttpClient < MiniTest::Test
4
+ def setup
5
+ @fake_client = stub('fake_client')
6
+ @locker = stub('locker')
7
+ @locking_client = Rets::LockingHttpClient.new(@fake_client, @locker, 'lock_name')
8
+ @url = "fake rets url"
9
+ @params = {'fake_param' => 'fake_param_value'}
10
+ end
11
+
12
+ def test_locking_client_calls_the_real_client_if_lock_succeeds
13
+ @locker.stubs(:lock).with('lock_name', {}).yields(nil)
14
+ @fake_client.expects(:http_post).with(@url, @params, {})
15
+ @locking_client.http_post(@url, @params)
16
+ end
17
+
18
+ def test_locking_client_does_nothing_if_lock_fails_to_yield
19
+ @fake_client.expects(:http_post).never
20
+ @locker.stubs(:lock).with('lock_name', {})
21
+ @locking_client.http_post(@url, @params)
22
+ end
23
+
24
+ def test_locking_client_returns_result_from_client
25
+ @fake_client.stubs(:http_post).returns('result')
26
+ @locker.stubs(:lock).with('lock_name', {}).yields(nil)
27
+ assert_equal 'result', @locking_client.http_post(@url, @params)
28
+ end
29
+ end
@@ -0,0 +1,459 @@
1
+ require_relative "helper"
2
+ require 'logger'
3
+
4
+ class TestMetadata < MiniTest::Test
5
+ def setup
6
+ @root = Rets::Metadata::Root.new(Logger.new(STDOUT), {})
7
+ $VERBOSE = true
8
+ end
9
+
10
+ def teardown
11
+ $VERBOSE = false
12
+ end
13
+
14
+ def test_metadata_root_build_tree
15
+ resource = stub(:id => "X")
16
+ Rets::Metadata::Resource.stubs(:build => resource)
17
+ resource_fragment = stub(:resource_fragment)
18
+ resource_container = stub(:rows => [resource_fragment])
19
+ @root.stubs(:metadata_types => { :resource => [resource_container] })
20
+ assert_equal({"x" => resource}, @root.build_tree)
21
+ assert_equal(resource, @root.build_tree["X"])
22
+ end
23
+
24
+ def test_metadata_root_version
25
+ @root.instance_variable_set("@metadata_types", {:system => [stub(:version => "1")]})
26
+ assert_equal "1", @root.version
27
+ end
28
+
29
+ def test_metadata_root_date
30
+ @root.instance_variable_set("@metadata_types", {:system => [stub(:date => "1")]})
31
+ assert_equal "1", @root.date
32
+ end
33
+
34
+ def test_metadata_root_different_version
35
+ @root.stubs(:version).returns("1.2.2")
36
+ @root.stubs(:date).returns("1")
37
+
38
+ current_version = "1.2.3"
39
+ current_timestamp = "1"
40
+
41
+ assert !@root.current?(current_timestamp, current_version)
42
+ end
43
+
44
+ def test_metadata_root_same_version
45
+ @root.stubs(:version).returns("1.2.2")
46
+ @root.stubs(:date).returns("1")
47
+
48
+ current_version = "1.2.2"
49
+ current_timestamp = "2"
50
+
51
+ assert @root.current?(current_timestamp, current_version)
52
+ end
53
+
54
+ def test_metadata_root_no_version_same_timestamp
55
+ @root.stubs(:version).returns("")
56
+ @root.stubs(:date).returns("1")
57
+
58
+ current_version = "1.2.3"
59
+ current_timestamp = "1"
60
+
61
+ assert @root.current?(current_timestamp, current_version)
62
+ end
63
+
64
+ def test_metadata_root_current
65
+ @root.stubs(:version).returns("1.2.2")
66
+ @root.stubs(:date).returns("1")
67
+
68
+ current_timestamp = "1"
69
+ current_version = "1.2.2"
70
+
71
+ assert @root.current?(current_timestamp, current_version)
72
+ end
73
+
74
+ # missing timestamp - this happens in violation of the spec.
75
+ def test_metadata_root_current_ignores_missing_timestamp
76
+ @root.stubs(:version).returns("1.2.2")
77
+ @root.stubs(:date).returns("1")
78
+
79
+ current_timestamp = nil
80
+ current_version = "1.2.2"
81
+
82
+ assert @root.current?(current_timestamp, current_version)
83
+ end
84
+
85
+ # missing version - this happens in violation of the spec.
86
+ def test_metadata_root_current_ignores_missing_version
87
+ @root.stubs(:version).returns("1.2.2")
88
+ @root.stubs(:date).returns("1")
89
+
90
+ current_timestamp = "1"
91
+ current_version = nil
92
+
93
+ assert @root.current?(current_timestamp, current_version)
94
+ end
95
+
96
+ def test_metadata_root_metadata_types_constructs_a_hash_of_metadata_types_from_sources
97
+ test_sources = { "X" => "Y", "Z" => "W" }
98
+ root = Rets::Metadata::Root.new(stub(:logger), test_sources)
99
+ root.stubs(:build_containers => "Y--")
100
+ Nokogiri.stubs(:parse => "Y-")
101
+
102
+ assert_equal({:x => "Y--", :z => "Y--"}, root.metadata_types)
103
+ end
104
+
105
+ def test_metadata_root_build_containers_selects_correct_tags
106
+ doc = "<RETS><METADATA-FOO></METADATA-FOO><MET-FOO></MET-FOO><METADATA-BAR /></RETS>"
107
+
108
+ @root.expects(:build_container).with { |fragment| fragment.name == "METADATA-FOO" }
109
+ @root.expects(:build_container).with { |fragment| fragment.name == "METADATA-BAR" }
110
+
111
+ @root.build_containers(Nokogiri.parse(doc))
112
+ end
113
+
114
+ def test_metadata_root_build_container_uses_row_containers_for_resource
115
+ doc = Nokogiri.parse(METADATA_RESOURCE).xpath("//METADATA-RESOURCE").first
116
+
117
+ container = @root.build_container(doc)
118
+
119
+ assert_instance_of Rets::Metadata::Containers::ResourceContainer, container
120
+
121
+ assert_equal 13, container.resources.size
122
+
123
+ resource = container.resources.first
124
+
125
+ assert_equal "ActiveAgent", resource["StandardName"]
126
+ end
127
+
128
+ def test_metadata_root_build_container_uses_system_container_for_system
129
+ doc = Nokogiri.parse(METADATA_SYSTEM).xpath("//METADATA-SYSTEM").first
130
+
131
+ container = @root.build_container(doc)
132
+ assert_instance_of Rets::Metadata::Containers::SystemContainer, container
133
+ end
134
+
135
+ def test_metadata_root_build_container_uses_base_container_for_unknown_metadata_types
136
+ doc = Nokogiri.parse(METADATA_UNKNOWN).xpath("//METADATA-FOO").first
137
+
138
+ container = @root.build_container(doc)
139
+ assert_instance_of Rets::Metadata::Containers::Container, container
140
+ end
141
+
142
+ def test_metadata_uses
143
+ #TODO
144
+ end
145
+
146
+ def test_resource_initialize
147
+ fragment = { "ResourceID" => 'r' }
148
+ resource = Rets::Metadata::Resource.new(fragment)
149
+ assert_equal('r', resource.id)
150
+ assert_equal([], resource.rets_classes)
151
+ end
152
+
153
+ def test_resource_build_lookup_tree
154
+ metadata = stub(:metadata)
155
+ resource = stub(:resource)
156
+
157
+ Rets::Metadata::Resource.expects(:find_lookup_containers).
158
+ with(metadata, resource).
159
+ returns([stub(:lookups => [{"LookupName" => "Foo"}])])
160
+
161
+ Rets::Metadata::Resource.expects(:find_lookup_type_containers).
162
+ with(metadata, resource, "Foo").
163
+ returns([stub(:lookup_types => [{"Value" => "111", "LongValue" => "Bar"}])])
164
+
165
+ tree = Rets::Metadata::Resource.build_lookup_tree(resource, metadata)
166
+
167
+ assert_equal ["Foo"], tree.keys
168
+ assert_equal 1, tree["Foo"].size
169
+
170
+ lookup_type = tree["Foo"].first
171
+
172
+ assert_equal "111", lookup_type.value
173
+ assert_equal "Bar", lookup_type.long_value
174
+ end
175
+
176
+ def test_resource_build_classes
177
+ resource = stub(:resource)
178
+ metadata = stub(:metadata)
179
+ rets_class = stub(:rets_class)
180
+ rets_class_fragment = stub(:rets_class_fragment)
181
+
182
+ Rets::Metadata::RetsClass.expects(:build).with(rets_class_fragment, resource, metadata).returns(rets_class)
183
+ Rets::Metadata::Resource.expects(:find_rets_classes).with(metadata, resource).returns([rets_class_fragment])
184
+
185
+ classes = Rets::Metadata::Resource.build_classes(resource, metadata)
186
+ assert_equal([rets_class], classes)
187
+ end
188
+
189
+ def test_resource_build
190
+ fragment = { "ResourceID" => "test" }
191
+
192
+ lookup_types = stub(:lookup_types)
193
+ classes = stub(:classes)
194
+ metadata = stub(:metadata)
195
+
196
+ Rets::Metadata::Resource.stubs(:build_lookup_tree => lookup_types)
197
+ Rets::Metadata::Resource.stubs(:build_classes => classes)
198
+
199
+ resource = Rets::Metadata::Resource.build(fragment, metadata, Logger.new(STDOUT))
200
+
201
+ assert_equal(lookup_types, resource.lookup_types)
202
+ assert_equal(classes, resource.rets_classes)
203
+ end
204
+
205
+ def test_resource_build_with_incomplete_classes
206
+ fragment = { "ResourceID" => "test" }
207
+
208
+ lookup_types = stub(:lookup_types)
209
+ metadata = stub(:metadata)
210
+
211
+ Rets::Metadata::Resource.stubs(:build_lookup_tree => lookup_types)
212
+ Rets::Metadata::Resource.stubs(:build_classes).raises(Rets::Metadata::Resource::MissingRetsClass)
213
+
214
+ error_log = StringIO.new
215
+ resource = Rets::Metadata::Resource.build(fragment, metadata, Logger.new(error_log))
216
+
217
+ error_log.rewind
218
+ error_msg = error_log.read
219
+ assert error_msg.include?('MissingRetsClass')
220
+ assert_equal(nil, resource)
221
+ end
222
+
223
+ def test_resource_find_lookup_containers
224
+ resource = stub(:id => "id")
225
+ metadata = { :lookup => [stub(:resource => "id"), stub(:resource => "id"), stub(:resource => "a")] }
226
+
227
+ lookup_containers = Rets::Metadata::Resource.find_lookup_containers(metadata, resource)
228
+
229
+ assert_equal(2, lookup_containers.size)
230
+ assert_equal(["id", "id"], lookup_containers.map(&:resource))
231
+ end
232
+
233
+ def test_resource_find_lookup_type_containers
234
+ resource = stub(:id => "id")
235
+ metadata = { :lookup_type => [stub(:resource => "id", :lookup => "look"),
236
+ stub(:resource => "id", :lookup => "look"),
237
+ stub(:resource => "id", :lookup => "not_look"),
238
+ stub(:resource => "a", :lookup => "look"),
239
+ stub(:resource => "a", :lookup => "not_look")
240
+ ]}
241
+
242
+ lookup_type_containers = Rets::Metadata::Resource.find_lookup_type_containers(metadata, resource, "look")
243
+
244
+ assert_equal(2, lookup_type_containers.size)
245
+ assert_equal(["id", "id"], lookup_type_containers.map(&:resource))
246
+ end
247
+
248
+ def test_resource_find_rets_classes
249
+ resource = stub(:id => "id")
250
+ rets_classes = stub(:rets_classes)
251
+
252
+ metadata = { :class => [stub(:resource => "id", :classes => rets_classes),
253
+ stub(:resource => "id", :classes => rets_classes),
254
+ stub(:resource => "a")]}
255
+
256
+ assert_equal(rets_classes, Rets::Metadata::Resource.find_rets_classes(metadata, resource))
257
+ end
258
+
259
+ def test_resource_find_rets_class
260
+ resource = Rets::Metadata::Resource.new({})
261
+ value = mock(:name => "test")
262
+
263
+ resource.expects(:rets_classes).returns([value])
264
+ assert_equal(value, resource.find_rets_class("test"))
265
+ end
266
+
267
+ def test_lookup_type_initialize
268
+ fragment = { "Value" => 'a', "ShortValue" => 'b', "LongValue" => 'c' }
269
+
270
+ lookup_type = Rets::Metadata::LookupType.new(fragment)
271
+
272
+ assert_equal('a', lookup_type.value)
273
+ assert_equal('b', lookup_type.short_value)
274
+ assert_equal('c', lookup_type.long_value)
275
+ end
276
+ def test_rets_class_find_table
277
+ rets_class = Rets::Metadata::RetsClass.new({}, "resource")
278
+ value = mock(:name => "test")
279
+
280
+ rets_class.expects(:tables).returns([value])
281
+ assert_equal(value, rets_class.find_table("test"))
282
+ end
283
+
284
+ def test_rets_class_find_table_container
285
+ resource = mock(:id => "a")
286
+ rets_class = mock(:name => "b")
287
+ table = mock(:resource => "a", :class => "b")
288
+
289
+ metadata = { :table => [table] }
290
+
291
+ assert_equal(table, Rets::Metadata::RetsClass.find_table_container(metadata, resource, rets_class))
292
+ end
293
+
294
+ def test_rets_class_build
295
+ resource = stub(:resource)
296
+ table_fragment = stub(:fragment)
297
+ table_container = stub(:tables => [table_fragment])
298
+ table = stub(:table)
299
+
300
+ Rets::Metadata::TableFactory.expects(:build).with(table_fragment, resource).returns(table)
301
+ Rets::Metadata::RetsClass.expects(:find_table_container).returns(table_container)
302
+
303
+ rets_class = Rets::Metadata::RetsClass.build({}, resource, "")
304
+
305
+ assert_equal(rets_class.tables, [table])
306
+ end
307
+
308
+ def test_rets_class_build_when_find_table_container_returns_nil
309
+ new_rets_class = stub(:new_rets_class)
310
+ Rets::Metadata::RetsClass.stubs(:new => new_rets_class)
311
+ Rets::Metadata::RetsClass.stubs(:find_table_container => nil)
312
+ Rets::Metadata::RetsClass.build({}, "", "")
313
+ end
314
+
315
+
316
+ def test_rets_class_initialize
317
+ fragment = { "ClassName" => "A" }
318
+ rets_class = Rets::Metadata::RetsClass.new(fragment, "resource")
319
+
320
+ assert_equal("A", rets_class.name)
321
+ assert_equal("resource", rets_class.resource)
322
+ assert_equal([], rets_class.tables)
323
+ end
324
+
325
+ def test_table_factory_creates_lookup_table
326
+ assert_instance_of Rets::Metadata::LookupTable, Rets::Metadata::TableFactory.build({"LookupName" => "Foo", "Interpretation" => "Lookup"}, nil)
327
+ end
328
+
329
+ def test_table_factory_creates_table
330
+ assert_instance_of Rets::Metadata::Table, Rets::Metadata::TableFactory.build({"LookupName" => "", "Interpretation" => ""}, nil)
331
+ end
332
+
333
+ def test_table_factory_enum
334
+ assert Rets::Metadata::TableFactory.enum?("LookupName" => "Foo", "Interpretation" => "Lookup")
335
+ assert !Rets::Metadata::TableFactory.enum?("LookupName" => "", "Interpretation" => "SomethingElse")
336
+ assert !Rets::Metadata::TableFactory.enum?("LookupName" => "Foo", "Interpretation" => "")
337
+ assert !Rets::Metadata::TableFactory.enum?("LookupName" => "", "Interpretation" => "SomethingElse")
338
+ end
339
+
340
+ def test_lookup_table_initialize
341
+ fragment = { "SystemName" => "A", "Interpretation" => "B", "LookupName" => "C" }
342
+
343
+ lookup_table = Rets::Metadata::LookupTable.new(fragment, "Foo")
344
+
345
+ assert_equal("Foo", lookup_table.resource)
346
+ assert_equal("A", lookup_table.name)
347
+ assert_equal("C", lookup_table.lookup_name)
348
+ assert_equal("B", lookup_table.interpretation)
349
+ end
350
+
351
+ def test_lookup_table_resolve_returns_empty_array_when_value_is_empty_and_is_multi?
352
+
353
+ lookup_table = Rets::Metadata::LookupTable.new({}, nil)
354
+ lookup_table.stubs(:multi? => true)
355
+
356
+ assert_equal [], lookup_table.resolve("")
357
+ end
358
+
359
+ def test_lookup_table_resolve_returns_single_value_if_not_multi
360
+ lookup_table = Rets::Metadata::LookupTable.new({}, nil)
361
+ lookup_table.stubs(:multi? => false)
362
+
363
+ lookup_table.expects(:lookup_type).with("A,B").returns(mock(:long_value => "AaaBbb"))
364
+
365
+ assert_equal "AaaBbb", lookup_table.resolve("A,B")
366
+ end
367
+
368
+ def test_lookup_table_resolve_returns_multi_value_array_when_multi
369
+ fragment = { "Interpretation" => "LookupMulti" }
370
+
371
+ lookup_table = Rets::Metadata::LookupTable.new(fragment, nil)
372
+
373
+ lookup_table.expects(:lookup_type).with("A").returns(mock(:long_value => "Aaa"))
374
+ lookup_table.expects(:lookup_type).with("B").returns(mock(:long_value => "Bbb"))
375
+
376
+ assert_equal ["Aaa", "Bbb"], lookup_table.resolve("A,B")
377
+ end
378
+
379
+ #Sandicor does this :|
380
+ def test_lookup_table_resolve_returns_multi_value_array_when_multi_with_quoted_values
381
+ fragment = { "Interpretation" => "LookupMulti" }
382
+
383
+ lookup_table = Rets::Metadata::LookupTable.new(fragment, nil)
384
+
385
+ lookup_table.expects(:lookup_type).with("A").returns(mock(:long_value => "Aaa"))
386
+ lookup_table.expects(:lookup_type).with("B").returns(mock(:long_value => "Bbb"))
387
+
388
+ assert_equal ["Aaa", "Bbb"], lookup_table.resolve(%q["A","B"])
389
+ end
390
+
391
+ # This scenario is unfortunately common.
392
+ def test_lookup_table_resolve_returns_nil_when_lookup_type_is_not_present_for_multi_value
393
+ fragment = { "Interpretation" => "LookupMulti" }
394
+
395
+ lookup_table = Rets::Metadata::LookupTable.new(fragment, nil)
396
+
397
+ lookup_table.expects(:lookup_type).with("A").returns(mock(:long_value => "Aaa"))
398
+ lookup_table.expects(:lookup_type).with("B").returns(nil)
399
+
400
+ lookup_table.expects(:warn).with("Discarding unmappable value of #{"B".inspect}")
401
+
402
+ assert_equal ["Aaa", ""], lookup_table.resolve("A,B")
403
+ end
404
+
405
+ # This scenario is unfortunately common.
406
+ def test_lookup_table_resolve_returns_nil_when_lookup_type_is_not_present_for_single_value
407
+
408
+ lookup_table = Rets::Metadata::LookupTable.new({}, nil)
409
+ lookup_table.stubs(:multi? => true)
410
+
411
+ lookup_table.expects(:lookup_type).with("A").returns(nil)
412
+
413
+ lookup_table.expects(:warn).with("Discarding unmappable value of #{"A".inspect}")
414
+
415
+ assert_equal [""], lookup_table.resolve("A")
416
+ end
417
+
418
+ def test_table_initialize
419
+ fragment = { "DataType" => "A", "SystemName" => "B" }
420
+
421
+ table = Rets::Metadata::Table.new(fragment)
422
+ assert_equal("A", table.type)
423
+ assert_equal("B", table.name)
424
+ end
425
+
426
+ def test_table_resolve_returns_empty_string_when_value_nil
427
+ table = Rets::Metadata::Table.new({})
428
+
429
+ assert_equal "", table.resolve(nil)
430
+ end
431
+
432
+ def test_table_resolve_passes_values_straight_through
433
+ table = Rets::Metadata::Table.new({})
434
+
435
+ assert_equal "Foo", table.resolve("Foo")
436
+ end
437
+
438
+ def test_table_resolve_passes_values_strips_extra_whitspace
439
+ table = Rets::Metadata::Table.new({})
440
+
441
+ assert_equal "Foo", table.resolve(" Foo ")
442
+ end
443
+
444
+ def test_root_can_be_serialized
445
+ sources = { :x => "a" }
446
+ root = Rets::Metadata::Root.new(stub(:logger), sources)
447
+ assert_equal sources, root.marshal_dump
448
+ end
449
+
450
+ def test_root_can_be_unserialized
451
+ logger = stub(:logger)
452
+ sources = { :x => "a" }
453
+
454
+ root_to_serialize = Rets::Metadata::Root.new(logger, sources)
455
+ new_root = Rets::Metadata::Root.new(logger, root_to_serialize.marshal_dump)
456
+
457
+ assert_equal root_to_serialize.marshal_dump, new_root.marshal_dump
458
+ end
459
+ end