ruby_odata 0.1.0 → 0.1.6

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 (86) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +7 -2
  4. data/.simplecov +10 -0
  5. data/.travis.yml +10 -4
  6. data/.yardopts +6 -0
  7. data/CHANGELOG.md +157 -0
  8. data/Guardfile +14 -0
  9. data/LICENSE +20 -22
  10. data/README.md +289 -0
  11. data/Rakefile +19 -9
  12. data/features/basic_auth.feature +3 -2
  13. data/features/batch_request.feature +7 -6
  14. data/features/cassettes/basic_auth_protected_resource.yml +57 -0
  15. data/features/cassettes/batch_request_additions.yml +69 -0
  16. data/features/cassettes/batch_request_deletes.yml +69 -0
  17. data/features/cassettes/batch_request_updates.yml +69 -0
  18. data/features/cassettes/clean_database_for_testing.yml +46 -0
  19. data/features/cassettes/cucumber_tags/basic_auth.yml +297 -0
  20. data/features/cassettes/cucumber_tags/batch_request.yml +1459 -0
  21. data/features/cassettes/cucumber_tags/complex_types.yml +326 -0
  22. data/features/cassettes/cucumber_tags/error_handling.yml +64 -0
  23. data/features/cassettes/cucumber_tags/query_builder.yml +2025 -0
  24. data/features/cassettes/cucumber_tags/service.yml +234 -0
  25. data/features/cassettes/cucumber_tags/service_manage.yml +937 -0
  26. data/features/cassettes/cucumber_tags/service_methods.yml +647 -0
  27. data/features/cassettes/cucumber_tags/ssl.yml +203 -0
  28. data/features/cassettes/cucumber_tags/type_conversion.yml +337 -0
  29. data/features/cassettes/service_manage_additions.yml +65 -0
  30. data/features/cassettes/service_manage_deletions.yml +58 -0
  31. data/features/cassettes/service_manage_deletions_2.yml +58 -0
  32. data/features/cassettes/unsecured_metadata.yml +89 -0
  33. data/features/complex_types.feature +4 -3
  34. data/features/error_handling.feature +13 -0
  35. data/features/query_builder.feature +30 -9
  36. data/features/service.feature +4 -3
  37. data/features/service_manage.feature +6 -5
  38. data/features/service_methods.feature +3 -2
  39. data/features/ssl.feature +8 -8
  40. data/features/step_definitions/service_steps.rb +32 -74
  41. data/features/support/env.rb +6 -3
  42. data/features/support/hooks.rb +3 -2
  43. data/features/support/pickle.rb +29 -18
  44. data/features/support/vcr.rb +24 -0
  45. data/features/type_conversion.feature +16 -17
  46. data/gemfiles/Gemfile.ruby187 +6 -0
  47. data/lib/ruby_odata.rb +20 -18
  48. data/lib/ruby_odata/association.rb +7 -6
  49. data/lib/ruby_odata/class_builder.rb +31 -14
  50. data/lib/ruby_odata/exceptions.rb +11 -0
  51. data/lib/ruby_odata/helpers.rb +17 -0
  52. data/lib/ruby_odata/operation.rb +5 -6
  53. data/lib/ruby_odata/property_metadata.rb +9 -7
  54. data/lib/ruby_odata/query_builder.rb +127 -63
  55. data/lib/ruby_odata/service.rb +265 -147
  56. data/lib/ruby_odata/version.rb +3 -1
  57. data/ruby_odata.gemspec +22 -13
  58. data/spec/fixtures/error_without_message.xml +5 -0
  59. data/spec/fixtures/int64_ids/edmx_boat_service.xml +19 -0
  60. data/spec/fixtures/int64_ids/edmx_car_service.xml +21 -0
  61. data/spec/fixtures/int64_ids/result_boats.xml +26 -0
  62. data/spec/fixtures/int64_ids/result_cars.xml +28 -0
  63. data/spec/fixtures/ms_system_center/edmx_ms_system_center.xml +1645 -0
  64. data/spec/fixtures/ms_system_center/edmx_ms_system_center_v2.xml +2120 -0
  65. data/spec/fixtures/ms_system_center/hardware_profiles.xml +61 -0
  66. data/spec/fixtures/ms_system_center/virtual_machines.xml +175 -0
  67. data/spec/fixtures/ms_system_center/vm_templates.xml +1193 -0
  68. data/spec/fixtures/nested_expands/edmx_northwind.xml +557 -0
  69. data/spec/fixtures/nested_expands/northwind_products_category_expands.xml +774 -0
  70. data/spec/fixtures/sample_service/result_select_categories_expand.xml +268 -0
  71. data/spec/fixtures/sample_service/result_select_categories_no_property.xml +6 -0
  72. data/spec/fixtures/sample_service/result_select_categories_travsing_no_expand.xml +6 -0
  73. data/spec/fixtures/sample_service/result_select_products_name_price.xml +92 -0
  74. data/spec/property_metadata_spec.rb +10 -10
  75. data/spec/query_builder_spec.rb +153 -14
  76. data/spec/revised_service_spec.rb +111 -6
  77. data/spec/service_spec.rb +389 -85
  78. data/spec/spec_helper.rb +3 -0
  79. data/spec/support/sample_service_matcher.rb +15 -0
  80. data/test/RubyODataService/RubyODataService/App_Data/.gitkeep +0 -0
  81. data/test/blueprints.rb +15 -9
  82. data/test/usage_samples/querying.rb +5 -1
  83. data/test/usage_samples/sample_data.rb +1 -3
  84. metadata +276 -76
  85. data/CHANGELOG.rdoc +0 -88
  86. data/README.rdoc +0 -259
@@ -0,0 +1,268 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xml:base="http://win7dev:8989/SampleService/RubyOData.svc/"
3
+ xmlns="http://www.w3.org/2005/Atom"
4
+ xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
5
+ xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
6
+ xmlns:georss="http://www.georss.org/georss"
7
+ xmlns:gml="http://www.opengis.net/gml">
8
+ <id>http://win7dev:8989/SampleService/RubyOdata.svc/Categories</id>
9
+ <title type="text">Categories</title>
10
+ <updated>2013-07-22T14:54:47Z</updated>
11
+ <link rel="self" title="Categories" href="Categories" />
12
+ <entry>
13
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(1)</id>
14
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
15
+ <link rel="edit" title="Category" href="Categories(1)" />
16
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(1)/Products">
17
+ <m:inline>
18
+ <feed>
19
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(1)/Products</id>
20
+ <title type="text">Products</title>
21
+ <updated>2013-07-22T14:54:47Z</updated>
22
+ <link rel="self" title="Products" href="Categories(1)/Products" />
23
+ <entry>
24
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(1)</id>
25
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
26
+ <link rel="edit" title="Product" href="Products(1)" />
27
+ <title />
28
+ <updated>2013-07-22T14:54:47Z</updated>
29
+ <author>
30
+ <name />
31
+ </author>
32
+ <content type="application/xml">
33
+ <m:properties>
34
+ <d:Name>Widget 0001</d:Name>
35
+ </m:properties>
36
+ </content>
37
+ </entry>
38
+ </feed>
39
+ </m:inline>
40
+ </link>
41
+ <title />
42
+ <updated>2013-07-22T14:54:47Z</updated>
43
+ <author>
44
+ <name />
45
+ </author>
46
+ <content type="application/xml">
47
+ <m:properties>
48
+ <d:Name>Category 0001</d:Name>
49
+ </m:properties>
50
+ </content>
51
+ </entry>
52
+ <entry>
53
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(2)</id>
54
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
55
+ <link rel="edit" title="Category" href="Categories(2)" />
56
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(2)/Products">
57
+ <m:inline>
58
+ <feed>
59
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(2)/Products</id>
60
+ <title type="text">Products</title>
61
+ <updated>2013-07-22T14:54:47Z</updated>
62
+ <link rel="self" title="Products" href="Categories(2)/Products" />
63
+ <entry>
64
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(2)</id>
65
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
66
+ <link rel="edit" title="Product" href="Products(2)" />
67
+ <title />
68
+ <updated>2013-07-22T14:54:47Z</updated>
69
+ <author>
70
+ <name />
71
+ </author>
72
+ <content type="application/xml">
73
+ <m:properties>
74
+ <d:Name>Widget 0002</d:Name>
75
+ </m:properties>
76
+ </content>
77
+ </entry>
78
+ </feed>
79
+ </m:inline>
80
+ </link>
81
+ <title />
82
+ <updated>2013-07-22T14:54:47Z</updated>
83
+ <author>
84
+ <name />
85
+ </author>
86
+ <content type="application/xml">
87
+ <m:properties>
88
+ <d:Name>Category 0001</d:Name>
89
+ </m:properties>
90
+ </content>
91
+ </entry>
92
+ <entry>
93
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(3)</id>
94
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
95
+ <link rel="edit" title="Category" href="Categories(3)" />
96
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(3)/Products">
97
+ <m:inline>
98
+ <feed>
99
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(3)/Products</id>
100
+ <title type="text">Products</title>
101
+ <updated>2013-07-22T14:54:47Z</updated>
102
+ <link rel="self" title="Products" href="Categories(3)/Products" />
103
+ <entry>
104
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(3)</id>
105
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
106
+ <link rel="edit" title="Product" href="Products(3)" />
107
+ <title />
108
+ <updated>2013-07-22T14:54:47Z</updated>
109
+ <author>
110
+ <name />
111
+ </author>
112
+ <content type="application/xml">
113
+ <m:properties>
114
+ <d:Name>Widget 0003</d:Name>
115
+ </m:properties>
116
+ </content>
117
+ </entry>
118
+ </feed>
119
+ </m:inline>
120
+ </link>
121
+ <title />
122
+ <updated>2013-07-22T14:54:47Z</updated>
123
+ <author>
124
+ <name />
125
+ </author>
126
+ <content type="application/xml">
127
+ <m:properties>
128
+ <d:Name>Category 0002</d:Name>
129
+ </m:properties>
130
+ </content>
131
+ </entry>
132
+ <entry>
133
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(4)</id>
134
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
135
+ <link rel="edit" title="Category" href="Categories(4)" />
136
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(4)/Products">
137
+ <m:inline>
138
+ <feed>
139
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(4)/Products</id>
140
+ <title type="text">Products</title>
141
+ <updated>2013-07-22T14:54:47Z</updated>
142
+ <link rel="self" title="Products" href="Categories(4)/Products" />
143
+ <entry>
144
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(4)</id>
145
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
146
+ <link rel="edit" title="Product" href="Products(4)" />
147
+ <title />
148
+ <updated>2013-07-22T14:54:47Z</updated>
149
+ <author>
150
+ <name />
151
+ </author>
152
+ <content type="application/xml">
153
+ <m:properties>
154
+ <d:Name>Widget 0004</d:Name>
155
+ </m:properties>
156
+ </content>
157
+ </entry>
158
+ </feed>
159
+ </m:inline>
160
+ </link>
161
+ <title />
162
+ <updated>2013-07-22T14:54:47Z</updated>
163
+ <author>
164
+ <name />
165
+ </author>
166
+ <content type="application/xml">
167
+ <m:properties>
168
+ <d:Name>Category 0002</d:Name>
169
+ </m:properties>
170
+ </content>
171
+ </entry>
172
+ <entry>
173
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(5)</id>
174
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
175
+ <link rel="edit" title="Category" href="Categories(5)" />
176
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(5)/Products">
177
+ <m:inline>
178
+ <feed>
179
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(5)/Products</id>
180
+ <title type="text">Products</title>
181
+ <updated>2013-07-22T14:54:47Z</updated>
182
+ <link rel="self" title="Products" href="Categories(5)/Products" />
183
+ <entry>
184
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(5)</id>
185
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
186
+ <link rel="edit" title="Product" href="Products(5)" />
187
+ <title />
188
+ <updated>2013-07-22T14:54:47Z</updated>
189
+ <author>
190
+ <name />
191
+ </author>
192
+ <content type="application/xml">
193
+ <m:properties>
194
+ <d:Name>Widget 0005</d:Name>
195
+ </m:properties>
196
+ </content>
197
+ </entry>
198
+ </feed>
199
+ </m:inline>
200
+ </link>
201
+ <title />
202
+ <updated>2013-07-22T14:54:47Z</updated>
203
+ <author>
204
+ <name />
205
+ </author>
206
+ <content type="application/xml">
207
+ <m:properties>
208
+ <d:Name>Category 0002</d:Name>
209
+ </m:properties>
210
+ </content>
211
+ </entry>
212
+ <entry>
213
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(6)</id>
214
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
215
+ <link rel="edit" title="Category" href="Categories(6)" />
216
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(6)/Products">
217
+ <m:inline>
218
+ <feed>
219
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(6)/Products</id>
220
+ <title type="text">Products</title>
221
+ <updated>2013-07-22T14:54:47Z</updated>
222
+ <link rel="self" title="Products" href="Categories(6)/Products" />
223
+ <author>
224
+ <name />
225
+ </author>
226
+ </feed>
227
+ </m:inline>
228
+ </link>
229
+ <title />
230
+ <updated>2013-07-22T14:54:47Z</updated>
231
+ <author>
232
+ <name />
233
+ </author>
234
+ <content type="application/xml">
235
+ <m:properties>
236
+ <d:Name>Category 0001</d:Name>
237
+ </m:properties>
238
+ </content>
239
+ </entry>
240
+ <entry>
241
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(7)</id>
242
+ <category term="RubyODataService.Category" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
243
+ <link rel="edit" title="Category" href="Categories(7)" />
244
+ <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Products" type="application/atom+xml;type=feed" title="Products" href="Categories(7)/Products">
245
+ <m:inline>
246
+ <feed>
247
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Categories(7)/Products</id>
248
+ <title type="text">Products</title>
249
+ <updated>2013-07-22T14:54:47Z</updated>
250
+ <link rel="self" title="Products" href="Categories(7)/Products" />
251
+ <author>
252
+ <name />
253
+ </author>
254
+ </feed>
255
+ </m:inline>
256
+ </link>
257
+ <title />
258
+ <updated>2013-07-22T14:54:47Z</updated>
259
+ <author>
260
+ <name />
261
+ </author>
262
+ <content type="application/xml">
263
+ <m:properties>
264
+ <d:Name>Category 0002</d:Name>
265
+ </m:properties>
266
+ </content>
267
+ </entry>
268
+ </feed>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2
+ <error
3
+ xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
4
+ <code></code>
5
+ <message xml:lang="en-US">Type 'RubyODataService.Category' does not have a property named 'Price' or there is no type with 'Price' name.</message>
6
+ </error>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2
+ <error
3
+ xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
4
+ <code></code>
5
+ <message xml:lang="en-US">Only properties specified in $expand can be traversed in $select query options. Property .</message>
6
+ </error>
@@ -0,0 +1,92 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xml:base="http://win7dev:8989/SampleService/RubyOData.svc/"
3
+ xmlns="http://www.w3.org/2005/Atom"
4
+ xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
5
+ xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
6
+ xmlns:georss="http://www.georss.org/georss"
7
+ xmlns:gml="http://www.opengis.net/gml">
8
+ <id>http://win7dev:8989/SampleService/RubyOdata.svc/Products</id>
9
+ <title type="text">Products</title>
10
+ <updated>2013-07-19T12:29:11Z</updated>
11
+ <link rel="self" title="Products" href="Products" />
12
+ <entry>
13
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(1)</id>
14
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
15
+ <link rel="edit" title="Product" href="Products(1)" />
16
+ <title />
17
+ <updated>2013-07-19T12:29:11Z</updated>
18
+ <author>
19
+ <name />
20
+ </author>
21
+ <content type="application/xml">
22
+ <m:properties>
23
+ <d:Name>Widget 0001</d:Name>
24
+ <d:Price m:type="Edm.Decimal">75.50</d:Price>
25
+ </m:properties>
26
+ </content>
27
+ </entry>
28
+ <entry>
29
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(2)</id>
30
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
31
+ <link rel="edit" title="Product" href="Products(2)" />
32
+ <title />
33
+ <updated>2013-07-19T12:29:11Z</updated>
34
+ <author>
35
+ <name />
36
+ </author>
37
+ <content type="application/xml">
38
+ <m:properties>
39
+ <d:Name>Widget 0002</d:Name>
40
+ <d:Price m:type="Edm.Decimal">100.00</d:Price>
41
+ </m:properties>
42
+ </content>
43
+ </entry>
44
+ <entry>
45
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(3)</id>
46
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
47
+ <link rel="edit" title="Product" href="Products(3)" />
48
+ <title />
49
+ <updated>2013-07-19T12:29:11Z</updated>
50
+ <author>
51
+ <name />
52
+ </author>
53
+ <content type="application/xml">
54
+ <m:properties>
55
+ <d:Name>Widget 0003</d:Name>
56
+ <d:Price m:type="Edm.Decimal">10.25</d:Price>
57
+ </m:properties>
58
+ </content>
59
+ </entry>
60
+ <entry>
61
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(4)</id>
62
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
63
+ <link rel="edit" title="Product" href="Products(4)" />
64
+ <title />
65
+ <updated>2013-07-19T12:29:11Z</updated>
66
+ <author>
67
+ <name />
68
+ </author>
69
+ <content type="application/xml">
70
+ <m:properties>
71
+ <d:Name>Widget 0004</d:Name>
72
+ <d:Price m:type="Edm.Decimal">100.00</d:Price>
73
+ </m:properties>
74
+ </content>
75
+ </entry>
76
+ <entry>
77
+ <id>http://win7dev:8989/SampleService/RubyOData.svc/Products(5)</id>
78
+ <category term="RubyODataService.Product" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
79
+ <link rel="edit" title="Product" href="Products(5)" />
80
+ <title />
81
+ <updated>2013-07-19T12:29:11Z</updated>
82
+ <author>
83
+ <name />
84
+ </author>
85
+ <content type="application/xml">
86
+ <m:properties>
87
+ <d:Name>Widget 0005</d:Name>
88
+ <d:Price m:type="Edm.Decimal">75.50</d:Price>
89
+ </m:properties>
90
+ </content>
91
+ </entry>
92
+ </feed>
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module OData
4
4
  describe PropertyMetadata do
5
5
  describe "#initialize" do
6
- it "parses an EDMX property with the essentials (name, type, nullable, nav_prop)" do
6
+ it "parses an EDMX property with the essentials (name, type, nullable, nav_prop)" do
7
7
  property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="false" />')
8
8
  property_metadata = PropertyMetadata.new property_element
9
9
  property_metadata.name.should eq "Id"
@@ -15,30 +15,30 @@ module OData
15
15
  property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="true" />')
16
16
  property_metadata = PropertyMetadata.new property_element
17
17
  property_metadata.nullable.should eq true
18
- end
19
- it "parses an EDMX property with nil for missing attributes" do
18
+ end
19
+ it "parses an EDMX property with nil for missing attributes" do
20
20
  property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" Nullable="false" />')
21
21
  property_metadata = PropertyMetadata.new property_element
22
22
  property_metadata.fc_target_path.should be_nil
23
23
  property_metadata.fc_keep_in_content.should be_nil
24
24
  end
25
- it "parses an EDMX property with false for missing Nullable attribute" do
25
+ it "parses an EDMX property with false for missing Nullable attribute" do
26
26
  property_element = RSpecSupport::ElementHelpers.string_to_element('<Property Name="Id" Type="Edm.String" />')
27
27
  property_metadata = PropertyMetadata.new property_element
28
28
  property_metadata.nullable.should eq false
29
- end
30
- it "parses an EDMX property with the fc_target_path and fc_keep_in_content attribute" do
31
- 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" />')
29
+ end
30
+ it "parses an EDMX property with the fc_target_path and fc_keep_in_content attribute" do
31
+ property_element = RSpecSupport::ElementHelpers.string_to_element('<Property xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" Name="Title" Type="Edm.String" Nullable="true" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="false" />')
32
32
  property_metadata = PropertyMetadata.new property_element
33
33
  property_metadata.fc_target_path.should eq "SyndicationTitle"
34
34
  property_metadata.fc_keep_in_content.should eq false
35
35
  end
36
- it "parses an EDMX property where fc_keep_in_content is true" do
37
- 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" />')
36
+ it "parses an EDMX property where fc_keep_in_content is true" do
37
+ property_element = RSpecSupport::ElementHelpers.string_to_element('<Property xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" Name="Title" Type="Edm.String" Nullable="true" m:FC_TargetPath="SyndicationTitle" m:FC_ContentKind="text" m:FC_KeepInContent="true" />')
38
38
  property_metadata = PropertyMetadata.new property_element
39
39
  property_metadata.fc_keep_in_content.should eq true
40
40
  end
41
- it "parses an EDMX navigation property with the name and the nav_prop set to true" do
41
+ it "parses an EDMX navigation property with the name and the nav_prop set to true" do
42
42
  property_element = RSpecSupport::ElementHelpers.string_to_element('<NavigationProperty Name="Category" Relationship="Model.CategoryProduct" FromRole="Product" ToRole="Category" />')
43
43
  property_metadata = PropertyMetadata.new property_element
44
44
  property_metadata.name.should eq "Category"
@@ -1,34 +1,173 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  module OData
4
4
  describe QueryBuilder do
5
5
  describe "#initialize" do
6
- it "handles additional parameters" do
7
- builder = QueryBuilder.new 'Products', { :x=>1, :y=>2 }
6
+ it "handles additional parameters" do
7
+ builder = QueryBuilder.new "Products", { :x=>1, :y=>2 }
8
8
  builder.query.should eq "Products?x=1&y=2"
9
9
  end
10
- it "handles empty additional parameters" do
11
- builder = QueryBuilder.new 'Products'
10
+ it "handles empty additional parameters" do
11
+ builder = QueryBuilder.new "Products"
12
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 }
13
+ end
14
+ it "should append additional parameters to the end of the query" do
15
+ builder = QueryBuilder.new "Products", { :x=>1, :y=>2 }
18
16
  builder.top(10)
19
17
  builder.query.should eq "Products?$top=10&x=1&y=2"
20
18
  end
19
+ end
20
+
21
+ describe "#links" do
21
22
  it "should properly handle queries for links" do
22
- builder = QueryBuilder.new 'Categories(1)'
23
- builder.links('Products')
23
+ builder = QueryBuilder.new "Categories(1)"
24
+ builder.links("Products")
24
25
  builder.query.should eq "Categories(1)/$links/Products"
25
26
  end
26
27
  it "should properly handle queries for links with additional operations" do
27
- builder = QueryBuilder.new 'Categories(1)'
28
- builder.links('Products')
28
+ builder = QueryBuilder.new "Categories(1)"
29
+ builder.links("Products")
29
30
  builder.top(5)
30
31
  builder.query.should eq "Categories(1)/$links/Products?$top=5"
31
32
  end
33
+ it "should throw an exception if count was already called on the builder" do
34
+ builder = QueryBuilder.new "Categories(1)"
35
+ builder.count
36
+ lambda { builder.links("Products") }.should raise_error(OData::NotSupportedError, "You cannot call both the `links` method and the `count` method in the same query.")
37
+ end
38
+ it "should throw an exception if select was already called on the builder" do
39
+ builder = QueryBuilder.new "Products"
40
+ builder.select "Price"
41
+ lambda { builder.links("Products") }.should raise_error(OData::NotSupportedError, "You cannot call both the `links` method and the `select` method in the same query.")
42
+ end
43
+ end
44
+
45
+ describe "#count" do
46
+ it "should accept the count method" do
47
+ builder = QueryBuilder.new "Products"
48
+ lambda { builder.count }.should_not raise_error
49
+ end
50
+ it "should properly handle the count method" do
51
+ builder = QueryBuilder.new "Products"
52
+ builder.count
53
+ builder.query.should eq "Products/$count"
54
+ end
55
+ it "should properly handle the count method with additional operators" do
56
+ builder = QueryBuilder.new "Products"
57
+ builder.filter("Name eq 'Widget 1'")
58
+ builder.count
59
+ builder.query.should eq "Products/$count?$filter=Name+eq+%27Widget+1%27"
60
+ end
61
+ it "should throw an exception if links was already called on the builder" do
62
+ builder = QueryBuilder.new "Categories(1)"
63
+ builder.links("Products")
64
+ lambda { builder.count }.should raise_error(OData::NotSupportedError, "You cannot call both the `links` method and the `count` method in the same query.")
65
+ end
66
+ it "should throw an exception if select was already called on the builder" do
67
+ builder = QueryBuilder.new "Products"
68
+ builder.select("Price")
69
+ lambda { builder.count }.should raise_error(OData::NotSupportedError, "You cannot call both the `select` method and the `count` method in the same query.")
70
+ end
71
+ end
72
+
73
+ describe "#select" do
74
+ it "should accept the select method" do
75
+ builder = QueryBuilder.new "Products"
76
+ lambda { builder.select }.should_not raise_error
77
+ end
78
+ it "should properly handle the select method" do
79
+ builder = QueryBuilder.new "Products"
80
+ builder.select "Price", "Rating"
81
+ builder.query.should eq "Products?$select=Price,Rating"
82
+ end
83
+ it "shouldn't add duplicate properties" do
84
+ builder = QueryBuilder.new "Products"
85
+ builder.select "Price", "Rating", "Price"
86
+ builder.query.should eq "Products?$select=Price,Rating"
87
+ end
88
+ it "should properly handle the select method with additional operators" do
89
+ builder = QueryBuilder.new "Products"
90
+ builder.filter("Name eq 'Widget 1'")
91
+ builder.select("Price", "Rating")
92
+ builder.query.should eq "Products?$select=Price,Rating&$filter=Name+eq+%27Widget+1%27"
93
+ end
94
+ it "should throw an exception if links was already called on the builder" do
95
+ builder = QueryBuilder.new "Categories(1)"
96
+ builder.links("Products")
97
+ lambda { builder.select("Price") }.should raise_error(OData::NotSupportedError, "You cannot call both the `links` method and the `select` method in the same query.")
98
+ end
99
+ it "should throw an exception if count was already called on the builder" do
100
+ builder = QueryBuilder.new "Products"
101
+ builder.count
102
+ lambda { builder.select("Price") }.should raise_error(OData::NotSupportedError, "You cannot call both the `count` method and the `select` method in the same query.")
103
+ end
104
+ it "should return itself" do
105
+ builder = QueryBuilder.new "Products"
106
+ result = builder.select("Price", "Rating")
107
+ result.should be_a(QueryBuilder)
108
+ end
109
+ it "should automatically add $expand for nested selects" do
110
+ builder = QueryBuilder.new "Categories"
111
+ result = builder.select "Name", "Products/Name"
112
+ result.query.should eq "Categories?$select=Name,Products/Name&$expand=Products"
113
+ end
114
+ it "should automatically add $expand for deeply nested selects" do
115
+ builder = QueryBuilder.new "Products"
116
+ result = builder.select "ProductName", "Order_Details/OrderID", "Order_Details/Order/Customer/CompanyName"
117
+ result.query.should eq "Products?$select=ProductName,Order_Details/OrderID,Order_Details/Order/Customer/CompanyName&$expand=Order_Details,Order_Details/Order/Customer"
118
+ end
119
+ end
120
+
121
+ describe "#navigate" do
122
+ it "should allow a user to drill down into a navigaion property on an initial query" do
123
+ builder = QueryBuilder.new "Genres('Horror Movies')"
124
+ builder.navigate("Titles")
125
+ builder.filter("Name eq 'Halloween'")
126
+ builder.query.should eq "Genres('Horror%20Movies')/Titles?$filter=Name+eq+%27Halloween%27"
127
+ end
128
+ it "should allow for multiple levels of drill down" do
129
+ builder = QueryBuilder.new "Genres('Horror Movies')"
130
+ builder.navigate("Titles('6aBu')")
131
+ builder.navigate("Awards")
132
+ builder.filter("Type eq 'Afi'")
133
+ builder.query.should eq "Genres('Horror%20Movies')/Titles('6aBu')/Awards?$filter=Type+eq+%27Afi%27"
134
+ end
135
+ it "should allow for a drill down plus links" do
136
+ builder = QueryBuilder.new "Genres('Horror Movies')"
137
+ builder.navigate("Titles('6aBu')")
138
+ builder.links("Awards")
139
+ builder.query.should eq "Genres('Horror%20Movies')/Titles('6aBu')/$links/Awards"
140
+ end
141
+ it "should allow for a drill down plus count" do
142
+ builder = QueryBuilder.new "Genres('Horror Movies')"
143
+ builder.navigate("Titles")
144
+ builder.count
145
+ builder.query.should eq "Genres('Horror%20Movies')/Titles/$count"
146
+ end
147
+ end
148
+
149
+ describe "additional_parameters" do
150
+ it "should be able to be added at any time" do
151
+ builder = QueryBuilder.new "PollingLocations"
152
+ builder.filter("Address/Zip eq 45693")
153
+ builder.expand("Election")
154
+ builder.additional_params[:foo] = "bar"
155
+ builder.query.should eq "PollingLocations?$expand=Election&$filter=Address%2FZip+eq+45693&foo=bar"
156
+ end
157
+
158
+ it "should not overwrite what is already there" do
159
+ builder = QueryBuilder.new "Products", { :x=>1, :y=>2 }
160
+ builder.top(10)
161
+ builder.additional_params[:foo] = "bar"
162
+ builder.query.should eq "Products?$top=10&foo=bar&x=1&y=2"
163
+ end
164
+ end
165
+
166
+ describe "#query" do
167
+ it "should encode spaces in IDs" do
168
+ builder = QueryBuilder.new "Categories('Cool Stuff')"
169
+ builder.query.should eq "Categories('Cool%20Stuff')"
170
+ end
32
171
  end
33
172
  end
34
173
  end