277
277
def test_get_ticket_api_private(self):
278
278
self.ticket.private = True
279
self.ticket.current_workflow_step = TicketWorkflowStep.QUEUED
280
279
self.ticket.save()
282
281
obj = self.getResource('ticket/')
283
282
self.assertEqual(0, len(obj['objects']))
284
def test_get_ticket_status_filtering(self):
285
# `Ticket` API supports 'status' filtering.
287
results = self.getResource(
288
'ticket/?status={}'.format(int(self.ticket.status)))
289
[t] = results['objects']
290
self.assertEqual(self.ticket.title, t['title'])
291
# The django query_spec goodies (exact, lt, lte, gt, gte, etc)
293
results = self.getResource(
294
'ticket/?status__lte={}'.format(
295
int(TicketWorkflowStepStatus.INPROGRESS)))
296
[t] = results['objects']
297
self.assertEqual(self.ticket.title, t['title'])
298
# Dataset updates take effect immediately.
299
self.ticket.status = TicketWorkflowStepStatus.COMPLETED
301
results = self.getResource(
302
'ticket/?status={}'.format(int(self.ticket.status)))
303
[t] = results['objects']
304
self.assertEqual(self.ticket.title, t['title'])
306
results = self.getResource(
307
'ticket/?status={}'.format(int(TicketWorkflowStepStatus.FAILED)))
308
self.assertEqual(0, len(results['objects']))
285
310
def test_get_sourcepackageupload_api(self):
286
311
obj = self.getResource('spu/')
287
312
self.assertEqual(obj['objects'][0], {
296
321
u'/api/v1/spu/{0}/'.format(self.spu.pk),
299
def test_get_ticket_status_api(self):
300
obj = self.getResource('ticketstatus/')
301
self.assertEqual(obj['objects'][0], {
302
u'created': unicode(self.ticket.created.strftime(
303
settings.TEST_DATETIME_FORMAT)),
304
u'current_workflow_step': unicode(get_enum_title(
305
self.ticket.current_workflow_step,
306
TicketWorkflowStep)),
307
u'status': unicode(get_enum_title(self.ticket.status,
308
TicketWorkflowStepStatus)),
309
u'id': self.ticket.pk,
310
u'title': self.ticket.title,
312
u'/api/v1/ticketstatus/{0}/'.format(self.ticket.uuid),
313
u'updated': unicode(self.ticket.updated.strftime(
314
settings.TEST_DATETIME_FORMAT)),
315
u'uuid': self.ticket.uuid,
318
324
def test_get_subticket_update_status_api(self):
319
325
obj = self.getResource('updatesubticketstatus/')
320
326
self.assertEqual(obj['objects'][0], {
397
403
self.assert_same('subticket_workflow_step_status/')
400
class GetOpenTicketsTest(TicketTastypieTestCase):
402
Test that /opentickets/ returns only in progress and queued tickets.
405
# patch the send function so that anything saving a QUEUED ticket
406
# won't generate noise
407
@mock.patch('ci_utils.amqp_utils.send')
408
def setUp(self, send):
409
super(GetOpenTicketsTest, self).setUp('/api/v1')
410
self.ticket_1 = mommy.make(
411
'Ticket', current_workflow_step=int(TicketWorkflowStep.NEW))
412
self.ticket_2 = mommy.make(
413
'Ticket', current_workflow_step=int(TicketWorkflowStep.QUEUED))
414
self.ticket_3 = mommy.make(
415
'Ticket', current_workflow_step=int(
416
TicketWorkflowStep.PKG_BUILDING))
417
self.ticket_4 = mommy.make(
418
'Ticket', current_workflow_step=int(
419
TicketWorkflowStep.IMAGE_BUILDING))
420
self.ticket_5 = mommy.make(
421
'Ticket', current_workflow_step=int(
422
TicketWorkflowStep.IMAGE_TESTING))
423
self.ticket_6 = mommy.make(
424
'Ticket', current_workflow_step=int(
425
TicketWorkflowStep.PKG_PUBLISHING))
426
self.ticket_7 = mommy.make(
427
'Ticket', current_workflow_step=int(TicketWorkflowStep.COMPLETED))
428
self.sourcepackage = sourcepackage_recipe.make()
429
self.spu = mommy.make('SourcePackageUpload',
430
sourcepackage=self.sourcepackage)
431
self.subticket_1 = mommy.make('SubTicket', ticket=self.ticket_1,
432
source_package_upload=self.spu)
433
self.artifact_1 = mommy.make('SubTicketArtifact',
434
subticket=self.subticket_1)
435
self.subticket_2 = mommy.make('SubTicket', ticket=self.ticket_2,
436
source_package_upload=self.spu)
437
self.artifact_2 = mommy.make('SubTicketArtifact',
438
subticket=self.subticket_2)
439
self.subticket_3 = mommy.make('SubTicket', ticket=self.ticket_3,
440
source_package_upload=self.spu)
441
self.artifact_3 = mommy.make('SubTicketArtifact',
442
subticket=self.subticket_3)
443
self.subticket_4 = mommy.make('SubTicket', ticket=self.ticket_4,
444
source_package_upload=self.spu)
445
self.artifact_4 = mommy.make('SubTicketArtifact',
446
subticket=self.subticket_4)
447
self.subticket_5 = mommy.make('SubTicket', ticket=self.ticket_5,
448
source_package_upload=self.spu)
449
self.artifact_5 = mommy.make('SubTicketArtifact',
450
subticket=self.subticket_5)
451
self.subticket_6 = mommy.make('SubTicket', ticket=self.ticket_6,
452
source_package_upload=self.spu)
453
self.artifact_6 = mommy.make('SubTicketArtifact',
454
subticket=self.subticket_6)
455
self.subticket_7 = mommy.make('SubTicket', ticket=self.ticket_7,
456
source_package_upload=self.spu)
457
self.artifact_7 = mommy.make('SubTicketArtifact',
458
subticket=self.subticket_7)
460
def test_total_open_tickets(self):
461
obj = self.getResource('opentickets/')
462
self.assertEqual(len(obj['objects']), 5)
464
def test_open_ticket_syntax(self):
465
self.ticket_2.current_workflow_step = int(
466
TicketWorkflowStep.COMPLETED)
468
self.ticket_3.current_workflow_step = int(
469
TicketWorkflowStep.COMPLETED)
471
self.ticket_4.current_workflow_step = int(
472
TicketWorkflowStep.COMPLETED)
474
self.ticket_5.current_workflow_step = int(
475
TicketWorkflowStep.COMPLETED)
477
obj = self.getResource('opentickets/')
478
self.assertEqual(obj['objects'][0], {
479
u'status': unicode(get_enum_title(self.ticket_6.status,
480
TicketWorkflowStepStatus)),
481
u'created': unicode(self.ticket_6.created.strftime(
482
settings.TEST_DATETIME_FORMAT)),
483
u'current_workflow_step': unicode(get_enum_title(
484
self.ticket_6.current_workflow_step,
485
TicketWorkflowStep)),
486
u'description': unicode(self.ticket_6.description),
487
u'title': unicode(self.ticket_6.title),
488
u'bug_id': self.ticket_6.bug_id,
489
u'owner': unicode(self.ticket_6.owner),
490
u'creator': unicode(self.ticket_6.creator),
491
u'base_image': unicode(self.ticket_6.base_image),
492
u'id': self.ticket_6.pk,
493
u'lander_unit': self.ticket_6.lander_unit,
494
u'master_ppa': unicode(self.ticket_6.master_ppa),
495
u'build_ppa': unicode(self.ticket_6.build_ppa),
496
u'resource_uri': u'/api/v1/opentickets/{0}/'.format(
498
u'series': unicode(self.ticket_6.series),
500
u'updated': unicode(self.ticket_6.updated.strftime(
501
settings.TEST_DATETIME_FORMAT)),
502
u'uuid': self.ticket_6.uuid,
505
def test_no_open_tickets(self):
506
self.ticket_2.current_workflow_step = int(
507
TicketWorkflowStep.COMPLETED)
509
self.ticket_3.current_workflow_step = int(
510
TicketWorkflowStep.COMPLETED)
512
self.ticket_4.current_workflow_step = int(
513
TicketWorkflowStep.COMPLETED)
515
self.ticket_5.current_workflow_step = int(
516
TicketWorkflowStep.COMPLETED)
518
self.ticket_6.current_workflow_step = int(
519
TicketWorkflowStep.COMPLETED)
521
obj = self.getResource('opentickets/')
522
self.assertEqual(len(obj['objects']), 0)
525
406
class TicketPaginationTest(TicketTastypieTestCase):
527
408
@mock.patch('ci_utils.amqp_utils.send')
533
414
def test_no_pagination(self):
534
415
# `PageNumberPaginator` honours the default behaviour.
535
416
# Full set (default limit is 20).
536
result = self.getResource('ticketstatus/')
417
result = self.getResource('ticket/')
537
418
self.assertEqual(5, len(result['objects']))
539
result = self.getResource('ticketstatus/?limit=3')
420
result = self.getResource('ticket/?limit=3')
540
421
self.assertEqual(3, len(result['objects']))
542
result = self.getResource('ticketstatus/?offset=3')
423
result = self.getResource('ticket/?offset=3')
543
424
self.assertEqual(2, len(result['objects']))
544
425
# Combined offset & limit.
545
result = self.getResource('ticketstatus/?offset=1&limit=1')
426
result = self.getResource('ticket/?offset=1&limit=1')
546
427
[ticket] = result['objects']
547
428
self.assertEqual('ticket-2', ticket['title'])
549
430
def test_page_number(self):
550
431
# `PageNumberPaginator` supports optional 'page' number
551
432
# to cope with YUI datasource requests.
552
result = self.getResource('ticketstatus/?page=2&limit=4')
433
result = self.getResource('ticket/?page=2&limit=4')
553
434
[ticket] = result['objects']
554
435
self.assertEqual('ticket-5', ticket['title'])
556
437
def test_offset_gets_precedence_over_page_number(self):
557
438
# `PageNumberPaginator` gives precedence to 'offset' if it's
558
439
# provided with 'page' (the latter is ignored.)
559
result = self.getResource('ticketstatus/?page=2&offset=1&limit=4')
440
result = self.getResource('ticket/?page=2&offset=1&limit=4')
560
441
self.assertEqual(4, len(result['objects']))