ixtlan-babel 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,167 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area
22
+ end
23
+ class Person
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address
29
+ attribute :phone_numbers, Array[PhoneNumber]
30
+ end
31
+
32
+ describe Ixtlan::Babel::ModelFilter do
33
+ let( :person ) do
34
+ Person.new(
35
+ :id => 987,
36
+ :name => 'me and the corner',
37
+ :address => Address.new( :street => 'Foo 12', :zipcode => '12345' ),
38
+ :phone_numbers => [PhoneNumber.new(
39
+ :prefix => 12,
40
+ :number => '123',
41
+ :area => Area.new( :code => '001', :iso => 'us' )
42
+ )]
43
+ )
44
+ end
45
+
46
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
47
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person ) }
48
+
49
+ it 'should serialize and deserialize without root' do
50
+ json = serializer.to_json
51
+ result = deserializer.from_json(json)
52
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
53
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
54
+ end
55
+
56
+ it 'should serialize and deserialize with root' do
57
+ json = serializer.to_json :root => :my
58
+ result = deserializer.from_json(json, :root => :my)
59
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
60
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
61
+ end
62
+
63
+ it 'should serialize and deserialize a hash with include list' do
64
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
65
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
66
+ result.object_id.wont_equal person.object_id
67
+ result.address.attributes.must_equal person.address.attributes
68
+ result.phone_numbers[0].area.must_be_nil
69
+ person.phone_numbers[0].area = nil
70
+ result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
71
+ result.name.must_equal person.name
72
+ result.id.must_equal person.id
73
+ end
74
+
75
+ it 'shouldserialize and deserialize with except' do
76
+ json = serializer.to_json(:except => ['id'])
77
+ result = deserializer.from_json(json, :except => ['id'])
78
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
79
+ result = deserializer.from_json(json)
80
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
81
+ end
82
+
83
+ it 'should serialize and deserialize with only' do
84
+ json = serializer.to_json(:only => ['name'])
85
+ result = deserializer.from_json(json, :only => ['name'])
86
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
87
+ result = deserializer.from_json(json)
88
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
89
+ end
90
+
91
+ it 'should serialize and deserialize with nested only' do
92
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
93
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
94
+
95
+ result.phone_numbers.must_be_nil
96
+ result.phone_numbers = nil
97
+ person.phone_numbers = nil
98
+
99
+ result.address.zipcode.must_be_nil
100
+ result.address.zipcode = nil
101
+ person.address.zipcode = nil
102
+
103
+ result.name.must_equal person.name
104
+ result.id.must_equal person.id
105
+ end
106
+
107
+ it 'should serialize and deserialize with nested only (array includes)' do
108
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
109
+ result = deserializer.from_json(json, :include => ['address'])
110
+
111
+ result.phone_numbers.must_be_nil
112
+ result.phone_numbers = nil
113
+ person.phone_numbers = nil
114
+
115
+ result.address.zipcode.must_be_nil
116
+ result.address.zipcode = nil
117
+ person.address.zipcode = nil
118
+
119
+ result.name.must_equal person.name
120
+ result.id.must_equal person.id
121
+ end
122
+
123
+ it 'should serialize and deserialize with nested except' do
124
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
125
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
126
+
127
+ result.phone_numbers.must_be_nil
128
+ result.phone_numbers = nil
129
+ person.phone_numbers = nil
130
+
131
+ result.address.zipcode.must_be_nil
132
+ result.address.zipcode = nil
133
+ person.address.zipcode = nil
134
+
135
+ result.name.must_equal person.name
136
+ result.id.must_equal person.id
137
+ end
138
+
139
+ it 'should serialize and deserialize with nested except (array includes)' do
140
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
141
+ result = deserializer.from_json(json, :include => ['address'])
142
+
143
+ result.phone_numbers.must_be_nil
144
+ result.phone_numbers = nil
145
+ person.phone_numbers = nil
146
+
147
+ result.address.zipcode.must_be_nil
148
+ result.address.zipcode = nil
149
+ person.address.zipcode = nil
150
+
151
+ result.name.must_equal person.name
152
+ result.id.must_equal person.id
153
+ end
154
+
155
+ it 'should serialize and deserialize with nested include' do
156
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
157
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
158
+
159
+ result.object_id.wont_equal person.object_id
160
+ result.address.attributes.must_equal person.address.attributes
161
+ result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
162
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
163
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
164
+ result.name.must_equal person.name
165
+ result.id.must_equal person.id
166
+ end
167
+ end
@@ -0,0 +1,184 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address2
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area2
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber2
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area2
22
+ end
23
+ class Person2
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address2
29
+
30
+ attr_accessor :phone_numbers, :age, :children_names
31
+
32
+ def phone_numbers
33
+ @phone_numbers ||= [PhoneNumber2.new(
34
+ :prefix => 12,
35
+ :number => '123',
36
+ :area => Area2.new( :code => '001', :iso => 'us' ) )]
37
+ end
38
+
39
+ def age
40
+ @age ||= 123
41
+ end
42
+
43
+ def children_names
44
+ @children_names ||= ['anna', 'jack', 'rama', 'mia']
45
+ end
46
+
47
+ def children_ages
48
+ @children_ages ||= [12, 3, 6, 9]
49
+ end
50
+ end
51
+
52
+ describe Ixtlan::Babel::ModelFilter.to_s + ':with_methods' do
53
+ let( :person ) do
54
+ Person2.new( :id => 987,
55
+ :name => 'me and the corner',
56
+ :address => Address2.new( :street => 'Foo 12', :zipcode => '12345' ) )
57
+ end
58
+
59
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
60
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person2 ) }
61
+
62
+ it 'should serialize and deserialize with methods' do
63
+ json = serializer.to_json(:include => [:age, :children_names, :children_ages])
64
+ data = JSON.parse(json)
65
+ data['age'].must_equal 123
66
+ data['children_names'].must_equal ['anna', 'jack', 'rama', 'mia']
67
+ data['children_ages'].must_equal [12, 3, 6, 9]
68
+ result = deserializer.from_json(json)
69
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
70
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
71
+ end
72
+
73
+ it 'should serialize and deserialize without root' do
74
+ json = serializer.to_json
75
+ result = deserializer.from_json(json)
76
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
77
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
78
+ end
79
+
80
+ it 'should serialize and deserialize with root' do
81
+ json = serializer.to_json :root => 'my'
82
+ result = deserializer.from_json(json, :root => 'my')
83
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
84
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
85
+ end
86
+
87
+ it 'should serialize and deserialize a hash with include list' do
88
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
89
+ data = JSON.parse(json)
90
+ data['phone_numbers'][0]['prefix'].must_equal 12
91
+ data['phone_numbers'][0]['number'].must_equal '123'
92
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
93
+ result.object_id.wont_equal person.object_id
94
+ result.address.attributes.must_equal person.address.attributes
95
+ result.phone_numbers[0].area.must_be_nil
96
+ person.phone_numbers[0].area = nil
97
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
98
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
99
+ result.name.must_equal person.name
100
+ result.id.must_equal person.id
101
+ end
102
+
103
+ it 'shouldserialize and deserialize with except' do
104
+ json = serializer.to_json(:except => ['id'])
105
+ result = deserializer.from_json(json, :except => ['id'])
106
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
107
+ result = deserializer.from_json(json)
108
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
109
+ end
110
+
111
+ it 'should serialize and deserialize with only' do
112
+ json = serializer.to_json(:only => ['name'])
113
+ result = deserializer.from_json(json, :only => ['name'])
114
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
115
+ result = deserializer.from_json(json)
116
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
117
+ end
118
+
119
+ it 'should serialize and deserialize with nested only' do
120
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
121
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
122
+
123
+ json['phone_numbers'].must_be_nil
124
+ json['address']['zipcode'].must_be_nil
125
+
126
+ result.address.zipcode.must_be_nil
127
+
128
+ result.name.must_equal person.name
129
+ result.id.must_equal person.id
130
+ end
131
+
132
+ it 'should serialize and deserialize with nested only (array includes)' do
133
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
134
+ result = deserializer.from_json(json, :include => ['address'])
135
+
136
+ json['phone_numbers'].must_be_nil
137
+ json['address']['zipcode'].must_be_nil
138
+
139
+ result.address.zipcode.must_be_nil
140
+
141
+ result.name.must_equal person.name
142
+ result.id.must_equal person.id
143
+ end
144
+
145
+ it 'should serialize and deserialize with nested except' do
146
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
147
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
148
+
149
+ json['phone_numbers'].must_be_nil
150
+ json['address']['zipcode'].must_be_nil
151
+
152
+ result.address.zipcode.must_be_nil
153
+
154
+ result.name.must_equal person.name
155
+ result.id.must_equal person.id
156
+ end
157
+
158
+ it 'should serialize and deserialize with nested except (array includes)' do
159
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
160
+ result = deserializer.from_json(json, :include => ['address'])
161
+
162
+ json['phone_numbers'].must_be_nil
163
+ json['address']['zipcode'].must_be_nil
164
+
165
+ result.address.zipcode.must_be_nil
166
+
167
+ result.name.must_equal person.name
168
+ result.id.must_equal person.id
169
+ end
170
+
171
+ it 'should serialize and deserialize with nested include' do
172
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
173
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
174
+
175
+ result.object_id.wont_equal person.object_id
176
+ result.address.attributes.must_equal person.address.attributes
177
+ result.phone_numbers[0].area.code.must_equal person.phone_numbers[0].area.code
178
+ result.phone_numbers[0].area.iso.must_equal person.phone_numbers[0].area.iso
179
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
180
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
181
+ result.name.must_equal person.name
182
+ result.id.must_equal person.id
183
+ end
184
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area
22
+ end
23
+ class Person
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address
29
+
30
+ def phone_numbers
31
+ [PhoneNumber.new(
32
+ :prefix => 12,
33
+ :number => '123',
34
+ :area => Area.new( :code => '001', :iso => 'us' )]
35
+ end
36
+
37
+ def age
38
+ 123
39
+ end
40
+ end
41
+
42
+ describe Ixtlan::Babel::ModelFilter + ':with_methods' do
43
+ let( :person ) do
44
+ Person.new( :id => 987,
45
+ :name => 'me and the corner',
46
+ :address => Address.new( :street => 'Foo 12', :zipcode => '12345' ) )
47
+ end
48
+
49
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
50
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person ) }
51
+
52
+ it 'should serialize and deserialize without root' do
53
+ json = serializer.to_json
54
+ result = deserializer.from_json(json)
55
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
56
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
57
+ end
58
+
59
+ it 'should serialize and deserialize with root' do
60
+ json = serializer.to_json :root => :my
61
+ result = deserializer.from_json(json, :root => :my)
62
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
63
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
64
+ end
65
+
66
+ it 'should serialize and deserialize a hash with include list' do
67
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
68
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
69
+ result.object_id.wont_equal person.object_id
70
+ result.address.attributes.must_equal person.address.attributes
71
+ result.phone_numbers[0].area.must_be_nil
72
+ person.phone_numbers[0].area = nil
73
+ result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
74
+ result.name.must_equal person.name
75
+ result.id.must_equal person.id
76
+ end
77
+
78
+ it 'shouldserialize and deserialize with except' do
79
+ json = serializer.to_json(:except => ['id'])
80
+ result = deserializer.from_json(json, :except => ['id'])
81
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
82
+ result = deserializer.from_json(json)
83
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
84
+ end
85
+
86
+ it 'should serialize and deserialize with only' do
87
+ json = serializer.to_json(:only => ['name'])
88
+ result = deserializer.from_json(json, :only => ['name'])
89
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
90
+ result = deserializer.from_json(json)
91
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
92
+ end
93
+
94
+ it 'should serialize and deserialize with nested only' do
95
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
96
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
97
+
98
+ result.phone_numbers.must_be_nil
99
+ result.phone_numbers = nil
100
+ person.phone_numbers = nil
101
+
102
+ result.address.zipcode.must_be_nil
103
+ result.address.zipcode = nil
104
+ person.address.zipcode = nil
105
+
106
+ result.name.must_equal person.name
107
+ result.id.must_equal person.id
108
+ end
109
+
110
+ it 'should serialize and deserialize with nested only (array includes)' do
111
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
112
+ result = deserializer.from_json(json, :include => ['address'])
113
+
114
+ result.phone_numbers.must_be_nil
115
+ result.phone_numbers = nil
116
+ person.phone_numbers = nil
117
+
118
+ result.address.zipcode.must_be_nil
119
+ result.address.zipcode = nil
120
+ person.address.zipcode = nil
121
+
122
+ result.name.must_equal person.name
123
+ result.id.must_equal person.id
124
+ end
125
+
126
+ it 'should serialize and deserialize with nested except' do
127
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
128
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
129
+
130
+ result.phone_numbers.must_be_nil
131
+ result.phone_numbers = nil
132
+ person.phone_numbers = nil
133
+
134
+ result.address.zipcode.must_be_nil
135
+ result.address.zipcode = nil
136
+ person.address.zipcode = nil
137
+
138
+ result.name.must_equal person.name
139
+ result.id.must_equal person.id
140
+ end
141
+
142
+ it 'should serialize and deserialize with nested except (array includes)' do
143
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
144
+ result = deserializer.from_json(json, :include => ['address'])
145
+
146
+ result.phone_numbers.must_be_nil
147
+ result.phone_numbers = nil
148
+ person.phone_numbers = nil
149
+
150
+ result.address.zipcode.must_be_nil
151
+ result.address.zipcode = nil
152
+ person.address.zipcode = nil
153
+
154
+ result.name.must_equal person.name
155
+ result.id.must_equal person.id
156
+ end
157
+
158
+ it 'should serialize and deserialize with nested include' do
159
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
160
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
161
+
162
+ result.object_id.wont_equal person.object_id
163
+ result.address.attributes.must_equal person.address.attributes
164
+ result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
165
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
166
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
167
+ result.name.must_equal person.name
168
+ result.id.must_equal person.id
169
+ end
170
+ end