rets-hack 0.11

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +142 -0
  3. data/Manifest.txt +58 -0
  4. data/README.md +129 -0
  5. data/Rakefile +28 -0
  6. data/bin/rets +202 -0
  7. data/example/connect.rb +19 -0
  8. data/example/get-photos.rb +20 -0
  9. data/example/get-property.rb +16 -0
  10. data/lib/rets/client.rb +373 -0
  11. data/lib/rets/client_progress_reporter.rb +48 -0
  12. data/lib/rets/http_client.rb +133 -0
  13. data/lib/rets/locking_http_client.rb +34 -0
  14. data/lib/rets/measuring_http_client.rb +27 -0
  15. data/lib/rets/metadata/caching.rb +59 -0
  16. data/lib/rets/metadata/containers.rb +89 -0
  17. data/lib/rets/metadata/file_cache.rb +29 -0
  18. data/lib/rets/metadata/json_serializer.rb +27 -0
  19. data/lib/rets/metadata/lookup_table.rb +65 -0
  20. data/lib/rets/metadata/lookup_type.rb +19 -0
  21. data/lib/rets/metadata/marshal_serializer.rb +27 -0
  22. data/lib/rets/metadata/multi_lookup_table.rb +70 -0
  23. data/lib/rets/metadata/null_cache.rb +24 -0
  24. data/lib/rets/metadata/resource.rb +103 -0
  25. data/lib/rets/metadata/rets_class.rb +57 -0
  26. data/lib/rets/metadata/rets_object.rb +41 -0
  27. data/lib/rets/metadata/root.rb +155 -0
  28. data/lib/rets/metadata/table.rb +33 -0
  29. data/lib/rets/metadata/table_factory.rb +19 -0
  30. data/lib/rets/metadata/yaml_serializer.rb +27 -0
  31. data/lib/rets/metadata.rb +18 -0
  32. data/lib/rets/parser/compact.rb +117 -0
  33. data/lib/rets/parser/error_checker.rb +56 -0
  34. data/lib/rets/parser/multipart.rb +39 -0
  35. data/lib/rets.rb +269 -0
  36. data/test/fixtures.rb +324 -0
  37. data/test/helper.rb +14 -0
  38. data/test/test_caching.rb +89 -0
  39. data/test/test_client.rb +307 -0
  40. data/test/test_error_checker.rb +87 -0
  41. data/test/test_file_cache.rb +42 -0
  42. data/test/test_http_client.rb +132 -0
  43. data/test/test_json_serializer.rb +26 -0
  44. data/test/test_locking_http_client.rb +29 -0
  45. data/test/test_marshal_serializer.rb +26 -0
  46. data/test/test_metadata.rb +71 -0
  47. data/test/test_metadata_class.rb +50 -0
  48. data/test/test_metadata_lookup_table.rb +21 -0
  49. data/test/test_metadata_lookup_type.rb +21 -0
  50. data/test/test_metadata_multi_lookup_table.rb +60 -0
  51. data/test/test_metadata_object.rb +33 -0
  52. data/test/test_metadata_resource.rb +148 -0
  53. data/test/test_metadata_root.rb +151 -0
  54. data/test/test_metadata_table.rb +21 -0
  55. data/test/test_metadata_table_factory.rb +24 -0
  56. data/test/test_parser_compact.rb +115 -0
  57. data/test/test_parser_multipart.rb +39 -0
  58. data/test/test_yaml_serializer.rb +26 -0
  59. data/test/vcr_cassettes/unauthorized_response.yml +262 -0
  60. metadata +227 -0
@@ -0,0 +1,71 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadata < MiniTest::Test
4
+ def test_metadata_uses
5
+ #TODO
6
+ end
7
+
8
+ def test_print_tree
9
+ hoa_lookup_types = [
10
+ Rets::Metadata::LookupType.new("LongValue" => "Quarterly", "Value" => "Q"),
11
+ Rets::Metadata::LookupType.new("LongValue" => "Annually", "Value" => "A"),
12
+ ]
13
+
14
+ table_fragment = {
15
+ "Units" => "Meters",
16
+ "Searchable" => "Y",
17
+ 'Required' => "N",
18
+
19
+ "SystemName" => "L_1",
20
+ "ShortName" => "Sq",
21
+ "LongName" => "Square Footage",
22
+ "StandardName" => "Sqft",
23
+ }
24
+
25
+ lookup_table_fragment = {
26
+ "Required" => "N",
27
+ "Searchable" => "Y",
28
+ "Units" => "",
29
+ "Interpretation" => "N",
30
+
31
+ "SystemName" => "L_10",
32
+ "ShortName" => "HF",
33
+ "LongName" => "HOA Frequency",
34
+ "StandardName" => "HOA F",
35
+ }
36
+
37
+ multi_lookup_table_fragment = {
38
+ "Required" => "N",
39
+ "Searchable" => "Y",
40
+ "Units" => "",
41
+ "Interpretation" => "N",
42
+
43
+ "SystemName" => "L_11",
44
+ "ShortName" => "HFs",
45
+ "LongName" => "HOA Frequencies",
46
+ "StandardName" => "HOA Fs",
47
+ }
48
+
49
+ resource_id = "Properties"
50
+ tables = [
51
+ Rets::Metadata::Table.new(table_fragment, resource_id),
52
+ Rets::Metadata::LookupTable.new(resource_id, hoa_lookup_types, lookup_table_fragment),
53
+ Rets::Metadata::MultiLookupTable.new(resource_id, hoa_lookup_types, multi_lookup_table_fragment),
54
+ ]
55
+
56
+ rets_classes = [
57
+ Rets::Metadata::RetsClass.new("T100", "Prop", "standard name", "some description", tables)
58
+ ]
59
+
60
+ rets_objects = [
61
+ Rets::Metadata::RetsObject.new("HiRes", "Photo", "photo/jpg", "photo description")
62
+ ]
63
+
64
+ resource = Rets::Metadata::Resource.new(resource_id, "matrix_unique_key", rets_classes, rets_objects)
65
+
66
+ io = StringIO.new
67
+ resource.print_tree(io)
68
+
69
+ assert_equal io.string, EXAMPLE_METADATA_TREE
70
+ end
71
+ end
@@ -0,0 +1,50 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataClass < MiniTest::Test
4
+ def test_rets_class_find_table
5
+ table = Rets::Metadata::Table.new({ "SystemName" => 'test' }, 'resource_id')
6
+ rets_class = Rets::Metadata::RetsClass.new('class_name', 'visible_name', 'standard name', 'description', [table])
7
+
8
+ assert_equal table, rets_class.find_table("test")
9
+ end
10
+
11
+ def test_rets_class_find_lookup_table
12
+ table = Rets::Metadata::LookupTable.new('resource_id', [], { "SystemName" => 'test' })
13
+ rets_class = Rets::Metadata::RetsClass.new('class_name', 'visible_name', 'standard name', 'description', [table])
14
+
15
+ assert_equal table, rets_class.find_table("test")
16
+ end
17
+
18
+ def test_rets_class_find_table_container
19
+ resource_id = "a"
20
+ class_name = "b"
21
+
22
+ table = mock(:resource => resource_id, :class => class_name)
23
+ metadata = { :table => [table] }
24
+
25
+ assert_equal table, Rets::Metadata::RetsClass.find_table_container(metadata, resource_id, class_name)
26
+ end
27
+
28
+ def test_rets_class_build
29
+ resource_id = "id"
30
+ lookup_types = []
31
+
32
+ table_fragment = stub(:fragment)
33
+ table_container = stub(:tables => [table_fragment])
34
+ table = stub(:table)
35
+
36
+ Rets::Metadata::TableFactory.expects(:build).with(table_fragment, resource_id, lookup_types).returns(table)
37
+ Rets::Metadata::RetsClass.expects(:find_table_container).returns(table_container)
38
+
39
+ rets_class = Rets::Metadata::RetsClass.build({}, resource_id, lookup_types, "")
40
+
41
+ assert_equal(rets_class.tables, [table])
42
+ end
43
+
44
+ def test_rets_class_build_when_find_table_container_returns_nil
45
+ new_rets_class = stub(:new_rets_class)
46
+ Rets::Metadata::RetsClass.stubs(:new => new_rets_class)
47
+ Rets::Metadata::RetsClass.stubs(:find_table_container => nil)
48
+ Rets::Metadata::RetsClass.build({}, "resource_id", [], "")
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataLookupTable < MiniTest::Test
4
+ def setup
5
+ $VERBOSE = true
6
+ end
7
+
8
+ def teardown
9
+ $VERBOSE = false
10
+ end
11
+
12
+ def test_lookup_table_resolve_returns_single_value_if_not_multi
13
+ fragment = {}
14
+ lookup_types = [
15
+ Rets::Metadata::LookupType.new("Value" => "A,B", "LongValue" => "AaaBbb")
16
+ ]
17
+ lookup_table = Rets::Metadata::LookupTable.new("Foo", lookup_types, fragment)
18
+
19
+ assert_equal "AaaBbb", lookup_table.resolve("A,B")
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataLookupType < MiniTest::Test
4
+ def test_lookup_type_initialize
5
+ fragment = { "Value" => 'a', "LongValue" => 'c' }
6
+
7
+ lookup_type = Rets::Metadata::LookupType.new(fragment)
8
+
9
+ assert_equal('a', lookup_type.value)
10
+ assert_equal('c', lookup_type.long_value)
11
+ end
12
+
13
+ def test_lookup_type_ignores_trailing_whitespace
14
+ fragment = { "Value" => 'a ', "LongValue" => 'c ' }
15
+
16
+ lookup_type = Rets::Metadata::LookupType.new(fragment)
17
+
18
+ assert_equal('a', lookup_type.value)
19
+ assert_equal('c', lookup_type.long_value)
20
+ end
21
+ end
@@ -0,0 +1,60 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataMultiLookupTable < MiniTest::Test
4
+ def setup
5
+ @fragment = { "Interpretation" => "LookupMulti" }
6
+ $VERBOSE = true
7
+ end
8
+
9
+ def teardown
10
+ $VERBOSE = false
11
+ end
12
+
13
+ def test_lookup_table_resolve_returns_empty_array_when_value_is_empty_and_is_multi?
14
+ lookup_table = Rets::Metadata::MultiLookupTable.new("Foo", [], @fragment)
15
+
16
+ assert_equal [], lookup_table.resolve("")
17
+ end
18
+
19
+ def test_lookup_table_resolve_returns_multi_value_array_when_multi
20
+ lookup_types = [
21
+ Rets::Metadata::LookupType.new("Value" => "A", "LongValue" => "Aaa"),
22
+ Rets::Metadata::LookupType.new("Value" => "B", "LongValue" => "Bbb"),
23
+ ]
24
+ lookup_table = Rets::Metadata::MultiLookupTable.new("Foo", lookup_types, @fragment)
25
+
26
+ assert_equal ["Aaa", "Bbb"], lookup_table.resolve("A,B")
27
+ end
28
+
29
+ #Sandicor does this :|
30
+ def test_lookup_table_resolve_returns_multi_value_array_when_multi_with_quoted_values
31
+ lookup_types = [
32
+ Rets::Metadata::LookupType.new("Value" => "A", "LongValue" => "Aaa"),
33
+ Rets::Metadata::LookupType.new("Value" => "B", "LongValue" => "Bbb"),
34
+ ]
35
+ lookup_table = Rets::Metadata::MultiLookupTable.new("Foo", lookup_types, @fragment)
36
+
37
+ assert_equal ["Aaa", "Bbb"], lookup_table.resolve(%q["A","B"])
38
+ end
39
+
40
+ # This scenario is unfortunately common.
41
+ def test_lookup_table_resolve_returns_nil_when_lookup_type_is_not_present_for_multi_value
42
+ lookup_types = [
43
+ Rets::Metadata::LookupType.new("Value" => "A", "LongValue" => "Aaa"),
44
+ ]
45
+ lookup_table = Rets::Metadata::MultiLookupTable.new("Foo", lookup_types, @fragment)
46
+
47
+ lookup_table.expects(:warn).with("Discarding unmappable value of #{"B".inspect}")
48
+
49
+ assert_equal ["Aaa", ""], lookup_table.resolve("A,B")
50
+ end
51
+
52
+ # This scenario is unfortunately common.
53
+ def test_lookup_table_resolve_returns_nil_when_lookup_type_is_not_present_for_single_value
54
+ lookup_table = Rets::Metadata::MultiLookupTable.new("Foo", [], @fragment)
55
+
56
+ lookup_table.expects(:warn).with("Discarding unmappable value of #{"A".inspect}")
57
+
58
+ assert_equal [""], lookup_table.resolve("A")
59
+ end
60
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataObject < MiniTest::Test
4
+ def test_rets_object_build
5
+ name = "Name"
6
+ mime_type = "mimetype"
7
+ description = "description"
8
+ object_type = "type"
9
+
10
+ object_fragment = {
11
+ "ObjectType" => object_type,
12
+ "VisibleName" => name,
13
+ "MIMEType" => mime_type,
14
+ "Description" => description,
15
+ }
16
+
17
+ assert_equal(
18
+ Rets::Metadata::RetsObject.build(object_fragment),
19
+ Rets::Metadata::RetsObject.new(object_type, name, mime_type, description)
20
+ )
21
+ end
22
+
23
+ def test_rets_object_building_not_case_dependent
24
+ object_fragment = {
25
+ "MiMeTyPe" => "image/jpeg"
26
+ }
27
+
28
+ assert_equal(
29
+ Rets::Metadata::RetsObject.build(object_fragment).mime_type,
30
+ "image/jpeg"
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,148 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataResource < MiniTest::Test
4
+ def test_resource_build_lookup_tree
5
+ metadata = stub(:metadata)
6
+ resource = stub(:resource)
7
+
8
+ Rets::Metadata::Resource.expects(:find_lookup_containers).
9
+ with(metadata, resource).
10
+ returns([stub(:lookups => [{"LookupName" => "Foo"}])])
11
+
12
+ Rets::Metadata::Resource.expects(:find_lookup_type_containers).
13
+ with(metadata, resource, "Foo").
14
+ returns([stub(:lookup_types => [{"Value" => "111", "LongValue" => "Bar"}])])
15
+
16
+ tree = Rets::Metadata::Resource.build_lookup_tree(resource, metadata)
17
+
18
+ assert_equal ["Foo"], tree.keys
19
+ assert_equal 1, tree["Foo"].size
20
+
21
+ lookup_type = tree["Foo"].first
22
+
23
+ assert_equal "111", lookup_type.value
24
+ assert_equal "Bar", lookup_type.long_value
25
+ end
26
+
27
+ def test_resource_build_classes
28
+ resource_id = "id"
29
+ lookup_types = []
30
+
31
+ metadata = stub(:metadata)
32
+ rets_class = stub(:rets_class)
33
+ rets_class_fragment = stub(:rets_class_fragment)
34
+
35
+ Rets::Metadata::RetsClass.expects(:build).with(rets_class_fragment, resource_id, lookup_types, metadata).returns(rets_class)
36
+ Rets::Metadata::Resource.expects(:find_rets_classes).with(metadata, resource_id).returns([rets_class_fragment])
37
+
38
+ classes = Rets::Metadata::Resource.build_classes(resource_id, lookup_types, metadata)
39
+ assert_equal([rets_class], classes)
40
+ end
41
+
42
+ def test_resource_build_objects
43
+ resource_id = "id"
44
+
45
+ metadata = stub(:metadata)
46
+ rets_object = stub(:rets_object)
47
+ rets_object_fragment = stub(:rets_object_fragment)
48
+
49
+ Rets::Metadata::RetsObject.expects(:build).with(rets_object_fragment).returns(rets_object)
50
+ Rets::Metadata::Resource.expects(:find_rets_objects).with(metadata, resource_id).returns([rets_object_fragment])
51
+
52
+ objects = Rets::Metadata::Resource.build_objects(resource_id, metadata)
53
+ assert_equal([rets_object], objects)
54
+ end
55
+
56
+ def test_resource_build_objects_when_objects_were_not_loaded
57
+ resource_id = "id"
58
+ metadata = {} # doesn't contain metadata for :object key
59
+
60
+ objects = Rets::Metadata::Resource.build_objects(resource_id, metadata)
61
+ assert_equal [], objects
62
+ end
63
+
64
+ def test_resource_build
65
+ fragment = { "ResourceID" => "test" }
66
+
67
+ lookup_types = stub(:lookup_types)
68
+ classes = stub(:classes)
69
+ objects = stub(:objects)
70
+ metadata = stub(:metadata)
71
+
72
+ Rets::Metadata::Resource.stubs(:build_lookup_tree => lookup_types)
73
+ Rets::Metadata::Resource.stubs(:build_classes => classes)
74
+ Rets::Metadata::Resource.stubs(:build_objects => objects)
75
+
76
+ resource = Rets::Metadata::Resource.build(fragment, metadata, Logger.new(STDOUT))
77
+
78
+ assert_equal(classes, resource.rets_classes)
79
+ assert_equal(objects, resource.rets_objects)
80
+ end
81
+
82
+ def test_resource_build_with_incomplete_classes
83
+ fragment = { "ResourceID" => "test" }
84
+
85
+ lookup_types = stub(:lookup_types)
86
+ metadata = stub(:metadata)
87
+
88
+ Rets::Metadata::Resource.stubs(:build_lookup_tree => lookup_types)
89
+ Rets::Metadata::Resource.stubs(:build_classes).raises(Rets::Metadata::Resource::MissingRetsClass)
90
+
91
+ error_log = StringIO.new
92
+ resource = Rets::Metadata::Resource.build(fragment, metadata, Logger.new(error_log))
93
+
94
+ error_log.rewind
95
+ error_msg = error_log.read
96
+ assert error_msg.include?('MissingRetsClass')
97
+ assert_equal(nil, resource)
98
+ end
99
+
100
+ def test_resource_find_lookup_containers
101
+ resource_id = "id"
102
+ metadata = {
103
+ :lookup => [
104
+ stub(:resource => resource_id),
105
+ stub(:resource => resource_id),
106
+ stub(:resource => "a")
107
+ ]
108
+ }
109
+
110
+ lookup_containers = Rets::Metadata::Resource.find_lookup_containers(metadata, resource_id)
111
+
112
+ assert_equal(2, lookup_containers.size)
113
+ assert_equal(["id", "id"], lookup_containers.map(&:resource))
114
+ end
115
+
116
+ def test_resource_find_lookup_type_containers
117
+ resource_id = "id"
118
+ metadata = {
119
+ :lookup_type => [
120
+ stub(:resource => resource_id, :lookup => "look"),
121
+ stub(:resource => resource_id, :lookup => "look"),
122
+ stub(:resource => resource_id, :lookup => "not_look"),
123
+ stub(:resource => "a", :lookup => "look"),
124
+ stub(:resource => "a", :lookup => "not_look")
125
+ ]
126
+ }
127
+ lookup_type_containers = Rets::Metadata::Resource.find_lookup_type_containers(metadata, resource_id, "look")
128
+
129
+ assert_equal(2, lookup_type_containers.size)
130
+ assert_equal(["id", "id"], lookup_type_containers.map(&:resource))
131
+ end
132
+
133
+ def test_resource_find_rets_classes
134
+ rets_classes = stub(:rets_classes)
135
+
136
+ metadata = { :class => [stub(:resource => "id", :classes => rets_classes),
137
+ stub(:resource => "id", :classes => rets_classes),
138
+ stub(:resource => "a")]}
139
+
140
+ assert_equal(rets_classes, Rets::Metadata::Resource.find_rets_classes(metadata, "id"))
141
+ end
142
+
143
+ def test_resource_find_rets_class
144
+ rets_class = Rets::Metadata::RetsClass.new('test', '', '', '', [])
145
+ resource = Rets::Metadata::Resource.new('', '', [rets_class], [])
146
+ assert_equal(rets_class, resource.find_rets_class("test"))
147
+ end
148
+ end
@@ -0,0 +1,151 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataRoot < MiniTest::Test
4
+ def setup
5
+ @root = Rets::Metadata::Root.new(Logger.new(STDOUT), {})
6
+ end
7
+
8
+ def test_metadata_root_build_tree
9
+ resource = stub(:id => "X")
10
+ Rets::Metadata::Resource.stubs(:build => resource)
11
+ resource_fragment = stub(:resource_fragment)
12
+ resource_container = stub(:rows => [resource_fragment])
13
+ @root.stubs(:metadata_types => { :resource => [resource_container] })
14
+ assert_equal({"x" => resource}, @root.build_tree)
15
+ assert_equal(resource, @root.build_tree["X"])
16
+ end
17
+
18
+ def test_metadata_root_version
19
+ @root.instance_variable_set("@metadata_types", {:system => [stub(:version => "1")]})
20
+ assert_equal "1", @root.version
21
+ end
22
+
23
+ def test_metadata_root_date
24
+ @root.instance_variable_set("@metadata_types", {:system => [stub(:date => "1")]})
25
+ assert_equal "1", @root.date
26
+ end
27
+
28
+ def test_metadata_root_different_version
29
+ @root.stubs(:version).returns("1.2.2")
30
+ @root.stubs(:date).returns("1")
31
+
32
+ current_version = "1.2.3"
33
+ current_timestamp = "1"
34
+
35
+ assert !@root.current?(current_timestamp, current_version)
36
+ end
37
+
38
+ def test_metadata_root_same_version
39
+ @root.stubs(:version).returns("1.2.2")
40
+ @root.stubs(:date).returns("1")
41
+
42
+ current_version = "1.2.2"
43
+ current_timestamp = "2"
44
+
45
+ assert @root.current?(current_timestamp, current_version)
46
+ end
47
+
48
+ def test_metadata_root_no_version_same_timestamp
49
+ @root.stubs(:version).returns("")
50
+ @root.stubs(:date).returns("1")
51
+
52
+ current_version = "1.2.3"
53
+ current_timestamp = "1"
54
+
55
+ assert @root.current?(current_timestamp, current_version)
56
+ end
57
+
58
+ def test_metadata_root_current
59
+ @root.stubs(:version).returns("1.2.2")
60
+ @root.stubs(:date).returns("1")
61
+
62
+ current_timestamp = "1"
63
+ current_version = "1.2.2"
64
+
65
+ assert @root.current?(current_timestamp, current_version)
66
+ end
67
+
68
+ # missing timestamp - this happens in violation of the spec.
69
+ def test_metadata_root_current_ignores_missing_timestamp
70
+ @root.stubs(:version).returns("1.2.2")
71
+ @root.stubs(:date).returns("1")
72
+
73
+ current_timestamp = nil
74
+ current_version = "1.2.2"
75
+
76
+ assert @root.current?(current_timestamp, current_version)
77
+ end
78
+
79
+ # missing version - this happens in violation of the spec.
80
+ def test_metadata_root_current_ignores_missing_version
81
+ @root.stubs(:version).returns("1.2.2")
82
+ @root.stubs(:date).returns("1")
83
+
84
+ current_timestamp = "1"
85
+ current_version = nil
86
+
87
+ assert @root.current?(current_timestamp, current_version)
88
+ end
89
+
90
+ def test_metadata_root_metadata_types_constructs_a_hash_of_metadata_types_from_sources
91
+ test_sources = { "X" => "Y", "Z" => "W" }
92
+ root = Rets::Metadata::Root.new(stub(:logger), test_sources)
93
+ root.stubs(:build_containers => "Y--")
94
+ Nokogiri.stubs(:parse => "Y-")
95
+
96
+ assert_equal({:x => "Y--", :z => "Y--"}, root.metadata_types)
97
+ end
98
+
99
+ def test_metadata_root_build_containers_selects_correct_tags
100
+ doc = "<RETS><METADATA-FOO></METADATA-FOO><MET-FOO></MET-FOO><METADATA-BAR /></RETS>"
101
+
102
+ @root.expects(:build_container).with { |fragment| fragment.name == "METADATA-FOO" }
103
+ @root.expects(:build_container).with { |fragment| fragment.name == "METADATA-BAR" }
104
+
105
+ @root.build_containers(Nokogiri.parse(doc))
106
+ end
107
+
108
+ def test_metadata_root_build_container_uses_row_containers_for_resource
109
+ doc = Nokogiri.parse(METADATA_RESOURCE).xpath("//METADATA-RESOURCE").first
110
+
111
+ container = @root.build_container(doc)
112
+
113
+ assert_instance_of Rets::Metadata::Containers::ResourceContainer, container
114
+
115
+ assert_equal 13, container.resources.size
116
+
117
+ resource = container.resources.first
118
+
119
+ assert_equal "ActiveAgent", resource["StandardName"]
120
+ end
121
+
122
+ def test_metadata_root_build_container_uses_system_container_for_system
123
+ doc = Nokogiri.parse(METADATA_SYSTEM).xpath("//METADATA-SYSTEM").first
124
+
125
+ container = @root.build_container(doc)
126
+ assert_instance_of Rets::Metadata::Containers::SystemContainer, container
127
+ end
128
+
129
+ def test_metadata_root_build_container_uses_base_container_for_unknown_metadata_types
130
+ doc = Nokogiri.parse(METADATA_UNKNOWN).xpath("//METADATA-FOO").first
131
+
132
+ container = @root.build_container(doc)
133
+ assert_instance_of Rets::Metadata::Containers::Container, container
134
+ end
135
+
136
+ def test_root_can_be_serialized
137
+ sources = { :x => "a" }
138
+ root = Rets::Metadata::Root.new(stub(:logger), sources)
139
+ assert_equal sources, root.marshal_dump
140
+ end
141
+
142
+ def test_root_can_be_unserialized
143
+ logger = stub(:logger)
144
+ sources = { :x => "a" }
145
+
146
+ root_to_serialize = Rets::Metadata::Root.new(logger, sources)
147
+ new_root = Rets::Metadata::Root.new(logger, root_to_serialize.marshal_dump)
148
+
149
+ assert_equal root_to_serialize.marshal_dump, new_root.marshal_dump
150
+ end
151
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataTable < MiniTest::Test
4
+ def test_table_resolve_returns_empty_string_when_value_nil
5
+ table = Rets::Metadata::Table.new({}, "resource_id")
6
+
7
+ assert_equal "", table.resolve(nil)
8
+ end
9
+
10
+ def test_table_resolve_passes_values_straight_through
11
+ table = Rets::Metadata::Table.new({}, "resource_id")
12
+
13
+ assert_equal "Foo", table.resolve("Foo")
14
+ end
15
+
16
+ def test_table_resolve_passes_values_strips_extra_whitspace
17
+ table = Rets::Metadata::Table.new({}, "resource_id")
18
+
19
+ assert_equal "Foo", table.resolve(" Foo ")
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "helper"
2
+
3
+ class TestMetadataTableFactory < MiniTest::Test
4
+ def test_table_factory_creates_mutli_lookup_table
5
+ table_fragment = {"LookupName" => "Foo", "Interpretation" => "LookupMulti"}
6
+ resource_id = "id"
7
+ lookup_types = {}
8
+ assert_instance_of Rets::Metadata::MultiLookupTable, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
9
+ end
10
+
11
+ def test_table_factory_creates_lookup_table
12
+ table_fragment = {"LookupName" => "Foo", "Interpretation" => "Lookup"}
13
+ resource_id = "id"
14
+ lookup_types = {}
15
+ assert_instance_of Rets::Metadata::LookupTable, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
16
+ end
17
+
18
+ def test_table_factory_creates_table
19
+ table_fragment = {"LookupName" => "", "Interpretation" => ""}
20
+ resource_id = "id"
21
+ lookup_types = {}
22
+ assert_instance_of Rets::Metadata::Table, Rets::Metadata::TableFactory.build(table_fragment, resource_id, lookup_types)
23
+ end
24
+ end