Files @ 6b1e1437c026
Branch filter:

Location: kallithea/kallithea/tests/models/test_changeset_status.py

Thomas De Schampheleire
changeset status: set status to rejected if at least one reviewer rejected

Currently, a reject of a change by a reviewer does not affect the overall
status at all. A logical policy is to reject the change if at least one
reviewer rejects it.

Note: different repositories/organizations may require different policies
for the overall status. Currently, the policies for approve/reject are
fixed. A possible improvement is to provide several alternative
policies and allow selecting the policy per instance or per repo.
from kallithea.tests import *
from kallithea.model.changeset_status import ChangesetStatusModel
from kallithea.model.db import ChangesetStatus

# shorthands
STATUS_APPROVED = ChangesetStatus.STATUS_APPROVED
STATUS_REJECTED = ChangesetStatus.STATUS_REJECTED
STATUS_NOT_REVIEWED = ChangesetStatus.STATUS_NOT_REVIEWED
STATUS_UNDER_REVIEW = ChangesetStatus.STATUS_UNDER_REVIEW

class ChangesetStatusMock(object):

    def __init__(self, status):
        self.status = status

S = ChangesetStatusMock

class TestChangesetStatusCalculation(BaseTestCase):

    def setUp(self):
        self.m = ChangesetStatusModel()

    @parameterized.expand([
        ('empty list', STATUS_UNDER_REVIEW, []),
        ('approve', STATUS_APPROVED, [S(STATUS_APPROVED)]),
        ('approve2', STATUS_APPROVED, [S(STATUS_APPROVED), S(STATUS_APPROVED)]),
        ('approve_reject', STATUS_REJECTED, [S(STATUS_APPROVED), S(STATUS_REJECTED)]),
        ('approve_underreview', STATUS_UNDER_REVIEW, [S(STATUS_APPROVED), S(STATUS_UNDER_REVIEW)]),
        ('approve_notreviewed', STATUS_UNDER_REVIEW, [S(STATUS_APPROVED), S(STATUS_NOT_REVIEWED)]),
        ('underreview', STATUS_UNDER_REVIEW, [S(STATUS_UNDER_REVIEW), S(STATUS_UNDER_REVIEW)]),
        ('reject', STATUS_REJECTED, [S(STATUS_REJECTED)]),
        ('reject_underreview', STATUS_REJECTED, [S(STATUS_REJECTED), S(STATUS_UNDER_REVIEW)]),
        ('reject_notreviewed', STATUS_REJECTED, [S(STATUS_REJECTED), S(STATUS_NOT_REVIEWED)]),
        ('notreviewed', STATUS_UNDER_REVIEW, [S(STATUS_NOT_REVIEWED)]),
    ])
    def test_result(self, name, expected_result, statuses):
        result = self.m._calculate_status(statuses)
        self.assertEqual(result, expected_result)