rest_model 0.1.0

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 (114) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +2 -0
  3. data/Guardfile +7 -0
  4. data/README.md +237 -0
  5. data/Rakefile +2 -0
  6. data/examples/all.rb +12 -0
  7. data/examples/embeds_many/invisible.rb +16 -0
  8. data/examples/embeds_many/simple.rb +13 -0
  9. data/examples/embeds_many/with_array.rb +10 -0
  10. data/examples/embeds_many/with_class_name.rb +13 -0
  11. data/examples/embeds_many/with_fields.rb +9 -0
  12. data/examples/embeds_many/with_if.rb +16 -0
  13. data/examples/embeds_many/with_nil_value.rb +12 -0
  14. data/examples/embeds_many/with_start_key.rb +13 -0
  15. data/examples/embeds_one/flattened.rb +12 -0
  16. data/examples/embeds_one/simple.rb +12 -0
  17. data/examples/embeds_one/with_class_name.rb +12 -0
  18. data/examples/embeds_one/with_if.rb +16 -0
  19. data/examples/embeds_one/with_start_key.rb +12 -0
  20. data/examples/has_many/simple.rb +28 -0
  21. data/examples/helper.rb +9 -0
  22. data/examples/initialize/embeds_many.rb +25 -0
  23. data/examples/initialize/embeds_many_array.rb +9 -0
  24. data/examples/initialize/embeds_one.rb +19 -0
  25. data/examples/initialize/simple.rb +8 -0
  26. data/examples/properties/array_serialization.rb +8 -0
  27. data/examples/properties/collections.rb +11 -0
  28. data/examples/properties/simple.rb +8 -0
  29. data/examples/properties/with_field.rb +8 -0
  30. data/examples/properties/with_field_path.rb +8 -0
  31. data/examples/properties/with_id.rb +8 -0
  32. data/examples/properties/with_if.rb +21 -0
  33. data/examples/properties/with_key_converter.rb +18 -0
  34. data/examples/properties/with_two_key_converters.rb +27 -0
  35. data/examples/properties/with_values.rb +10 -0
  36. data/examples/summarization/simple.rb +21 -0
  37. data/examples/to_input/embeds_many.rb +25 -0
  38. data/examples/to_input/embeds_many_without_key.rb +31 -0
  39. data/examples/to_input/embeds_one.rb +13 -0
  40. data/examples/to_input/embeds_one_without_key.rb +23 -0
  41. data/examples/to_input/flattened.rb +12 -0
  42. data/examples/to_input/serializables.rb +19 -0
  43. data/examples/to_input/simple.rb +8 -0
  44. data/examples/to_input/with_field.rb +8 -0
  45. data/examples/to_input/with_field_path.rb +8 -0
  46. data/examples/to_input/with_fields.rb +8 -0
  47. data/examples/to_input/without_key.rb +11 -0
  48. data/examples/to_input/without_nil.rb +11 -0
  49. data/lib/rest_model/configuration.rb +45 -0
  50. data/lib/rest_model/key/association.rb +42 -0
  51. data/lib/rest_model/key/builder.rb +30 -0
  52. data/lib/rest_model/key/embeddable/builder.rb +19 -0
  53. data/lib/rest_model/key/embeddable/response.rb +25 -0
  54. data/lib/rest_model/key/embeddable/retriever.rb +20 -0
  55. data/lib/rest_model/key/embeddable/sender.rb +41 -0
  56. data/lib/rest_model/key/embeddable.rb +29 -0
  57. data/lib/rest_model/key/href/response.rb +10 -0
  58. data/lib/rest_model/key/href.rb +10 -0
  59. data/lib/rest_model/key/property/builder.rb +27 -0
  60. data/lib/rest_model/key/property/response.rb +9 -0
  61. data/lib/rest_model/key/property/retriever.rb +24 -0
  62. data/lib/rest_model/key/property/sender.rb +41 -0
  63. data/lib/rest_model/key/property.rb +22 -0
  64. data/lib/rest_model/key/relation/builder.rb +24 -0
  65. data/lib/rest_model/key/relation/response.rb +38 -0
  66. data/lib/rest_model/key/relation.rb +23 -0
  67. data/lib/rest_model/key.rb +44 -0
  68. data/lib/rest_model/response.rb +42 -0
  69. data/lib/rest_model/serialization/boolean.rb +48 -0
  70. data/lib/rest_model/serialization/date.rb +19 -0
  71. data/lib/rest_model/serialization/enumerable.rb +15 -0
  72. data/lib/rest_model/serialization/float.rb +17 -0
  73. data/lib/rest_model/serialization/integer.rb +17 -0
  74. data/lib/rest_model/serialization/string.rb +13 -0
  75. data/lib/rest_model/source/path.rb +25 -0
  76. data/lib/rest_model/source/retriever.rb +48 -0
  77. data/lib/rest_model/source/sender.rb +38 -0
  78. data/lib/rest_model/version.rb +3 -0
  79. data/lib/rest_model.rb +101 -0
  80. data/rest_model.gemspec +26 -0
  81. data/spec/.DS_Store +0 -0
  82. data/spec/integration/embeds_many_spec.rb +57 -0
  83. data/spec/integration/embeds_one_spec.rb +41 -0
  84. data/spec/integration/has_many_spec.rb +27 -0
  85. data/spec/integration/property_spec.rb +69 -0
  86. data/spec/integration/summarization_spec.rb +12 -0
  87. data/spec/spec_helper.rb +26 -0
  88. data/spec/support/examples.rb +29 -0
  89. data/spec/support/out.rb +17 -0
  90. data/spec/support/shared_examples.rb +20 -0
  91. data/spec/unit/configuration_spec.rb +24 -0
  92. data/spec/unit/key/association_spec.rb +69 -0
  93. data/spec/unit/key/embeddable/builder_spec.rb +26 -0
  94. data/spec/unit/key/embeddable/response_spec.rb +55 -0
  95. data/spec/unit/key/embeddable/retriever_spec.rb +38 -0
  96. data/spec/unit/key/embeddable_spec.rb +7 -0
  97. data/spec/unit/key/property/builder_spec.rb +154 -0
  98. data/spec/unit/key/property/response_spec.rb +22 -0
  99. data/spec/unit/key/property/retriever_spec.rb +31 -0
  100. data/spec/unit/key/property_spec.rb +39 -0
  101. data/spec/unit/key/relation/builder_spec.rb +53 -0
  102. data/spec/unit/key/relation/response_spec.rb +105 -0
  103. data/spec/unit/key/relation_spec.rb +71 -0
  104. data/spec/unit/key_spec.rb +101 -0
  105. data/spec/unit/response_spec.rb +44 -0
  106. data/spec/unit/rest_model_spec.rb +46 -0
  107. data/spec/unit/serialization/boolean_spec.rb +25 -0
  108. data/spec/unit/serialization/date_spec.rb +13 -0
  109. data/spec/unit/serialization/float_spec.rb +13 -0
  110. data/spec/unit/serialization/integer_spec.rb +13 -0
  111. data/spec/unit/serialization/string_spec.rb +11 -0
  112. data/spec/unit/source/path_spec.rb +62 -0
  113. data/spec/unit/source/retriever_spec.rb +85 -0
  114. metadata +260 -0
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ def it_parses_property
4
+ it 'parses property' do
5
+ root.login.should == 'jackiechan2010'
6
+ end
7
+ end
8
+
9
+ describe_example 'properties/simple' do
10
+ it_parses_property
11
+ end
12
+
13
+ describe_example 'properties/with_field' do
14
+ context 'when input has a different name for the property' do
15
+ it_parses_property
16
+ end
17
+ end
18
+
19
+ describe_example 'properties/with_field_path' do
20
+ context 'when input has a different path for the property' do
21
+ it_parses_property
22
+ end
23
+ end
24
+
25
+ describe_example 'properties/with_id' do
26
+ context 'when property is an id' do
27
+ it 'parses id' do
28
+ root.id.should == "2000"
29
+ end
30
+ end
31
+ end
32
+
33
+ describe_example 'properties/with_if' do
34
+ context 'when a property has a conditional proc (:if)' do
35
+ context 'and it evaluates to true' do
36
+ it 'parses property' do
37
+ root_with_description.description.should == "description"
38
+ end
39
+ end
40
+
41
+ context 'and it evaluates to false' do
42
+ it "doesn't parse property" do
43
+ root_without_description.description.should_not be
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ describe_example 'properties/with_key_converter' do
50
+ after do
51
+ RestModel::Configuration.configure do |c|
52
+ c.convert_input_keys = nil
53
+ end
54
+ end
55
+
56
+ context 'when a diferent key converter is configured on rest model' do
57
+ it_parses_property
58
+ end
59
+ end
60
+
61
+ describe_example 'properties/with_two_key_converters' do
62
+ context 'when key converters are configured for each class' do
63
+ it_parses_property
64
+
65
+ it 'parses other property with different key converter' do
66
+ root.product.unit_price.should == 29.9
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe_example 'summarization/simple' do
4
+ subject {root[:entries].first}
5
+
6
+ it 'summarizes resources' do
7
+ subject.keys.count.should == 3
8
+ subject[:id].should == '138911938'
9
+ subject[:login].should == 'jackiechan2010'
10
+ subject[:href].should == 'http://example.com/customers/138911938'
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ $:.push '../lib'
2
+
3
+ require 'rest_model'
4
+ require 'ostruct'
5
+ require 'json'
6
+ require 'stringio'
7
+ require 'active_support/core_ext/hash/indifferent_access'
8
+
9
+ require 'support/shared_examples'
10
+ require 'support/examples'
11
+ require 'support/out'
12
+
13
+ RSpec.configure do |config|
14
+ config.before do
15
+ [:Example, :ExampleChild].each do |klass|
16
+ Object.send(:remove_const, klass) if Object.const_defined? klass
17
+ end
18
+ end
19
+ end
20
+
21
+ include Output
22
+ include Examples
23
+
24
+ RestModel::Configuration.configure do |c|
25
+ c.host = 'http://example.com'
26
+ end
@@ -0,0 +1,29 @@
1
+ module Examples
2
+ def describe_example(file, &block)
3
+ describe "example #{file}" do
4
+ [:Root, :Item, :Customer, :Entry].each do |klass|
5
+ Examples.send(:remove_const, klass) if Examples.const_defined?(klass)
6
+ end
7
+
8
+ # silently {
9
+
10
+ eval File.read("examples/#{file}.rb")
11
+
12
+ # }
13
+
14
+ variables = instance_variables.reject {|var| var.to_s =~ /metadata$/}
15
+
16
+ values = variables.inject({}) do |buffer, name|
17
+ method_name = name.to_s.gsub(/@/, "")
18
+ let(method_name) {instance_variable_get(name)}
19
+ buffer.merge method_name => instance_variable_get(name)
20
+ end
21
+
22
+ before :all do
23
+ values.each {|name, value| instance_variable_set "@#{name}", value}
24
+ end
25
+
26
+ instance_eval &block if block
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module Output
2
+ def out
3
+ output = StringIO.new
4
+ begin
5
+ $stdout = output
6
+ yield
7
+ ensure
8
+ $stdout = STDOUT
9
+ end
10
+ output.string
11
+ end
12
+
13
+ def silently
14
+ out {yield}
15
+ nil
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ shared_examples_for "an association" do
2
+ it "defines an attr_accessor with association name" do
3
+ Example.new.tap do |example|
4
+ example.respond_to?("#{field}").should be_true
5
+ example.respond_to?("#{field}=").should be_true
6
+ end
7
+ end
8
+
9
+ it "puts a new association in keys list" do
10
+ Example.keys.find {|key| key.name == field}.name.should == field
11
+ end
12
+
13
+ it "supports option definition" do
14
+ Example.keys.find {|key| key.name == field}.options.should == options
15
+ end
16
+
17
+ it "many? responds appropriately" do
18
+ Example.keys.find {|key| key.name == field}.many?.should == many
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Configuration do
4
+ after(:all) do
5
+ RestModel::Configuration.convert_input_keys = nil
6
+ end
7
+
8
+ context "when no custom input keys converter is set" do
9
+ it "returns default key converter" do
10
+ default_handler = RestModel::Configuration::DefaultHandler
11
+ RestModel::Configuration.convert_input_keys.should == default_handler
12
+ end
13
+ end
14
+
15
+ context "when a custom input keys converter is set" do
16
+ let(:custom_convert_input_keys) {lambda {|keys| keys}}
17
+
18
+ before {RestModel::Configuration.convert_input_keys = custom_convert_input_keys}
19
+
20
+ it "returns custom key converter" do
21
+ RestModel::Configuration.convert_input_keys.should == custom_convert_input_keys
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Association do
4
+ describe "#initialize" do
5
+ context "class_name" do
6
+ context "when class_name option is passed" do
7
+ subject do
8
+ RestModel::Association.new(:login, class_name: :some_class)
9
+ end
10
+
11
+ it "sets passed class_name" do
12
+ subject.instance_variable_get("@class_name").should == "SomeClass"
13
+ end
14
+ end
15
+
16
+ context "when class_name option is not passed" do
17
+ subject {RestModel::Association.new(:login)}
18
+
19
+ it "sets default class_name" do
20
+ subject.instance_variable_get("@class_name").should == "Login"
21
+ end
22
+ end
23
+ end
24
+
25
+ context "many" do
26
+ context "when many option is passed with true" do
27
+ subject do
28
+ RestModel::Association.new(:login, many: true)
29
+ end
30
+
31
+ it "returns false to one?" do
32
+ subject.one?.should be_false
33
+ end
34
+
35
+ it "returns true to many?" do
36
+ subject.many?.should be_true
37
+ end
38
+ end
39
+
40
+ context "when many option is passed with false" do
41
+ subject do
42
+ RestModel::Association.new(:login, many: false)
43
+ end
44
+
45
+ it "returns true to one?" do
46
+ subject.one?.should be_true
47
+ end
48
+
49
+ it "returns false to many?" do
50
+ subject.many?.should be_false
51
+ end
52
+ end
53
+
54
+ context "when many option is not passed" do
55
+ subject do
56
+ RestModel::Association.new(:login)
57
+ end
58
+
59
+ it "returns true to one?" do
60
+ subject.one?.should be_true
61
+ end
62
+
63
+ it "returns false to many?" do
64
+ subject.many?.should be_false
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Embeddable::Builder do
4
+ before do
5
+ class Example < RestModel
6
+ embeds_one :contract, some_option: 'contract options'
7
+ embeds_many :invoice_items, some_option: 'invoice options'
8
+ end
9
+ end
10
+
11
+ describe ".embeds_one" do
12
+ let(:field) {:contract}
13
+ let(:many) {false}
14
+ let(:options) {{some_option: 'contract options', many: many}}
15
+
16
+ it_behaves_like "an association"
17
+ end
18
+
19
+ describe ".embeds_many" do
20
+ let(:field) {:invoice_items}
21
+ let(:many) {true}
22
+ let(:options) {{some_option: 'invoice options', many: many}}
23
+
24
+ it_behaves_like "an association"
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Embeddable::Response do
4
+ before do
5
+ class ExampleChild < RestModel
6
+ property :id
7
+ end
8
+
9
+ class Example < RestModel
10
+ embeds_one :example_child
11
+ embeds_many :example_children
12
+ end
13
+ end
14
+
15
+ shared_examples_for "an embeddable" do
16
+ it "returns a pair with property name and value" do
17
+ subject.to_resource(example).should == result
18
+ end
19
+
20
+ context "when this key shouldn't be visible on resource" do
21
+ it "returns an empty hash" do
22
+ subject.should_receive(:visible?).and_return false
23
+ subject.to_resource(example).should == {}
24
+ end
25
+ end
26
+ end
27
+
28
+ context "when embeds one" do
29
+ subject {Example.keys[0]}
30
+
31
+ let :example do
32
+ Example.new.tap do |example|
33
+ example.example_child = ExampleChild.new(id: "200")
34
+ end
35
+ end
36
+
37
+ let(:result) {{example_child: {id: "200"}}}
38
+
39
+ it_behaves_like "an embeddable"
40
+ end
41
+
42
+ context "when embeds many" do
43
+ subject {Example.keys[1]}
44
+
45
+ let :example do
46
+ Example.new.tap do |example|
47
+ example.example_children = [ExampleChild.new(id: "300")]
48
+ end
49
+ end
50
+
51
+ let(:result) {{example_children: [{id: "300"}]}}
52
+
53
+ it_behaves_like "an embeddable"
54
+ end
55
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Embeddable::Retriever do
4
+ context "when it embeds one" do
5
+ before do
6
+ class ExampleChild < RestModel
7
+ property :id
8
+ end
9
+ end
10
+
11
+ let(:value) {{id: "7000"}}
12
+
13
+ subject {RestModel::Embeddable.new(:example_child, many: false, start_key: "")}
14
+
15
+ it "parses child" do
16
+ child = subject.from_source(value)
17
+ child.id.should == "7000"
18
+ end
19
+ end
20
+
21
+ context "when it embeds many" do
22
+ before do
23
+ class ExampleChild < RestModel
24
+ property :id
25
+ end
26
+ end
27
+
28
+ let(:value) {{example_children: [{id: "7000"}, {id: "7001"}]}}
29
+
30
+ subject {RestModel::Embeddable.new(:example_children, many: true)}
31
+
32
+ it "parses children" do
33
+ children = subject.from_source(value)
34
+ children[0].id.should == "7000"
35
+ children[1].id.should == "7001"
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Embeddable do
4
+ it "is a relation" do
5
+ RestModel::Embeddable.superclass.should == RestModel::Association
6
+ end
7
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Property::Builder do
4
+ shared_examples_for "a property" do
5
+ it "defines an attr_accessor with property name" do
6
+ Example.new.tap do |example|
7
+ example.respond_to?("#{field}").should be_true
8
+ example.respond_to?("#{field}=").should be_true
9
+ end
10
+ end
11
+
12
+ it "puts a new property in keys list" do
13
+ Example.keys.find {|key| key.name == field}.name.should == field
14
+ end
15
+
16
+ it "supports option definition" do
17
+ Example.keys.find {|key| key.name == field}.options.should == options
18
+ end
19
+ end
20
+
21
+ shared_examples_for "a key" do
22
+ it "is referenced as the resource id" do
23
+ Example.id_key.name.should == field
24
+ end
25
+ end
26
+
27
+ describe ".id" do
28
+ context "when it's just 'id'" do
29
+ before do
30
+ class Example < RestModel
31
+ id
32
+ end
33
+ end
34
+
35
+ let(:field) {:id}
36
+ let(:options) {{id: true}}
37
+
38
+ it_behaves_like "a property"
39
+ it_behaves_like "a key"
40
+ end
41
+
42
+ context "when it has a different name" do
43
+ before do
44
+ class Example < RestModel
45
+ id :different_name
46
+ end
47
+ end
48
+
49
+ let(:field) {:different_name}
50
+ let(:options) {{id: true}}
51
+
52
+ it_behaves_like "a property"
53
+ it_behaves_like "a key"
54
+ end
55
+
56
+ context "when it has options" do
57
+ before do
58
+ class Example < RestModel
59
+ id some_option: 'some option value'
60
+ end
61
+ end
62
+
63
+ let(:field) {:id}
64
+ let(:options) {{some_option: 'some option value', id: true}}
65
+
66
+ it_behaves_like "a property"
67
+ it_behaves_like "a key"
68
+ end
69
+
70
+ context "when it has both different name and options" do
71
+ before do
72
+ class Example < RestModel
73
+ id :different_name, some_option: 'some option value'
74
+ end
75
+ end
76
+
77
+ let(:field) {:different_name}
78
+ let(:options) {{some_option: 'some option value', id: true}}
79
+
80
+ it_behaves_like "a property"
81
+ it_behaves_like "a key"
82
+ end
83
+
84
+ context "when it defines somehow the option id: false" do
85
+ before do
86
+ class Example < RestModel
87
+ id id: false
88
+ end
89
+ end
90
+
91
+ let(:field) {:id}
92
+ let(:options) {{id: true}}
93
+
94
+ it_behaves_like "a property"
95
+ it_behaves_like "a key"
96
+ end
97
+ end
98
+
99
+ describe ".property" do
100
+ context "when it is a normal property" do
101
+ before do
102
+ class Example < RestModel
103
+ property :document_number, some_option: 'this is an option'
104
+ end
105
+ end
106
+
107
+ let(:field) {:document_number}
108
+ let(:options) {{some_option: 'this is an option'}}
109
+
110
+ it_behaves_like "a property"
111
+ end
112
+
113
+ context "when it has the option :id set to true" do
114
+ before do
115
+ class Example < RestModel
116
+ property :document_number, id: true
117
+ end
118
+ end
119
+
120
+ let(:field) {:document_number}
121
+ let(:options) {{id: true}}
122
+
123
+ it_behaves_like "a property"
124
+ it_behaves_like "a key"
125
+ end
126
+ end
127
+
128
+ describe ".properties" do
129
+ before do
130
+ class Example < RestModel
131
+ properties :id, :description
132
+ properties :price, :quantity, firstoption: 'this is the first option', secondoption: 'this is the second option'
133
+ end
134
+ end
135
+
136
+ [:id, :description].each do |item|
137
+ context "for #{item}" do
138
+ let(:field) {item}
139
+ let(:options) {{}}
140
+
141
+ it_behaves_like "a property"
142
+ end
143
+ end
144
+
145
+ [:price, :quantity].each do |item|
146
+ context "for #{item}" do
147
+ let(:field) {item}
148
+ let(:options) {{firstoption: 'this is the first option', secondoption: 'this is the second option'}}
149
+
150
+ it_behaves_like "a property"
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Property::Response do
4
+ class Customer
5
+ attr_accessor :login
6
+ end
7
+
8
+ subject {RestModel::Property.new(:login)}
9
+
10
+ it "returns a pair with property name and value" do
11
+ customer = Customer.new.tap {|c| c.login = "jackiechan2010"}
12
+ subject.to_resource(customer).should == {login: "jackiechan2010"}
13
+ end
14
+
15
+ context "when this key shouldn't be visible on resource" do
16
+ it "returns an empty hash" do
17
+ subject.should_receive(:visible?).and_return false
18
+ customer = Customer.new.tap {|c| c.login = "jackiechan2010"}
19
+ subject.to_resource(customer).should == {}
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Property::Retriever do
4
+ subject {RestModel::Property.new(:login)}
5
+
6
+ let(:item) {{login: "jackiechan2010"}}
7
+ let(:serializer_mock) {mock :serializer}
8
+
9
+ before do
10
+ subject.stub!(:serializer).and_return serializer_mock
11
+ end
12
+
13
+ it "tries to serialize value" do
14
+ serializer_mock.should_receive(:serialize).with(item[:login]).and_return(item[:login])
15
+ subject.from_source(item)
16
+ end
17
+
18
+ context "when there is a values map" do
19
+ let(:values) {{paid: '01', unpaid: '02'}}
20
+
21
+ subject do
22
+ options = {values: values}
23
+ RestModel::Property.new(:payment_status, options)
24
+ end
25
+
26
+ it "maps value" do
27
+ serializer_mock.should_receive(:serialize).with("02").and_return "02"
28
+ subject.from_source({payment_status: "02"}).should == :unpaid
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Property do
4
+ describe "#initialize" do
5
+ context "serializer" do
6
+ context "when custom is provided" do
7
+ subject do
8
+ options = {type: RestModel::Serialization::Boolean}
9
+ RestModel::Property.new(:haz_bool?, options)
10
+ end
11
+
12
+ it "configures custom" do
13
+ subject.serializer.should == RestModel::Serialization::Boolean
14
+ end
15
+ end
16
+
17
+ context "when it isn't provided" do
18
+ subject {RestModel::Property.new(:login)}
19
+
20
+ it "uses String serializer" do
21
+ subject.serializer.should == RestModel::Serialization::String
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when values map is provided" do
27
+ let(:values) {{paid: '01', unpaid: '02'}}
28
+
29
+ subject do
30
+ options = {values: values}
31
+ RestModel::Property.new(:payment_status, options)
32
+ end
33
+
34
+ it "configures values" do
35
+ subject.translations.should == values
36
+ end
37
+ end
38
+ end
39
+ end