From 0434e8b78b124786fd3d727541c78294882b9737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Hermida?= Date: Mon, 28 Jan 2019 13:15:32 +0100 Subject: [PATCH] Fix calculate_milestone_is_closed and add tests --- taiga/projects/milestones/services.py | 21 ++-- tests/integration/test_milestones.py | 5 +- tests/unit/test_milestones.py | 148 +++++++++++++++++++++++++- 3 files changed, 158 insertions(+), 16 deletions(-) diff --git a/taiga/projects/milestones/services.py b/taiga/projects/milestones/services.py index c56a7333..b480da04 100644 --- a/taiga/projects/milestones/services.py +++ b/taiga/projects/milestones/services.py @@ -26,18 +26,17 @@ from taiga.projects.userstories.models import UserStory def calculate_milestone_is_closed(milestone): - uss_check = milestone.user_stories.all().count() > 0 and all( - [task.status is not None and task.status.is_closed for task in - milestone.tasks.all()]) and all( - [user_story.is_closed for user_story in milestone.user_stories.all()]) + all_us_closed = all([user_story.is_closed for user_story in milestone.user_stories.all()]) + all_tasks_closed = all([task.status is not None and task.status.is_closed for task in + milestone.tasks.all()]) + all_issues_closed = all([issue.is_closed for issue in milestone.issues.all()]) - issues_check = milestone.issues.all().count() > 0 and all( - [issue.is_closed for issue in milestone.issues.all()]) and all( - [task.is_closed for task in milestone.tasks.all()]) - - tasks_check = milestone.tasks.all().count() > 0 and all( - [task.is_closed for task in milestone.tasks.all()]) and all( - [issue.is_closed for issue in milestone.issues.all()]) + uss_check = milestone.user_stories.all().count() > 0 \ + and all_tasks_closed and all_us_closed and all_issues_closed + issues_check = milestone.issues.all().count() > 0 and all_issues_closed \ + and all_tasks_closed and all_us_closed + tasks_check = milestone.tasks.all().count() > 0 and all_tasks_closed \ + and all_issues_closed and all_us_closed return uss_check or issues_check or tasks_check diff --git a/tests/integration/test_milestones.py b/tests/integration/test_milestones.py index 2b15be7e..3f7cd96b 100644 --- a/tests/integration/test_milestones.py +++ b/tests/integration/test_milestones.py @@ -307,8 +307,9 @@ def test_api_move_tasks_to_another_sprint_close_previous(client): closed_status = f.TaskStatusFactory.create(project=project, is_closed=True) task1 = f.create_task(project=project, milestone=milestone1, taskboard_order=1, - status=closed_status) - task2 = f.create_task(project=project, milestone=milestone1, taskboard_order=2) + status=closed_status, user_story=None) + task2 = f.create_task(project=project, milestone=milestone1, taskboard_order=2, + user_story=None) assert project.milestones.get(id=milestone1.id).tasks.count() == 2 assert not milestone1.closed diff --git a/tests/unit/test_milestones.py b/tests/unit/test_milestones.py index e7c3d50f..de6e7113 100644 --- a/tests/unit/test_milestones.py +++ b/tests/unit/test_milestones.py @@ -3,7 +3,6 @@ import pytest from .. import factories as f from taiga.projects.milestones import services - pytestmark = pytest.mark.django_db @@ -51,6 +50,54 @@ def test_stay_open_with_issues_but_closed_tasks(): assert not services.calculate_milestone_is_closed(milestone1) +def test_stay_open_with_issues_but_closed_uss(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + us_closed_status = f.UserStoryStatusFactory.create(project=project, + is_closed=True) + f.create_userstory(project=project, milestone=milestone1, + status=us_closed_status, is_closed=True) + + f.create_issue(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_closed_issues_but_open_uss(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + closed_status = f.IssueStatusFactory.create(project=project, + is_closed=True) + f.create_issue(project=project, milestone=milestone1, + status=closed_status) + + f.create_userstory(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_closed_issues_but_open_tasks(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + closed_status = f.IssueStatusFactory.create(project=project, + is_closed=True) + f.create_issue(project=project, milestone=milestone1, + status=closed_status) + + f.create_task(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + def test_tasks_not_closed(): project = f.ProjectFactory() f.MembershipFactory.create(project=project, user=project.owner, @@ -75,7 +122,7 @@ def test_tasks_closed(): closed_status = f.TaskStatusFactory.create(project=project, is_closed=True) f.create_task(project=project, milestone=milestone1, - status=closed_status) + status=closed_status, user_story=None) assert services.calculate_milestone_is_closed(milestone1) @@ -95,6 +142,51 @@ def test_stay_open_with_tasks_but_closed_issues(): assert not services.calculate_milestone_is_closed(milestone1) +def test_stay_open_with_tasks_but_closed_uss(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + us_closed_status = f.UserStoryStatusFactory.create(project=project, + is_closed=True) + f.create_userstory(project=project, milestone=milestone1, + status=us_closed_status, is_closed=True) + + f.create_task(project=project, milestone=milestone1, user_story=None) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_closed_tasks_but_open_uss(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + closed_status = f.TaskStatusFactory.create(project=project, + is_closed=True) + f.create_task(project=project, milestone=milestone1, + status=closed_status, user_story=None) + + f.create_userstory(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_closed_tasks_but_open_issues(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + closed_status = f.TaskStatusFactory.create(project=project, + is_closed=True) + f.create_task(project=project, milestone=milestone1, + status=closed_status, user_story=None) + + f.create_issue(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + def test_uss_not_closed(): project = f.ProjectFactory() f.MembershipFactory.create(project=project, user=project.owner, @@ -104,7 +196,7 @@ def test_uss_not_closed(): closed_status = f.UserStoryStatusFactory.create(project=project, is_closed=True) f.create_userstory(project=project, milestone=milestone1, - status=closed_status) + status=closed_status, is_closed=True) f.create_userstory(project=project, milestone=milestone1) assert not services.calculate_milestone_is_closed(milestone1) @@ -124,3 +216,53 @@ def test_uss_closed(): assert services.calculate_milestone_is_closed(milestone1) + +def test_stay_open_with_uss_but_closed_tasks_and_us(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + us_closed_status = f.UserStoryStatusFactory.create(project=project, + is_closed=True) + us = f.create_userstory(project=project, milestone=milestone1, + status=us_closed_status, is_closed=True) + + task_closed_status = f.TaskStatusFactory.create(project=project, + is_closed=True) + f.create_task(project=project, milestone=milestone1, user_story=us, + status=task_closed_status) + + f.create_userstory(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_uss_but_closed_tasks(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + closed_status = f.TaskStatusFactory.create(project=project, + is_closed=True) + f.create_task(project=project, milestone=milestone1, + status=closed_status, user_story=None) + f.create_userstory(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1) + + +def test_stay_open_with_uss_but_closed_issues(): + project = f.ProjectFactory() + f.MembershipFactory.create(project=project, user=project.owner, + is_admin=True) + milestone1 = f.MilestoneFactory.create(project=project) + + closed_status = f.IssueStatusFactory.create(project=project, + is_closed=True) + f.create_issue(project=project, milestone=milestone1, + status=closed_status) + f.create_userstory(project=project, milestone=milestone1) + + assert not services.calculate_milestone_is_closed(milestone1)