rest_model 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +2 -0
- data/Guardfile +7 -0
- data/README.md +237 -0
- data/Rakefile +2 -0
- data/examples/all.rb +12 -0
- data/examples/embeds_many/invisible.rb +16 -0
- data/examples/embeds_many/simple.rb +13 -0
- data/examples/embeds_many/with_array.rb +10 -0
- data/examples/embeds_many/with_class_name.rb +13 -0
- data/examples/embeds_many/with_fields.rb +9 -0
- data/examples/embeds_many/with_if.rb +16 -0
- data/examples/embeds_many/with_nil_value.rb +12 -0
- data/examples/embeds_many/with_start_key.rb +13 -0
- data/examples/embeds_one/flattened.rb +12 -0
- data/examples/embeds_one/simple.rb +12 -0
- data/examples/embeds_one/with_class_name.rb +12 -0
- data/examples/embeds_one/with_if.rb +16 -0
- data/examples/embeds_one/with_start_key.rb +12 -0
- data/examples/has_many/simple.rb +28 -0
- data/examples/helper.rb +9 -0
- data/examples/initialize/embeds_many.rb +25 -0
- data/examples/initialize/embeds_many_array.rb +9 -0
- data/examples/initialize/embeds_one.rb +19 -0
- data/examples/initialize/simple.rb +8 -0
- data/examples/properties/array_serialization.rb +8 -0
- data/examples/properties/collections.rb +11 -0
- data/examples/properties/simple.rb +8 -0
- data/examples/properties/with_field.rb +8 -0
- data/examples/properties/with_field_path.rb +8 -0
- data/examples/properties/with_id.rb +8 -0
- data/examples/properties/with_if.rb +21 -0
- data/examples/properties/with_key_converter.rb +18 -0
- data/examples/properties/with_two_key_converters.rb +27 -0
- data/examples/properties/with_values.rb +10 -0
- data/examples/summarization/simple.rb +21 -0
- data/examples/to_input/embeds_many.rb +25 -0
- data/examples/to_input/embeds_many_without_key.rb +31 -0
- data/examples/to_input/embeds_one.rb +13 -0
- data/examples/to_input/embeds_one_without_key.rb +23 -0
- data/examples/to_input/flattened.rb +12 -0
- data/examples/to_input/serializables.rb +19 -0
- data/examples/to_input/simple.rb +8 -0
- data/examples/to_input/with_field.rb +8 -0
- data/examples/to_input/with_field_path.rb +8 -0
- data/examples/to_input/with_fields.rb +8 -0
- data/examples/to_input/without_key.rb +11 -0
- data/examples/to_input/without_nil.rb +11 -0
- data/lib/rest_model/configuration.rb +45 -0
- data/lib/rest_model/key/association.rb +42 -0
- data/lib/rest_model/key/builder.rb +30 -0
- data/lib/rest_model/key/embeddable/builder.rb +19 -0
- data/lib/rest_model/key/embeddable/response.rb +25 -0
- data/lib/rest_model/key/embeddable/retriever.rb +20 -0
- data/lib/rest_model/key/embeddable/sender.rb +41 -0
- data/lib/rest_model/key/embeddable.rb +29 -0
- data/lib/rest_model/key/href/response.rb +10 -0
- data/lib/rest_model/key/href.rb +10 -0
- data/lib/rest_model/key/property/builder.rb +27 -0
- data/lib/rest_model/key/property/response.rb +9 -0
- data/lib/rest_model/key/property/retriever.rb +24 -0
- data/lib/rest_model/key/property/sender.rb +41 -0
- data/lib/rest_model/key/property.rb +22 -0
- data/lib/rest_model/key/relation/builder.rb +24 -0
- data/lib/rest_model/key/relation/response.rb +38 -0
- data/lib/rest_model/key/relation.rb +23 -0
- data/lib/rest_model/key.rb +44 -0
- data/lib/rest_model/response.rb +42 -0
- data/lib/rest_model/serialization/boolean.rb +48 -0
- data/lib/rest_model/serialization/date.rb +19 -0
- data/lib/rest_model/serialization/enumerable.rb +15 -0
- data/lib/rest_model/serialization/float.rb +17 -0
- data/lib/rest_model/serialization/integer.rb +17 -0
- data/lib/rest_model/serialization/string.rb +13 -0
- data/lib/rest_model/source/path.rb +25 -0
- data/lib/rest_model/source/retriever.rb +48 -0
- data/lib/rest_model/source/sender.rb +38 -0
- data/lib/rest_model/version.rb +3 -0
- data/lib/rest_model.rb +101 -0
- data/rest_model.gemspec +26 -0
- data/spec/.DS_Store +0 -0
- data/spec/integration/embeds_many_spec.rb +57 -0
- data/spec/integration/embeds_one_spec.rb +41 -0
- data/spec/integration/has_many_spec.rb +27 -0
- data/spec/integration/property_spec.rb +69 -0
- data/spec/integration/summarization_spec.rb +12 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/examples.rb +29 -0
- data/spec/support/out.rb +17 -0
- data/spec/support/shared_examples.rb +20 -0
- data/spec/unit/configuration_spec.rb +24 -0
- data/spec/unit/key/association_spec.rb +69 -0
- data/spec/unit/key/embeddable/builder_spec.rb +26 -0
- data/spec/unit/key/embeddable/response_spec.rb +55 -0
- data/spec/unit/key/embeddable/retriever_spec.rb +38 -0
- data/spec/unit/key/embeddable_spec.rb +7 -0
- data/spec/unit/key/property/builder_spec.rb +154 -0
- data/spec/unit/key/property/response_spec.rb +22 -0
- data/spec/unit/key/property/retriever_spec.rb +31 -0
- data/spec/unit/key/property_spec.rb +39 -0
- data/spec/unit/key/relation/builder_spec.rb +53 -0
- data/spec/unit/key/relation/response_spec.rb +105 -0
- data/spec/unit/key/relation_spec.rb +71 -0
- data/spec/unit/key_spec.rb +101 -0
- data/spec/unit/response_spec.rb +44 -0
- data/spec/unit/rest_model_spec.rb +46 -0
- data/spec/unit/serialization/boolean_spec.rb +25 -0
- data/spec/unit/serialization/date_spec.rb +13 -0
- data/spec/unit/serialization/float_spec.rb +13 -0
- data/spec/unit/serialization/integer_spec.rb +13 -0
- data/spec/unit/serialization/string_spec.rb +11 -0
- data/spec/unit/source/path_spec.rb +62 -0
- data/spec/unit/source/retriever_spec.rb +85 -0
- metadata +260 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Relation::Builder do
|
4
|
+
describe ".has_one" do
|
5
|
+
before do
|
6
|
+
class Example < RestModel
|
7
|
+
has_one :item, some_option: 'option'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:field) {:item}
|
12
|
+
let(:many) {false}
|
13
|
+
let(:options) {{some_option: 'option', many: many, has: true}}
|
14
|
+
|
15
|
+
it_behaves_like "an association"
|
16
|
+
|
17
|
+
it "puts a new relation in relation list" do
|
18
|
+
Example.relations.find {|relation| relation.name == field}.name.should == field
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".has_many" do
|
23
|
+
before do
|
24
|
+
class Example < RestModel
|
25
|
+
has_many :items, some_option: 'option'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:field) {:items}
|
30
|
+
let(:many) {true}
|
31
|
+
let(:options) {{some_option: 'option', many: many, has: true}}
|
32
|
+
|
33
|
+
it_behaves_like "an association"
|
34
|
+
|
35
|
+
it "puts a new relation in relation list" do
|
36
|
+
Example.relations.find {|relation| relation.name == field}.name.should == field
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".belongs_to" do
|
41
|
+
before do
|
42
|
+
class Example < RestModel
|
43
|
+
belongs_to :item, some_option: 'option'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
let(:field) {:item}
|
48
|
+
let(:many) {false}
|
49
|
+
let(:options) {{some_option: 'option', many: many, has: false}}
|
50
|
+
|
51
|
+
it_behaves_like "an association"
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Response do
|
4
|
+
shared_examples_for "a relation" do
|
5
|
+
context "#to_relation" do
|
6
|
+
it "returns a pair with property name and value" do
|
7
|
+
subject.to_relation(example).should == result
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "#to_resource" do
|
12
|
+
context "when the key shouldn't be visible on resource" do
|
13
|
+
it "returns an empty hash" do
|
14
|
+
subject.should_receive(:visible?).and_return false
|
15
|
+
subject.to_resource(example).should == {}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when the relation instance variable in parent returns nil" do
|
20
|
+
it "returns an empty hash" do
|
21
|
+
subject.to_resource(example).should == {}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "otherwise" do
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when has one" do
|
32
|
+
before do
|
33
|
+
class ExampleChild < RestModel
|
34
|
+
id
|
35
|
+
belongs_to :example
|
36
|
+
end
|
37
|
+
|
38
|
+
class Example < RestModel
|
39
|
+
id
|
40
|
+
has_one :example_child
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
subject {Example.keys[1]}
|
45
|
+
|
46
|
+
let(:example) {Example.new(id: 100)}
|
47
|
+
let(:result) {{rel: :example_child, href: "http://example.com/examples/100/example_child"}}
|
48
|
+
|
49
|
+
it_behaves_like "a relation"
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when has many" do
|
53
|
+
before do
|
54
|
+
class ExampleChild < RestModel
|
55
|
+
property :id
|
56
|
+
belongs_to :example
|
57
|
+
end
|
58
|
+
|
59
|
+
class Example < RestModel
|
60
|
+
property :id
|
61
|
+
has_many :example_children
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
subject {Example.keys[1]}
|
66
|
+
|
67
|
+
let(:example) {Example.new(id: 200)}
|
68
|
+
let(:result) {{rel: :example_children, href: "http://example.com/examples/200/example_children"}}
|
69
|
+
|
70
|
+
it_behaves_like "a relation"
|
71
|
+
end
|
72
|
+
|
73
|
+
context "when belongs to one" do
|
74
|
+
before do
|
75
|
+
class ExampleChild < RestModel
|
76
|
+
property :id
|
77
|
+
belongs_to :example
|
78
|
+
end
|
79
|
+
|
80
|
+
class Example < RestModel
|
81
|
+
property :id
|
82
|
+
has_many :example_children
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
subject {ExampleChild.keys[1]}
|
87
|
+
|
88
|
+
let(:example) {ExampleChild.new(id: 200)}
|
89
|
+
let(:result) {{rel: :example, href: "http://example.com/examples/200/example_children"}}
|
90
|
+
|
91
|
+
it_behaves_like "a relation"
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when using forbidden key names" do
|
95
|
+
[:resource_id, :resource].each do |forbidden_name|
|
96
|
+
it "raises an exception for #{forbidden_name}" do
|
97
|
+
expect {
|
98
|
+
class Example < RestModel
|
99
|
+
property forbidden_name
|
100
|
+
end
|
101
|
+
}.to raise_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Relation do
|
4
|
+
it "is a relation" do
|
5
|
+
RestModel::Relation.superclass.should == RestModel::Association
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#has?" do
|
9
|
+
context "when it has one resource" do
|
10
|
+
subject do
|
11
|
+
RestModel::Relation.new(:service, many: false, has: true)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns true" do
|
15
|
+
subject.has?.should be_true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when it has many resources" do
|
20
|
+
subject do
|
21
|
+
RestModel::Relation.new(:service, many: true, has: true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns true" do
|
25
|
+
subject.has?.should be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when it belongs to a resource" do
|
30
|
+
subject do
|
31
|
+
RestModel::Relation.new(:service, many: false, has: false)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns true" do
|
35
|
+
subject.has?.should be_false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#belongs?" do
|
41
|
+
context "when it belongs to a resource" do
|
42
|
+
subject do
|
43
|
+
RestModel::Relation.new(:service, many: false, has: false)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns true" do
|
47
|
+
subject.belongs?.should be_true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "when it has one resource" do
|
52
|
+
subject do
|
53
|
+
RestModel::Relation.new(:service, many: false, has: true)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns true" do
|
57
|
+
subject.belongs?.should be_false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when it has many resources" do
|
62
|
+
subject do
|
63
|
+
RestModel::Relation.new(:service, many: true, has: true)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns true" do
|
67
|
+
subject.belongs?.should be_false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Key do
|
4
|
+
let(:name) {"key_name"}
|
5
|
+
let(:options) {{any_option: "here"}}
|
6
|
+
|
7
|
+
subject {RestModel::Property.new(name, options)}
|
8
|
+
|
9
|
+
describe "#initialize" do
|
10
|
+
it "sets key name" do
|
11
|
+
subject.name.should == name
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets options" do
|
15
|
+
subject.options.should == options
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#visible?" do
|
20
|
+
context "when :visible option was defined" do
|
21
|
+
context "and :if option was defined with false" do
|
22
|
+
subject {RestModel::Property.new(name, {if: proc {false}, visible: true})}
|
23
|
+
it "return false even when visible is true" do
|
24
|
+
subject.visible?(nil).should be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "and it evaluates to false" do
|
29
|
+
subject {RestModel::Property.new(name, {visible: false})}
|
30
|
+
|
31
|
+
it "returns false" do
|
32
|
+
subject.visible?(nil).should be_false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "and it evaluates to true" do
|
37
|
+
subject {RestModel::Property.new(name, {visible: true})}
|
38
|
+
|
39
|
+
it "returns true" do
|
40
|
+
subject.visible?(nil).should be_true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with a proc" do
|
45
|
+
context "and it evaluates true" do
|
46
|
+
subject {RestModel::Property.new(name, {visible: proc {true}})}
|
47
|
+
it "returns true" do
|
48
|
+
subject.visible?("a").should be_true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "and it evaluates false" do
|
53
|
+
subject {RestModel::Property.new(name, {visible: proc {false}})}
|
54
|
+
it "returns false" do
|
55
|
+
subject.visible?("a").should be_false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "and it depends on resource instance" do
|
60
|
+
subject {RestModel::Property.new(name, {visible: proc {show}})}
|
61
|
+
|
62
|
+
it "uses it" do
|
63
|
+
resource = OpenStruct.new
|
64
|
+
resource.show = true
|
65
|
+
subject.visible?(resource).should be_true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#present?" do
|
73
|
+
context "when :if option was defined with a proc" do
|
74
|
+
context "and it evaluates to false" do
|
75
|
+
subject {RestModel::Property.new(name, {if: proc {false}})}
|
76
|
+
|
77
|
+
it "returns false" do
|
78
|
+
subject.present?(nil).should be_false
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "and it evaluates to true" do
|
83
|
+
subject {RestModel::Property.new(name, {if: proc {true}})}
|
84
|
+
|
85
|
+
it "returns true" do
|
86
|
+
subject.present?(nil).should be_true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "and it depends on resource instance" do
|
91
|
+
subject {RestModel::Property.new(name, {if: proc {show}})}
|
92
|
+
|
93
|
+
it "uses it" do
|
94
|
+
resource = OpenStruct.new
|
95
|
+
resource.show = true
|
96
|
+
subject.present?(resource).should be_true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Response do
|
4
|
+
before do
|
5
|
+
class Example < RestModel
|
6
|
+
id :login
|
7
|
+
property :phone
|
8
|
+
embeds_one :address, class_name: :example_child
|
9
|
+
end
|
10
|
+
|
11
|
+
class ExampleChild < RestModel
|
12
|
+
property :street
|
13
|
+
property :city
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:input) do
|
18
|
+
{
|
19
|
+
login: 'jackiechan2010',
|
20
|
+
phone: '32232188',
|
21
|
+
address: {
|
22
|
+
street: 'Aurora St.',
|
23
|
+
city: 'Recife'
|
24
|
+
}
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#normalize" do
|
29
|
+
context "when one resource is received" do
|
30
|
+
it "returns a resource" do
|
31
|
+
model = Example.parse(input).first
|
32
|
+
Example.normalize(model).with_indifferent_access.should == input.with_indifferent_access
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when a list of resources is received" do
|
37
|
+
it "returns some resources in an entries array" do
|
38
|
+
model = 3.times.map {Example.parse(input).first}
|
39
|
+
result = {entries: 3.times.map {input}}
|
40
|
+
Example.normalize(model).with_indifferent_access.should == result.with_indifferent_access
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel do
|
4
|
+
describe '#resource' do
|
5
|
+
before do
|
6
|
+
class Example < RestModel
|
7
|
+
property :login
|
8
|
+
property :name
|
9
|
+
property :age, type: Float
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns a hash with properties and its values" do
|
14
|
+
example = Example.new(login: 'jackiechan2010', name: 'Jackie Chan', age: 45)
|
15
|
+
example.resource.should == {login: 'jackiechan2010', name: 'Jackie Chan', age: 45}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when using not allowed names" do
|
20
|
+
[:resource_id, :resource, :link].each do |unallowed|
|
21
|
+
it "warns when method #{unallowed} is redefined" do
|
22
|
+
output = out do
|
23
|
+
eval <<-RUBY
|
24
|
+
class Example < RestModel
|
25
|
+
def #{unallowed}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
RUBY
|
29
|
+
end
|
30
|
+
output.should =~ /^warning: redefining '#{unallowed}' may cause serious problems/
|
31
|
+
end
|
32
|
+
|
33
|
+
%w(property embeds_one embeds_many has_one has_many belongs_to).each do |kind|
|
34
|
+
it "removes method #{unallowed} created by #{kind}" do
|
35
|
+
expect {
|
36
|
+
eval <<-RUBY
|
37
|
+
class Example < RestModel
|
38
|
+
#{kind} :#{unallowed}
|
39
|
+
end
|
40
|
+
RUBY
|
41
|
+
}.to raise_error "you can't define a key with name '#{unallowed}'"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Serialization::Boolean do
|
4
|
+
[true, "true", "TRUE", "1", 1, 1.0, "x", "X", "t", "T"].each do |true_value|
|
5
|
+
context "when value is #{true_value}" do
|
6
|
+
it "returns true" do
|
7
|
+
subject.class.serialize(true_value).should be_true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
[false, "false", "FALSE", "0", 0, 0.0, "", " ", "f", "F", nil].each do |false_value|
|
13
|
+
context "when value is #{false_value}" do
|
14
|
+
it "returns false" do
|
15
|
+
subject.class.serialize(false_value).should be_false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when an invalid value is serialized" do
|
21
|
+
it "raises an error" do
|
22
|
+
expect {subject.class.serialize("neither true or false")}.to raise_error
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Serialization::Date do
|
4
|
+
it "converts to date" do
|
5
|
+
subject.class.serialize('2011-07-01').should == Date.new(2011, 07, 01)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "when an invalid value is serialized" do
|
9
|
+
it "raises an error" do
|
10
|
+
expect {subject.class.serialize("not a date")}.to raise_error
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Serialization::Float do
|
4
|
+
it "converts to float" do
|
5
|
+
subject.class.serialize('1200.49').should == 1200.49
|
6
|
+
end
|
7
|
+
|
8
|
+
context "when an invalid value is serialized" do
|
9
|
+
it "raises an error" do
|
10
|
+
expect {subject.class.serialize("not a float")}.to raise_error
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Serialization::Integer do
|
4
|
+
it "converts to integer" do
|
5
|
+
subject.class.serialize('1200').should == 1200
|
6
|
+
end
|
7
|
+
|
8
|
+
context "when an invalid value is serialized" do
|
9
|
+
it "raises an error" do
|
10
|
+
expect {subject.class.serialize("not an integer")}.to raise_error
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Serialization::String do
|
4
|
+
it "converts value to string" do
|
5
|
+
subject.class.serialize(:something).should == "something"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns nil when value is nil" do
|
9
|
+
subject.class.serialize(nil).should be_nil
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Upcasing
|
4
|
+
def self.call(keys)
|
5
|
+
keys.map {|key| key.to_s.upcase}
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe RestModel::Source::Path do
|
10
|
+
shared_examples_for "an input path" do
|
11
|
+
it "brings the correct input path" do
|
12
|
+
subject.source_path.should == path
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when a custom path is not defined" do
|
17
|
+
context "and there is'nt a custom keys input converter" do
|
18
|
+
subject {RestModel::Key.new(:name)}
|
19
|
+
let(:path) {[:name]}
|
20
|
+
it_behaves_like "an input path"
|
21
|
+
end
|
22
|
+
|
23
|
+
context "and there is a custom keys input converter" do
|
24
|
+
subject {RestModel::Key.new(:name, convert_input_keys: Upcasing)}
|
25
|
+
let(:path) {['NAME']}
|
26
|
+
it_behaves_like "an input path"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when a custom path is defined" do
|
31
|
+
context "and it is a simple name" do
|
32
|
+
subject {RestModel::Key.new(:name, field: :other_name)}
|
33
|
+
let(:path) {[:other_name]}
|
34
|
+
it_behaves_like "an input path"
|
35
|
+
end
|
36
|
+
|
37
|
+
context "and it is a set of names composed by dot" do
|
38
|
+
subject {RestModel::Key.new(:name, field: 'a.long.way.to.go')}
|
39
|
+
let(:path) {['a', 'long', 'way', 'to', 'go']}
|
40
|
+
it_behaves_like "an input path"
|
41
|
+
end
|
42
|
+
|
43
|
+
context "and it is a set of names composed by dot" do
|
44
|
+
subject {RestModel::Key.new(:name, field: 'a.long.long.way.to.go')}
|
45
|
+
let(:path) {['a', 'long', 'long', 'way', 'to', 'go']}
|
46
|
+
it_behaves_like "an input path"
|
47
|
+
end
|
48
|
+
|
49
|
+
context "and it is a set of names composed by dot using :start_key instead of :field" do
|
50
|
+
subject {RestModel::Key.new(:name, start_key: 'a.long.way.to.go')}
|
51
|
+
let(:path) {['a', 'long', 'way', 'to', 'go']}
|
52
|
+
it_behaves_like "an input path"
|
53
|
+
end
|
54
|
+
|
55
|
+
context "and there is a custom keys input converter" do
|
56
|
+
let(:options) {{start_key: 'yay.upcase.path', convert_input_keys: Upcasing}}
|
57
|
+
subject {RestModel::Key.new(:name, options)}
|
58
|
+
let(:path) {['YAY', 'UPCASE', 'PATH']}
|
59
|
+
it_behaves_like "an input path"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestModel::Source::Retriever do
|
4
|
+
describe '.parse' do
|
5
|
+
it 'parses simple properties' do
|
6
|
+
class Example < RestModel
|
7
|
+
property :login
|
8
|
+
end
|
9
|
+
|
10
|
+
models = Example.parse({login: 'jackiechan2010'})
|
11
|
+
models.should be_an(Array)
|
12
|
+
models.first.login.should == 'jackiechan2010'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'uses different field name if defined' do
|
16
|
+
class Example < RestModel
|
17
|
+
property :login, field: :customer_login
|
18
|
+
end
|
19
|
+
|
20
|
+
models = Example.parse({customer_login: 'jackiechan2010'})
|
21
|
+
models.should be_an(Array)
|
22
|
+
models.first.login.should == 'jackiechan2010'
|
23
|
+
end
|
24
|
+
|
25
|
+
context "uses type defined" do
|
26
|
+
context 'boolean' do
|
27
|
+
before do
|
28
|
+
class Example < RestModel
|
29
|
+
property :can_merge, type: Boolean
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns true when value is 'X'" do
|
34
|
+
models = Example.parse({can_merge: 'X'})
|
35
|
+
models.first.can_merge.should be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns false when value isn't 'X'" do
|
39
|
+
models = Example.parse({can_merge: ''})
|
40
|
+
models.first.can_merge.should be_false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "date" do
|
45
|
+
it "parse" do
|
46
|
+
class Example < RestModel
|
47
|
+
property :issue_date, type: Date
|
48
|
+
end
|
49
|
+
|
50
|
+
models = Example.parse({issue_date: '2011-01-01'})
|
51
|
+
models.first.issue_date.should == Date.parse('2011-01-01')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "float" do
|
56
|
+
it "parse" do
|
57
|
+
class Example < RestModel
|
58
|
+
property :amount, type: Float
|
59
|
+
end
|
60
|
+
|
61
|
+
models = Example.parse({amount: '1234.5'})
|
62
|
+
models.first.amount.should == 1234.5
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "maps values if defined" do
|
68
|
+
before do
|
69
|
+
class Example < RestModel
|
70
|
+
property :status, values: {paid: '01', unpaid: '02'}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it "returns key when value was mapped" do
|
75
|
+
models = Example.parse({status: '02'})
|
76
|
+
models.first.status.should == :unpaid
|
77
|
+
end
|
78
|
+
|
79
|
+
it "returns nil when value wasn't mapped" do
|
80
|
+
models = Example.parse({status: '03'})
|
81
|
+
models.first.status.should be_nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|