azure-plus 0.6.5

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 (298) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +11 -0
  4. data/ChangeLog.txt +40 -0
  5. data/Gemfile +16 -0
  6. data/README.md +590 -0
  7. data/Rakefile +129 -0
  8. data/azure.gemspec +47 -0
  9. data/lib/azure.rb +52 -0
  10. data/lib/azure/base_management/affinity_group.rb +32 -0
  11. data/lib/azure/base_management/base_management_service.rb +238 -0
  12. data/lib/azure/base_management/location.rb +27 -0
  13. data/lib/azure/base_management/management_http_request.rb +244 -0
  14. data/lib/azure/base_management/serialization.rb +129 -0
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -0
  16. data/lib/azure/blob/blob.rb +32 -0
  17. data/lib/azure/blob/blob_service.rb +1424 -0
  18. data/lib/azure/blob/block.rb +31 -0
  19. data/lib/azure/blob/container.rb +32 -0
  20. data/lib/azure/blob/serialization.rb +285 -0
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +361 -0
  23. data/lib/azure/cloud_service_management/configuration_set.rb +28 -0
  24. data/lib/azure/cloud_service_management/deployment.rb +64 -0
  25. data/lib/azure/cloud_service_management/input_endpoint.rb +29 -0
  26. data/lib/azure/cloud_service_management/instance_endpoint.rb +31 -0
  27. data/lib/azure/cloud_service_management/persistent_vm_downtime.rb +29 -0
  28. data/lib/azure/cloud_service_management/role.rb +30 -0
  29. data/lib/azure/cloud_service_management/role_instance.rb +40 -0
  30. data/lib/azure/cloud_service_management/serialization.rb +329 -0
  31. data/lib/azure/cloud_service_management/virtual_ip.rb +29 -0
  32. data/lib/azure/core.rb +39 -0
  33. data/lib/azure/core/auth/authorizer.rb +36 -0
  34. data/lib/azure/core/auth/shared_key.rb +110 -0
  35. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  36. data/lib/azure/core/auth/signer.rb +48 -0
  37. data/lib/azure/core/configuration.rb +211 -0
  38. data/lib/azure/core/error.rb +22 -0
  39. data/lib/azure/core/filtered_service.rb +44 -0
  40. data/lib/azure/core/http/debug_filter.rb +36 -0
  41. data/lib/azure/core/http/http_error.rb +88 -0
  42. data/lib/azure/core/http/http_filter.rb +53 -0
  43. data/lib/azure/core/http/http_request.rb +159 -0
  44. data/lib/azure/core/http/http_response.rb +140 -0
  45. data/lib/azure/core/http/retry_policy.rb +74 -0
  46. data/lib/azure/core/http/signer_filter.rb +34 -0
  47. data/lib/azure/core/service.rb +63 -0
  48. data/lib/azure/core/signed_service.rb +43 -0
  49. data/lib/azure/core/utility.rb +190 -0
  50. data/lib/azure/queue/message.rb +30 -0
  51. data/lib/azure/queue/queue.rb +29 -0
  52. data/lib/azure/queue/queue_service.rb +568 -0
  53. data/lib/azure/queue/serialization.rb +106 -0
  54. data/lib/azure/service/access_policy.rb +26 -0
  55. data/lib/azure/service/enumeration_results.rb +21 -0
  56. data/lib/azure/service/logging.rb +32 -0
  57. data/lib/azure/service/metrics.rb +31 -0
  58. data/lib/azure/service/retention_policy.rb +25 -0
  59. data/lib/azure/service/serialization.rb +240 -0
  60. data/lib/azure/service/signed_identifier.rb +30 -0
  61. data/lib/azure/service/storage_service.rb +79 -0
  62. data/lib/azure/service/storage_service_properties.rb +32 -0
  63. data/lib/azure/service_bus/action.rb +21 -0
  64. data/lib/azure/service_bus/auth/wrap_service.rb +89 -0
  65. data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
  66. data/lib/azure/service_bus/brokered_message.rb +124 -0
  67. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  68. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  69. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  70. data/lib/azure/service_bus/false_filter.rb +38 -0
  71. data/lib/azure/service_bus/filter.rb +21 -0
  72. data/lib/azure/service_bus/interval.rb +104 -0
  73. data/lib/azure/service_bus/queue.rb +230 -0
  74. data/lib/azure/service_bus/resource.rb +109 -0
  75. data/lib/azure/service_bus/rule.rb +98 -0
  76. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  77. data/lib/azure/service_bus/serialization.rb +160 -0
  78. data/lib/azure/service_bus/service_bus_service.rb +829 -0
  79. data/lib/azure/service_bus/sql_filter.rb +50 -0
  80. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  81. data/lib/azure/service_bus/subscription.rb +184 -0
  82. data/lib/azure/service_bus/topic.rb +187 -0
  83. data/lib/azure/service_bus/true_filter.rb +38 -0
  84. data/lib/azure/sql_database_management/serialization.rb +111 -0
  85. data/lib/azure/sql_database_management/sql_database.rb +31 -0
  86. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -0
  87. data/lib/azure/storage_management/serialization.rb +184 -0
  88. data/lib/azure/storage_management/storage_account.rb +40 -0
  89. data/lib/azure/storage_management/storage_management_service.rb +166 -0
  90. data/lib/azure/table/auth/shared_key.rb +92 -0
  91. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  92. data/lib/azure/table/batch.rb +330 -0
  93. data/lib/azure/table/batch_response.rb +118 -0
  94. data/lib/azure/table/edmtype.rb +127 -0
  95. data/lib/azure/table/entity.rb +31 -0
  96. data/lib/azure/table/guid.rb +24 -0
  97. data/lib/azure/table/query.rb +112 -0
  98. data/lib/azure/table/serialization.rb +108 -0
  99. data/lib/azure/table/table_service.rb +560 -0
  100. data/lib/azure/version.rb +31 -0
  101. data/lib/azure/virtual_machine_image_management/serialization.rb +51 -0
  102. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  103. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  104. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -0
  105. data/lib/azure/virtual_machine_management/serialization.rb +436 -0
  106. data/lib/azure/virtual_machine_management/virtual_machine.rb +42 -0
  107. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +549 -0
  108. data/lib/azure/virtual_network_management/serialization.rb +186 -0
  109. data/lib/azure/virtual_network_management/virtual_network.rb +36 -0
  110. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -0
  111. data/test/fixtures/32px-fulls-black.jpg +0 -0
  112. data/test/fixtures/affinity_group.xml +33 -0
  113. data/test/fixtures/all_containers.xml +20 -0
  114. data/test/fixtures/all_tables.xml +22 -0
  115. data/test/fixtures/certificate.pem +21 -0
  116. data/test/fixtures/container_acl.xml +11 -0
  117. data/test/fixtures/create_sql_database_server.xml +2 -0
  118. data/test/fixtures/create_storage_desc_error.xml +5 -0
  119. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  120. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  121. data/test/fixtures/create_storage_full_error.xml +6 -0
  122. data/test/fixtures/create_storage_label_error.xml +5 -0
  123. data/test/fixtures/create_storage_location_error.xml +5 -0
  124. data/test/fixtures/create_storage_name_error.xml +6 -0
  125. data/test/fixtures/create_table_response_entry.xml +15 -0
  126. data/test/fixtures/delete_storage_container_error.xml +5 -0
  127. data/test/fixtures/delete_storage_error.xml +5 -0
  128. data/test/fixtures/deployment_error.xml +5 -0
  129. data/test/fixtures/empty_xml_file +0 -0
  130. data/test/fixtures/get_deployment.xml +94 -0
  131. data/test/fixtures/get_deployment_existing.xml +94 -0
  132. data/test/fixtures/get_deployment_missing.xml +5 -0
  133. data/test/fixtures/get_storage_account_error.xml +5 -0
  134. data/test/fixtures/get_storage_account_properties.xml +32 -0
  135. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  136. data/test/fixtures/http_error.xml +5 -0
  137. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  138. data/test/fixtures/list_affinity_groups.xml +22 -0
  139. data/test/fixtures/list_blobs.xml +121 -0
  140. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  141. data/test/fixtures/list_blocks_all.xml +23 -0
  142. data/test/fixtures/list_blocks_committed.xml +13 -0
  143. data/test/fixtures/list_cloud_services.xml +39 -0
  144. data/test/fixtures/list_containers.xml +38 -0
  145. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  146. data/test/fixtures/list_images.xml +110 -0
  147. data/test/fixtures/list_locations.xml +62 -0
  148. data/test/fixtures/list_page_ranges.xml +11 -0
  149. data/test/fixtures/list_sql_database.xml +36 -0
  150. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  151. data/test/fixtures/list_storage_account_single.xml +25 -0
  152. data/test/fixtures/list_storage_accounts.xml +46 -0
  153. data/test/fixtures/list_virtual_networks.xml +92 -0
  154. data/test/fixtures/logging.xml +11 -0
  155. data/test/fixtures/management_certificate.pem +55 -0
  156. data/test/fixtures/messages.xml +12 -0
  157. data/test/fixtures/metrics.xml +10 -0
  158. data/test/fixtures/privatekey.key +28 -0
  159. data/test/fixtures/query_entities_empty_response.xml +7 -0
  160. data/test/fixtures/query_entities_response.xml +45 -0
  161. data/test/fixtures/queue_service_properties.xml +22 -0
  162. data/test/fixtures/queue_service_properties_original.xml +19 -0
  163. data/test/fixtures/queues.xml +16 -0
  164. data/test/fixtures/retention_policy.xml +5 -0
  165. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  166. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  167. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  168. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  169. data/test/fixtures/storage_service_properties.xml +23 -0
  170. data/test/fixtures/update_storage_account.xml +16 -0
  171. data/test/fixtures/update_storage_error.xml +5 -0
  172. data/test/fixtures/updated_storage_accounts.xml +53 -0
  173. data/test/fixtures/virtual_machine.xml +113 -0
  174. data/test/fixtures/windows_virtual_machine.xml +106 -0
  175. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  176. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -0
  177. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  178. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  179. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -0
  180. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  181. data/test/integration/blob/blob_metadata_test.rb +75 -0
  182. data/test/integration/blob/blob_pages_test.rb +119 -0
  183. data/test/integration/blob/blob_properties_test.rb +77 -0
  184. data/test/integration/blob/block_blob_test.rb +254 -0
  185. data/test/integration/blob/container/container_acl_test.rb +69 -0
  186. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  187. data/test/integration/blob/container/create_container_test.rb +60 -0
  188. data/test/integration/blob/container/delete_container_test.rb +39 -0
  189. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  190. data/test/integration/blob/container/list_containers_test.rb +79 -0
  191. data/test/integration/blob/container/root_container_test.rb +54 -0
  192. data/test/integration/blob/copy_blob_test.rb +113 -0
  193. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  194. data/test/integration/blob/create_page_blob_test.rb +83 -0
  195. data/test/integration/blob/delete_blob_test.rb +159 -0
  196. data/test/integration/blob/get_blob_test.rb +65 -0
  197. data/test/integration/blob/informative_errors_test.rb +39 -0
  198. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  199. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  200. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  201. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  202. data/test/integration/blob/list_blobs_test.rb +113 -0
  203. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
  204. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
  205. data/test/integration/database/create_sql_server_firewall_test.rb +86 -0
  206. data/test/integration/database/create_sql_server_test.rb +53 -0
  207. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -0
  208. data/test/integration/database/delete_sql_server_test.rb +58 -0
  209. data/test/integration/database/list_sql_server_firewall_test.rb +45 -0
  210. data/test/integration/database/list_sql_servers_test.rb +44 -0
  211. data/test/integration/database/reset_password_sql_server_test.rb +55 -0
  212. data/test/integration/location/Location_List_test.rb +39 -0
  213. data/test/integration/queue/clear_messages_test.rb +42 -0
  214. data/test/integration/queue/create_message_test.rb +75 -0
  215. data/test/integration/queue/create_queue_test.rb +50 -0
  216. data/test/integration/queue/delete_message_test.rb +67 -0
  217. data/test/integration/queue/delete_queue_test.rb +45 -0
  218. data/test/integration/queue/informative_errors_test.rb +42 -0
  219. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  220. data/test/integration/queue/list_messages_test.rb +79 -0
  221. data/test/integration/queue/list_queues_test.rb +44 -0
  222. data/test/integration/queue/peek_messages_test.rb +59 -0
  223. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  224. data/test/integration/queue/queue_metadata_test.rb +40 -0
  225. data/test/integration/queue/update_message_test.rb +74 -0
  226. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  227. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  228. data/test/integration/service_bus/queues_test.rb +266 -0
  229. data/test/integration/service_bus/rules_test.rb +145 -0
  230. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  231. data/test/integration/service_bus/scenario_test.rb +101 -0
  232. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  233. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  234. data/test/integration/service_bus/topics_test.rb +129 -0
  235. data/test/integration/storage_management/storage_management_test.rb +160 -0
  236. data/test/integration/table/create_table_test.rb +36 -0
  237. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  238. data/test/integration/table/delete_entity_test.rb +94 -0
  239. data/test/integration/table/delete_table_test.rb +40 -0
  240. data/test/integration/table/get_table_test.rb +37 -0
  241. data/test/integration/table/informative_errors_test.rb +39 -0
  242. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  243. data/test/integration/table/insert_entity_test.rb +88 -0
  244. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  245. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  246. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  247. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  248. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  249. data/test/integration/table/merge_entity_test.rb +113 -0
  250. data/test/integration/table/query_entities_test.rb +195 -0
  251. data/test/integration/table/query_tables_test.rb +43 -0
  252. data/test/integration/table/query_test.rb +251 -0
  253. data/test/integration/table/table_acl_test.rb +52 -0
  254. data/test/integration/table/table_gb18030_test.rb +355 -0
  255. data/test/integration/table/update_entity_batch_test.rb +149 -0
  256. data/test/integration/table/update_entity_test.rb +131 -0
  257. data/test/integration/test_helper.rb +42 -0
  258. data/test/integration/vm/VM_Create_test.rb +260 -0
  259. data/test/integration/vm/VM_Delete_test.rb +55 -0
  260. data/test/integration/vm/VM_Operations_test.rb +173 -0
  261. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  262. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  263. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -0
  264. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -0
  265. data/test/support/env.rb +19 -0
  266. data/test/support/fixtures.rb +36 -0
  267. data/test/support/name_generator.rb +160 -0
  268. data/test/support/stubs.rb +42 -0
  269. data/test/support/virtual_machine_name_generator.rb +102 -0
  270. data/test/support/virtual_network_helper.rb +73 -0
  271. data/test/test_helper.rb +53 -0
  272. data/test/unit/affinity_group/affinity_group_test.rb +192 -0
  273. data/test/unit/affinity_group/serialization_test.rb +88 -0
  274. data/test/unit/base_management/location_test.rb +57 -0
  275. data/test/unit/blob/blob_service_test.rb +1947 -0
  276. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +276 -0
  277. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  278. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  279. data/test/unit/core/auth/shared_key_test.rb +58 -0
  280. data/test/unit/core/auth/signer_test.rb +30 -0
  281. data/test/unit/core/http/http_error_test.rb +57 -0
  282. data/test/unit/core/http/http_request_test.rb +66 -0
  283. data/test/unit/core/http/http_response_test.rb +45 -0
  284. data/test/unit/core/http/retry_policy_test.rb +23 -0
  285. data/test/unit/database/serialization_test.rb +97 -0
  286. data/test/unit/database/sql_database_server_service_test.rb +288 -0
  287. data/test/unit/service/serialization_test.rb +502 -0
  288. data/test/unit/service/storage_service_test.rb +291 -0
  289. data/test/unit/storage_management/serialization_test.rb +232 -0
  290. data/test/unit/storage_management/storage_management_service_test.rb +261 -0
  291. data/test/unit/table/edmtype_test.rb +108 -0
  292. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -0
  293. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -0
  294. data/test/unit/virtual_machine_management/serialization_test.rb +247 -0
  295. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -0
  296. data/test/unit/vnet/serialization_test.rb +187 -0
  297. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  298. metadata +470 -0
@@ -0,0 +1,195 @@
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "integration/test_helper"
16
+ require "azure/table/table_service"
17
+ require "azure/core/http/http_error"
18
+
19
+ describe Azure::Table::TableService do
20
+ describe "#query_entities" do
21
+ subject { Azure::Table::TableService.new }
22
+ let(:table_name){ TableNameHelper.name }
23
+ let(:entities_per_partition){3}
24
+ let(:partitions){ ["part1", "part2", "part3"]}
25
+ let(:entities){
26
+ entities = {}
27
+ index = 0
28
+ partitions.each { |p|
29
+ entities[p] = []
30
+ (0..entities_per_partition).each { |i|
31
+ entities[p].push "entity-#{index}"
32
+ index+=1
33
+ }
34
+ }
35
+ entities
36
+ }
37
+ let(:entity_properties){
38
+ {
39
+ "CustomStringProperty" => "CustomPropertyValue",
40
+ "CustomIntegerProperty" => 37,
41
+ "CustomBooleanProperty" => true,
42
+ "CustomDateProperty" => Time.now
43
+ }
44
+ }
45
+ before {
46
+ subject.create_table table_name
47
+ partitions.each { |p|
48
+ entities[p].each { |e|
49
+ entity = entity_properties.dup
50
+ entity[:PartitionKey] = p
51
+ entity[:RowKey] = e
52
+ subject.insert_entity table_name, entity
53
+ }
54
+ }
55
+ }
56
+
57
+ after { TableNameHelper.clean }
58
+
59
+ it "Queries a table for list of entities" do
60
+ result = subject.query_entities table_name
61
+ result.must_be_kind_of Array
62
+ result.length.must_equal ((partitions.length + 1) * entities_per_partition)
63
+
64
+ result.each { |e|
65
+ entities[e.properties["PartitionKey"]].must_include e.properties["RowKey"]
66
+ entity_properties.each { |k,v|
67
+ unless v.class == Time
68
+ e.properties[k].must_equal v
69
+ else
70
+ e.properties[k].to_i.must_equal v.to_i
71
+ end
72
+ }
73
+ }
74
+ end
75
+
76
+ it "can constrain by partition and row key, returning zero or one entity" do
77
+ partition = partitions[0]
78
+ row_key = entities[partition][0]
79
+
80
+ result = subject.query_entities table_name, { :partition_key => partition, :row_key => row_key }
81
+ result.must_be_kind_of Array
82
+ result.length.must_equal 1
83
+
84
+ result.each { |e|
85
+ e.properties["RowKey"].must_equal row_key
86
+ entity_properties.each { |k,v|
87
+ unless v.class == Time
88
+ e.properties[k].must_equal v
89
+ else
90
+ e.properties[k].to_i.must_equal v.to_i
91
+ end
92
+ }
93
+ }
94
+ end
95
+
96
+ it "can project a subset of properties, populating sparse properties with nil" do
97
+ projection = ["CustomIntegerProperty", "ThisPropertyDoesNotExist"]
98
+ result = subject.query_entities table_name, { :select => projection }
99
+ result.must_be_kind_of Array
100
+ result.length.must_equal ((partitions.length + 1) * entities_per_partition)
101
+
102
+ result.each { |e|
103
+ e.properties.length.must_equal projection.length
104
+ e.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
105
+ e.properties.must_include "ThisPropertyDoesNotExist"
106
+ e.properties["ThisPropertyDoesNotExist"].must_equal ""
107
+ }
108
+ end
109
+
110
+ it "can filter by one or more properties, returning a matching set of entities" do
111
+ subject.insert_entity table_name, entity_properties.merge({
112
+ "PartitionKey" => "filter-test-partition",
113
+ "RowKey" => "filter-test-key",
114
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
115
+ "CustomBooleanProperty"=> false
116
+ })
117
+
118
+ filter = "CustomIntegerProperty gt #{entity_properties["CustomIntegerProperty"]} and CustomBooleanProperty eq false"
119
+ result = subject.query_entities table_name, { :filter => filter }
120
+ result.must_be_kind_of Array
121
+ result.length.must_equal 1
122
+ result.first.properties["PartitionKey"].must_equal "filter-test-partition"
123
+
124
+ filter = "CustomIntegerProperty gt #{entity_properties["CustomIntegerProperty"]} and CustomBooleanProperty eq true"
125
+ result = subject.query_entities table_name, { :filter => filter }
126
+ result.must_be_kind_of Array
127
+ result.length.must_equal 0
128
+ end
129
+
130
+ it "can limit the result set using the top parameter" do
131
+ result = subject.query_entities table_name, { :top => 3 }
132
+ result.must_be_kind_of Array
133
+ result.length.must_equal 3
134
+ result.continuation_token.wont_be_nil
135
+ end
136
+
137
+ it "can page results using the top parameter and continuation_token" do
138
+ result = subject.query_entities table_name, { :top => 3 }
139
+ result.must_be_kind_of Array
140
+ result.length.must_equal 3
141
+ result.continuation_token.wont_be_nil
142
+
143
+ result2 = subject.query_entities table_name, { :top => 3, :continuation_token => result.continuation_token }
144
+ result2.must_be_kind_of Array
145
+ result2.length.must_equal 3
146
+ result2.continuation_token.wont_be_nil
147
+
148
+ result3 = subject.query_entities table_name, { :top => 3, :continuation_token => result2.continuation_token }
149
+ result3.must_be_kind_of Array
150
+ result3.length.must_equal 3
151
+ result3.continuation_token.wont_be_nil
152
+
153
+ result4 = subject.query_entities table_name, { :top => 3, :continuation_token => result3.continuation_token }
154
+ result4.must_be_kind_of Array
155
+ result4.length.must_equal 3
156
+ result4.continuation_token.must_be_nil
157
+ end
158
+
159
+ it "can combine projection, filtering, and paging in the same query" do
160
+ subject.insert_entity table_name, entity_properties.merge({
161
+ "PartitionKey" => "filter-test-partition",
162
+ "RowKey" => "filter-test-key",
163
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
164
+ "CustomBooleanProperty"=> false
165
+ })
166
+
167
+ filter = "CustomIntegerProperty eq #{entity_properties["CustomIntegerProperty"]}"
168
+ projection = ["PartitionKey", "CustomIntegerProperty"]
169
+ result = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3 }
170
+ result.must_be_kind_of Array
171
+ result.length.must_equal 3
172
+ result.continuation_token.wont_be_nil
173
+
174
+ result.first.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
175
+ result.first.properties["PartitionKey"].wont_be_nil
176
+ result.first.properties.length.must_equal 2
177
+
178
+ result2 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result.continuation_token }
179
+ result2.must_be_kind_of Array
180
+ result2.length.must_equal 3
181
+ result2.continuation_token.wont_be_nil
182
+
183
+ result3 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result2.continuation_token }
184
+ result3.must_be_kind_of Array
185
+ result3.length.must_equal 3
186
+ result3.continuation_token.wont_be_nil
187
+
188
+ result4 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result3.continuation_token }
189
+ result4.must_be_kind_of Array
190
+ result4.length.must_equal 3
191
+ result4.continuation_token.must_be_nil
192
+ end
193
+
194
+ end
195
+ end
@@ -0,0 +1,43 @@
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "integration/test_helper"
16
+ require "azure/table/table_service"
17
+ require "azure/core/http/http_error"
18
+
19
+ describe Azure::Table::TableService do
20
+ describe "#query_tables" do
21
+ subject { Azure::Table::TableService.new }
22
+ let(:tables){ [TableNameHelper.name, TableNameHelper.name] }
23
+ before { tables.each { |t| subject.create_table t } }
24
+ after { TableNameHelper.clean }
25
+
26
+ it "gets a list of tables for the account" do
27
+ result = subject.query_tables
28
+ result.must_be_kind_of Array
29
+
30
+ tables.each { |t|
31
+ table = result.find {|c|
32
+ c[:properties]["TableName"] == t
33
+ }
34
+ table.wont_be_nil
35
+ updated = subject.get_table(t)
36
+ updated.wont_be_nil
37
+
38
+ # this is a weird, but sometimes it's off by a few seconds
39
+ assert ((table[:updated] - updated).abs < 30), "time stamps don't match"
40
+ }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,251 @@
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "integration/test_helper"
16
+ require "azure/table/table_service"
17
+ require "azure/table/query"
18
+ require "azure/core/http/http_error"
19
+
20
+ describe Azure::Table::TableService do
21
+ describe "#query_entities" do
22
+ subject { Azure::Table::TableService.new }
23
+ let(:table_name){ TableNameHelper.name }
24
+ let(:entities_per_partition){3}
25
+ let(:partitions){ ["part1", "part2", "part3"]}
26
+ let(:entities){
27
+ entities = {}
28
+ index = 0
29
+ partitions.each { |p|
30
+ entities[p] = []
31
+ (0..entities_per_partition).each { |i|
32
+ entities[p].push "entity-#{index}"
33
+ index+=1
34
+ }
35
+ }
36
+ entities
37
+ }
38
+ let(:entity_properties){
39
+ {
40
+ "CustomStringProperty" => "CustomPropertyValue",
41
+ "CustomIntegerProperty" => 37,
42
+ "CustomBooleanProperty" => true,
43
+ "CustomDateProperty" => Time.now
44
+ }
45
+ }
46
+ before {
47
+ subject.create_table table_name
48
+ partitions.each { |p|
49
+ entities[p].each { |e|
50
+ entity = entity_properties.dup
51
+ entity[:PartitionKey] = p
52
+ entity[:RowKey] = e
53
+ subject.insert_entity table_name, entity
54
+ }
55
+ }
56
+ }
57
+
58
+ after { TableNameHelper.clean }
59
+
60
+ it "Queries a table for list of entities" do
61
+ q = Azure::Table::Query.new.from table_name
62
+
63
+ result = q.execute
64
+ result.must_be_kind_of Array
65
+ result.length.must_equal ((partitions.length + 1) * entities_per_partition)
66
+
67
+ result.each { |e|
68
+ entities[e.properties["PartitionKey"]].must_include e.properties["RowKey"]
69
+ entity_properties.each { |k,v|
70
+ unless v.class == Time
71
+ e.properties[k].must_equal v
72
+ else
73
+ e.properties[k].to_i.must_equal v.to_i
74
+ end
75
+ }
76
+ }
77
+ end
78
+
79
+ it "can constrain by partition and row key, returning zero or one entity" do
80
+ partition = partitions[0]
81
+ row_key = entities[partition][0]
82
+
83
+ q = Azure::Table::Query.new
84
+ .from(table_name)
85
+ .partition(partition)
86
+ .row(row_key)
87
+
88
+ result = q.execute
89
+ result.must_be_kind_of Array
90
+ result.length.must_equal 1
91
+
92
+ result.each { |e|
93
+ e.properties["RowKey"].must_equal row_key
94
+ entity_properties.each { |k,v|
95
+ unless v.class == Time
96
+ e.properties[k].must_equal v
97
+ else
98
+ e.properties[k].to_i.must_equal v.to_i
99
+ end
100
+ }
101
+ }
102
+ end
103
+
104
+ it "can project a subset of properties, populating sparse properties with nil" do
105
+ projection = ['CustomIntegerProperty', 'ThisPropertyDoesNotExist']
106
+
107
+ q = Azure::Table::Query.new
108
+ .from(table_name)
109
+ .select(projection[0])
110
+ .select(projection[1])
111
+
112
+ result = q.execute
113
+ result.must_be_kind_of Array
114
+ result.length.must_equal ((partitions.length + 1) * entities_per_partition)
115
+
116
+ result.each { |e|
117
+ e.properties.length.must_equal projection.length
118
+ e.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
119
+ e.properties.must_include "ThisPropertyDoesNotExist"
120
+ e.properties["ThisPropertyDoesNotExist"].must_equal ""
121
+ }
122
+ end
123
+
124
+ it "can filter by one or more properties, returning a matching set of entities" do
125
+ subject.insert_entity table_name, entity_properties.merge({
126
+ "PartitionKey" => "filter-test-partition",
127
+ "RowKey" => "filter-test-key",
128
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
129
+ "CustomBooleanProperty"=> false
130
+ })
131
+
132
+ q = Azure::Table::Query.new
133
+ .from(table_name)
134
+ .where("CustomIntegerProperty gt #{entity_properties['CustomIntegerProperty']}")
135
+ .where("CustomBooleanProperty eq false")
136
+
137
+ result = q.execute
138
+ result.must_be_kind_of Array
139
+ result.length.must_equal 1
140
+ result.first.properties["PartitionKey"].must_equal "filter-test-partition"
141
+
142
+ q = Azure::Table::Query.new
143
+ .from(table_name)
144
+ .where("CustomIntegerProperty gt #{entity_properties['CustomIntegerProperty']}")
145
+ .where("CustomBooleanProperty eq true")
146
+ result = q.execute
147
+ result.must_be_kind_of Array
148
+ result.length.must_equal 0
149
+ end
150
+
151
+ it "can limit the result set using the top parameter" do
152
+ q = Azure::Table::Query.new
153
+ .from(table_name)
154
+ .top(3)
155
+
156
+ result = q.execute
157
+ result.must_be_kind_of Array
158
+ result.length.must_equal 3
159
+ result.continuation_token.wont_be_nil
160
+ end
161
+
162
+ it "can page results using the top parameter and continuation_token" do
163
+ q = Azure::Table::Query.new
164
+ .from(table_name)
165
+ .top(3)
166
+
167
+ result = q.execute
168
+ result.must_be_kind_of Array
169
+ result.length.must_equal 3
170
+ result.continuation_token.wont_be_nil
171
+
172
+ q = Azure::Table::Query.new
173
+ .from(table_name)
174
+ .top(3)
175
+ .next_row(result.continuation_token[:next_row_key])
176
+ .next_partition(result.continuation_token[:next_partition_key])
177
+
178
+ result2 = q.execute
179
+ result2.must_be_kind_of Array
180
+ result2.length.must_equal 3
181
+ result2.continuation_token.wont_be_nil
182
+
183
+ q = Azure::Table::Query.new
184
+ .from(table_name)
185
+ .top(3)
186
+ .next_row(result2.continuation_token[:next_row_key])
187
+ .next_partition(result2.continuation_token[:next_partition_key])
188
+
189
+ result3 = q.execute
190
+ result3.must_be_kind_of Array
191
+ result3.length.must_equal 3
192
+ result3.continuation_token.wont_be_nil
193
+
194
+ q = Azure::Table::Query.new
195
+ .from(table_name)
196
+ .top(3)
197
+ .next_row(result3.continuation_token[:next_row_key])
198
+ .next_partition(result3.continuation_token[:next_partition_key])
199
+
200
+ result4 = q.execute
201
+ result4.must_be_kind_of Array
202
+ result4.length.must_equal 3
203
+ result4.continuation_token.must_be_nil
204
+ end
205
+
206
+ it "can combine projection, filtering, and paging in the same query" do
207
+ subject.insert_entity table_name, entity_properties.merge({
208
+ "PartitionKey" => "filter-test-partition",
209
+ "RowKey" => "filter-test-key",
210
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
211
+ "CustomBooleanProperty"=> false
212
+ })
213
+
214
+
215
+ q = Azure::Table::Query.new
216
+ .from(table_name)
217
+ .select("PartitionKey")
218
+ .select("CustomIntegerProperty")
219
+ .where("CustomIntegerProperty eq #{entity_properties['CustomIntegerProperty']}")
220
+ .top(3)
221
+
222
+ result = q.execute
223
+ result.must_be_kind_of Array
224
+ result.length.must_equal 3
225
+ result.continuation_token.wont_be_nil
226
+
227
+ result.first.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
228
+ result.first.properties["PartitionKey"].wont_be_nil
229
+ result.first.properties.length.must_equal 2
230
+
231
+ q.next_row(result.continuation_token[:next_row_key]).next_partition(result.continuation_token[:next_partition_key])
232
+
233
+ result2 = q.execute
234
+ result2.must_be_kind_of Array
235
+ result2.length.must_equal 3
236
+ result2.continuation_token.wont_be_nil
237
+
238
+ q.next_row(result2.continuation_token[:next_row_key]).next_partition(result2.continuation_token[:next_partition_key])
239
+ result3 = q.execute
240
+ result3.must_be_kind_of Array
241
+ result3.length.must_equal 3
242
+ result3.continuation_token.wont_be_nil
243
+
244
+ q.next_row(result3.continuation_token[:next_row_key]).next_partition(result3.continuation_token[:next_partition_key])
245
+ result4 = q.execute
246
+ result4.must_be_kind_of Array
247
+ result4.length.must_equal 3
248
+ result4.continuation_token.must_be_nil
249
+ end
250
+ end
251
+ end