azure-fix 0.7.0.pre3

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 (311) hide show
  1. checksums.yaml +7 -0
  2. data/.env_sample +13 -0
  3. data/.gitignore +30 -0
  4. data/.travis.yml +13 -0
  5. data/ChangeLog.txt +56 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +702 -0
  9. data/Rakefile +121 -0
  10. data/azure.gemspec +51 -0
  11. data/bin/pfxer +35 -0
  12. data/lib/azure.rb +147 -0
  13. data/lib/azure/base_management/affinity_group.rb +32 -0
  14. data/lib/azure/base_management/base_management_service.rb +220 -0
  15. data/lib/azure/base_management/location.rb +27 -0
  16. data/lib/azure/base_management/management_http_request.rb +172 -0
  17. data/lib/azure/base_management/serialization.rb +135 -0
  18. data/lib/azure/base_management/sql_management_http_request.rb +35 -0
  19. data/lib/azure/blob/auth/shared_access_signature.rb +147 -0
  20. data/lib/azure/blob/blob.rb +32 -0
  21. data/lib/azure/blob/blob_service.rb +1452 -0
  22. data/lib/azure/blob/block.rb +31 -0
  23. data/lib/azure/blob/container.rb +32 -0
  24. data/lib/azure/blob/serialization.rb +285 -0
  25. data/lib/azure/client.rb +31 -0
  26. data/lib/azure/client_services.rb +98 -0
  27. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  28. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +135 -0
  29. data/lib/azure/cloud_service_management/serialization.rb +118 -0
  30. data/lib/azure/configurable.rb +290 -0
  31. data/lib/azure/core/auth/authorizer.rb +36 -0
  32. data/lib/azure/core/auth/shared_key.rb +118 -0
  33. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  34. data/lib/azure/core/auth/signer.rb +51 -0
  35. data/lib/azure/core/error.rb +21 -0
  36. data/lib/azure/core/filtered_service.rb +45 -0
  37. data/lib/azure/core/http/debug_filter.rb +36 -0
  38. data/lib/azure/core/http/http_error.rb +86 -0
  39. data/lib/azure/core/http/http_filter.rb +53 -0
  40. data/lib/azure/core/http/http_request.rb +173 -0
  41. data/lib/azure/core/http/http_response.rb +96 -0
  42. data/lib/azure/core/http/retry_policy.rb +74 -0
  43. data/lib/azure/core/http/signer_filter.rb +33 -0
  44. data/lib/azure/core/service.rb +46 -0
  45. data/lib/azure/core/signed_service.rb +45 -0
  46. data/lib/azure/core/utility.rb +244 -0
  47. data/lib/azure/default.rb +126 -0
  48. data/lib/azure/http_client.rb +85 -0
  49. data/lib/azure/queue/message.rb +30 -0
  50. data/lib/azure/queue/queue.rb +28 -0
  51. data/lib/azure/queue/queue_service.rb +570 -0
  52. data/lib/azure/queue/serialization.rb +105 -0
  53. data/lib/azure/service/access_policy.rb +26 -0
  54. data/lib/azure/service/cors.rb +11 -0
  55. data/lib/azure/service/cors_rule.rb +15 -0
  56. data/lib/azure/service/enumeration_results.rb +21 -0
  57. data/lib/azure/service/logging.rb +32 -0
  58. data/lib/azure/service/metrics.rb +31 -0
  59. data/lib/azure/service/retention_policy.rb +25 -0
  60. data/lib/azure/service/serialization.rb +299 -0
  61. data/lib/azure/service/signed_identifier.rb +30 -0
  62. data/lib/azure/service/storage_service.rb +86 -0
  63. data/lib/azure/service/storage_service_properties.rb +37 -0
  64. data/lib/azure/service_bus/action.rb +21 -0
  65. data/lib/azure/service_bus/auth/shared_access_signer.rb +44 -0
  66. data/lib/azure/service_bus/auth/wrap_service.rb +90 -0
  67. data/lib/azure/service_bus/auth/wrap_signer.rb +77 -0
  68. data/lib/azure/service_bus/brokered_message.rb +124 -0
  69. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  70. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  71. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  72. data/lib/azure/service_bus/false_filter.rb +38 -0
  73. data/lib/azure/service_bus/filter.rb +21 -0
  74. data/lib/azure/service_bus/interval.rb +104 -0
  75. data/lib/azure/service_bus/queue.rb +230 -0
  76. data/lib/azure/service_bus/relay.rb +88 -0
  77. data/lib/azure/service_bus/resource.rb +109 -0
  78. data/lib/azure/service_bus/rule.rb +98 -0
  79. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  80. data/lib/azure/service_bus/serialization.rb +161 -0
  81. data/lib/azure/service_bus/service_bus_service.rb +899 -0
  82. data/lib/azure/service_bus/sql_filter.rb +50 -0
  83. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  84. data/lib/azure/service_bus/subscription.rb +184 -0
  85. data/lib/azure/service_bus/topic.rb +187 -0
  86. data/lib/azure/service_bus/true_filter.rb +38 -0
  87. data/lib/azure/sql_database_management/errors.rb +11 -0
  88. data/lib/azure/sql_database_management/firewall_rule.rb +30 -0
  89. data/lib/azure/sql_database_management/serialization.rb +99 -0
  90. data/lib/azure/sql_database_management/sql_database_management_service.rb +211 -0
  91. data/lib/azure/sql_database_management/sql_server.rb +32 -0
  92. data/lib/azure/storage_management/serialization.rb +204 -0
  93. data/lib/azure/storage_management/storage_account.rb +48 -0
  94. data/lib/azure/storage_management/storage_management_service.rb +207 -0
  95. data/lib/azure/table/auth/shared_key.rb +59 -0
  96. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  97. data/lib/azure/table/batch.rb +330 -0
  98. data/lib/azure/table/batch_response.rb +118 -0
  99. data/lib/azure/table/edmtype.rb +127 -0
  100. data/lib/azure/table/entity.rb +31 -0
  101. data/lib/azure/table/guid.rb +24 -0
  102. data/lib/azure/table/query.rb +112 -0
  103. data/lib/azure/table/serialization.rb +108 -0
  104. data/lib/azure/table/table_service.rb +563 -0
  105. data/lib/azure/version.rb +31 -0
  106. data/lib/azure/virtual_machine_image_management/serialization.rb +70 -0
  107. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  108. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  109. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +83 -0
  110. data/lib/azure/virtual_machine_management/serialization.rb +459 -0
  111. data/lib/azure/virtual_machine_management/virtual_machine.rb +44 -0
  112. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +552 -0
  113. data/lib/azure/virtual_network_management/serialization.rb +193 -0
  114. data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
  115. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +108 -0
  116. data/test/fixtures/32px-fulls-black.jpg +0 -0
  117. data/test/fixtures/affinity_group.xml +33 -0
  118. data/test/fixtures/all_containers.xml +20 -0
  119. data/test/fixtures/all_tables.xml +22 -0
  120. data/test/fixtures/container_acl.xml +11 -0
  121. data/test/fixtures/create_sql_database_server.xml +2 -0
  122. data/test/fixtures/create_storage_desc_error.xml +5 -0
  123. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  124. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  125. data/test/fixtures/create_storage_full_error.xml +6 -0
  126. data/test/fixtures/create_storage_label_error.xml +5 -0
  127. data/test/fixtures/create_storage_location_error.xml +5 -0
  128. data/test/fixtures/create_storage_name_error.xml +6 -0
  129. data/test/fixtures/create_table_response_entry.xml +15 -0
  130. data/test/fixtures/delete_storage_container_error.xml +5 -0
  131. data/test/fixtures/delete_storage_error.xml +5 -0
  132. data/test/fixtures/deployment_error.xml +5 -0
  133. data/test/fixtures/empty_xml_file +0 -0
  134. data/test/fixtures/get_storage_account_error.xml +5 -0
  135. data/test/fixtures/get_storage_account_properties.xml +34 -0
  136. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  137. data/test/fixtures/http_error.xml +5 -0
  138. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  139. data/test/fixtures/list_affinity_groups.xml +22 -0
  140. data/test/fixtures/list_blobs.xml +121 -0
  141. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  142. data/test/fixtures/list_blocks_all.xml +23 -0
  143. data/test/fixtures/list_blocks_committed.xml +13 -0
  144. data/test/fixtures/list_cloud_services.xml +39 -0
  145. data/test/fixtures/list_containers.xml +38 -0
  146. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  147. data/test/fixtures/list_locations.xml +212 -0
  148. data/test/fixtures/list_os_images.xml +110 -0
  149. data/test/fixtures/list_page_ranges.xml +11 -0
  150. data/test/fixtures/list_sql_database.xml +24 -0
  151. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  152. data/test/fixtures/list_storage_account_single.xml +25 -0
  153. data/test/fixtures/list_storage_accounts.xml +48 -0
  154. data/test/fixtures/list_virtual_networks.xml +92 -0
  155. data/test/fixtures/list_vm_images.xml +21 -0
  156. data/test/fixtures/logging.xml +11 -0
  157. data/test/fixtures/management_certificate.pfx +0 -0
  158. data/test/fixtures/messages.xml +12 -0
  159. data/test/fixtures/metrics.xml +10 -0
  160. data/test/fixtures/privatekey.key +28 -0
  161. data/test/fixtures/query_entities_empty_response.xml +7 -0
  162. data/test/fixtures/query_entities_response.xml +45 -0
  163. data/test/fixtures/queue_service_properties.xml +22 -0
  164. data/test/fixtures/queue_service_properties_original.xml +19 -0
  165. data/test/fixtures/queues.xml +16 -0
  166. data/test/fixtures/retention_policy.xml +5 -0
  167. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  168. data/test/fixtures/sb_default_create_relay_response.xml +15 -0
  169. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  170. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  171. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  172. data/test/fixtures/storage_service_keys.xml +8 -0
  173. data/test/fixtures/storage_service_properties.xml +55 -0
  174. data/test/fixtures/update_storage_account.xml +16 -0
  175. data/test/fixtures/update_storage_error.xml +5 -0
  176. data/test/fixtures/updated_storage_accounts.xml +55 -0
  177. data/test/fixtures/virtual_machine.xml +116 -0
  178. data/test/fixtures/windows_virtual_machine.xml +106 -0
  179. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  180. data/test/integration/affinity_group/Create_Affinity_test.rb +64 -0
  181. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  182. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  183. data/test/integration/affinity_group/Update_Affinity_test.rb +87 -0
  184. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  185. data/test/integration/blob/blob_metadata_test.rb +75 -0
  186. data/test/integration/blob/blob_pages_test.rb +119 -0
  187. data/test/integration/blob/blob_properties_test.rb +77 -0
  188. data/test/integration/blob/block_blob_test.rb +254 -0
  189. data/test/integration/blob/container/container_acl_test.rb +69 -0
  190. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  191. data/test/integration/blob/container/create_container_test.rb +60 -0
  192. data/test/integration/blob/container/delete_container_test.rb +39 -0
  193. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  194. data/test/integration/blob/container/list_containers_test.rb +79 -0
  195. data/test/integration/blob/container/root_container_test.rb +55 -0
  196. data/test/integration/blob/copy_blob_test.rb +113 -0
  197. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  198. data/test/integration/blob/create_page_blob_test.rb +83 -0
  199. data/test/integration/blob/delete_blob_test.rb +159 -0
  200. data/test/integration/blob/get_blob_test.rb +65 -0
  201. data/test/integration/blob/informative_errors_test.rb +39 -0
  202. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  203. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  204. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  205. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  206. data/test/integration/blob/list_blobs_test.rb +113 -0
  207. data/test/integration/cloud_service/Cloud_Create_test.rb +45 -0
  208. data/test/integration/cloud_service/Cloud_Delete_test.rb +45 -0
  209. data/test/integration/database/create_sql_server_firewall_test.rb +81 -0
  210. data/test/integration/database/create_sql_server_test.rb +53 -0
  211. data/test/integration/database/delete_sql_server_firewall_test.rb +64 -0
  212. data/test/integration/database/delete_sql_server_test.rb +45 -0
  213. data/test/integration/database/list_sql_server_firewall_test.rb +44 -0
  214. data/test/integration/database/list_sql_servers_test.rb +44 -0
  215. data/test/integration/database/reset_password_sql_server_test.rb +53 -0
  216. data/test/integration/location/Location_List_test.rb +39 -0
  217. data/test/integration/location/RoleSize_List_test.rb +35 -0
  218. data/test/integration/queue/clear_messages_test.rb +42 -0
  219. data/test/integration/queue/create_message_test.rb +75 -0
  220. data/test/integration/queue/create_queue_test.rb +50 -0
  221. data/test/integration/queue/delete_message_test.rb +67 -0
  222. data/test/integration/queue/delete_queue_test.rb +45 -0
  223. data/test/integration/queue/informative_errors_test.rb +42 -0
  224. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  225. data/test/integration/queue/list_messages_test.rb +79 -0
  226. data/test/integration/queue/list_queues_test.rb +43 -0
  227. data/test/integration/queue/peek_messages_test.rb +59 -0
  228. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  229. data/test/integration/queue/queue_metadata_test.rb +40 -0
  230. data/test/integration/queue/update_message_test.rb +74 -0
  231. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  232. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  233. data/test/integration/service_bus/queues_test.rb +266 -0
  234. data/test/integration/service_bus/relay_test.rb +132 -0
  235. data/test/integration/service_bus/rules_test.rb +145 -0
  236. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  237. data/test/integration/service_bus/scenario_test.rb +101 -0
  238. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  239. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  240. data/test/integration/service_bus/topics_test.rb +129 -0
  241. data/test/integration/storage_management/storage_management_test.rb +185 -0
  242. data/test/integration/table/create_table_test.rb +36 -0
  243. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  244. data/test/integration/table/delete_entity_test.rb +94 -0
  245. data/test/integration/table/delete_table_test.rb +40 -0
  246. data/test/integration/table/get_table_test.rb +37 -0
  247. data/test/integration/table/informative_errors_test.rb +39 -0
  248. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  249. data/test/integration/table/insert_entity_test.rb +88 -0
  250. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  251. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  252. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  253. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  254. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  255. data/test/integration/table/merge_entity_test.rb +113 -0
  256. data/test/integration/table/query_entities_test.rb +196 -0
  257. data/test/integration/table/query_tables_test.rb +43 -0
  258. data/test/integration/table/query_test.rb +251 -0
  259. data/test/integration/table/table_acl_test.rb +52 -0
  260. data/test/integration/table/table_gb18030_test.rb +355 -0
  261. data/test/integration/table/update_entity_batch_test.rb +149 -0
  262. data/test/integration/table/update_entity_test.rb +131 -0
  263. data/test/integration/test_helper.rb +40 -0
  264. data/test/integration/vm/VM_Create_test.rb +262 -0
  265. data/test/integration/vm/VM_Delete_test.rb +53 -0
  266. data/test/integration/vm/VM_Operations_test.rb +172 -0
  267. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  268. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  269. data/test/integration/vnet/Virtual_Network_Create_test.rb +116 -0
  270. data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
  271. data/test/support/env.rb +19 -0
  272. data/test/support/fixtures.rb +36 -0
  273. data/test/support/name_generator.rb +168 -0
  274. data/test/support/stubs.rb +42 -0
  275. data/test/support/virtual_machine_name_generator.rb +102 -0
  276. data/test/support/virtual_network_helper.rb +73 -0
  277. data/test/test_helper.rb +47 -0
  278. data/test/unit/affinity_group/affinity_group_test.rb +189 -0
  279. data/test/unit/affinity_group/serialization_test.rb +87 -0
  280. data/test/unit/base_management/base_management_service_test.rb +19 -0
  281. data/test/unit/base_management/location_test.rb +56 -0
  282. data/test/unit/base_management/role_size_test.rb +50 -0
  283. data/test/unit/blob/auth/shared_access_signature_test.rb +71 -0
  284. data/test/unit/blob/blob_service_test.rb +1970 -0
  285. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -0
  286. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  287. data/test/unit/config/azure_test.rb +112 -0
  288. data/test/unit/config/client_test.rb +37 -0
  289. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  290. data/test/unit/core/auth/shared_key_test.rb +58 -0
  291. data/test/unit/core/auth/signer_test.rb +30 -0
  292. data/test/unit/core/http/http_error_test.rb +61 -0
  293. data/test/unit/core/http/http_request_test.rb +138 -0
  294. data/test/unit/core/http/http_response_test.rb +20 -0
  295. data/test/unit/core/http/retry_policy_test.rb +23 -0
  296. data/test/unit/core/utility_test.rb +122 -0
  297. data/test/unit/database/serialization_test.rb +94 -0
  298. data/test/unit/database/sql_database_server_service_test.rb +341 -0
  299. data/test/unit/http_client_test.rb +74 -0
  300. data/test/unit/service/serialization_test.rb +533 -0
  301. data/test/unit/service/storage_service_test.rb +297 -0
  302. data/test/unit/storage_management/serialization_test.rb +244 -0
  303. data/test/unit/storage_management/storage_management_service_test.rb +247 -0
  304. data/test/unit/table/edmtype_test.rb +108 -0
  305. data/test/unit/virtual_machine_image_management/serialization_test.rb +50 -0
  306. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +114 -0
  307. data/test/unit/virtual_machine_management/serialization_test.rb +316 -0
  308. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +480 -0
  309. data/test/unit/vnet/serialization_test.rb +187 -0
  310. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  311. metadata +579 -0
@@ -0,0 +1,113 @@
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
+
16
+ require "integration/test_helper"
17
+ require "azure/table/table_service"
18
+ require "azure/core/http/http_error"
19
+
20
+ describe Azure::Table::TableService do
21
+ describe "#merge_entity" do
22
+ subject { Azure::Table::TableService.new }
23
+ let(:table_name){ TableNameHelper.name }
24
+
25
+ let(:entity_properties){
26
+ {
27
+ "PartitionKey" => "testingpartition",
28
+ "RowKey" => "abcd1234_existing",
29
+ "CustomStringProperty" => "CustomPropertyValue",
30
+ "CustomIntegerProperty" => 37,
31
+ "CustomBooleanProperty" => true,
32
+ "CustomDateProperty" => Time.now
33
+ }
34
+ }
35
+
36
+ before {
37
+ subject.create_table table_name
38
+ subject.insert_entity table_name, entity_properties
39
+ @existing_etag = ""
40
+
41
+ exists = false
42
+ begin
43
+ existing = subject.get_entity table_name, entity_properties["PartitionKey"], entity_properties["RowKey"]
44
+ @existing_etag = existing.etag
45
+ exists = true
46
+ rescue
47
+ end
48
+
49
+ assert exists, "cannot verify existing record"
50
+ }
51
+
52
+ after { TableNameHelper.clean }
53
+
54
+ it "updates an existing entity, merging the properties" do
55
+ etag = subject.merge_entity table_name, {
56
+ "PartitionKey" => entity_properties["PartitionKey"],
57
+ "RowKey" => entity_properties["RowKey"],
58
+ "NewCustomProperty" => "NewCustomValue"
59
+ }
60
+ etag.must_be_kind_of String
61
+ etag.wont_equal @existing_etag
62
+
63
+ result = subject.get_entity table_name, entity_properties["PartitionKey"], entity_properties["RowKey"]
64
+
65
+ result.must_be_kind_of Azure::Table::Entity
66
+ result.table.must_equal table_name
67
+ result.properties["PartitionKey"].must_equal entity_properties["PartitionKey"]
68
+ result.properties["RowKey"].must_equal entity_properties["RowKey"]
69
+
70
+ # retained all existing props
71
+ entity_properties.each { |k,v|
72
+ unless entity_properties[k].class == Time
73
+ result.properties[k].must_equal entity_properties[k]
74
+ else
75
+ result.properties[k].to_i.must_equal entity_properties[k].to_i
76
+ end
77
+ }
78
+
79
+ # and has the new one
80
+ result.properties["NewCustomProperty"].must_equal "NewCustomValue"
81
+ end
82
+
83
+ it "errors on a non-existing row key" do
84
+ assert_raises(Azure::Core::Http::HTTPError) do
85
+ entity = entity_properties.dup
86
+ entity["RowKey"] = "this-row-key-does-not-exist"
87
+ subject.merge_entity table_name, entity
88
+ end
89
+ end
90
+
91
+ it "errors on an invalid table name" do
92
+ assert_raises(Azure::Core::Http::HTTPError) do
93
+ subject.merge_entity "this_table.cannot-exist!", entity_properties
94
+ end
95
+ end
96
+
97
+ it "errors on an invalid partition key" do
98
+ assert_raises(Azure::Core::Http::HTTPError) do
99
+ entity = entity_properties.dup
100
+ entity["PartitionKey"] = "this/partition_key#is?invalid"
101
+ subject.merge_entity table_name, entity
102
+ end
103
+ end
104
+
105
+ it "errors on an invalid row key" do
106
+ assert_raises(Azure::Core::Http::HTTPError) do
107
+ entity = entity_properties.dup
108
+ entity["RowKey"] = "this/row_key#is?invalid"
109
+ subject.merge_entity table_name, entity
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,196 @@
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
+ puts '#########################################'
99
+ result = subject.query_entities table_name, { :select => projection }
100
+ result.must_be_kind_of Array
101
+ result.length.must_equal ((partitions.length + 1) * entities_per_partition)
102
+
103
+ result.each { |e|
104
+ e.properties.length.must_equal projection.length
105
+ e.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
106
+ e.properties.must_include "ThisPropertyDoesNotExist"
107
+ e.properties["ThisPropertyDoesNotExist"].must_equal ""
108
+ }
109
+ end
110
+
111
+ it "can filter by one or more properties, returning a matching set of entities" do
112
+ subject.insert_entity table_name, entity_properties.merge({
113
+ "PartitionKey" => "filter-test-partition",
114
+ "RowKey" => "filter-test-key",
115
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
116
+ "CustomBooleanProperty"=> false
117
+ })
118
+
119
+ filter = "CustomIntegerProperty gt #{entity_properties["CustomIntegerProperty"]} and CustomBooleanProperty eq false"
120
+ result = subject.query_entities table_name, { :filter => filter }
121
+ result.must_be_kind_of Array
122
+ result.length.must_equal 1
123
+ result.first.properties["PartitionKey"].must_equal "filter-test-partition"
124
+
125
+ filter = "CustomIntegerProperty gt #{entity_properties["CustomIntegerProperty"]} and CustomBooleanProperty eq true"
126
+ result = subject.query_entities table_name, { :filter => filter }
127
+ result.must_be_kind_of Array
128
+ result.length.must_equal 0
129
+ end
130
+
131
+ it "can limit the result set using the top parameter" do
132
+ result = subject.query_entities table_name, { :top => 3 }
133
+ result.must_be_kind_of Array
134
+ result.length.must_equal 3
135
+ result.continuation_token.wont_be_nil
136
+ end
137
+
138
+ it "can page results using the top parameter and continuation_token" do
139
+ result = subject.query_entities table_name, { :top => 3 }
140
+ result.must_be_kind_of Array
141
+ result.length.must_equal 3
142
+ result.continuation_token.wont_be_nil
143
+
144
+ result2 = subject.query_entities table_name, { :top => 3, :continuation_token => result.continuation_token }
145
+ result2.must_be_kind_of Array
146
+ result2.length.must_equal 3
147
+ result2.continuation_token.wont_be_nil
148
+
149
+ result3 = subject.query_entities table_name, { :top => 3, :continuation_token => result2.continuation_token }
150
+ result3.must_be_kind_of Array
151
+ result3.length.must_equal 3
152
+ result3.continuation_token.wont_be_nil
153
+
154
+ result4 = subject.query_entities table_name, { :top => 3, :continuation_token => result3.continuation_token }
155
+ result4.must_be_kind_of Array
156
+ result4.length.must_equal 3
157
+ result4.continuation_token.must_be_nil
158
+ end
159
+
160
+ it "can combine projection, filtering, and paging in the same query" do
161
+ subject.insert_entity table_name, entity_properties.merge({
162
+ "PartitionKey" => "filter-test-partition",
163
+ "RowKey" => "filter-test-key",
164
+ "CustomIntegerProperty" => entity_properties["CustomIntegerProperty"] + 1,
165
+ "CustomBooleanProperty"=> false
166
+ })
167
+
168
+ filter = "CustomIntegerProperty eq #{entity_properties["CustomIntegerProperty"]}"
169
+ projection = ["PartitionKey", "CustomIntegerProperty"]
170
+ result = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3 }
171
+ result.must_be_kind_of Array
172
+ result.length.must_equal 3
173
+ result.continuation_token.wont_be_nil
174
+
175
+ result.first.properties["CustomIntegerProperty"].must_equal entity_properties["CustomIntegerProperty"]
176
+ result.first.properties["PartitionKey"].wont_be_nil
177
+ result.first.properties.length.must_equal 2
178
+
179
+ result2 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result.continuation_token }
180
+ result2.must_be_kind_of Array
181
+ result2.length.must_equal 3
182
+ result2.continuation_token.wont_be_nil
183
+
184
+ result3 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result2.continuation_token }
185
+ result3.must_be_kind_of Array
186
+ result3.length.must_equal 3
187
+ result3.continuation_token.wont_be_nil
188
+
189
+ result4 = subject.query_entities table_name, { :select => projection, :filter => filter, :top => 3, :continuation_token => result3.continuation_token }
190
+ result4.must_be_kind_of Array
191
+ result4.length.must_equal 3
192
+ result4.continuation_token.must_be_nil
193
+ end
194
+
195
+ end
196
+ 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