ludo-roart 0.1.11

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.
@@ -0,0 +1,22 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. .. spec_helper])
2
+
3
+ describe 'hash extentions' do
4
+
5
+ it 'should format the content correctly' do
6
+ payload = {:subject => "A New Ticket", :queue => 'My Queue'}
7
+ payload.to_content_format.include?("Subject: A New Ticket").should be_true
8
+ payload.to_content_format.include?("Queue: My Queue").should be_true
9
+ end
10
+
11
+ it 'should handel custom fields' do
12
+ payload = {:cf_stuff => 'field'}
13
+ payload.to_content_format.should == "CF-Stuff: field"
14
+ end
15
+
16
+ it 'should use our content formatter for strings' do
17
+ payload = {:subject => 'A new ticket', :queue => 'My queue', :text => "A text"}
18
+ Roart::ContentFormatter.should_receive(:format_string).at_least(:once)
19
+ payload.to_content_format
20
+ end
21
+
22
+ end
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper])
2
+
3
+ describe "History" do
4
+
5
+ it 'should have a ticket' do
6
+ search_array = ['1:subject']
7
+ search_array.extend(Roart::TicketPage)
8
+ full_ticket = Roart::Ticket.send(:instantiate, {:id => 1, :subject => 'subject', :full => true})
9
+ @ticket = Roart::Ticket.send(:instantiate, search_array.to_search_array ).first
10
+ Roart::History.should_receive(:get_page).and_return('200')
11
+
12
+ history = @ticket.histories
13
+ history.ticket.should == @ticket
14
+
15
+ end
16
+
17
+ describe 'getting ticket history' do
18
+
19
+ it 'should create the crect URI' do
20
+ connection = mock('connection', :rest_path => 'REST/1.0/')
21
+ myclass = mock('class', :connection => connection)
22
+ ticket = mock(:ticket, :id => 1, :class => myclass)
23
+ hash = mock(:options_hash, :[] => ticket)
24
+ Roart::History.should_receive(:default_options).and_return(hash)
25
+ Roart::History.send(:uri_for, ticket).should == 'REST/1.0/ticket/1/history?format=l'
26
+ end
27
+ end
28
+
29
+ describe 'reading history pages' do
30
+
31
+ before do
32
+ @page = File.open(File.join(File.dirname(__FILE__), %w[ .. test_data full_history.txt])).readlines.join
33
+ @ticket = mock('ticket')
34
+ Roart::History.should_receive(:get_page).and_return(@page)
35
+ @histories = Roart::History.default(:ticket => @ticket)
36
+ end
37
+
38
+ it 'should have the right number of histories' do
39
+ @histories.size.should == 5
40
+ end
41
+
42
+ it 'should have a ticket' do
43
+ @histories.first.ticket.should == @ticket
44
+ end
45
+
46
+ it 'should have an id' do
47
+ @histories.first.id.should == 34725
48
+ end
49
+
50
+ it 'should return itself for all' do
51
+ @histories.all.should == @histories
52
+ end
53
+
54
+ it 'should return the ticket' do
55
+ @histories.ticket.should == @ticket
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,11 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper])
3
+
4
+ describe "Roart" do
5
+
6
+ it "should raise an error if there aren't required fields" do
7
+ attributes = {:subject => "Not Enough Stuff"}
8
+ lambda { Roart::check_keys!(attributes, Roart::Tickets::RequiredAttributes) }.should raise_error(Roart::ArgumentError)
9
+ end
10
+
11
+ end
@@ -0,0 +1,93 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper])
2
+
3
+ describe 'ticket page' do
4
+
5
+ describe 'ticket hash' do
6
+
7
+ it 'should convert an array to a hash' do
8
+ array = ["id : 10", "subject : asdf"]
9
+ array.extend(Roart::TicketPage)
10
+ hash = array.to_hash
11
+ hash.has_key?(:id).should be_true
12
+ hash[:id].should == 10
13
+ hash[:subject].should == 'asdf'
14
+ end
15
+
16
+ end
17
+
18
+ describe 'reading a ticket' do
19
+
20
+ before do
21
+ @page = File.open(File.join(File.dirname(__FILE__), %w[ .. test_data ticket.txt])).readlines.join
22
+ @page = @page.split("\n")
23
+ @page.extend(Roart::TicketPage)
24
+ end
25
+
26
+ it 'should include custom fields' do
27
+ @page.to_hash[:cf_BTN].should == '1035328269'
28
+ end
29
+
30
+ it 'should be a hash' do
31
+ @page.to_hash.class.should == HashWithIndifferentAccess
32
+ end
33
+
34
+ end
35
+
36
+ describe 'search array' do
37
+
38
+ before do
39
+ @array = ["123 : Subject", "234 : Subject"]
40
+ @array.extend(Roart::TicketPage)
41
+ @array = @array.to_search_array
42
+ end
43
+
44
+ it 'should make an array of search results' do
45
+ @array.size.should == 2
46
+ end
47
+
48
+ it 'should put search elements into the search array' do
49
+ @array.first[:id].should == 123
50
+ @array.last[:id].should == 234
51
+ end
52
+
53
+ end
54
+
55
+ describe "search list array" do
56
+ before do
57
+ @array = [['id:234', 'subject:SomeTicket', ], ['id:432','subject:Another']]
58
+ @array.extend(Roart::TicketPage)
59
+ @array = @array.to_search_list_array
60
+ end
61
+
62
+ it "should return an array of hashes" do
63
+ @array.first.class.should == HashWithIndifferentAccess
64
+ end
65
+
66
+ it "should put the search elements into the array" do
67
+ @array.first[:id].should == 234
68
+ end
69
+ end
70
+
71
+ describe 'ticket history hash' do
72
+
73
+ before do
74
+ @page = File.open(File.join(File.dirname(__FILE__), %w[ .. test_data single_history.txt])).readlines.join
75
+ @page = @page.split("\n")
76
+ @page.extend(Roart::TicketPage)
77
+ end
78
+
79
+ it 'should give back the hash of history' do
80
+ @page.to_history_hash.class.should == HashWithIndifferentAccess
81
+ end
82
+
83
+ it 'should have some content' do
84
+ @page.to_history_hash[:content].should_not be_nil
85
+ end
86
+
87
+ it 'should have the create type' do
88
+ @page.to_history_hash[:type].should == 'Create'
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,553 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper])
2
+
3
+ describe "Ticket" do
4
+
5
+ it "should have a connection" do
6
+ Roart::Connection.should_receive(:new).with(:some => 'some options', :adapter => "www").and_return(true)
7
+ Roart::Ticket.connection(:some => 'some options', :adapter => "www").should == true
8
+ end
9
+
10
+ it "should find the first ticket" do
11
+ Roart::Ticket.should_receive(:find_initial).with(:my => 'options').and_return('a ticket')
12
+ Roart::Ticket.find(:first, :my => 'options').should == 'a ticket'
13
+ end
14
+
15
+ it 'should find all tickets' do
16
+ Roart::Ticket.should_receive(:find_all).with(:my => 'options').and_return(%w[array of tickets])
17
+ Roart::Ticket.find(:all, :my => 'options').should == ['array', 'of', 'tickets']
18
+ end
19
+
20
+ it 'should find a ticket by id' do
21
+ Roart::Ticket.should_receive(:find_by_ids).with([12345],{}).and_return('a ticket')
22
+ Roart::Ticket.find(12345).should == 'a ticket'
23
+ end
24
+
25
+ describe "find initial" do
26
+
27
+ it 'should set options to include :limit => 1' do
28
+ Roart::Ticket.should_receive(:find_all).with({:limit => 1}).and_return(['ticket', 'not seen'])
29
+ Roart::Ticket.send(:find_initial)
30
+ end
31
+
32
+ it 'should not overwrite the options hash' do
33
+ Roart::Ticket.should_receive(:find_all).with({:queue => 'queue', :limit => 1}).and_return(['ticket', 'not seen'])
34
+ Roart::Ticket.send(:find_initial, :queue => 'queue')
35
+ end
36
+
37
+ it 'should return 1 ticket object' do
38
+ Roart::Ticket.should_receive(:find_all).with({:limit => 1}).and_return(['ticket', 'not seen'])
39
+ Roart::Ticket.send(:find_initial).should == 'ticket'
40
+ end
41
+
42
+ end
43
+
44
+ describe 'page array' do
45
+
46
+ it 'should raise an error if not a 200 response' do
47
+ connection = mock('connection', :get => 'some error message')
48
+ Roart::Ticket.should_receive(:connection).and_return(connection)
49
+ lambda do
50
+ Roart::Ticket.send(:page_array, 'www.whatever')
51
+ end.should raise_error(Roart::TicketSystemInterfaceError)
52
+ end
53
+
54
+ it 'should raise an error if nothing is returned' do
55
+ connection = mock('connection', :get => nil)
56
+ Roart::Ticket.should_receive(:connection).and_return(connection)
57
+ lambda do
58
+ Roart::Ticket.send(:page_array, 'www.whatever')
59
+ end.should raise_error(Roart::TicketSystemError)
60
+ end
61
+
62
+ it 'should give back an array of strings' do
63
+ connection = mock('connection', :get => "200 OK\n23:SomeTicket\n33:Another")
64
+ Roart::Ticket.should_receive(:connection).and_return(connection)
65
+ Roart::Ticket.send(:page_array, 'uri').should == ['23:SomeTicket', '33:Another']
66
+ end
67
+
68
+ end
69
+
70
+ describe 'getting tickets from URI' do
71
+
72
+ describe 'search' do
73
+
74
+ it 'should give an array of tickets' do
75
+ Roart::Ticket.should_receive(:page_list_array).with('uri&format=l').and_return([['id:234', 'subject:SomeTicket', ], ['id:432','subject:Another']])
76
+ Roart::Ticket.send(:get_tickets_from_search_uri, 'uri').size.should == 2
77
+ end
78
+
79
+ it 'should have full tickets' do
80
+ Roart::Ticket.should_receive(:page_list_array).with('uri&format=l').and_return([['id:234', 'subject:SomeTicket', ], ['id:432','subject:Another']])
81
+ Roart::Ticket.send(:get_tickets_from_search_uri, 'uri').each do |ticket|
82
+ ticket.full.should be_true
83
+ end
84
+ end
85
+
86
+ it 'should give back an array of arrays of strings' do
87
+ test_data = File.open(File.dirname(__FILE__) + "/../test_data/search_ticket.txt").readlines.join("\n")
88
+ connection = mock('connection', :get => test_data)
89
+ Roart::Ticket.should_receive(:connection).and_return(connection)
90
+ Roart::Ticket.send(:page_list_array, 'uri').should == [["id: ticket/3033", "Queue: Canada Express", "Subject: Canada Express", "Status: new"], ["id: ticket/2354", "Queue: Canada Express", "Subject: Canada Express", "Status: open"]]
91
+ end
92
+
93
+ describe ' search with no matches' do
94
+ it 'should give an empty array for :all' do
95
+ results = 'RT/3.6.6 200 Ok
96
+
97
+ No matching results.'
98
+ connection = mock('connection', :server => 'server', :get => results)
99
+ Roart::Ticket.should_receive(:connection).and_return(connection)
100
+ Roart::Ticket.send(:get_tickets_from_search_uri, 'uri').should == []
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ describe 'full ticket' do
107
+
108
+ it 'should give a ticket' do
109
+ Roart::Ticket.should_receive(:page_array).with('uri').and_return(['id:23', 'subject:someticket'])
110
+ Roart::Ticket.send(:get_ticket_from_uri, 'uri').is_a?(Roart::Ticket).should be_true
111
+ end
112
+
113
+ it 'should be a full ticket' do
114
+ Roart::Ticket.should_receive(:page_array).with('uri').and_return(['id:23', 'subject:someticket'])
115
+ Roart::Ticket.send(:get_ticket_from_uri, 'uri').full.should be_true
116
+ end
117
+
118
+ end
119
+
120
+ describe 'getting ticket from id' do
121
+
122
+ it 'should give a ticket' do
123
+ connection = mock('connection', :server => "server")
124
+ Roart::Ticket.should_receive(:connection).and_return(connection)
125
+ Roart::Ticket.should_receive(:get_ticket_from_uri).with('server' + '/REST/1.0/ticket/' + 12345.to_s).and_return('a ticket')
126
+ Roart::Ticket.send(:get_ticket_by_id, 12345).should == 'a ticket'
127
+ end
128
+
129
+ it 'should raise when searching for an id with no results' do
130
+ results = 'RT/3.6.6 200 Ok
131
+
132
+ No matching results.'
133
+ connection = mock('connection', :server => 'server', :get => results)
134
+ Roart::Ticket.stub!(:connection).and_return(connection)
135
+ lambda {Roart::Ticket.send(:get_ticket_by_id, 123)}.should raise_error("No ticket matching search criteria found.")
136
+ end
137
+
138
+ end
139
+
140
+ describe 'find methods' do
141
+
142
+ it 'should get all tickets from an options hash' do
143
+ Roart::Ticket.should_receive('construct_search_uri').with('searches').and_return('uri')
144
+ Roart::Ticket.should_receive('get_tickets_from_search_uri').with('uri').and_return(['tickets'])
145
+ Roart::Ticket.send(:find_all, 'searches').should == ['tickets']
146
+ end
147
+
148
+ it 'should find tickets from id' do
149
+ Roart::Ticket.should_receive(:get_ticket_by_id).with('id').and_return('a ticket')
150
+ Roart::Ticket.send(:find_by_ids, ['id'], {}).should == 'a ticket'
151
+ end
152
+
153
+ end
154
+
155
+ describe 'building a search uri' do
156
+
157
+ before do
158
+ @connection = mock('connection', :server => "server")
159
+ @search_string = "/REST/1.0/search/ticket?"
160
+ Roart::Ticket.should_receive(:connection).and_return(@connection)
161
+ @query = @connection.server + @search_string + 'query= '
162
+ end
163
+
164
+ describe 'queues' do
165
+
166
+ it 'should include a queue' do
167
+ Roart::Ticket.send(:construct_search_uri, {:queue => 'myQueue'}).should == @query + "Queue = 'myQueue'"
168
+ end
169
+
170
+ it 'should take multiple queues' do
171
+ Roart::Ticket.send(:construct_search_uri, {:queue => ['myQueue', 'another']}).should == @query + "( Queue = 'myQueue' OR Queue = 'another' )"
172
+ end
173
+
174
+ end
175
+
176
+ describe 'dates' do
177
+
178
+ before do
179
+ @time = Time.now
180
+ end
181
+
182
+ it 'should accept a date' do
183
+ Roart::Ticket.send(:construct_search_uri, {:created => @time}).should == @query + "( Created > '#{dbtime(@time)}' )"
184
+ end
185
+
186
+ it 'should accept an array of dates' do
187
+ Roart::Ticket.send(:construct_search_uri, {:created => [@time, @time + 300]}).should == @query + "( Created > '#{dbtime(@time)}' AND Created < '#{dbtime(@time + 300)}' )"
188
+ end
189
+
190
+ it 'should accept a range of dates' do
191
+ Roart::Ticket.send(:construct_search_uri, {:created => (@time..(@time + 300))}).should == @query + "( Created > '#{dbtime(@time)}' AND Created < '#{dbtime(@time + 300)}' )"
192
+ end
193
+
194
+ it 'should accept an array of strings' do
195
+ Roart::Ticket.send(:construct_search_uri, {:created => %w[cat dog]}).should == @query + "( Created > 'cat' AND Created < 'dog' )"
196
+ end
197
+
198
+ it 'should accept a string' do
199
+ Roart::Ticket.send(:construct_search_uri, {:created => 'time'}).should == @query + "( Created > 'time' )"
200
+ end
201
+
202
+ describe 'date fields' do
203
+
204
+ it 'should search started' do
205
+ Roart::Ticket.send(:construct_search_uri, {:started => 'time'}).should == @query + "( Started > 'time' )"
206
+ end
207
+
208
+ it 'should search resolved' do
209
+ Roart::Ticket.send(:construct_search_uri, {:resolved => 'time'}).should == @query + "( Resolved > 'time' )"
210
+ end
211
+
212
+ it 'should search told' do
213
+ Roart::Ticket.send(:construct_search_uri, {:told => 'time'}).should == @query + "( Told > 'time' )"
214
+ end
215
+
216
+ it 'should search last_updated' do
217
+ Roart::Ticket.send(:construct_search_uri, {:last_updated => 'time'}).should == @query + "( LastUpdated > 'time' )"
218
+ end
219
+
220
+ it 'should search starts' do
221
+ Roart::Ticket.send(:construct_search_uri, {:starts => 'time'}).should == @query + "( Starts > 'time' )"
222
+ end
223
+
224
+ it 'should search due' do
225
+ Roart::Ticket.send(:construct_search_uri, {:due => 'time'}).should == @query + "( Due > 'time' )"
226
+ end
227
+
228
+ it 'should search updated' do
229
+ Roart::Ticket.send(:construct_search_uri, {:updated => 'time'}).should == @query + "( Updated > 'time' )"
230
+ end
231
+
232
+ end
233
+
234
+ end
235
+
236
+ describe 'searches' do
237
+
238
+ it 'should accept a string' do
239
+ Roart::Ticket.send(:construct_search_uri, {:subject => 'fish'}).should == @query + "Subject LIKE 'fish'"
240
+ end
241
+
242
+ it 'should accept an array' do
243
+ Roart::Ticket.send(:construct_search_uri, {:subject => %w[cramanation station]}).should == @query + "( Subject LIKE 'cramanation' AND Subject LIKE 'station' )"
244
+ end
245
+
246
+ describe 'search fields' do
247
+
248
+ it 'should search content' do
249
+ Roart::Ticket.send(:construct_search_uri, {:content => 'fish'}).should == @query + "Content LIKE 'fish'"
250
+ end
251
+
252
+ it 'should search content_type' do
253
+ Roart::Ticket.send(:construct_search_uri, {:content_type => 'fish'}).should == @query + "ContentType LIKE 'fish'"
254
+ end
255
+
256
+ it 'should search file_name' do
257
+ Roart::Ticket.send(:construct_search_uri, {:file_name => 'fish'}).should == @query + "FileName LIKE 'fish'"
258
+ end
259
+
260
+ end
261
+
262
+ end
263
+
264
+ describe 'status' do
265
+
266
+ it 'should accept a string' do
267
+ Roart::Ticket.send(:construct_search_uri, {:status => 'new'}).should == @query + "Status = 'new'"
268
+ end
269
+
270
+ it 'should accept a symbol' do
271
+ Roart::Ticket.send(:construct_search_uri, {:status => :new}).should == @query + "Status = 'new'"
272
+ end
273
+
274
+ it 'should accept an array' do
275
+ Roart::Ticket.send(:construct_search_uri, {:status => ['new', 'open']}).should == @query + "( Status = 'new' OR Status = 'open' )"
276
+ end
277
+
278
+ end
279
+
280
+ describe 'custom_fields' do
281
+
282
+ it 'should accept a hash with string values' do
283
+ Roart::Ticket.send(:construct_search_uri, {:custom_fields => {:phone => '8675309'}}).should == @query + "'CF.{phone}' = '8675309'"
284
+ end
285
+
286
+ it 'should accept a hash with string values' do
287
+ Roart::Ticket.send(:construct_search_uri, {:custom_fields => {:phone => ['8675309', '5553265']}}).should == @query + "( 'CF.{phone}' = '8675309' OR 'CF.{phone}' = '5553265' )"
288
+ end
289
+
290
+ end
291
+
292
+ describe 'multiple find options' do
293
+
294
+ it 'should allow multiple find options' do
295
+ query = Roart::Ticket.send(:construct_search_uri, {:status => 'new', :queue => 'MyQueue'})
296
+ query.include?("Status = 'new'").should be_true
297
+ query.include?("Queue = 'MyQueue'").should be_true
298
+ end
299
+
300
+ it "should search for :queue => 'A Queue', :status => [:new, :open]" do
301
+ query = Roart::Ticket.send(:construct_search_uri, {:queue => 'A Queue', :status => [:new, :open]})
302
+ query.include?("( Status = 'new' OR Status = 'open' )").should be_true
303
+ query.include?("Queue = 'A Queue'").should be_true
304
+ end
305
+
306
+ end
307
+
308
+ end
309
+
310
+ end
311
+
312
+ describe "the default queue" do
313
+
314
+ before do
315
+ @connection = mock('connection', :server => "server")
316
+ @search_string = "/REST/1.0/search/ticket?"
317
+ @query = @connection.server + @search_string + 'query= '
318
+ class MyTicket < Roart::Ticket; end
319
+ MyTicket.instance_variable_set("@default_queue", 'myQueue')
320
+ MyTicket.should_receive(:connection).and_return(@connection)
321
+ end
322
+
323
+
324
+ it 'should have a default queue' do
325
+ MyTicket.send(:construct_search_uri, :status => :new).should == @query + "Queue = 'myQueue' AND Status = 'new'"
326
+ end
327
+
328
+ it 'should search without options and return the default queue' do
329
+ MyTicket.send(:construct_search_uri).should == @query + "Queue = 'myQueue'"
330
+ end
331
+
332
+ end
333
+
334
+ describe 'ticket methods' do
335
+
336
+
337
+ it 'should change the ticket' do
338
+ ticket = Roart::Ticket.send(:instantiate,{:subject => 'A New Ticket', :queue => 'My Queue', :id => 1})
339
+ ticket.subject = 'An Old Ticket'
340
+ ticket.subject.should == 'An Old Ticket'
341
+ end
342
+
343
+ it 'should be able to load the full ticket' do
344
+ search_array = ['1:subject']
345
+ search_array.extend(Roart::TicketPage)
346
+ full_ticket = Roart::Ticket.send(:instantiate, {:id => 1, :subject => 'subject', :full => true})
347
+ ticket = Roart::Ticket.send(:instantiate, search_array.to_search_array ).first
348
+ Roart::Ticket.should_receive(:find).with(1).and_return(full_ticket)
349
+ ticket.load_full!
350
+ ticket.full.should be_true
351
+ end
352
+
353
+ end
354
+
355
+ describe 'manipulating tickets' do
356
+
357
+ describe 'creating tickets' do
358
+
359
+ before do
360
+ post_data = @payload = {:queue => 'My Queue', :subject => 'A New Ticket'}
361
+ post_data.update(:id => 'ticket/new')
362
+ post_data = to_content_format(post_data)
363
+ mock_connection = mock('connection')
364
+ Roart::Ticket.should_receive(:connection).twice.and_return(mock_connection)
365
+ mock_connection.should_receive(:server).and_return('uri')
366
+ mock_connection.should_receive(:post).
367
+ with('uri/REST/1.0/ticket/new', {:content => post_data}).
368
+ and_return(response_body)
369
+ end
370
+
371
+ let(:ticket) { Roart::Ticket.new(@payload) }
372
+
373
+ context "on success" do
374
+ let(:response_body) { "RT/3.6.6 200 Ok\n\n# Ticket 267783 created." }
375
+
376
+ it 'should be able to save a new ticket' do
377
+ ticket.new_record?.should be_true
378
+ ticket.save
379
+ ticket.new_record?.should be_false
380
+ end
381
+
382
+ it 'should be able to create a ticket' do
383
+ ticket = Roart::Ticket.create(@payload)
384
+ end
385
+
386
+ it 'should return a newly created ticket' do
387
+ ticket.class.should == Roart::Ticket
388
+ ticket.save
389
+ ticket.id.should == 267783
390
+ end
391
+
392
+ it 'should NOT have errors' do
393
+ ticket.save
394
+ ticket.errors.should be_empty
395
+ end
396
+
397
+ it 'should be saved' do
398
+ ticket.save
399
+ ticket.saved.should == true
400
+ end
401
+ end
402
+
403
+ context "on failure" do
404
+ let(:response_body) { "RT/4.0.5 200 Ok\n\n# Could not create ticket.\n# Status 'huj' isn't a valid status for tickets in this queue." }
405
+
406
+ it 'should return an unsaved ticket' do
407
+ ticket.class.should == Roart::Ticket
408
+ ticket.save
409
+ ticket.id.should == 'ticket/new'
410
+ ticket.should be_new_record
411
+ end
412
+
413
+ it 'should return false' do
414
+ ticket.save.should == false
415
+ end
416
+
417
+ it 'should have errors' do
418
+ ticket.save
419
+ ticket.errors.size.should == 1
420
+ ticket.errors[:base].should == ["# Status 'huj' isn't a valid status for tickets in this queue."]
421
+ end
422
+ end
423
+
424
+ end
425
+
426
+ describe 'updating tickets' do
427
+
428
+ before do
429
+ @payload = {:queue => 'My Queue', :subject => 'An Old Ticket'}.with_indifferent_access
430
+ @post_data = {:queue => 'My Queue', :subject => 'An Old Ticket'}.with_indifferent_access
431
+ @payload[:subject] = 'A New Ticket'
432
+ @post_data = to_content_format(@post_data)
433
+ @mock_connection = mock('connection')
434
+ @mock_connection.should_receive(:server).and_return('uri')
435
+ Roart::Ticket.should_receive(:connection).twice.and_return(@mock_connection)
436
+ @mock_connection.should_receive(:post).
437
+ with('uri/REST/1.0/ticket/1/edit', {:content => @post_data}).
438
+ and_return(response_body)
439
+ end
440
+
441
+ context "on success" do
442
+ let(:response_body) { "RT/3.6.6 200 Ok\n\n# Ticket 267783 updated." }
443
+
444
+ it 'should be able to update a ticket' do
445
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
446
+ ticket.subject = 'An Old Ticket'
447
+ ticket.save.should == true
448
+ end
449
+
450
+ it 'should keep the same id' do
451
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
452
+ ticket.subject = 'An Old Ticket'
453
+ ticket.save
454
+ ticket.id.should == 1
455
+ end
456
+
457
+ it 'should save the ticket' do
458
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
459
+ ticket.subject = 'An Old Ticket'
460
+ ticket.save
461
+ ticket.subject.should == 'An Old Ticket'
462
+ end
463
+ end
464
+
465
+ context "on 502 failure" do
466
+ let(:response_body) { "RT/3.6.6 502 Not OK\n\n# Dead gateway" }
467
+
468
+ it 'should raise an error on failed save' do
469
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
470
+ ticket.subject = 'An Old Ticket'
471
+ expect { ticket.save }.to raise_error(Roart::TicketSystemError)
472
+ end
473
+ end
474
+
475
+ context "on 200 failure" do
476
+ let(:response_body) { "RT/3.6.6 200 Probably OK\n\n# Could not update ticket\n# Queue is missing" }
477
+
478
+ it 'should set errors' do
479
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
480
+ ticket.subject = 'An Old Ticket'
481
+ expect { ticket.save }.not_to raise_error
482
+ ticket.errors.size.should == 1
483
+ ticket.errors[:base].should == ["# Queue is missing"]
484
+ end
485
+ end
486
+
487
+ context "on 400 failure" do
488
+ let(:response_body) { "RT/3.6.6 400 Not OK\n\n# U's A SUKKA, FOO!." }
489
+
490
+ it 'should set errors' do
491
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
492
+ ticket.subject = 'An Old Ticket'
493
+ expect { ticket.save }.not_to raise_error
494
+ ticket.errors.size.should == 1
495
+ ticket.errors[:base].should == ["# U's A SUKKA, FOO!."]
496
+ end
497
+ end
498
+
499
+ context "on 409 failure" do
500
+ let(:response_body) { "RT/4.0.5 409 Syntax Error\n# Ticket 13 updated.\n# status2: Unknown field.\n\nid: \nStatus2: huj"}
501
+
502
+ it 'should set errors' do
503
+ ticket = Roart::Ticket.send(:instantiate, @payload.update(:id => 1))
504
+ ticket.subject = 'An Old Ticket'
505
+ expect { ticket.save }.not_to raise_error
506
+ ticket.errors.size.should == 2
507
+ ticket.errors[:base].should == [
508
+ "# Ticket 13 updated.",
509
+ "# status2: Unknown field."
510
+ ]
511
+ end
512
+ end
513
+
514
+ end
515
+
516
+ end
517
+
518
+ describe 'histories' do
519
+
520
+ before(:each) do
521
+ search_array = ['1:subject']
522
+ search_array.extend(Roart::TicketPage)
523
+ full_ticket = Roart::Ticket.send(:instantiate, {:id => 1, :subject => 'subject', :full => true})
524
+ @mock_connection = mock('connection')
525
+ @mock_connection.should_receive(:get).with('uri').and_return('200')
526
+ @ticket = Roart::Ticket.send(:instantiate, search_array.to_search_array).first
527
+ @ticket.class.should_receive(:connection).and_return(@mock_connection)
528
+ Roart::History.should_receive(:uri_for).with(@ticket).and_return('uri')
529
+ end
530
+
531
+ it 'should return history objects' do
532
+ @ticket.histories.class.should == Roart::HistoryArray
533
+ end
534
+
535
+ it 'should have a default of the ticket id' do
536
+ @ticket.histories.ticket.should == @ticket
537
+ end
538
+
539
+ it 'should only spawn 1 dup class for each ticket' do
540
+ @ticket.histories.should === @ticket.histories
541
+ end
542
+
543
+ it 'should have a last history that is equal to the last value' do
544
+ @ticket.histories.last.should == @ticket.histories[@ticket.histories.size - 1]
545
+ end
546
+
547
+ it 'should have count, which is equal to size' do
548
+ @ticket.histories.count.should == @ticket.histories.size
549
+ end
550
+
551
+ end
552
+
553
+ end