rews 0.2.12 → 0.5.0

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.
@@ -63,6 +63,16 @@ module Rews
63
63
  Hash[h.map{|k,v| [camelize(k.to_s), v]}]
64
64
  end
65
65
 
66
+ # convert rsxml to xml, transforming tags to CamelCase and prefixing with
67
+ # the t: namespace prefix
68
+ def rsxml_to_xml(sexp)
69
+ Rsxml.to_xml(sexp) do |tag, attrs|
70
+ ttag = "t:#{camelize(tag.to_s)}"
71
+ tattrs = Hash[attrs.map{|k,v| [camelize(k.to_s), v]}]
72
+ [ttag, tattrs]
73
+ end
74
+ end
75
+
66
76
  # check the response codes of an Exchange Web Services request.
67
77
  # the supplied block makes a SOAP request, and the response is parsed
68
78
  # out and checked
@@ -82,7 +92,7 @@ module Rews
82
92
 
83
93
  errors = all_statuses.map{|s| single_error_check(client, s)}.compact
84
94
  rescue Exception=>e
85
- client.log{|logger| logger.warn(e)}
95
+ Rews.log{|logger| logger.warn(e)}
86
96
  tag_exception(e, :savon_response=>response)
87
97
  raise e
88
98
  end
@@ -102,7 +112,7 @@ module Rews
102
112
  if status[:response_class] == "Error"
103
113
  return "#{status[:response_code]} - #{status[:message_text]}"
104
114
  elsif status[:response_class] == "Warning"
105
- client.log{|logger| logger.warn("#{status[:response_code]} - #{status[:message_text]}")}
115
+ Rews.log{|logger| logger.warn("#{status[:response_code]} - #{status[:message_text]}")}
106
116
  end
107
117
  end
108
118
  end
@@ -4,7 +4,8 @@ class RequestProxy
4
4
  attr_accessor :soap
5
5
  attr_accessor :http
6
6
  def initialize
7
- @soap=Object.new
7
+ soap_struct = Struct.new(:body)
8
+ @soap = soap_struct.new
8
9
  @http=Object.new
9
10
  end
10
11
 
@@ -16,5 +17,28 @@ class RequestProxy
16
17
  def method_missing(method, *args, &block)
17
18
  @self_before_instance_eval.send method, *args, &block
18
19
  end
20
+
21
+ class << self
22
+ # mocks a request to the savon client, and validates that the body xml generated
23
+ # is correct
24
+ def mock_request(example, client, action, attrs, response, &validate_block)
25
+ # deal with different call arity
26
+ example.mock(client).savon_client.mock!.request(*[:wsdl, action, attrs].compact) do |*args|
27
+ block = args.last # block is the last arg
28
+
29
+ ctx = RequestProxy.new()
30
+ example.mock(ctx.http).headers.mock!["SOAPAction"]="\"#{Rews::SCHEMA_MESSAGES}/#{action}\""
31
+ ns = Object.new
32
+ example.mock(ctx.soap).namespaces{ns}
33
+ example.mock(ns)["xmlns:t"]=Rews::SCHEMA_TYPES
34
+ # mock(ctx.soap).body=(anything)
35
+
36
+ ctx.eval_with_delegation(&block)
37
+
38
+ validate_block.call(ctx.soap.body) if validate_block
39
+ response
40
+ end
41
+ end
42
+ end
19
43
  end
20
44
 
@@ -17,5 +17,309 @@ module Rews
17
17
 
18
18
  client.distinguished_folder_id('inbox')
19
19
  end
20
+
21
+ describe "create_item" do
22
+ def test_create_item(client, items, &validate_block)
23
+ response = Object.new
24
+ mock(response).to_hash{{:create_item_response=>{:response_messages=>{:create_item_response_message=>{:response_class=>"Success"}}}}}
25
+
26
+ RequestProxy.mock_request(self,
27
+ client,
28
+ "CreateItem",
29
+ {},
30
+ response,
31
+ &validate_block)
32
+ client.create_item(:items=>items)
33
+ end
34
+
35
+ it "should create a CreateItem request and render the Items to the body" do
36
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
37
+ test_create_item(client, [[:suppress_read_receipt, [:reference_item_id, {:id=>"abc", :change_key=>"def"}]]]) do |body|
38
+ rsxml = Rsxml.to_rsxml(body, :ns=>{"wsdl"=>"ews_wsdl", "t"=>"ews_types"})
39
+ rsxml.should == ["wsdl:Items",{"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types"},
40
+ ["t:SuppressReadReceipt",
41
+ ["t:ReferenceItemId", {"Id"=>"abc", "ChangeKey"=>"def"}]]]
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "suppress_read_receipt" do
47
+ def test_suppress_read_receipt(client, item_or_item_ids, &validate_block)
48
+ response = Object.new
49
+ mock(response).to_hash{{:create_item_response=>{:response_messages=>{:create_item_response_message=>{:response_class=>"Success"}}}}}
50
+
51
+ RequestProxy.mock_request(self,
52
+ client,
53
+ "CreateItem",
54
+ {},
55
+ response,
56
+ &validate_block)
57
+ client.suppress_read_receipt(item_or_item_ids)
58
+ end
59
+
60
+ it "should send a CreateItemRequest with SuppressReadReceipt items for each ItemId" do
61
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
62
+ test_suppress_read_receipt(client, [Item::ItemId.new(client, {:id=>"abc", :change_key=>"def"}),
63
+ Item::ItemId.new(client, {:id=>"ghi", :change_key=>"jkl"})]) do |body|
64
+ rsxml = Rsxml.to_rsxml(body, :ns=>{"wsdl"=>"ews_wsdl", "t"=>"ews_types"})
65
+ rsxml.should == ["wsdl:Items", {"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types"},
66
+ ["t:SuppressReadReceipt",
67
+ ["t:ReferenceItemId", {"Id"=>"abc", "ChangeKey"=>"def"}]],
68
+ ["t:SuppressReadReceipt",
69
+ ["t:ReferenceItemId", {"Id"=>"ghi", "ChangeKey"=>"jkl"}]]]
70
+ end
71
+ end
72
+
73
+ it "should send a CreateItemRequest with SuppressReadReceipt items for each Item" do
74
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
75
+ test_suppress_read_receipt(client, [Item::Item.new(client, 'Message', {:item_id=>{:id=>'abc', :change_key=>'def'}}),
76
+ Item::Item.new(client, 'Message', {:item_id=>{:id=>'ghi', :change_key=>'jkl'}})]) do |body|
77
+ rsxml = Rsxml.to_rsxml(body, :ns=>{"wsdl"=>"ews_wsdl", "t"=>"ews_types"})
78
+ rsxml.should == ["wsdl:Items", {"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types"},
79
+ ["t:SuppressReadReceipt",
80
+ ["t:ReferenceItemId", {"Id"=>"abc", "ChangeKey"=>"def"}]],
81
+ ["t:SuppressReadReceipt",
82
+ ["t:ReferenceItemId", {"Id"=>"ghi", "ChangeKey"=>"jkl"}]]]
83
+ end
84
+ end
85
+
86
+ it "should filter Items with IsRead=true or IsReadReceiptRequested=false before making request" do
87
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
88
+ test_suppress_read_receipt(client, [Item::Item.new(client,
89
+ 'Message',
90
+ {:item_id=>{:id=>'abc', :change_key=>'def'},
91
+ :is_read=>true}),
92
+ Item::Item.new(client, 'Message', {:item_id=>{:id=>'ghi', :change_key=>'jkl'}}),
93
+ Item::Item.new(client,
94
+ 'Message',
95
+ {:item_id=>{:id=>'mno', :change_key=>'pqr'},
96
+ :is_read_receipt_requested=>false})]) do |body|
97
+ rsxml = Rsxml.to_rsxml(body, :ns=>{"wsdl"=>"ews_wsdl", "t"=>"ews_types"})
98
+ rsxml.should == ["wsdl:Items", {"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types"},
99
+ ["t:SuppressReadReceipt",
100
+ ["t:ReferenceItemId", {"Id"=>"ghi", "ChangeKey"=>"jkl"}]]]
101
+ end
102
+ end
103
+ end
104
+
105
+ describe "get_item" do
106
+ def test_get_item(client, item_shape, ignore_change_keys, message_ids, result)
107
+ shape = Object.new
108
+ mock(Shape::ItemShape).new(item_shape||{}){shape}
109
+ mock(shape).to_xml{""}
110
+
111
+ message_ids = message_ids.result if message_ids.is_a?(Folder::FindResult)
112
+ message_ids.each do |mid|
113
+ if mid.is_a?(Item::Item)
114
+ mock(mid.item_id).to_xml(ignore_change_keys){""}
115
+ else
116
+ mock(mid).to_xml(ignore_change_keys){""}
117
+ end
118
+ end
119
+
120
+ response = Object.new
121
+ mock(response).to_hash{{:get_item_response=>{:response_messages=>{:get_item_response_message=>{:response_class=>"Success", :items=>result}}}}}
122
+
123
+ RequestProxy.mock_request(self, client, "GetItem", nil, response)
124
+
125
+ opts = {}
126
+ opts[:item_shape]=item_shape if item_shape
127
+ opts[:ignore_change_keys]=ignore_change_keys if ignore_change_keys
128
+ client.get_item(message_ids, opts)
129
+ end
130
+
131
+ it "should generate xml including all provided ItemIds and parse response" do
132
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
133
+ items = test_get_item(client,
134
+ {:base_shape=>:IdOnly},
135
+ nil,
136
+ [Item::ItemId.new(client, {:id=>"abc", :change_key=>"def"})],
137
+ {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
138
+ items.size.should == 1
139
+ msg=items.first
140
+ msg.item_id.should == Item::ItemId.new(client, :id=>"abc", :change_key=>"def")
141
+ end
142
+
143
+ it "should generate xml ignoring change keys if requested and parsing a response with multiple items" do
144
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
145
+ items = test_get_item(client,
146
+ {:base_shape=>:Default},
147
+ true,
148
+ [Item::ItemId.new(client, {:id=>"abc", :change_key=>"def"}),
149
+ Item::ItemId.new(client, {:id=>"ghi", :change_key=>"jkl"})],
150
+ {:message=>[{:item_id=>{:id=>"abc", :change_key=>"def"}},
151
+ {:item_id=>{:id=>"ghi", :change_key=>"jkl"}}]})
152
+ items.size.should == 2
153
+ items.first.item_id.should == Item::ItemId.new(client, :id=>"abc", :change_key=>"def")
154
+ items[1].item_id.should == Item::ItemId.new(client, :id=>"ghi", :change_key=>"jkl")
155
+ end
156
+
157
+ it "should extract ItemIds from Items if items are provided as identifiers" do
158
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
159
+ items = test_get_item(client,
160
+ {:base_shape=>:Default},
161
+ true,
162
+ [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
163
+ Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})],
164
+ {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
165
+ end
166
+
167
+ it "should extract results from a FindResult if a FindResult is provided for identifiers" do
168
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
169
+ items = test_get_item(client,
170
+ {:base_shape=>:Default},
171
+ true,
172
+ Folder::FindResult.new({}) {
173
+ [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
174
+ Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})]},
175
+ {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
176
+ end
177
+ end
178
+
179
+
180
+
181
+ describe "update_item" do
182
+ def test_update_item(client,
183
+ conflict_resolution,
184
+ message_disposition,
185
+ ignore_change_keys,
186
+ updates,
187
+ message_ids,
188
+ &validate_block)
189
+
190
+ message_ids = message_ids.result if message_ids.is_a?(Folder::FindResult)
191
+ message_ids.each do |mid|
192
+ if mid.is_a?(Item::Item)
193
+ proy(mid.item_id).to_xml(ignore_change_keys)
194
+ else
195
+ proxy(mid).to_xml(ignore_change_keys)
196
+ end
197
+ end
198
+
199
+ response = Object.new
200
+ mock(response).to_hash{{:update_item_response=>{:response_messages=>{:update_item_response_message=>{:response_class=>"Success"}}}}}
201
+
202
+ RequestProxy.mock_request(self, client, "UpdateItem",
203
+ { :ConflictResolution=>conflict_resolution || "AutoResolve",
204
+ :MessageDisposition=>message_disposition || "SaveOnly"},
205
+ response,
206
+ &validate_block)
207
+
208
+ opts = {}
209
+ opts[:conflict_resolution]=conflict_resolution if conflict_resolution
210
+ opts[:message_disposition]=message_disposition if message_disposition
211
+ opts[:ignore_change_keys]=ignore_change_keys if !ignore_change_keys.nil?
212
+ opts[:updates]=updates
213
+ client.update_item(message_ids, opts)
214
+ end
215
+
216
+ it "should generate body xml and parse response for a single update" do
217
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
218
+ test_update_item(client, nil, nil, nil,
219
+ SetItemField.new("message:IsRead", [:message, [:is_read, "true"]]),
220
+ [Item::ItemId.new(client, :id=>"abc", :change_key=>"def")]) do |body|
221
+
222
+ rsxml = Rsxml.to_rsxml(body, :ns=>{:wsdl=>"ews_wsdl", :t=>"ews_types", ""=>"ews_wsdl"})
223
+ Rsxml.compare(rsxml, ["wsdl:ItemChanges", {"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types", "xmlns"=>"ews_wsdl"},
224
+ ["t:ItemChange",
225
+ ["t:ItemId", {"Id"=>"abc", "ChangeKey"=>"def"}],
226
+ ["t:Updates",
227
+ ["t:SetItemField",
228
+ ["t:FieldURI", {"FieldURI"=>"message:IsRead"}],
229
+ ["t:Message", ["t:IsRead", "true"]]]]]]).should == true
230
+ end
231
+ end
232
+
233
+ it "should generate body xml and parse response for a multiple updates of multiple items" do
234
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
235
+ test_update_item(client, nil, nil, nil,
236
+ [SetItemField.new("message:IsRead", [:message, [:is_read, "true"]]),
237
+ SetItemField.new("item:Blah", [:item, [:blah, "blah"]])],
238
+ [Item::ItemId.new(client, :id=>"abc", :change_key=>"def"),
239
+ Item::ItemId.new(client, :id=>"ghi", :change_key=>"jkl")]) do |body|
240
+
241
+ rsxml = Rsxml.to_rsxml(body, :ns=>{:wsdl=>"ews_wsdl", :t=>"ews_types", ""=>"ews_wsdl"})
242
+ Rsxml.compare(rsxml, ["wsdl:ItemChanges", {"xmlns:wsdl"=>"ews_wsdl", "xmlns:t"=>"ews_types", "xmlns"=>"ews_wsdl"},
243
+ ["t:ItemChange",
244
+ ["t:ItemId", {"Id"=>"abc", "ChangeKey"=>"def"}],
245
+ ["t:Updates",
246
+ ["t:SetItemField",
247
+ ["t:FieldURI", {"FieldURI"=>"message:IsRead"}],
248
+ ["t:Message", ["t:IsRead", "true"]]],
249
+ ["t:SetItemField",
250
+ ["t:FieldURI", {"FieldURI"=>"item:Blah"}],
251
+ ["t:Item", ["t:Blah", "blah"]]]]],
252
+ ["t:ItemChange",
253
+ ["t:ItemId", {"Id"=>"ghi", "ChangeKey"=>"jkl"}],
254
+ ["t:Updates",
255
+ ["t:SetItemField",
256
+ ["t:FieldURI", {"FieldURI"=>"message:IsRead"}],
257
+ ["t:Message", ["t:IsRead", "true"]]],
258
+ ["t:SetItemField",
259
+ ["t:FieldURI", {"FieldURI"=>"item:Blah"}],
260
+ ["t:Item", ["t:Blah", "blah"]]]]]]).should == true
261
+ end
262
+ end
263
+
264
+ end
265
+
266
+
267
+
268
+ describe "delete_item" do
269
+ def test_delete_item(client, delete_type, ignore_change_keys, message_ids)
270
+ message_ids = message_ids.result if message_ids.is_a?(Folder::FindResult)
271
+ message_ids.each do |mid|
272
+ if mid.is_a?(Item::Item)
273
+ mock(mid.item_id).to_xml(ignore_change_keys){""}
274
+ else
275
+ mock(mid).to_xml(ignore_change_keys){""}
276
+ end
277
+ end
278
+
279
+ response = Object.new
280
+ mock(response).to_hash{{:delete_item_response=>{:response_messages=>{:delete_item_response_message=>{:response_class=>"Success"}}}}}
281
+
282
+ RequestProxy.mock_request(self, client, "DeleteItem", {:DeleteType=>delete_type}, response)
283
+
284
+ opts = {}
285
+ opts[:delete_type]=delete_type if delete_type
286
+ opts[:ignore_change_keys]=ignore_change_keys if ignore_change_keys
287
+ client.delete_item(message_ids, opts)
288
+ end
289
+
290
+ it "should generate xml including a single ItemId" do
291
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
292
+ test_delete_item(client, :HardDelete, nil, [Item::ItemId.new(client, :id=>"abc", :change_key=>"def")])
293
+ end
294
+
295
+ it "should generate xml ignoring change keys and including multiple ItemIds" do
296
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
297
+ test_delete_item(client,
298
+ :HardDelete,
299
+ true,
300
+ [Item::ItemId.new(client, :id=>"abc", :change_key=>"def"),
301
+ Item::ItemId.new(client, :id=>"ghi", :change_key=>"jkl")])
302
+ end
303
+
304
+ it "should extract ItemIds from Items if Items are provided as identifiers" do
305
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
306
+ test_delete_item(client,
307
+ :HardDelete,
308
+ true,
309
+ [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
310
+ Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})])
311
+ end
312
+
313
+ it "should extract ItemIds from a FindResult if a FindResult is provided as identifiers" do
314
+ client = Client.new("https://foo/EWS/Exchange.asmx", :ntlm, "EXCHDOM\\foo", "password")
315
+ test_delete_item(client,
316
+ :HardDelete,
317
+ true,
318
+ Folder::FindResult.new({}) {[Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
319
+ Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})]})
320
+ end
321
+ end
322
+
323
+
20
324
  end
21
325
  end
@@ -88,23 +88,6 @@ module Rews
88
88
  end
89
89
 
90
90
  describe Folder::BaseFolderId do
91
- def mock_request(client, action, attrs, response)
92
- # deal with different call arity
93
- mock(client).savon_client.mock!.request(*[:wsdl, action, attrs].compact) do |*args|
94
- block = args.last # block is the last arg
95
-
96
- ctx = RequestProxy.new()
97
- mock(ctx.http).headers.mock!["SOAPAction"]="\"#{SCHEMA_MESSAGES}/#{action}\""
98
- ns = Object.new
99
- mock(ctx.soap).namespaces{ns}
100
- mock(ns)["xmlns:t"]=Rews::SCHEMA_TYPES
101
- mock(ctx.soap).body=(anything)
102
-
103
- ctx.eval_with_delegation(&block)
104
- response
105
- end
106
- end
107
-
108
91
  describe "find_folder" do
109
92
  def test_find_folder(client, folder_shape, indexed_page_folder_view, restriction, result)
110
93
  shape = Object.new
@@ -129,7 +112,7 @@ module Rews
129
112
  response = Object.new
130
113
  mock(response).to_hash{{:find_folder_response=>{:response_messages=>{:find_folder_response_message=>{:response_class=>"Success", :root_folder=>result}}}}}
131
114
 
132
- mock_request(client, "FindFolder", {"Traversal"=>"Shallow"}, response)
115
+ RequestProxy.mock_request(self, client, "FindFolder", {"Traversal"=>"Shallow"}, response)
133
116
 
134
117
  opts = {}
135
118
  opts[:folder_shape] = folder_shape if folder_shape
@@ -227,7 +210,7 @@ module Rews
227
210
  response = Object.new
228
211
  mock(response).to_hash{{:find_item_response=>{:response_messages=>{:find_item_response_message=>{:response_class=>"Success", :root_folder=>result}}}}}
229
212
 
230
- mock_request(client, "FindItem", {"Traversal"=>"Shallow"}, response)
213
+ RequestProxy.mock_request(self, client, "FindItem", {"Traversal"=>"Shallow"}, response)
231
214
 
232
215
  opts = {}
233
216
  opts[:item_shape] = item_shape if item_shape
@@ -314,139 +297,8 @@ module Rews
314
297
  end
315
298
  end
316
299
 
317
- describe "get_item" do
318
- def test_get_item(client, item_shape, ignore_change_keys, message_ids, result)
319
- shape = Object.new
320
- mock(Shape::ItemShape).new(item_shape||{}){shape}
321
- mock(shape).to_xml{""}
322
-
323
- fid = Folder::DistinguishedFolderId.new(client, 'blah')
324
-
325
- message_ids = message_ids.result if message_ids.is_a?(Folder::FindResult)
326
- message_ids.each do |mid|
327
- if mid.is_a?(Item::Item)
328
- mock(mid.item_id).to_xml(ignore_change_keys){""}
329
- else
330
- mock(mid).to_xml(ignore_change_keys){""}
331
- end
332
- end
333
-
334
- response = Object.new
335
- mock(response).to_hash{{:get_item_response=>{:response_messages=>{:get_item_response_message=>{:response_class=>"Success", :items=>result}}}}}
336
-
337
- mock_request(client, "GetItem", nil, response)
338
-
339
- opts = {}
340
- opts[:item_shape]=item_shape if item_shape
341
- opts[:ignore_change_keys]=ignore_change_keys if ignore_change_keys
342
- fid.get_item(message_ids, opts)
343
- end
344
-
345
- it "should generate xml including all provided ItemIds and parse response" do
346
- client = Object.new
347
- items = test_get_item(client,
348
- {:base_shape=>:IdOnly},
349
- nil,
350
- [Item::ItemId.new(client, {:id=>"abc", :change_key=>"def"})],
351
- {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
352
- items.size.should == 1
353
- msg=items.first
354
- msg.item_id.should == Item::ItemId.new(client, :id=>"abc", :change_key=>"def")
355
- end
356
-
357
- it "should generate xml ignoring change keys if requested and parsing a response with multiple items" do
358
- client = Object.new
359
- items = test_get_item(client,
360
- {:base_shape=>:Default},
361
- true,
362
- [Item::ItemId.new(client, {:id=>"abc", :change_key=>"def"}),
363
- Item::ItemId.new(client, {:id=>"ghi", :change_key=>"jkl"})],
364
- {:message=>[{:item_id=>{:id=>"abc", :change_key=>"def"}},
365
- {:item_id=>{:id=>"ghi", :change_key=>"jkl"}}]})
366
- items.size.should == 2
367
- items.first.item_id.should == Item::ItemId.new(client, :id=>"abc", :change_key=>"def")
368
- items[1].item_id.should == Item::ItemId.new(client, :id=>"ghi", :change_key=>"jkl")
369
- end
370
-
371
- it "should extract ItemIds from Items if items are provided as identifiers" do
372
- client = Object.new
373
- items = test_get_item(client,
374
- {:base_shape=>:Default},
375
- true,
376
- [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
377
- Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})],
378
- {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
379
- end
380
-
381
- it "should extract results from a FindResult if a FindResult is provided for identifiers" do
382
- client = Object.new
383
- items = test_get_item(client,
384
- {:base_shape=>:Default},
385
- true,
386
- Folder::FindResult.new({}) {
387
- [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
388
- Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})]},
389
- {:message=>{:item_id=>{:id=>"abc", :change_key=>"def"}}})
390
- end
391
- end
392
-
393
- describe "delete_item" do
394
- def test_delete_item(client, delete_type, ignore_change_keys, message_ids)
395
-
396
- fid = Folder::DistinguishedFolderId.new(client, 'blah')
397
-
398
- message_ids = message_ids.result if message_ids.is_a?(Folder::FindResult)
399
- message_ids.each do |mid|
400
- if mid.is_a?(Item::Item)
401
- mock(mid.item_id).to_xml(ignore_change_keys){""}
402
- else
403
- mock(mid).to_xml(ignore_change_keys){""}
404
- end
405
- end
406
-
407
- response = Object.new
408
- mock(response).to_hash{{:delete_item_response=>{:response_messages=>{:delete_item_response_message=>{:response_class=>"Success"}}}}}
409
-
410
- mock_request(client, "DeleteItem", {:DeleteType=>delete_type}, response)
411
-
412
- opts = {}
413
- opts[:delete_type]=delete_type if delete_type
414
- opts[:ignore_change_keys]=ignore_change_keys if ignore_change_keys
415
- fid.delete_item(message_ids, opts)
416
- end
417
-
418
- it "should generate xml including a single ItemId" do
419
- client = Object.new
420
- test_delete_item(client, :HardDelete, nil, [Item::ItemId.new(client, :id=>"abc", :change_key=>"def")])
421
- end
422
-
423
- it "should generate xml ignoring change keys and including multiple ItemIds" do
424
- client = Object.new
425
- test_delete_item(client,
426
- :HardDelete,
427
- true,
428
- [Item::ItemId.new(client, :id=>"abc", :change_key=>"def"),
429
- Item::ItemId.new(client, :id=>"ghi", :change_key=>"jkl")])
430
- end
431
300
 
432
- it "should extract ItemIds from Items if Items are provided as identifiers" do
433
- client = Object.new
434
- test_delete_item(client,
435
- :HardDelete,
436
- true,
437
- [Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
438
- Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})])
439
- end
440
301
 
441
- it "should extract ItemIds from a FindResult if a FindResult is provided as identifiers" do
442
- client = Object.new
443
- test_delete_item(client,
444
- :HardDelete,
445
- true,
446
- Folder::FindResult.new({}) {[Item::Item.new(client, :message, {:item_id=>{:id=>"abc", :change_key=>"def"}}),
447
- Item::Item.new(client, :message, {:item_id=>{:id=>"ghi", :change_key=>"jkl"}})]})
448
- end
449
- end
450
302
  end
451
303
  end
452
304
  end