def test_invalid_revert_aborted_task(self): task = setup_complete_task(self) task.status = Task.Status.ABORTED task.save() with self.assertRaises(InvalidRevertError): self._revert_task( task, task.assignments.first().iterations.first(), revert_before=False, commit=True) task.delete()
def test_invalid_revert_aborted_task(self): task = setup_complete_task(self) task.status = Task.Status.ABORTED task.save() with self.assertRaises(InvalidRevertError): self._revert_task( task, task.assignments.first().iterations.first(), revert_before=False, commit=True) task.delete()
def _test_reverted_task(self, times, datetime, status, num_assignments, num_snapshots_per_assignment, latest_data): task = setup_complete_task(self, times) response = self.api_client.post( reverse('orchestra:orchestra:project_management:revert_task'), json.dumps({ 'task_id': task.id, # Convert datetime to timestamp 'revert_datetime': time.mktime(datetime.timetuple()), 'fake': True }), content_type='application/json') self.assertEquals(response.status_code, 200) task.refresh_from_db() self.assertEquals(task.status, Task.Status.COMPLETE) self.assertEquals(task.assignments.count(), 2) for assignment in task.assignments.all(): self.assertEquals( len(assignment.snapshots['snapshots']), 2) response = self.api_client.post( reverse('orchestra:orchestra:project_management:revert_task'), json.dumps({ 'task_id': task.id, # Convert datetime to timestamp 'revert_datetime': time.mktime(datetime.timetuple()), 'fake': False }), content_type='application/json') self.assertEquals(response.status_code, 200) audit = json.loads(response.content.decode('utf-8')) self._test_audit(audit, num_assignments, num_snapshots_per_assignment) task.refresh_from_db() self.assertEquals(task.status, status) assignments = assignment_history(task) self.assertEquals(task.assignments.count(), num_assignments) self.assertEquals( len(num_snapshots_per_assignment), num_assignments) for i, num_snapshots in enumerate(num_snapshots_per_assignment): self.assertEquals( len(assignments[i].snapshots['snapshots']), num_snapshots) if num_assignments: self.assertEquals( current_assignment(task).in_progress_task_data, latest_data) task.delete()
def test_invalid_revert_before(self): task = setup_complete_task(self) task.status = Task.Status.ABORTED task.save() # Ensure reviewer assignment has more than one iteration reviewer_assignment = assignment_history(task).last() self.assertGreater(reviewer_assignment.iterations.count(), 1) # Attempt to revert before an iteration that isn't the assignment's # first with self.assertRaises(InvalidRevertError): self._revert_task( task, get_latest_iteration(reviewer_assignment), revert_before=True, commit=True) task.delete()
def test_invalid_revert_before(self): task = setup_complete_task(self) task.status = Task.Status.ABORTED task.save() # Ensure reviewer assignment has more than one iteration reviewer_assignment = assignment_history(task).last() self.assertGreater(reviewer_assignment.iterations.count(), 1) # Attempt to revert before an iteration that isn't the assignment's # first with self.assertRaises(InvalidRevertError): self._revert_task( task, get_latest_iteration(reviewer_assignment), revert_before=True, commit=True) task.delete()
def test_revert_processing(self): task = setup_complete_task(self) reverted_status = Task.Status.PROCESSING expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=(RevertChange.REVERTED.value, RevertChange.DELETED.value), iteration_changes=((RevertChange.REVERTED.value, RevertChange.DELETED.value), (RevertChange.DELETED.value, RevertChange.DELETED.value))) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[0], num_iterations=1, task_status=reverted_status, latest_data={'test': 'entry_resubmit'}, expected_audit=expected_audit) task.delete()
def test_revert_first_review(self): task = setup_complete_task(self) reverted_status = Task.Status.REVIEWING expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=(RevertChange.REVERTED.value, RevertChange.REVERTED.value), iteration_changes=((RevertChange.UNCHANGED.value, RevertChange.DELETED.value), (RevertChange.REVERTED.value, RevertChange.DELETED.value))) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[1], num_iterations=2, task_status=reverted_status, latest_data={'test': 'reviewer_accept'}, expected_audit=expected_audit) task.delete()
def test_revert_processing(self): task = setup_complete_task(self) reverted_status = Task.Status.PROCESSING expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=( RevertChange.REVERTED.value, RevertChange.DELETED.value), iteration_changes=( (RevertChange.REVERTED.value, RevertChange.DELETED.value), (RevertChange.DELETED.value, RevertChange.DELETED.value) )) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[0], num_iterations=1, task_status=reverted_status, latest_data={'test': 'entry_resubmit'}, expected_audit=expected_audit) task.delete()
def test_revert_first_review(self): task = setup_complete_task(self) reverted_status = Task.Status.REVIEWING expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=( RevertChange.REVERTED.value, RevertChange.REVERTED.value), iteration_changes=( (RevertChange.UNCHANGED.value, RevertChange.DELETED.value), (RevertChange.REVERTED.value, RevertChange.DELETED.value) )) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[1], num_iterations=2, task_status=reverted_status, latest_data={'test': 'reviewer_accept'}, expected_audit=expected_audit) task.delete()
def test_revert_pending_review(self): task = setup_complete_task(self) reverted_status = Task.Status.PENDING_REVIEW expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=(RevertChange.REVERTED.value, RevertChange.DELETED.value), iteration_changes=((RevertChange.UNCHANGED.value, RevertChange.DELETED.value), (RevertChange.DELETED.value, RevertChange.DELETED.value))) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[1], num_iterations=1, task_status=reverted_status, latest_data={'test': 'entry_resubmit'}, expected_audit=expected_audit, revert_before=True) task.delete()
def test_revert_pending_review(self): task = setup_complete_task(self) reverted_status = Task.Status.PENDING_REVIEW expected_audit = self._expected_audit( task, reverted_status=reverted_status, assignment_changes=( RevertChange.REVERTED.value, RevertChange.DELETED.value), iteration_changes=( (RevertChange.UNCHANGED.value, RevertChange.DELETED.value), (RevertChange.DELETED.value, RevertChange.DELETED.value) )) self._test_reverted_task( task, iteration=get_iteration_history(task).all()[1], num_iterations=1, task_status=reverted_status, latest_data={'test': 'entry_resubmit'}, expected_audit=expected_audit, revert_before=True) task.delete()
def test_revert_task_api(self): # Microseconds are truncated when manually saving models test_start = timezone.now().replace(microsecond=0) times = { 'awaiting_pickup': test_start, 'entry_pickup': test_start + timedelta(hours=1), 'entry_submit': test_start + timedelta(hours=2), 'reviewer_pickup': test_start + timedelta(hours=3), 'reviewer_reject': test_start + timedelta(hours=4), 'entry_resubmit': test_start + timedelta(hours=5), 'reviewer_accept': test_start + timedelta(hours=6), } # Revert past end of task should have no effect self._test_reverted_task( times, datetime=times['reviewer_accept'] + timedelta(hours=0.5), status=Task.Status.COMPLETE, num_assignments=2, num_snapshots_per_assignment=[2, 2], latest_data={'test': 'reviewer_accept'}) # Revert before reviewer acceptance but retain latest data self._test_reverted_task( times, datetime=times['reviewer_accept'], status=Task.Status.REVIEWING, num_assignments=2, num_snapshots_per_assignment=[2, 1], latest_data={'test': 'reviewer_accept'}) self._test_reverted_task( times, datetime=times['reviewer_accept'] - timedelta(hours=0.5), status=Task.Status.REVIEWING, num_assignments=2, num_snapshots_per_assignment=[2, 1], latest_data={'test': 'reviewer_accept'}) # Revert before entry resubmission but retain latest data self._test_reverted_task( times, datetime=times['entry_resubmit'], status=Task.Status.POST_REVIEW_PROCESSING, num_assignments=2, num_snapshots_per_assignment=[1, 1], latest_data={'test': 'entry_resubmit'}) self._test_reverted_task( times, datetime=times['entry_resubmit'] - timedelta(hours=0.5), status=Task.Status.POST_REVIEW_PROCESSING, num_assignments=2, num_snapshots_per_assignment=[1, 1], latest_data={'test': 'entry_resubmit'}) # Revert before reviewer rejection but retain latest data self._test_reverted_task( times, datetime=times['reviewer_reject'], status=Task.Status.REVIEWING, num_assignments=2, num_snapshots_per_assignment=[1, 0], latest_data={'test': 'reviewer_reject'}) self._test_reverted_task( times, datetime=times['reviewer_reject'] - timedelta(hours=0.5), status=Task.Status.REVIEWING, num_assignments=2, num_snapshots_per_assignment=[1, 0], latest_data={'test': 'reviewer_reject'}) # Revert before reviewer pickup but retain latest data self._test_reverted_task( times, datetime=times['reviewer_pickup'], status=Task.Status.PENDING_REVIEW, num_assignments=1, num_snapshots_per_assignment=[1], latest_data={'test': 'entry_submit'}) self._test_reverted_task( times, datetime=times['reviewer_pickup'] - timedelta(hours=0.5), status=Task.Status.PENDING_REVIEW, num_assignments=1, num_snapshots_per_assignment=[1], latest_data={'test': 'entry_submit'}) # Revert before entry submission but retain latest data self._test_reverted_task( times, datetime=times['entry_submit'], status=Task.Status.PROCESSING, num_assignments=1, num_snapshots_per_assignment=[0], latest_data={'test': 'entry_submit'}) self._test_reverted_task( times, datetime=times['entry_submit'] - timedelta(hours=0.5), status=Task.Status.PROCESSING, num_assignments=1, num_snapshots_per_assignment=[0], latest_data={'test': 'entry_submit'}) # Revert before entry submission but retain latest data self._test_reverted_task( times, datetime=times['entry_pickup'], status=Task.Status.AWAITING_PROCESSING, num_assignments=0, num_snapshots_per_assignment=[], latest_data={}) self._test_reverted_task( times, datetime=times['entry_pickup'] - timedelta(hours=0.5), status=Task.Status.AWAITING_PROCESSING, num_assignments=0, num_snapshots_per_assignment=[], latest_data={}) task = setup_complete_task(self, times) datetime = times['awaiting_pickup'] response = self.api_client.post( reverse('orchestra:orchestra:project_management:revert_task'), json.dumps({ 'task_id': task.id, # Convert datetime to timestamp 'revert_datetime': time.mktime(datetime.timetuple()), 'fake': False }), content_type='application/json') self.assertEquals(response.status_code, 200) with self.assertRaises(Task.DoesNotExist): Task.objects.get(id=task.id) task = setup_complete_task(self, times) datetime = times['awaiting_pickup'] - timedelta(hours=0.5) response = self.api_client.post( reverse('orchestra:orchestra:project_management:revert_task'), json.dumps({ 'task_id': task.id, # Convert datetime to timestamp 'revert_datetime': time.mktime(datetime.timetuple()), 'fake': False }), content_type='application/json') self.assertEquals(response.status_code, 200) with self.assertRaises(Task.DoesNotExist): Task.objects.get(id=task.id)