ruby_odata 0.0.9 → 0.0.10
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.
- data/CHANGELOG.rdoc +15 -1
- data/README.rdoc +17 -7
- data/features/basic_auth.feature +3 -3
- data/features/batch_request.feature +1 -1
- data/features/complex_types.feature +1 -1
- data/features/query_builder.feature +1 -1
- data/features/service.feature +1 -1
- data/features/service_manage.feature +1 -1
- data/features/step_definitions/service_steps.rb +4 -0
- data/features/support/env.rb +3 -1
- data/features/support/hooks.rb +1 -1
- data/features/type_conversion.feature +1 -1
- data/lib/ruby_odata.rb +1 -0
- data/lib/ruby_odata/property_metadata.rb +28 -0
- data/lib/ruby_odata/query_builder.rb +7 -3
- data/lib/ruby_odata/service.rb +101 -28
- data/lib/ruby_odata/version.rb +1 -1
- data/ruby_odata.gemspec +1 -0
- data/spec/fixtures/feed_customization/edmx_feed_customization.xml +70 -0
- data/spec/fixtures/feed_customization/result_feed_customization_categories_expand.xml +213 -0
- data/spec/fixtures/feed_customization/result_feed_customization_products_expand.xml +217 -0
- data/spec/fixtures/sap/edmx_sap_demo_flight.xml +61 -0
- data/spec/fixtures/sap/result_sap_demo_flight_missing_category.xml +81 -0
- data/spec/property_metadata_spec.rb +42 -0
- data/spec/query_builder_spec.rb +23 -0
- data/spec/service_spec.rb +224 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/support/describe_private.rb +13 -0
- data/spec/support/element_helpers.rb +7 -0
- data/test/Cassini x64.bat +1 -1
- data/test/Cassini x86.bat +1 -1
- data/test/applicationhost.config.template +1 -1
- metadata +93 -131
@@ -0,0 +1,61 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:gp="http://www.sap.com/Protocols/SAPData/GenericPlayer" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData">
|
3
|
+
<edmx:DataServices m:DataServiceVersion="2.0">
|
4
|
+
<Schema Namespace="DEMO_FLIGHT" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
|
5
|
+
<EntityType Name="flight_data" m:HasStream="false" sap:content-version="1">
|
6
|
+
<Key>
|
7
|
+
<PropertyRef Name="scheme_id"/>
|
8
|
+
<PropertyRef Name="value"/>
|
9
|
+
<PropertyRef Name="scheme_agency_id"/>
|
10
|
+
</Key>
|
11
|
+
<Property Name="scheme_id" Type="Edm.String" Nullable="false" MaxLength="30" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
12
|
+
<Property Name="airlineid" Type="Edm.String" MaxLength="3" sap:label="Airline" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
13
|
+
<Property Name="value" Type="Edm.String" Nullable="false" MaxLength="72" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
14
|
+
<Property Name="scheme_agency_id" Type="Edm.String" Nullable="false" MaxLength="16" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
15
|
+
</EntityType>
|
16
|
+
<EntityType Name="z_demo_flight" m:HasStream="false" sap:content-version="1">
|
17
|
+
<Key>
|
18
|
+
<PropertyRef Name="scheme_id"/>
|
19
|
+
<PropertyRef Name="scheme_agency_id"/>
|
20
|
+
<PropertyRef Name="value"/>
|
21
|
+
</Key>
|
22
|
+
<Property Name="cityto" Type="Edm.String" MaxLength="20" sap:label="Arrival city" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
23
|
+
<Property Name="scheme_id" Type="Edm.String" Nullable="false" MaxLength="30" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
24
|
+
<Property Name="curr" Type="Edm.String" MaxLength="5" sap:label="Airline local currency" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
25
|
+
<Property Name="businmax" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
26
|
+
<Property Name="arrdate" Type="Edm.DateTime" Precision="8" sap:label="Arrival date" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
27
|
+
<Property Name="deptime" Type="Edm.Time" Precision="6" sap:label="Departure time" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
28
|
+
<Property Name="firstmax" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
29
|
+
<Property Name="price" Type="Edm.Decimal" Precision="23" Scale="4" sap:label="Airfare" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
30
|
+
<Property Name="businfree" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
31
|
+
<Property Name="scheme_agency_id" Type="Edm.String" Nullable="false" MaxLength="16" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
32
|
+
<Property Name="airline" Type="Edm.String" MaxLength="20" sap:label="Airline" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
33
|
+
<Property Name="economax" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
34
|
+
<Property Name="cityfrom" Type="Edm.String" MaxLength="20" sap:label="Depart. city" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
35
|
+
<Property Name="airportfr" Type="Edm.String" MaxLength="3" sap:label="Departure airport" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
36
|
+
<Property Name="connectid" Type="Edm.String" MaxLength="4" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
37
|
+
<Property Name="firstfree" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
38
|
+
<Property Name="econofree" Type="Edm.Int32" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
39
|
+
<Property Name="airlineid" Type="Edm.String" MaxLength="2" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
40
|
+
<Property Name="curr_iso" Type="Edm.String" MaxLength="3" sap:label="ISO code" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
41
|
+
<Property Name="value" Type="Edm.String" Nullable="false" MaxLength="72" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
42
|
+
<Property Name="flightdate" Type="Edm.DateTime" Nullable="true" Precision="0" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
43
|
+
<Property Name="airportto" Type="Edm.String" MaxLength="3" sap:label="Destination airport" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
44
|
+
<Property Name="arrtime" Type="Edm.Time" Precision="6" sap:label="Arrival Time" sap:creatable="false" sap:updatable="false" sap:filterable="false"/>
|
45
|
+
<NavigationProperty Name="flight_data_r" Relationship="DEMO_FLIGHT.flight_data_r" FromRole="FromRole_z_demo_flight_flight_data" ToRole="ToRole_flight_data_z_demo_flight"/>
|
46
|
+
</EntityType>
|
47
|
+
<Association Name="flight_data_r" sap:content-version="1">
|
48
|
+
<End Type="DEMO_FLIGHT.z_demo_flight" Multiplicity="0..1" Role="FromRole_z_demo_flight_flight_data"/>
|
49
|
+
<End Type="DEMO_FLIGHT.flight_data" Multiplicity="0..1" Role="ToRole_flight_data_z_demo_flight"/>
|
50
|
+
</Association>
|
51
|
+
<EntityContainer Name="DEMO_FLIGHT" m:IsDefaultEntityContainer="true">
|
52
|
+
<EntitySet Name="flight_dataCollection" EntityType="DEMO_FLIGHT.flight_data" sap:content-version="1" sap:creatable="false" sap:updatable="false" sap:deletable="false"/>
|
53
|
+
<EntitySet Name="z_demo_flightCollection" EntityType="DEMO_FLIGHT.z_demo_flight" sap:content-version="1" sap:creatable="false" sap:updatable="false" sap:deletable="false"/>
|
54
|
+
<AssociationSet Name="AssocSet_flight_data_r" Association="DEMO_FLIGHT.flight_data_r" sap:content-version="1" sap:creatable="false" sap:updatable="false" sap:deletable="false">
|
55
|
+
<End EntitySet="z_demo_flightCollection" Role="FromRole_z_demo_flight_flight_data"/>
|
56
|
+
<End EntitySet="flight_dataCollection" Role="ToRole_flight_data_z_demo_flight"/>
|
57
|
+
</AssociationSet>
|
58
|
+
</EntityContainer>
|
59
|
+
</Schema>
|
60
|
+
</edmx:DataServices>
|
61
|
+
</edmx:Edmx>
|
@@ -0,0 +1,81 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<atom:feed xml:base="HTTP://GW.ESWORKPLACE.SAP.COM:80/sap/opu/sdata/sap/DEMO_FLIGHT/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData">
|
3
|
+
<atom:id>HTTP://GW.ESWORKPLACE.SAP.COM:80/sap/opu/sdata/sap/DEMO_FLIGHT/z_demo_flightCollection</atom:id>
|
4
|
+
<atom:link href="z_demo_flightCollection" rel="self" type="application/atom+xml;type=feed"/>
|
5
|
+
<atom:title>zDemoFlightCollection</atom:title>
|
6
|
+
<atom:updated>2011-09-23T01:17:51Z</atom:updated>
|
7
|
+
<atom:entry>
|
8
|
+
<atom:content type="application/xml">
|
9
|
+
<m:properties>
|
10
|
+
<d:value>020408_AA001720081001</d:value>
|
11
|
+
<d:scheme_id>Z_DEMO_FLIGHT</d:scheme_id>
|
12
|
+
<d:scheme_agency_id>HU2_800</d:scheme_agency_id>
|
13
|
+
<d:cityto>SAN FRANCISCO</d:cityto>
|
14
|
+
<d:curr>USD</d:curr>
|
15
|
+
<d:businmax>0</d:businmax>
|
16
|
+
<d:arrdate m:Type="Edm.DateTime">2008-10-01T00:00:00</d:arrdate>
|
17
|
+
<d:deptime m:Type="Edm.Time">PT11H00M00S</d:deptime>
|
18
|
+
<d:firstmax>0</d:firstmax>
|
19
|
+
<d:price m:Type="Edm.Decimal">422.9400</d:price>
|
20
|
+
<d:businfree>0</d:businfree>
|
21
|
+
<d:airline>American Airlines</d:airline>
|
22
|
+
<d:economax>0</d:economax>
|
23
|
+
<d:cityfrom>NEW YORK</d:cityfrom>
|
24
|
+
<d:airportfr>JFK</d:airportfr>
|
25
|
+
<d:connectid>00000000</d:connectid>
|
26
|
+
<d:firstfree>0</d:firstfree>
|
27
|
+
<d:econofree>0</d:econofree>
|
28
|
+
<d:airlineid/>
|
29
|
+
<d:curr_iso>USD</d:curr_iso>
|
30
|
+
<d:flightdate m:Type="Edm.DateTime" m:null="true"/>
|
31
|
+
<d:airportto>SFO</d:airportto>
|
32
|
+
<d:arrtime m:Type="Edm.Time">PT14H01M00S</d:arrtime>
|
33
|
+
</m:properties>
|
34
|
+
</atom:content>
|
35
|
+
<atom:id>HTTP://GW.ESWORKPLACE.SAP.COM:80/sap/opu/sdata/sap/DEMO_FLIGHT/z_demo_flightCollection(value='020408_AA001720081001',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')</atom:id>
|
36
|
+
<atom:link href="z_demo_flightCollection(value='020408_AA001720081001',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')" rel="self" type="application/atom+xml;type=entry"/>
|
37
|
+
<atom:link gateway:abap_name="FLIGHT_DATA_R" href="z_demo_flightCollection(value='020408_AA001720081001',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')/flight_data_r" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flight_data_r" type="application/atom+xml;type=entry" title="flight_data_r" xmlns:gateway="http://www.sap.com/Protocols/Gateway">
|
38
|
+
<sap:icon/>
|
39
|
+
</atom:link>
|
40
|
+
<atom:title>z_demo_flight</atom:title>
|
41
|
+
<atom:updated>2011-09-23T01:17:51Z</atom:updated>
|
42
|
+
<sap:icon/>
|
43
|
+
</atom:entry>
|
44
|
+
<atom:entry>
|
45
|
+
<atom:content type="application/xml">
|
46
|
+
<m:properties>
|
47
|
+
<d:value>020408_AA001720081029</d:value>
|
48
|
+
<d:scheme_id>Z_DEMO_FLIGHT</d:scheme_id>
|
49
|
+
<d:scheme_agency_id>HU2_800</d:scheme_agency_id>
|
50
|
+
<d:cityto>SAN FRANCISCO</d:cityto>
|
51
|
+
<d:curr>USD</d:curr>
|
52
|
+
<d:businmax>0</d:businmax>
|
53
|
+
<d:arrdate m:Type="Edm.DateTime">2008-10-29T00:00:00</d:arrdate>
|
54
|
+
<d:deptime m:Type="Edm.Time">PT11H00M00S</d:deptime>
|
55
|
+
<d:firstmax>0</d:firstmax>
|
56
|
+
<d:price m:Type="Edm.Decimal">422.9400</d:price>
|
57
|
+
<d:businfree>0</d:businfree>
|
58
|
+
<d:airline>American Airlines</d:airline>
|
59
|
+
<d:economax>0</d:economax>
|
60
|
+
<d:cityfrom>NEW YORK</d:cityfrom>
|
61
|
+
<d:airportfr>JFK</d:airportfr>
|
62
|
+
<d:connectid>00000000</d:connectid>
|
63
|
+
<d:firstfree>0</d:firstfree>
|
64
|
+
<d:econofree>0</d:econofree>
|
65
|
+
<d:airlineid/>
|
66
|
+
<d:curr_iso>USD</d:curr_iso>
|
67
|
+
<d:flightdate m:Type="Edm.DateTime" m:null="true"/>
|
68
|
+
<d:airportto>SFO</d:airportto>
|
69
|
+
<d:arrtime m:Type="Edm.Time">PT14H01M00S</d:arrtime>
|
70
|
+
</m:properties>
|
71
|
+
</atom:content>
|
72
|
+
<atom:id>HTTP://GW.ESWORKPLACE.SAP.COM:80/sap/opu/sdata/sap/DEMO_FLIGHT/z_demo_flightCollection(value='020408_AA001720081029',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')</atom:id>
|
73
|
+
<atom:link href="z_demo_flightCollection(value='020408_AA001720081029',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')" rel="self" type="application/atom+xml;type=entry"/>
|
74
|
+
<atom:link gateway:abap_name="FLIGHT_DATA_R" href="z_demo_flightCollection(value='020408_AA001720081029',scheme_id='Z_DEMO_FLIGHT',scheme_agency_id='HU2_800')/flight_data_r" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flight_data_r" type="application/atom+xml;type=entry" title="flight_data_r" xmlns:gateway="http://www.sap.com/Protocols/Gateway">
|
75
|
+
<sap:icon/>
|
76
|
+
</atom:link>
|
77
|
+
<atom:title>z_demo_flight</atom:title>
|
78
|
+
<atom:updated>2011-09-23T01:17:51Z</atom:updated>
|
79
|
+
<sap:icon/>
|
80
|
+
</atom:entry>
|
81
|
+
</atom:feed>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module OData
|
4
|
+
describe PropertyMetadata do
|
5
|
+
describe "#initialize" do
|
6
|
+
it "parses an EDMX property with the essentials (name, type, nullable)" do
|
7
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="false" />')
|
8
|
+
property_metadata = PropertyMetadata.new property_element
|
9
|
+
property_metadata.name.should eq "Id"
|
10
|
+
property_metadata.type.should eq "Edm.String"
|
11
|
+
property_metadata.nullable.should eq false
|
12
|
+
end
|
13
|
+
it "parses an EDMX property where nullable is true" do
|
14
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="true" />')
|
15
|
+
property_metadata = PropertyMetadata.new property_element
|
16
|
+
property_metadata.nullable.should eq true
|
17
|
+
end
|
18
|
+
it "parses an EDMX property with nil for missing attributes" do
|
19
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="false" />')
|
20
|
+
property_metadata = PropertyMetadata.new property_element
|
21
|
+
property_metadata.fc_target_path.should be_nil
|
22
|
+
property_metadata.fc_keep_in_content.should be_nil
|
23
|
+
end
|
24
|
+
it "parses an EDMX property with false for missing Nullable attribute" do
|
25
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" />')
|
26
|
+
property_metadata = PropertyMetadata.new property_element
|
27
|
+
property_metadata.nullable.should eq false
|
28
|
+
end
|
29
|
+
it "parses an EDMX property with the fc_target_path and fc_keep_in_content attribute" do
|
30
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Title" Type="Edm.String" Nullable="true" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="false" />')
|
31
|
+
property_metadata = PropertyMetadata.new property_element
|
32
|
+
property_metadata.fc_target_path.should eq "SyndicationTitle"
|
33
|
+
property_metadata.fc_keep_in_content.should eq false
|
34
|
+
end
|
35
|
+
it "parses an EDMX property where fc_keep_in_content is true" do
|
36
|
+
property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Title" Type="Edm.String" Nullable="true" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="true" />')
|
37
|
+
property_metadata = PropertyMetadata.new property_element
|
38
|
+
property_metadata.fc_keep_in_content.should eq true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module OData
|
4
|
+
describe QueryBuilder do
|
5
|
+
describe "#initialize" do
|
6
|
+
it "handles additional parameters" do
|
7
|
+
builder = QueryBuilder.new 'Products', { :x=>1, :y=>2 }
|
8
|
+
builder.query.should eq "Products?x=1&y=2"
|
9
|
+
end
|
10
|
+
it "handles empty additional parameters" do
|
11
|
+
builder = QueryBuilder.new 'Products'
|
12
|
+
builder.query.should eq "Products"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
describe "#query" do
|
16
|
+
it "should append additional parameters to the end" do
|
17
|
+
builder = QueryBuilder.new 'Products', { :x=>1, :y=>2 }
|
18
|
+
builder.top(10)
|
19
|
+
builder.query.should eq "Products?$top=10&x=1&y=2"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/service_spec.rb
CHANGED
@@ -19,7 +19,71 @@ module OData
|
|
19
19
|
|
20
20
|
lambda { OData::Service.new "http://test.com/test.svc" }.should_not raise_error
|
21
21
|
end
|
22
|
+
|
23
|
+
describe "additional query string parameters" do
|
24
|
+
before(:each) do
|
25
|
+
# Required for the build_classes method
|
26
|
+
stub_request(:get, /http:\/\/test\.com\/test\.svc\/\$metadata(?:\?.+)?/).
|
27
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
28
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/edmx_empty.xml", __FILE__)), :headers => {})
|
29
|
+
end
|
30
|
+
it "should accept additional query string parameters" do
|
31
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
32
|
+
svc.options[:additional_params].should eq Hash[:x=>1, :y=>2]
|
33
|
+
end
|
34
|
+
it "should call the correct metadata uri when additional_params are passed in" do
|
35
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x => 1, :y => 2 } }
|
36
|
+
a_request(:get, "http://test.com/test.svc/$metadata?x=1&y=2").should have_been_made
|
37
|
+
end
|
38
|
+
end
|
22
39
|
end
|
40
|
+
|
41
|
+
describe "additional query string parameters" do
|
42
|
+
before(:each) do
|
43
|
+
# Required for the build_classes method
|
44
|
+
stub_request(:any, /http:\/\/test\.com\/test\.svc(?:.*)/).
|
45
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
46
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/sap/edmx_sap_demo_flight.xml", __FILE__)), :headers => {})
|
47
|
+
end
|
48
|
+
it "should pass the parameters as part of a query" do
|
49
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
50
|
+
svc.flight_dataCollection
|
51
|
+
svc.execute
|
52
|
+
a_request(:get, "http://test.com/test.svc/flight_dataCollection?x=1&y=2").should have_been_made
|
53
|
+
end
|
54
|
+
it "should pass the parameters as part of a save" do
|
55
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
56
|
+
new_flight = ZDemoFlight.new
|
57
|
+
svc.AddToflight_dataCollection(new_flight)
|
58
|
+
svc.save_changes
|
59
|
+
a_request(:post, "http://test.com/test.svc/flight_dataCollection?x=1&y=2").should have_been_made
|
60
|
+
end
|
61
|
+
it "should pass the parameters as part of an update" do
|
62
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
63
|
+
existing_flight = ZDemoFlight.new
|
64
|
+
existing_flight.__metadata = { :uri => "http://test.com/test.svc/flight_dataCollection/1" }
|
65
|
+
svc.update_object(existing_flight)
|
66
|
+
svc.save_changes
|
67
|
+
a_request(:put, "http://test.com/test.svc/flight_dataCollection/1?x=1&y=2").should have_been_made
|
68
|
+
end
|
69
|
+
it "should pass the parameters as part of a delete" do
|
70
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
71
|
+
existing_flight = ZDemoFlight.new
|
72
|
+
existing_flight.__metadata = { :uri => "http://test.com/test.svc/flight_dataCollection/1" }
|
73
|
+
svc.delete_object(existing_flight)
|
74
|
+
svc.save_changes
|
75
|
+
a_request(:delete, "http://test.com/test.svc/flight_dataCollection/1?x=1&y=2").should have_been_made
|
76
|
+
end
|
77
|
+
it "should pass the parameters as part of a batch save" do
|
78
|
+
svc = OData::Service.new "http://test.com/test.svc/", { :additional_params => { :x=>1, :y=>2 } }
|
79
|
+
new_flight = ZDemoFlight.new
|
80
|
+
svc.AddToflight_dataCollection(new_flight)
|
81
|
+
new_flight2 = ZDemoFlight.new
|
82
|
+
svc.AddToflight_dataCollection(new_flight2)
|
83
|
+
svc.save_changes
|
84
|
+
a_request(:post, "http://test.com/test.svc/$batch?x=1&y=2").should have_been_made
|
85
|
+
end
|
86
|
+
end
|
23
87
|
|
24
88
|
describe "lowercase collections" do
|
25
89
|
before(:each) do
|
@@ -39,5 +103,165 @@ module OData
|
|
39
103
|
lambda { svc.send('acronyms') }.should_not raise_error
|
40
104
|
end
|
41
105
|
end
|
106
|
+
|
107
|
+
describe "handling of SAP results" do
|
108
|
+
before(:each) do
|
109
|
+
# Required for the build_classes method
|
110
|
+
stub_request(:get, "http://test.com/test.svc/$metadata").
|
111
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
112
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/sap/edmx_sap_demo_flight.xml", __FILE__)), :headers => {})
|
113
|
+
|
114
|
+
stub_request(:get, "http://test.com/test.svc/z_demo_flightCollection").
|
115
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
116
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/sap/result_sap_demo_flight_missing_category.xml", __FILE__)), :headers => {})
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should handle entities without a category element" do
|
120
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
121
|
+
svc.z_demo_flightCollection
|
122
|
+
results = svc.execute
|
123
|
+
results.first.should be_a_kind_of(ZDemoFlight)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "collections, objects, etc" do
|
128
|
+
before(:each) do
|
129
|
+
# Metadata
|
130
|
+
stub_request(:get, "http://test.com/test.svc/$metadata").
|
131
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
132
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/feed_customization/edmx_feed_customization.xml", __FILE__)), :headers => {})
|
133
|
+
|
134
|
+
# Content - Products
|
135
|
+
stub_request(:get, /http:\/\/test\.com\/test\.svc\/Products(?:.*)/).
|
136
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
137
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/feed_customization/result_feed_customization_products_expand.xml", __FILE__)), :headers => {})
|
138
|
+
|
139
|
+
# Content - Categories expanded Products
|
140
|
+
stub_request(:get, /http:\/\/test\.com\/test\.svc\/Categories(?:.*)/).
|
141
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
142
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/feed_customization/result_feed_customization_categories_expand.xml", __FILE__)), :headers => {})
|
143
|
+
end
|
144
|
+
after(:each) do
|
145
|
+
Object.send(:remove_const, 'Product')
|
146
|
+
Object.send(:remove_const, 'Category')
|
147
|
+
end
|
148
|
+
describe "handling feed customizations" do
|
149
|
+
describe "property metadata" do
|
150
|
+
it "should fill the class_metadata hash" do
|
151
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
152
|
+
svc.class_metadata.should_not be_empty
|
153
|
+
end
|
154
|
+
it "should add a key (based on the name) for each property class_metadata hash" do
|
155
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
156
|
+
svc.class_metadata['Product'].should have_key 'ID'
|
157
|
+
svc.class_metadata['Product'].should have_key 'Name'
|
158
|
+
svc.class_metadata['Product'].should have_key 'Description'
|
159
|
+
end
|
160
|
+
it "should have a PropertyMetadata object for each property class_metadata hash" do
|
161
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
162
|
+
svc.class_metadata['Product']['ID'].should be_a OData::PropertyMetadata
|
163
|
+
svc.class_metadata['Product']['Name'].should be_a OData::PropertyMetadata
|
164
|
+
svc.class_metadata['Product']['Description'].should be_a OData::PropertyMetadata
|
165
|
+
end
|
166
|
+
it "should have the correct PropertyMetadata object for Id" do
|
167
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
168
|
+
meta = svc.class_metadata['Product']['ID']
|
169
|
+
meta.name.should eq 'ID'
|
170
|
+
meta.type.should eq 'Edm.Int32'
|
171
|
+
meta.nullable.should eq false
|
172
|
+
meta.fc_target_path.should be_nil
|
173
|
+
meta.fc_keep_in_content.should be_nil
|
174
|
+
end
|
175
|
+
it "should have the correct PropertyMetadata object for Name" do
|
176
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
177
|
+
meta = svc.class_metadata['Product']['Name']
|
178
|
+
meta.name.should eq 'Name'
|
179
|
+
meta.type.should eq 'Edm.String'
|
180
|
+
meta.nullable.should eq true
|
181
|
+
meta.fc_target_path.should eq "SyndicationTitle"
|
182
|
+
meta.fc_keep_in_content.should eq false
|
183
|
+
end
|
184
|
+
it "should have the correct PropertyMetadata object for Description" do
|
185
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
186
|
+
meta = svc.class_metadata['Product']['Description']
|
187
|
+
meta.name.should eq 'Description'
|
188
|
+
meta.type.should eq 'Edm.String'
|
189
|
+
meta.nullable.should eq true
|
190
|
+
meta.fc_target_path.should eq "SyndicationSummary"
|
191
|
+
meta.fc_keep_in_content.should eq false
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "single class" do
|
196
|
+
it "should handle properties where a property is represented in the syndication title instead of the properties collection" do
|
197
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
198
|
+
svc.Products
|
199
|
+
results = svc.execute
|
200
|
+
results.first.Name.should eq "Bread"
|
201
|
+
end
|
202
|
+
it "should handle properties where a property is represented in the syndication summary instead of the properties collection" do
|
203
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
204
|
+
svc.Products
|
205
|
+
results = svc.execute
|
206
|
+
results.first.Description.should eq "Whole grain bread"
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "expanded inline class" do
|
211
|
+
it "should handle properties where a property is represented in the syndication title instead of the properties collection" do
|
212
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
213
|
+
svc.Categories
|
214
|
+
results = svc.execute
|
215
|
+
|
216
|
+
beverages = results[1]
|
217
|
+
|
218
|
+
milk = beverages.Products.first
|
219
|
+
milk.Name.should eq "Milk"
|
220
|
+
milk.Description.should eq "Low fat milk"
|
221
|
+
|
222
|
+
lemonade = beverages.Products.last
|
223
|
+
lemonade.Name.should eq "Pink Lemonade"
|
224
|
+
lemonade.Description.should eq "36 Ounce Cans (Pack of 3)"
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe "handling inline collections/properties" do
|
230
|
+
it "should make plural named properties arrays and not a single class" do
|
231
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
232
|
+
svc.Categories
|
233
|
+
results = svc.execute
|
234
|
+
food = results[0]
|
235
|
+
|
236
|
+
food.Products.should be_an Array
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should not make an array if the navigation property name is singular" do
|
240
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
241
|
+
svc.Products
|
242
|
+
results = svc.execute
|
243
|
+
product = results.first
|
244
|
+
product.Category.should_not be_an Array
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe_private OData::Service do
|
251
|
+
describe "parse value" do
|
252
|
+
before(:each) do
|
253
|
+
# Required for the build_classes method
|
254
|
+
stub_request(:get, "http://test.com/test.svc/$metadata").
|
255
|
+
with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).
|
256
|
+
to_return(:status => 200, :body => File.new(File.expand_path("../fixtures/edmx_empty.xml", __FILE__)), :headers => {})
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should not error on an 'out of range' date" do
|
260
|
+
# This date was returned in the Netflix OData service and failed with an ArgumentError: out of range using 1.8.7 (2010-12-23 patchlevel 330) [i386-mingw32]
|
261
|
+
svc = OData::Service.new "http://test.com/test.svc/"
|
262
|
+
element_to_parse = Nokogiri::XML.parse('<d:AvailableFrom m:type="Edm.DateTime">2100-01-01T00:00:00</d:AvailableFrom>').elements[0]
|
263
|
+
lambda { svc.parse_value(element_to_parse) }.should_not raise_exception
|
264
|
+
end
|
265
|
+
end
|
42
266
|
end
|
43
267
|
end
|
data/spec/spec_helper.rb
CHANGED