Exemple #1
0
    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()
Exemple #4
0
    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()
Exemple #6
0
    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()
Exemple #7
0
    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()
Exemple #10
0
    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)