stuartpreston-azure-sdk-for-ruby 0.7.1 → 0.7.2

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 (290) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/.travis.yml +10 -10
  4. data/ChangeLog.txt +70 -68
  5. data/Gemfile +15 -15
  6. data/README.md +618 -618
  7. data/Rakefile +133 -133
  8. data/azure.gemspec +44 -44
  9. data/lib/azure.rb +52 -52
  10. data/lib/azure/base_management/affinity_group.rb +32 -32
  11. data/lib/azure/base_management/base_management_service.rb +304 -304
  12. data/lib/azure/base_management/location.rb +27 -27
  13. data/lib/azure/base_management/management_http_request.rb +171 -171
  14. data/lib/azure/base_management/serialization.rb +129 -129
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -45
  16. data/lib/azure/blob/blob.rb +31 -31
  17. data/lib/azure/blob/blob_service.rb +1423 -1423
  18. data/lib/azure/blob/block.rb +30 -30
  19. data/lib/azure/blob/container.rb +31 -31
  20. data/lib/azure/blob/serialization.rb +284 -284
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -38
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +140 -140
  23. data/lib/azure/cloud_service_management/serialization.rb +117 -117
  24. data/lib/azure/core.rb +39 -39
  25. data/lib/azure/core/auth/authorizer.rb +36 -36
  26. data/lib/azure/core/auth/shared_key.rb +110 -110
  27. data/lib/azure/core/auth/shared_key_lite.rb +48 -48
  28. data/lib/azure/core/auth/signer.rb +48 -48
  29. data/lib/azure/core/configuration.rb +211 -211
  30. data/lib/azure/core/error.rb +22 -22
  31. data/lib/azure/core/filtered_service.rb +43 -43
  32. data/lib/azure/core/http/debug_filter.rb +35 -35
  33. data/lib/azure/core/http/http_error.rb +88 -88
  34. data/lib/azure/core/http/http_filter.rb +52 -52
  35. data/lib/azure/core/http/http_request.rb +157 -157
  36. data/lib/azure/core/http/http_response.rb +140 -140
  37. data/lib/azure/core/http/retry_policy.rb +73 -73
  38. data/lib/azure/core/http/signer_filter.rb +33 -33
  39. data/lib/azure/core/service.rb +62 -62
  40. data/lib/azure/core/signed_service.rb +42 -42
  41. data/lib/azure/core/utility.rb +190 -190
  42. data/lib/azure/queue/message.rb +29 -29
  43. data/lib/azure/queue/queue.rb +28 -28
  44. data/lib/azure/queue/queue_service.rb +567 -567
  45. data/lib/azure/queue/serialization.rb +106 -106
  46. data/lib/azure/service/access_policy.rb +25 -25
  47. data/lib/azure/service/cors.rb +11 -11
  48. data/lib/azure/service/cors_rule.rb +15 -15
  49. data/lib/azure/service/enumeration_results.rb +20 -20
  50. data/lib/azure/service/logging.rb +31 -31
  51. data/lib/azure/service/metrics.rb +30 -30
  52. data/lib/azure/service/retention_policy.rb +24 -24
  53. data/lib/azure/service/serialization.rb +297 -297
  54. data/lib/azure/service/signed_identifier.rb +29 -29
  55. data/lib/azure/service/storage_service.rb +82 -82
  56. data/lib/azure/service/storage_service_properties.rb +37 -37
  57. data/lib/azure/service_bus/action.rb +21 -21
  58. data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
  59. data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
  60. data/lib/azure/service_bus/brokered_message.rb +123 -123
  61. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
  62. data/lib/azure/service_bus/correlation_filter.rb +45 -45
  63. data/lib/azure/service_bus/empty_rule_action.rb +29 -29
  64. data/lib/azure/service_bus/false_filter.rb +38 -38
  65. data/lib/azure/service_bus/filter.rb +21 -21
  66. data/lib/azure/service_bus/interval.rb +103 -103
  67. data/lib/azure/service_bus/queue.rb +229 -229
  68. data/lib/azure/service_bus/relay.rb +87 -87
  69. data/lib/azure/service_bus/resource.rb +108 -108
  70. data/lib/azure/service_bus/rule.rb +97 -97
  71. data/lib/azure/service_bus/rule_aspect.rb +34 -34
  72. data/lib/azure/service_bus/serialization.rb +161 -161
  73. data/lib/azure/service_bus/service_bus_service.rb +896 -896
  74. data/lib/azure/service_bus/sql_filter.rb +50 -50
  75. data/lib/azure/service_bus/sql_rule_action.rb +50 -50
  76. data/lib/azure/service_bus/subscription.rb +183 -183
  77. data/lib/azure/service_bus/topic.rb +186 -186
  78. data/lib/azure/service_bus/true_filter.rb +38 -38
  79. data/lib/azure/sql_database_management/serialization.rb +111 -111
  80. data/lib/azure/sql_database_management/sql_database.rb +31 -31
  81. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -200
  82. data/lib/azure/storage_management/serialization.rb +184 -184
  83. data/lib/azure/storage_management/storage_account.rb +40 -40
  84. data/lib/azure/storage_management/storage_management_service.rb +166 -166
  85. data/lib/azure/table/auth/shared_key.rb +92 -92
  86. data/lib/azure/table/auth/shared_key_lite.rb +44 -44
  87. data/lib/azure/table/batch.rb +329 -329
  88. data/lib/azure/table/batch_response.rb +118 -118
  89. data/lib/azure/table/edmtype.rb +126 -126
  90. data/lib/azure/table/entity.rb +30 -30
  91. data/lib/azure/table/guid.rb +23 -23
  92. data/lib/azure/table/query.rb +111 -111
  93. data/lib/azure/table/serialization.rb +107 -107
  94. data/lib/azure/table/table_service.rb +559 -559
  95. data/lib/azure/version.rb +31 -31
  96. data/lib/azure/virtual_machine_image_management/serialization.rb +66 -66
  97. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -25
  98. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -25
  99. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +94 -94
  100. data/lib/azure/virtual_machine_management/serialization.rb +462 -462
  101. data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -45
  102. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +588 -588
  103. data/lib/azure/virtual_network_management/serialization.rb +190 -190
  104. data/lib/azure/virtual_network_management/virtual_network.rb +37 -37
  105. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
  106. data/test/fixtures/affinity_group.xml +33 -33
  107. data/test/fixtures/all_containers.xml +20 -20
  108. data/test/fixtures/all_tables.xml +22 -22
  109. data/test/fixtures/certificate.pem +21 -21
  110. data/test/fixtures/container_acl.xml +11 -11
  111. data/test/fixtures/create_sql_database_server.xml +1 -1
  112. data/test/fixtures/create_storage_desc_error.xml +5 -5
  113. data/test/fixtures/create_storage_extendedprop_error.xml +8 -8
  114. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -6
  115. data/test/fixtures/create_storage_full_error.xml +6 -6
  116. data/test/fixtures/create_storage_label_error.xml +5 -5
  117. data/test/fixtures/create_storage_location_error.xml +5 -5
  118. data/test/fixtures/create_storage_name_error.xml +6 -6
  119. data/test/fixtures/create_table_response_entry.xml +15 -15
  120. data/test/fixtures/delete_storage_container_error.xml +5 -5
  121. data/test/fixtures/delete_storage_error.xml +5 -5
  122. data/test/fixtures/deployment_error.xml +5 -5
  123. data/test/fixtures/get_storage_account_error.xml +5 -5
  124. data/test/fixtures/get_storage_account_properties.xml +31 -31
  125. data/test/fixtures/get_storage_account_properties_new.xml +31 -31
  126. data/test/fixtures/http_error.xml +5 -5
  127. data/test/fixtures/insert_entity_response_entry.xml +25 -25
  128. data/test/fixtures/list_affinity_groups.xml +22 -22
  129. data/test/fixtures/list_blobs.xml +120 -120
  130. data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
  131. data/test/fixtures/list_blocks_all.xml +22 -22
  132. data/test/fixtures/list_blocks_committed.xml +12 -12
  133. data/test/fixtures/list_cloud_services.xml +38 -38
  134. data/test/fixtures/list_containers.xml +37 -37
  135. data/test/fixtures/list_firewall_management_endpoint.xml +27 -27
  136. data/test/fixtures/list_images.xml +110 -110
  137. data/test/fixtures/list_locations.xml +62 -62
  138. data/test/fixtures/list_page_ranges.xml +10 -10
  139. data/test/fixtures/list_sql_database.xml +36 -36
  140. data/test/fixtures/list_sql_server_firewall.xml +23 -23
  141. data/test/fixtures/list_storage_account_single.xml +24 -24
  142. data/test/fixtures/list_storage_accounts.xml +45 -45
  143. data/test/fixtures/list_virtual_networks.xml +92 -92
  144. data/test/fixtures/logging.xml +11 -11
  145. data/test/fixtures/management_certificate.pem +55 -55
  146. data/test/fixtures/messages.xml +12 -12
  147. data/test/fixtures/metrics.xml +10 -10
  148. data/test/fixtures/privatekey.key +28 -28
  149. data/test/fixtures/query_entities_empty_response.xml +7 -7
  150. data/test/fixtures/query_entities_response.xml +45 -45
  151. data/test/fixtures/queue_service_properties.xml +22 -22
  152. data/test/fixtures/queue_service_properties_original.xml +19 -19
  153. data/test/fixtures/queues.xml +16 -16
  154. data/test/fixtures/retention_policy.xml +5 -5
  155. data/test/fixtures/sb_default_create_queue_response.xml +23 -23
  156. data/test/fixtures/sb_default_create_relay_response.xml +15 -15
  157. data/test/fixtures/sb_default_create_topic_response.xml +18 -18
  158. data/test/fixtures/sb_get_access_token_response.txt +1 -1
  159. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
  160. data/test/fixtures/storage_service_properties.xml +54 -54
  161. data/test/fixtures/update_storage_account.xml +16 -16
  162. data/test/fixtures/update_storage_error.xml +4 -4
  163. data/test/fixtures/updated_storage_accounts.xml +52 -52
  164. data/test/fixtures/virtual_machine.xml +113 -113
  165. data/test/fixtures/windows_virtual_machine.xml +106 -106
  166. data/test/integration/affinity_group/Affinity_test.rb +55 -55
  167. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
  168. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
  169. data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
  170. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
  171. data/test/integration/blob/blob_gb18030_test.rb +199 -199
  172. data/test/integration/blob/blob_metadata_test.rb +75 -75
  173. data/test/integration/blob/blob_pages_test.rb +119 -119
  174. data/test/integration/blob/blob_properties_test.rb +77 -77
  175. data/test/integration/blob/block_blob_test.rb +254 -254
  176. data/test/integration/blob/container/container_acl_test.rb +69 -69
  177. data/test/integration/blob/container/container_metadata_test.rb +50 -50
  178. data/test/integration/blob/container/create_container_test.rb +60 -60
  179. data/test/integration/blob/container/delete_container_test.rb +39 -39
  180. data/test/integration/blob/container/get_container_properties_test.rb +48 -48
  181. data/test/integration/blob/container/list_containers_test.rb +79 -79
  182. data/test/integration/blob/container/root_container_test.rb +53 -53
  183. data/test/integration/blob/copy_blob_test.rb +113 -113
  184. data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
  185. data/test/integration/blob/create_page_blob_test.rb +83 -83
  186. data/test/integration/blob/delete_blob_test.rb +159 -159
  187. data/test/integration/blob/get_blob_test.rb +65 -65
  188. data/test/integration/blob/informative_errors_test.rb +38 -38
  189. data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
  190. data/test/integration/blob/lease/break_lease_test.rb +40 -40
  191. data/test/integration/blob/lease/release_lease_test.rb +40 -40
  192. data/test/integration/blob/lease/renew_lease_test.rb +42 -42
  193. data/test/integration/blob/list_blobs_test.rb +113 -113
  194. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -44
  195. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -44
  196. data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
  197. data/test/integration/database/create_sql_server_test.rb +53 -53
  198. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -70
  199. data/test/integration/database/delete_sql_server_test.rb +58 -58
  200. data/test/integration/database/list_sql_server_firewall_test.rb +45 -45
  201. data/test/integration/database/list_sql_servers_test.rb +44 -44
  202. data/test/integration/database/reset_password_sql_server_test.rb +55 -55
  203. data/test/integration/location/Location_List_test.rb +39 -39
  204. data/test/integration/queue/clear_messages_test.rb +42 -42
  205. data/test/integration/queue/create_message_test.rb +75 -75
  206. data/test/integration/queue/create_queue_test.rb +50 -50
  207. data/test/integration/queue/delete_message_test.rb +67 -67
  208. data/test/integration/queue/delete_queue_test.rb +45 -45
  209. data/test/integration/queue/informative_errors_test.rb +41 -41
  210. data/test/integration/queue/list_messages_encoded_test.rb +79 -79
  211. data/test/integration/queue/list_messages_test.rb +79 -79
  212. data/test/integration/queue/list_queues_test.rb +44 -44
  213. data/test/integration/queue/peek_messages_test.rb +59 -59
  214. data/test/integration/queue/queue_gb18030_test.rb +131 -131
  215. data/test/integration/queue/queue_metadata_test.rb +40 -40
  216. data/test/integration/queue/update_message_test.rb +74 -74
  217. data/test/integration/service_bus/informative_errors_test.rb +36 -36
  218. data/test/integration/service_bus/queues_scenario_test.rb +200 -200
  219. data/test/integration/service_bus/queues_test.rb +265 -265
  220. data/test/integration/service_bus/relay_test.rb +131 -131
  221. data/test/integration/service_bus/rules_test.rb +144 -144
  222. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
  223. data/test/integration/service_bus/scenario_test.rb +101 -101
  224. data/test/integration/service_bus/subscriptions_test.rb +211 -211
  225. data/test/integration/service_bus/topics_scenario_test.rb +406 -406
  226. data/test/integration/service_bus/topics_test.rb +129 -129
  227. data/test/integration/storage_management/storage_management_test.rb +160 -160
  228. data/test/integration/table/create_table_test.rb +35 -35
  229. data/test/integration/table/delete_entity_batch_test.rb +106 -106
  230. data/test/integration/table/delete_entity_test.rb +93 -93
  231. data/test/integration/table/delete_table_test.rb +39 -39
  232. data/test/integration/table/get_table_test.rb +36 -36
  233. data/test/integration/table/informative_errors_test.rb +38 -38
  234. data/test/integration/table/insert_entity_batch_test.rb +99 -99
  235. data/test/integration/table/insert_entity_test.rb +87 -87
  236. data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
  237. data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
  238. data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
  239. data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
  240. data/test/integration/table/merge_entity_batch_test.rb +127 -127
  241. data/test/integration/table/merge_entity_test.rb +112 -112
  242. data/test/integration/table/query_entities_test.rb +194 -194
  243. data/test/integration/table/query_tables_test.rb +42 -42
  244. data/test/integration/table/query_test.rb +250 -250
  245. data/test/integration/table/table_acl_test.rb +51 -51
  246. data/test/integration/table/table_gb18030_test.rb +355 -355
  247. data/test/integration/table/update_entity_batch_test.rb +148 -148
  248. data/test/integration/table/update_entity_test.rb +130 -130
  249. data/test/integration/test_helper.rb +42 -42
  250. data/test/integration/vm/VM_Create_test.rb +260 -260
  251. data/test/integration/vm/VM_Delete_test.rb +55 -55
  252. data/test/integration/vm/VM_Operations_test.rb +173 -173
  253. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
  254. data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
  255. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
  256. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
  257. data/test/support/env.rb +19 -19
  258. data/test/support/fixtures.rb +36 -36
  259. data/test/support/name_generator.rb +168 -168
  260. data/test/support/stubs.rb +42 -42
  261. data/test/support/virtual_machine_name_generator.rb +102 -102
  262. data/test/support/virtual_network_helper.rb +73 -73
  263. data/test/test_helper.rb +53 -53
  264. data/test/unit/affinity_group/affinity_group_test.rb +192 -192
  265. data/test/unit/affinity_group/serialization_test.rb +88 -88
  266. data/test/unit/base_management/location_test.rb +57 -57
  267. data/test/unit/blob/blob_service_test.rb +1946 -1946
  268. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
  269. data/test/unit/cloud_service_management/serialization_test.rb +169 -169
  270. data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
  271. data/test/unit/core/auth/shared_key_test.rb +58 -58
  272. data/test/unit/core/auth/signer_test.rb +30 -30
  273. data/test/unit/core/http/http_error_test.rb +57 -57
  274. data/test/unit/core/http/http_request_test.rb +66 -66
  275. data/test/unit/core/http/http_response_test.rb +45 -45
  276. data/test/unit/core/http/retry_policy_test.rb +23 -23
  277. data/test/unit/database/serialization_test.rb +97 -97
  278. data/test/unit/database/sql_database_server_service_test.rb +288 -288
  279. data/test/unit/service/serialization_test.rb +532 -532
  280. data/test/unit/service/storage_service_test.rb +292 -292
  281. data/test/unit/storage_management/serialization_test.rb +232 -232
  282. data/test/unit/storage_management/storage_management_service_test.rb +261 -261
  283. data/test/unit/table/edmtype_test.rb +107 -107
  284. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -35
  285. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -65
  286. data/test/unit/virtual_machine_management/serialization_test.rb +258 -258
  287. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -440
  288. data/test/unit/vnet/serialization_test.rb +187 -187
  289. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
  290. metadata +34 -27
@@ -1,533 +1,533 @@
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 "test_helper"
16
- require "azure/service/serialization"
17
-
18
- require 'azure/service/enumeration_results'
19
- require 'azure/service/signed_identifier'
20
- require 'azure/service/access_policy'
21
-
22
- require 'azure/service/storage_service_properties'
23
- require 'azure/service/logging'
24
- require 'azure/service/metrics'
25
- require 'azure/service/retention_policy'
26
-
27
- describe Azure::Service::Serialization do
28
- subject { Azure::Service::Serialization }
29
-
30
- let(:storage_service_properties) { Azure::Service::StorageServiceProperties.new }
31
- let(:storage_service_properties_xml) { Fixtures["storage_service_properties"] }
32
-
33
- describe "#signed_identifiers_from_xml" do
34
- let(:signed_identifiers_xml) { Fixtures["container_acl"]}
35
-
36
- it "accepts an XML string" do
37
- subject.signed_identifiers_from_xml signed_identifiers_xml
38
- end
39
-
40
- it "returns an Array of SignedIdentifier instances" do
41
- results = subject.signed_identifiers_from_xml signed_identifiers_xml
42
- results.must_be_kind_of Array
43
- results[0].must_be_kind_of Azure::Service::SignedIdentifier
44
- results.count.must_equal 1
45
- end
46
- end
47
-
48
- describe "#signed_identifiers_to_xml" do
49
- let(:signed_identifiers) {
50
- identifier = Azure::Service::SignedIdentifier.new
51
- identifier.id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
52
- identifier.access_policy.start = "2009-09-28T08:49:37.0000000Z"
53
- identifier.access_policy.expiry = "2009-09-29T08:49:37.0000000Z"
54
- identifier.access_policy.permission = "rwd"
55
- [identifier]
56
- }
57
-
58
- let(:signed_identifiers_xml) { Fixtures["container_acl"]}
59
-
60
- it "accepts a list of SignedIdentifier instances" do
61
- subject.signed_identifiers_to_xml signed_identifiers
62
- end
63
-
64
- it "returns a XML graph of the provided values" do
65
- xml = subject.signed_identifiers_to_xml signed_identifiers
66
- xml.must_equal signed_identifiers_xml
67
- end
68
- end
69
-
70
- describe "#signed_identifier_from_xml" do
71
- let(:signed_identifier_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier }
72
- let(:mock_access_policy) { mock() }
73
- before { subject.expects(:access_policy_from_xml).with(signed_identifier_xml.AccessPolicy).returns(mock_access_policy) }
74
-
75
- it "accepts an XML node" do
76
- subject.signed_identifier_from_xml signed_identifier_xml
77
- end
78
-
79
- it "returns a SignedIdentifier instance" do
80
- identifier = subject.signed_identifier_from_xml signed_identifier_xml
81
- identifier.must_be_kind_of Azure::Service::SignedIdentifier
82
- end
83
-
84
- it "sets the properties of the SignedIdentifier" do
85
- identifier = subject.signed_identifier_from_xml signed_identifier_xml
86
- identifier.wont_be_nil
87
- identifier.id.must_equal "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
88
- end
89
- end
90
-
91
- describe "#access_policy_from_xml" do
92
- let(:access_policy_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier.AccessPolicy }
93
-
94
- it "accepts an XML node" do
95
- subject.access_policy_from_xml access_policy_xml
96
- end
97
-
98
- it "returns a AccessPolicy instance" do
99
- access_policy = subject.access_policy_from_xml access_policy_xml
100
- access_policy.must_be_kind_of Azure::Service::AccessPolicy
101
- end
102
-
103
- it "sets the properties of the AccessPolicy" do
104
- access_policy = subject.access_policy_from_xml access_policy_xml
105
-
106
- access_policy.wont_be_nil
107
- access_policy.start.must_equal "2009-09-28T08:49:37.0000000Z"
108
- access_policy.expiry.must_equal "2009-09-29T08:49:37.0000000Z"
109
- access_policy.permission.must_equal "rwd"
110
- end
111
- end
112
-
113
- describe "#enumeration_results_from_xml" do
114
- let(:enumeration_results_xml) { Fixtures[:list_containers] }
115
-
116
- describe "when passed an instance of EnumerationResults" do
117
- let(:enumeration_results) { Azure::Service::EnumerationResults.new }
118
-
119
- it "parses the XML and populates the provided EnumerationResults instance" do
120
- result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
121
- result.must_be :kind_of?, Azure::Service::EnumerationResults
122
- result.continuation_token.must_equal "video"
123
- end
124
-
125
- it "returns the same instance provided" do
126
- result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
127
- result.must_equal enumeration_results
128
- end
129
- end
130
-
131
- describe "when passed nil" do
132
- it "returns a new instance of EnumerationResults" do
133
- result = subject.enumeration_results_from_xml enumeration_results_xml, nil
134
- result.must_be_kind_of Azure::Service::EnumerationResults
135
- end
136
- end
137
- end
138
-
139
- describe "#metadata_from_xml" do
140
- let(:list_containers_xml) { Fixtures["list_containers"] }
141
- let(:metadata_xml_node) { Nokogiri.Slop(list_containers_xml).root.Containers.Container[1].Metadata }
142
-
143
- it "converts a Metadata XML element to a Hash" do
144
- subject.metadata_from_xml(metadata_xml_node).must_be_kind_of Hash
145
- end
146
-
147
- it "uses the child element names as keys" do
148
- hash = subject.metadata_from_xml(metadata_xml_node)
149
- hash.has_key?("mymetadata1").must_equal true
150
- hash.has_key?("mymetadata2").must_equal true
151
- hash.has_key?("x-ms-invalid-name").must_equal true
152
- end
153
-
154
- it "uses the child element text contents as values" do
155
- hash = subject.metadata_from_xml(metadata_xml_node)
156
- hash["mymetadata1"].must_equal "first value"
157
- hash["mymetadata2"].must_equal "second value"
158
- end
159
-
160
- describe "when it encounters more than one of the same element name" do
161
- it "returns and array of values for that key" do
162
- hash = subject.metadata_from_xml(metadata_xml_node)
163
- hash["x-ms-invalid-name"].must_be_kind_of Array
164
- hash["x-ms-invalid-name"].must_equal ["invalid-metadata-name","invalid-metadata-name2"]
165
- end
166
- end
167
- end
168
-
169
- describe "#metadata_from_headers" do
170
- let(:headers) { { "Content-Type"=>"application/xml", "Content-Length"=>"37" } }
171
-
172
- let(:metadata_headers) { headers.merge({ "x-ms-meta-MyMetadata1" => "first value", "x-ms-meta-MyMetadata2" => "second value" })}
173
-
174
- it "returns a Hash" do
175
- subject.metadata_from_headers(metadata_headers).must_be_kind_of Hash
176
- end
177
-
178
- it "extracts metadata from a Hash for keys that start with x-ms-meta-* and removes that prefix" do
179
- hash = subject.metadata_from_headers(metadata_headers)
180
- hash.has_key?("MyMetadata1").must_equal true
181
- hash.has_key?("MyMetadata2").must_equal true
182
- end
183
-
184
- it "sets the metadata values to the corresponding header values" do
185
- hash = subject.metadata_from_headers(metadata_headers)
186
- hash["MyMetadata1"].must_equal "first value"
187
- hash["MyMetadata2"].must_equal "second value"
188
- end
189
- end
190
-
191
- describe "#retention_policy_to_xml" do
192
- let(:retention_policy) {
193
- retention_policy = Azure::Service::RetentionPolicy.new
194
- retention_policy.enabled = true
195
- retention_policy.days = 7
196
-
197
- retention_policy
198
- }
199
-
200
- let(:retention_policy_xml) { Fixtures["retention_policy"]}
201
-
202
- it "accepts a RetentionPolicy instance and an Nokogiri::XML::Builder instance" do
203
- Nokogiri::XML::Builder.new do |xml|
204
- subject.retention_policy_to_xml retention_policy, xml
205
- end
206
- end
207
-
208
- it "adds to the XML Builder, which will create the XML graph of the provided values" do
209
- builder = Nokogiri::XML::Builder.new do |xml|
210
- subject.retention_policy_to_xml retention_policy, xml
211
- end
212
- builder.to_xml.must_equal retention_policy_xml
213
- end
214
- end
215
-
216
- describe "#retention_policy_from_xml" do
217
- let(:retention_policy_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.HourMetrics.RetentionPolicy }
218
-
219
- it "accepts an XML Node" do
220
- subject.retention_policy_from_xml retention_policy_xml
221
- end
222
-
223
- it "returns an RetentionPolicy instance" do
224
- retention_policy = subject.retention_policy_from_xml retention_policy_xml
225
- retention_policy.wont_be_nil
226
- retention_policy.must_be_kind_of Azure::Service::RetentionPolicy
227
- end
228
-
229
- it "sets the properties of the RetentionPolicy instance" do
230
- retention_policy = subject.retention_policy_from_xml retention_policy_xml
231
- retention_policy.enabled.must_equal true
232
- retention_policy.days.must_equal 7
233
- end
234
- end
235
-
236
- describe "#hour_metrics_to_xml" do
237
- let(:metrics) {
238
- metrics = Azure::Service::Metrics.new
239
- metrics.version = "1.0"
240
- metrics.enabled = true
241
- metrics.include_apis = false
242
- retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
243
- retention_policy.enabled = true
244
- retention_policy.days = 7
245
-
246
- metrics
247
- }
248
-
249
- let(:metrics_xml) { Fixtures["metrics"]}
250
-
251
- it "accepts a Metrics instance and an Nokogiri::XML::Builder instance" do
252
- Nokogiri::XML::Builder.new do |xml|
253
- subject.hour_metrics_to_xml metrics, xml
254
- end
255
- end
256
-
257
- it "adds to the XML Builder, which will create the XML graph of the provided values" do
258
- builder = Nokogiri::XML::Builder.new do |xml|
259
- subject.hour_metrics_to_xml metrics, xml
260
- end
261
- builder.to_xml.must_equal metrics_xml
262
- end
263
- end
264
-
265
- describe "#metrics_from_xml" do
266
- let(:metrics_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.HourMetrics }
267
- let(:mock_retention_policy) { mock }
268
-
269
- before {
270
- subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
271
- }
272
-
273
- it "accepts an XML Node" do
274
- subject.metrics_from_xml metrics_xml
275
- end
276
-
277
- it "returns an Metrics instance" do
278
- metrics = subject.metrics_from_xml metrics_xml
279
- metrics.wont_be_nil
280
- metrics.must_be_kind_of Azure::Service::Metrics
281
- end
282
-
283
- it "sets the properties of the Metrics instance" do
284
- metrics = subject.metrics_from_xml metrics_xml
285
- metrics.version.must_equal "1.0"
286
- metrics.enabled.must_equal true
287
- metrics.include_apis.must_equal false
288
- metrics.retention_policy.must_equal mock_retention_policy
289
- end
290
- end
291
-
292
-
293
- describe "#logging_to_xml" do
294
- let(:logging) {
295
- logging = Azure::Service::Logging.new
296
- logging.version = "1.0"
297
- logging.delete = true
298
- logging.read = false
299
- logging.write = true
300
-
301
- retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
302
- retention_policy.enabled = true
303
- retention_policy.days = 7
304
-
305
- logging
306
- }
307
-
308
- let(:logging_xml) { Fixtures["logging"]}
309
-
310
- it "accepts a Logging instance and an Nokogiri::XML::Builder instance" do
311
- Nokogiri::XML::Builder.new do |xml|
312
- subject.logging_to_xml logging, xml
313
- end
314
- end
315
-
316
- it "adds to the XML Builder, which will create the XML graph of the provided values" do
317
- builder = Nokogiri::XML::Builder.new do |xml|
318
- subject.logging_to_xml logging, xml
319
- end
320
- builder.to_xml.must_equal logging_xml
321
- end
322
- end
323
-
324
- describe "#logging_from_xml" do
325
- let(:logging_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.Logging }
326
- let(:mock_retention_policy) { mock }
327
-
328
- before {
329
- subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
330
- }
331
-
332
- it "accepts an XML Node" do
333
- subject.logging_from_xml logging_xml
334
- end
335
-
336
- it "returns an Logging instance" do
337
- logging = subject.logging_from_xml logging_xml
338
- logging.wont_be_nil
339
- logging.must_be_kind_of Azure::Service::Logging
340
- end
341
-
342
- it "sets the properties of the Logging instance" do
343
- logging = subject.logging_from_xml logging_xml
344
- logging.version.must_equal "1.0"
345
- logging.delete.must_equal true
346
- logging.read.must_equal false
347
- logging.write.must_equal true
348
- logging.retention_policy.must_equal mock_retention_policy
349
- end
350
- end
351
-
352
- describe "#service_properties_to_xml" do
353
- let(:service_properties) {
354
- service_properties = Azure::Service::StorageServiceProperties.new
355
- service_properties.default_service_version = "2011-08-18"
356
- logging = service_properties.logging = Azure::Service::Logging.new
357
- logging.version = "1.0"
358
- logging.delete = true
359
- logging.read = false
360
- logging.write = true
361
- retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
362
- retention_policy.enabled = true
363
- retention_policy.days = 7
364
-
365
- metrics = service_properties.hour_metrics = Azure::Service::Metrics.new
366
- metrics.version = "1.0"
367
- metrics.enabled = true
368
- metrics.include_apis = false
369
- retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
370
- retention_policy.enabled = true
371
- retention_policy.days = 7
372
-
373
- service_properties.minute_metrics = metrics
374
-
375
- service_properties.cors = Azure::Service::Cors.new do |cors|
376
- cors.cors_rules = []
377
- cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
378
- cors_rule.allowed_origins = ["http://www.contoso.com", "http://dummy.uri"]
379
- cors_rule.allowed_methods = ["PUT", "HEAD"]
380
- cors_rule.max_age_in_seconds = 5
381
- cors_rule.exposed_headers = ["x-ms-*"]
382
- cors_rule.allowed_headers = ["x-ms-blob-content-type", "x-ms-blob-content-disposition"]
383
- })
384
-
385
- cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
386
- cors_rule.allowed_origins = ["*"]
387
- cors_rule.allowed_methods = ["PUT", "GET"]
388
- cors_rule.max_age_in_seconds = 5
389
- cors_rule.exposed_headers = ["x-ms-*"]
390
- cors_rule.allowed_headers = ["x-ms-blob-content-type", "x-ms-blob-content-disposition"]
391
- })
392
-
393
- cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
394
- cors_rule.allowed_origins = ["http://www.contoso.com"]
395
- cors_rule.allowed_methods = ["GET"]
396
- cors_rule.max_age_in_seconds = 5
397
- cors_rule.exposed_headers = ["x-ms-*"]
398
- cors_rule.allowed_headers = ["x-ms-client-request-id"]
399
- })
400
- end
401
-
402
- service_properties
403
- }
404
-
405
- let(:service_properties_xml) { Fixtures["storage_service_properties"]}
406
-
407
- it "accepts a StorageServiceProperties instance" do
408
- subject.service_properties_to_xml service_properties
409
- end
410
-
411
- it "returns a XML graph of the provided values" do
412
- xml = subject.service_properties_to_xml service_properties
413
- xml.must_equal service_properties_xml
414
- end
415
- end
416
-
417
- describe "#service_properties_from_xml" do
418
- let(:service_properties_xml) { Fixtures["storage_service_properties"]}
419
- let(:mock_logging) { mock }
420
- let(:mock_metrics) { mock }
421
- let(:mock_cors) { mock }
422
-
423
- before {
424
- subject.expects(:logging_from_xml).returns(mock_logging)
425
- subject.expects(:metrics_from_xml).twice.returns(mock_metrics)
426
- subject.expects(:cors_from_xml).returns(mock_cors)
427
- }
428
-
429
- it "accepts an XML string" do
430
- subject.service_properties_from_xml service_properties_xml
431
- end
432
-
433
- it "returns an StorageServiceProperties instance" do
434
- service_properties = subject.service_properties_from_xml service_properties_xml
435
- service_properties.wont_be_nil
436
- service_properties.must_be_kind_of Azure::Service::StorageServiceProperties
437
- end
438
-
439
- it "sets the properties of the StorageServiceProperties instance" do
440
- service_properties = subject.service_properties_from_xml service_properties_xml
441
- service_properties.logging.must_equal mock_logging
442
- service_properties.hour_metrics.must_equal mock_metrics
443
- service_properties.minute_metrics.must_equal mock_metrics
444
- end
445
- end
446
-
447
- describe "#to_bool" do
448
- it "converts a valid string value to a Boolean" do
449
- subject.to_bool('true').must_be_kind_of TrueClass
450
- subject.to_bool('false').must_be_kind_of FalseClass
451
- end
452
-
453
- it "is case insensitive" do
454
- # mixed case
455
- subject.to_bool('True').must_equal true
456
-
457
- # upper case
458
- subject.to_bool('TRUE').must_equal true
459
- end
460
-
461
- it "returns false for any value other than 'true'" do
462
- subject.to_bool('random string').must_equal false
463
- subject.to_bool(nil).must_equal false
464
- end
465
- end
466
-
467
- describe "#slopify" do
468
- let(:xml_data) { '<?xml version="1.0" encoding="utf-8"?><Foo></Foo>' }
469
- let(:document) { Nokogiri.Slop xml_data }
470
- let(:root_node) { document.root }
471
- let(:non_slop_node) { Nokogiri.parse(xml_data).root }
472
-
473
- describe "when passed a String" do
474
-
475
- it "parses the string into a Nokogiri::XML::Element node" do
476
- result = subject.slopify(xml_data)
477
- result.must_be_kind_of Nokogiri::XML::Element
478
- end
479
-
480
- it "returns the root of the parsed Document" do
481
- result = subject.slopify(xml_data)
482
- result.name.must_equal root_node.name
483
- end
484
-
485
- it "enables Nokogiri 'Slop' mode on the returned Element" do
486
- result = subject.slopify(xml_data)
487
- result.must_respond_to :method_missing
488
- end
489
- end
490
-
491
- describe "when passed a Nokogiri::XML::Document" do
492
- it "returns a Nokogiri::XML::Element node" do
493
- result = subject.slopify(document)
494
- result.must_be_kind_of Nokogiri::XML::Element
495
- end
496
-
497
- it "returns the root of the Document" do
498
- result = subject.slopify(document)
499
- result.name.must_equal root_node.name
500
- end
501
-
502
- it "enables Nokogiri 'Slop' mode on the returned Element" do
503
- result = subject.slopify(xml_data)
504
- result.must_respond_to :method_missing
505
- end
506
- end
507
-
508
- describe "when passed a Nokogiri::XML::Element" do
509
- it "returns the Element unchanged" do
510
- result = subject.slopify(root_node)
511
- result.must_equal root_node
512
- end
513
-
514
- it "does not enable Nokogiri 'Slop' mode on the returned Element if it didn't already have it" do
515
- result = subject.slopify(root_node)
516
- result.respond_to?(:method_missing).must_equal root_node.respond_to?(:method_missing)
517
-
518
- result = subject.slopify(non_slop_node)
519
- result.respond_to?(:method_missing).must_equal non_slop_node.respond_to?(:method_missing)
520
- end
521
- end
522
- end
523
-
524
- describe "#expect_node" do
525
- let(:node) { mock() }
526
- it "throws an error if the xml node doesn't match the passed element name" do
527
- node.expects(:name).returns("NotFoo")
528
- assert_raises RuntimeError do
529
- subject.expect_node("Foo", node)
530
- end
531
- end
532
- end
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 "test_helper"
16
+ require "azure/service/serialization"
17
+
18
+ require 'azure/service/enumeration_results'
19
+ require 'azure/service/signed_identifier'
20
+ require 'azure/service/access_policy'
21
+
22
+ require 'azure/service/storage_service_properties'
23
+ require 'azure/service/logging'
24
+ require 'azure/service/metrics'
25
+ require 'azure/service/retention_policy'
26
+
27
+ describe Azure::Service::Serialization do
28
+ subject { Azure::Service::Serialization }
29
+
30
+ let(:storage_service_properties) { Azure::Service::StorageServiceProperties.new }
31
+ let(:storage_service_properties_xml) { Fixtures["storage_service_properties"] }
32
+
33
+ describe "#signed_identifiers_from_xml" do
34
+ let(:signed_identifiers_xml) { Fixtures["container_acl"]}
35
+
36
+ it "accepts an XML string" do
37
+ subject.signed_identifiers_from_xml signed_identifiers_xml
38
+ end
39
+
40
+ it "returns an Array of SignedIdentifier instances" do
41
+ results = subject.signed_identifiers_from_xml signed_identifiers_xml
42
+ results.must_be_kind_of Array
43
+ results[0].must_be_kind_of Azure::Service::SignedIdentifier
44
+ results.count.must_equal 1
45
+ end
46
+ end
47
+
48
+ describe "#signed_identifiers_to_xml" do
49
+ let(:signed_identifiers) {
50
+ identifier = Azure::Service::SignedIdentifier.new
51
+ identifier.id = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
52
+ identifier.access_policy.start = "2009-09-28T08:49:37.0000000Z"
53
+ identifier.access_policy.expiry = "2009-09-29T08:49:37.0000000Z"
54
+ identifier.access_policy.permission = "rwd"
55
+ [identifier]
56
+ }
57
+
58
+ let(:signed_identifiers_xml) { Fixtures["container_acl"]}
59
+
60
+ it "accepts a list of SignedIdentifier instances" do
61
+ subject.signed_identifiers_to_xml signed_identifiers
62
+ end
63
+
64
+ it "returns a XML graph of the provided values" do
65
+ xml = subject.signed_identifiers_to_xml signed_identifiers
66
+ xml.must_equal signed_identifiers_xml
67
+ end
68
+ end
69
+
70
+ describe "#signed_identifier_from_xml" do
71
+ let(:signed_identifier_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier }
72
+ let(:mock_access_policy) { mock() }
73
+ before { subject.expects(:access_policy_from_xml).with(signed_identifier_xml.AccessPolicy).returns(mock_access_policy) }
74
+
75
+ it "accepts an XML node" do
76
+ subject.signed_identifier_from_xml signed_identifier_xml
77
+ end
78
+
79
+ it "returns a SignedIdentifier instance" do
80
+ identifier = subject.signed_identifier_from_xml signed_identifier_xml
81
+ identifier.must_be_kind_of Azure::Service::SignedIdentifier
82
+ end
83
+
84
+ it "sets the properties of the SignedIdentifier" do
85
+ identifier = subject.signed_identifier_from_xml signed_identifier_xml
86
+ identifier.wont_be_nil
87
+ identifier.id.must_equal "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
88
+ end
89
+ end
90
+
91
+ describe "#access_policy_from_xml" do
92
+ let(:access_policy_xml) { Nokogiri.Slop(Fixtures["container_acl"]).root.SignedIdentifier.AccessPolicy }
93
+
94
+ it "accepts an XML node" do
95
+ subject.access_policy_from_xml access_policy_xml
96
+ end
97
+
98
+ it "returns a AccessPolicy instance" do
99
+ access_policy = subject.access_policy_from_xml access_policy_xml
100
+ access_policy.must_be_kind_of Azure::Service::AccessPolicy
101
+ end
102
+
103
+ it "sets the properties of the AccessPolicy" do
104
+ access_policy = subject.access_policy_from_xml access_policy_xml
105
+
106
+ access_policy.wont_be_nil
107
+ access_policy.start.must_equal "2009-09-28T08:49:37.0000000Z"
108
+ access_policy.expiry.must_equal "2009-09-29T08:49:37.0000000Z"
109
+ access_policy.permission.must_equal "rwd"
110
+ end
111
+ end
112
+
113
+ describe "#enumeration_results_from_xml" do
114
+ let(:enumeration_results_xml) { Fixtures[:list_containers] }
115
+
116
+ describe "when passed an instance of EnumerationResults" do
117
+ let(:enumeration_results) { Azure::Service::EnumerationResults.new }
118
+
119
+ it "parses the XML and populates the provided EnumerationResults instance" do
120
+ result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
121
+ result.must_be :kind_of?, Azure::Service::EnumerationResults
122
+ result.continuation_token.must_equal "video"
123
+ end
124
+
125
+ it "returns the same instance provided" do
126
+ result = subject.enumeration_results_from_xml enumeration_results_xml, enumeration_results
127
+ result.must_equal enumeration_results
128
+ end
129
+ end
130
+
131
+ describe "when passed nil" do
132
+ it "returns a new instance of EnumerationResults" do
133
+ result = subject.enumeration_results_from_xml enumeration_results_xml, nil
134
+ result.must_be_kind_of Azure::Service::EnumerationResults
135
+ end
136
+ end
137
+ end
138
+
139
+ describe "#metadata_from_xml" do
140
+ let(:list_containers_xml) { Fixtures["list_containers"] }
141
+ let(:metadata_xml_node) { Nokogiri.Slop(list_containers_xml).root.Containers.Container[1].Metadata }
142
+
143
+ it "converts a Metadata XML element to a Hash" do
144
+ subject.metadata_from_xml(metadata_xml_node).must_be_kind_of Hash
145
+ end
146
+
147
+ it "uses the child element names as keys" do
148
+ hash = subject.metadata_from_xml(metadata_xml_node)
149
+ hash.has_key?("mymetadata1").must_equal true
150
+ hash.has_key?("mymetadata2").must_equal true
151
+ hash.has_key?("x-ms-invalid-name").must_equal true
152
+ end
153
+
154
+ it "uses the child element text contents as values" do
155
+ hash = subject.metadata_from_xml(metadata_xml_node)
156
+ hash["mymetadata1"].must_equal "first value"
157
+ hash["mymetadata2"].must_equal "second value"
158
+ end
159
+
160
+ describe "when it encounters more than one of the same element name" do
161
+ it "returns and array of values for that key" do
162
+ hash = subject.metadata_from_xml(metadata_xml_node)
163
+ hash["x-ms-invalid-name"].must_be_kind_of Array
164
+ hash["x-ms-invalid-name"].must_equal ["invalid-metadata-name","invalid-metadata-name2"]
165
+ end
166
+ end
167
+ end
168
+
169
+ describe "#metadata_from_headers" do
170
+ let(:headers) { { "Content-Type"=>"application/xml", "Content-Length"=>"37" } }
171
+
172
+ let(:metadata_headers) { headers.merge({ "x-ms-meta-MyMetadata1" => "first value", "x-ms-meta-MyMetadata2" => "second value" })}
173
+
174
+ it "returns a Hash" do
175
+ subject.metadata_from_headers(metadata_headers).must_be_kind_of Hash
176
+ end
177
+
178
+ it "extracts metadata from a Hash for keys that start with x-ms-meta-* and removes that prefix" do
179
+ hash = subject.metadata_from_headers(metadata_headers)
180
+ hash.has_key?("MyMetadata1").must_equal true
181
+ hash.has_key?("MyMetadata2").must_equal true
182
+ end
183
+
184
+ it "sets the metadata values to the corresponding header values" do
185
+ hash = subject.metadata_from_headers(metadata_headers)
186
+ hash["MyMetadata1"].must_equal "first value"
187
+ hash["MyMetadata2"].must_equal "second value"
188
+ end
189
+ end
190
+
191
+ describe "#retention_policy_to_xml" do
192
+ let(:retention_policy) {
193
+ retention_policy = Azure::Service::RetentionPolicy.new
194
+ retention_policy.enabled = true
195
+ retention_policy.days = 7
196
+
197
+ retention_policy
198
+ }
199
+
200
+ let(:retention_policy_xml) { Fixtures["retention_policy"]}
201
+
202
+ it "accepts a RetentionPolicy instance and an Nokogiri::XML::Builder instance" do
203
+ Nokogiri::XML::Builder.new do |xml|
204
+ subject.retention_policy_to_xml retention_policy, xml
205
+ end
206
+ end
207
+
208
+ it "adds to the XML Builder, which will create the XML graph of the provided values" do
209
+ builder = Nokogiri::XML::Builder.new do |xml|
210
+ subject.retention_policy_to_xml retention_policy, xml
211
+ end
212
+ builder.to_xml.must_equal retention_policy_xml
213
+ end
214
+ end
215
+
216
+ describe "#retention_policy_from_xml" do
217
+ let(:retention_policy_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.HourMetrics.RetentionPolicy }
218
+
219
+ it "accepts an XML Node" do
220
+ subject.retention_policy_from_xml retention_policy_xml
221
+ end
222
+
223
+ it "returns an RetentionPolicy instance" do
224
+ retention_policy = subject.retention_policy_from_xml retention_policy_xml
225
+ retention_policy.wont_be_nil
226
+ retention_policy.must_be_kind_of Azure::Service::RetentionPolicy
227
+ end
228
+
229
+ it "sets the properties of the RetentionPolicy instance" do
230
+ retention_policy = subject.retention_policy_from_xml retention_policy_xml
231
+ retention_policy.enabled.must_equal true
232
+ retention_policy.days.must_equal 7
233
+ end
234
+ end
235
+
236
+ describe "#hour_metrics_to_xml" do
237
+ let(:metrics) {
238
+ metrics = Azure::Service::Metrics.new
239
+ metrics.version = "1.0"
240
+ metrics.enabled = true
241
+ metrics.include_apis = false
242
+ retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
243
+ retention_policy.enabled = true
244
+ retention_policy.days = 7
245
+
246
+ metrics
247
+ }
248
+
249
+ let(:metrics_xml) { Fixtures["metrics"]}
250
+
251
+ it "accepts a Metrics instance and an Nokogiri::XML::Builder instance" do
252
+ Nokogiri::XML::Builder.new do |xml|
253
+ subject.hour_metrics_to_xml metrics, xml
254
+ end
255
+ end
256
+
257
+ it "adds to the XML Builder, which will create the XML graph of the provided values" do
258
+ builder = Nokogiri::XML::Builder.new do |xml|
259
+ subject.hour_metrics_to_xml metrics, xml
260
+ end
261
+ builder.to_xml.must_equal metrics_xml
262
+ end
263
+ end
264
+
265
+ describe "#metrics_from_xml" do
266
+ let(:metrics_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.HourMetrics }
267
+ let(:mock_retention_policy) { mock }
268
+
269
+ before {
270
+ subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
271
+ }
272
+
273
+ it "accepts an XML Node" do
274
+ subject.metrics_from_xml metrics_xml
275
+ end
276
+
277
+ it "returns an Metrics instance" do
278
+ metrics = subject.metrics_from_xml metrics_xml
279
+ metrics.wont_be_nil
280
+ metrics.must_be_kind_of Azure::Service::Metrics
281
+ end
282
+
283
+ it "sets the properties of the Metrics instance" do
284
+ metrics = subject.metrics_from_xml metrics_xml
285
+ metrics.version.must_equal "1.0"
286
+ metrics.enabled.must_equal true
287
+ metrics.include_apis.must_equal false
288
+ metrics.retention_policy.must_equal mock_retention_policy
289
+ end
290
+ end
291
+
292
+
293
+ describe "#logging_to_xml" do
294
+ let(:logging) {
295
+ logging = Azure::Service::Logging.new
296
+ logging.version = "1.0"
297
+ logging.delete = true
298
+ logging.read = false
299
+ logging.write = true
300
+
301
+ retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
302
+ retention_policy.enabled = true
303
+ retention_policy.days = 7
304
+
305
+ logging
306
+ }
307
+
308
+ let(:logging_xml) { Fixtures["logging"]}
309
+
310
+ it "accepts a Logging instance and an Nokogiri::XML::Builder instance" do
311
+ Nokogiri::XML::Builder.new do |xml|
312
+ subject.logging_to_xml logging, xml
313
+ end
314
+ end
315
+
316
+ it "adds to the XML Builder, which will create the XML graph of the provided values" do
317
+ builder = Nokogiri::XML::Builder.new do |xml|
318
+ subject.logging_to_xml logging, xml
319
+ end
320
+ builder.to_xml.must_equal logging_xml
321
+ end
322
+ end
323
+
324
+ describe "#logging_from_xml" do
325
+ let(:logging_xml) { Nokogiri.Slop(Fixtures["storage_service_properties"]).root.Logging }
326
+ let(:mock_retention_policy) { mock }
327
+
328
+ before {
329
+ subject.expects(:retention_policy_from_xml).returns(mock_retention_policy)
330
+ }
331
+
332
+ it "accepts an XML Node" do
333
+ subject.logging_from_xml logging_xml
334
+ end
335
+
336
+ it "returns an Logging instance" do
337
+ logging = subject.logging_from_xml logging_xml
338
+ logging.wont_be_nil
339
+ logging.must_be_kind_of Azure::Service::Logging
340
+ end
341
+
342
+ it "sets the properties of the Logging instance" do
343
+ logging = subject.logging_from_xml logging_xml
344
+ logging.version.must_equal "1.0"
345
+ logging.delete.must_equal true
346
+ logging.read.must_equal false
347
+ logging.write.must_equal true
348
+ logging.retention_policy.must_equal mock_retention_policy
349
+ end
350
+ end
351
+
352
+ describe "#service_properties_to_xml" do
353
+ let(:service_properties) {
354
+ service_properties = Azure::Service::StorageServiceProperties.new
355
+ service_properties.default_service_version = "2011-08-18"
356
+ logging = service_properties.logging = Azure::Service::Logging.new
357
+ logging.version = "1.0"
358
+ logging.delete = true
359
+ logging.read = false
360
+ logging.write = true
361
+ retention_policy = logging.retention_policy = Azure::Service::RetentionPolicy.new
362
+ retention_policy.enabled = true
363
+ retention_policy.days = 7
364
+
365
+ metrics = service_properties.hour_metrics = Azure::Service::Metrics.new
366
+ metrics.version = "1.0"
367
+ metrics.enabled = true
368
+ metrics.include_apis = false
369
+ retention_policy = metrics.retention_policy = Azure::Service::RetentionPolicy.new
370
+ retention_policy.enabled = true
371
+ retention_policy.days = 7
372
+
373
+ service_properties.minute_metrics = metrics
374
+
375
+ service_properties.cors = Azure::Service::Cors.new do |cors|
376
+ cors.cors_rules = []
377
+ cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
378
+ cors_rule.allowed_origins = ["http://www.contoso.com", "http://dummy.uri"]
379
+ cors_rule.allowed_methods = ["PUT", "HEAD"]
380
+ cors_rule.max_age_in_seconds = 5
381
+ cors_rule.exposed_headers = ["x-ms-*"]
382
+ cors_rule.allowed_headers = ["x-ms-blob-content-type", "x-ms-blob-content-disposition"]
383
+ })
384
+
385
+ cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
386
+ cors_rule.allowed_origins = ["*"]
387
+ cors_rule.allowed_methods = ["PUT", "GET"]
388
+ cors_rule.max_age_in_seconds = 5
389
+ cors_rule.exposed_headers = ["x-ms-*"]
390
+ cors_rule.allowed_headers = ["x-ms-blob-content-type", "x-ms-blob-content-disposition"]
391
+ })
392
+
393
+ cors.cors_rules.push(Azure::Service::CorsRule.new { |cors_rule|
394
+ cors_rule.allowed_origins = ["http://www.contoso.com"]
395
+ cors_rule.allowed_methods = ["GET"]
396
+ cors_rule.max_age_in_seconds = 5
397
+ cors_rule.exposed_headers = ["x-ms-*"]
398
+ cors_rule.allowed_headers = ["x-ms-client-request-id"]
399
+ })
400
+ end
401
+
402
+ service_properties
403
+ }
404
+
405
+ let(:service_properties_xml) { Fixtures["storage_service_properties"]}
406
+
407
+ it "accepts a StorageServiceProperties instance" do
408
+ subject.service_properties_to_xml service_properties
409
+ end
410
+
411
+ it "returns a XML graph of the provided values" do
412
+ xml = subject.service_properties_to_xml service_properties
413
+ xml.must_equal service_properties_xml
414
+ end
415
+ end
416
+
417
+ describe "#service_properties_from_xml" do
418
+ let(:service_properties_xml) { Fixtures["storage_service_properties"]}
419
+ let(:mock_logging) { mock }
420
+ let(:mock_metrics) { mock }
421
+ let(:mock_cors) { mock }
422
+
423
+ before {
424
+ subject.expects(:logging_from_xml).returns(mock_logging)
425
+ subject.expects(:metrics_from_xml).twice.returns(mock_metrics)
426
+ subject.expects(:cors_from_xml).returns(mock_cors)
427
+ }
428
+
429
+ it "accepts an XML string" do
430
+ subject.service_properties_from_xml service_properties_xml
431
+ end
432
+
433
+ it "returns an StorageServiceProperties instance" do
434
+ service_properties = subject.service_properties_from_xml service_properties_xml
435
+ service_properties.wont_be_nil
436
+ service_properties.must_be_kind_of Azure::Service::StorageServiceProperties
437
+ end
438
+
439
+ it "sets the properties of the StorageServiceProperties instance" do
440
+ service_properties = subject.service_properties_from_xml service_properties_xml
441
+ service_properties.logging.must_equal mock_logging
442
+ service_properties.hour_metrics.must_equal mock_metrics
443
+ service_properties.minute_metrics.must_equal mock_metrics
444
+ end
445
+ end
446
+
447
+ describe "#to_bool" do
448
+ it "converts a valid string value to a Boolean" do
449
+ subject.to_bool('true').must_be_kind_of TrueClass
450
+ subject.to_bool('false').must_be_kind_of FalseClass
451
+ end
452
+
453
+ it "is case insensitive" do
454
+ # mixed case
455
+ subject.to_bool('True').must_equal true
456
+
457
+ # upper case
458
+ subject.to_bool('TRUE').must_equal true
459
+ end
460
+
461
+ it "returns false for any value other than 'true'" do
462
+ subject.to_bool('random string').must_equal false
463
+ subject.to_bool(nil).must_equal false
464
+ end
465
+ end
466
+
467
+ describe "#slopify" do
468
+ let(:xml_data) { '<?xml version="1.0" encoding="utf-8"?><Foo></Foo>' }
469
+ let(:document) { Nokogiri.Slop xml_data }
470
+ let(:root_node) { document.root }
471
+ let(:non_slop_node) { Nokogiri.parse(xml_data).root }
472
+
473
+ describe "when passed a String" do
474
+
475
+ it "parses the string into a Nokogiri::XML::Element node" do
476
+ result = subject.slopify(xml_data)
477
+ result.must_be_kind_of Nokogiri::XML::Element
478
+ end
479
+
480
+ it "returns the root of the parsed Document" do
481
+ result = subject.slopify(xml_data)
482
+ result.name.must_equal root_node.name
483
+ end
484
+
485
+ it "enables Nokogiri 'Slop' mode on the returned Element" do
486
+ result = subject.slopify(xml_data)
487
+ result.must_respond_to :method_missing
488
+ end
489
+ end
490
+
491
+ describe "when passed a Nokogiri::XML::Document" do
492
+ it "returns a Nokogiri::XML::Element node" do
493
+ result = subject.slopify(document)
494
+ result.must_be_kind_of Nokogiri::XML::Element
495
+ end
496
+
497
+ it "returns the root of the Document" do
498
+ result = subject.slopify(document)
499
+ result.name.must_equal root_node.name
500
+ end
501
+
502
+ it "enables Nokogiri 'Slop' mode on the returned Element" do
503
+ result = subject.slopify(xml_data)
504
+ result.must_respond_to :method_missing
505
+ end
506
+ end
507
+
508
+ describe "when passed a Nokogiri::XML::Element" do
509
+ it "returns the Element unchanged" do
510
+ result = subject.slopify(root_node)
511
+ result.must_equal root_node
512
+ end
513
+
514
+ it "does not enable Nokogiri 'Slop' mode on the returned Element if it didn't already have it" do
515
+ result = subject.slopify(root_node)
516
+ result.respond_to?(:method_missing).must_equal root_node.respond_to?(:method_missing)
517
+
518
+ result = subject.slopify(non_slop_node)
519
+ result.respond_to?(:method_missing).must_equal non_slop_node.respond_to?(:method_missing)
520
+ end
521
+ end
522
+ end
523
+
524
+ describe "#expect_node" do
525
+ let(:node) { mock() }
526
+ it "throws an error if the xml node doesn't match the passed element name" do
527
+ node.expects(:name).returns("NotFoo")
528
+ assert_raises RuntimeError do
529
+ subject.expect_node("Foo", node)
530
+ end
531
+ end
532
+ end
533
533
  end