From 8f8e7fa65ea627f8e6ef6658bb8ec5714b14ec0c Mon Sep 17 00:00:00 2001 From: Patrick Smith Date: Mon, 14 Jan 2019 16:02:46 -0500 Subject: [PATCH] Add active & expired task order statuses --- atst/models/task_order.py | 17 +++++++++++++++- tests/factories.py | 11 +++++++++- tests/models/test_task_order.py | 36 +++++++++++++++++++++++++++++---- 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/atst/models/task_order.py b/atst/models/task_order.py index 502fd8f8..340be9af 100644 --- a/atst/models/task_order.py +++ b/atst/models/task_order.py @@ -1,5 +1,6 @@ from enum import Enum +import pendulum from sqlalchemy import Column, Numeric, String, ForeignKey, Date, Integer from sqlalchemy.types import ARRAY from sqlalchemy.orm import relationship @@ -9,6 +10,8 @@ from atst.models import Base, types, mixins class Status(Enum): PENDING = "Pending" + ACTIVE = "Active" + EXPIRED = "Expired" class TaskOrder(Base, mixins.TimestampsMixin): @@ -69,9 +72,21 @@ class TaskOrder(Base, mixins.TimestampsMixin): number = Column(String, unique=True) # Task Order Number loa = Column(ARRAY(String)) # Line of Accounting (LOA) + @property + def is_submitted(self): + return self.number is not None + @property def status(self): - return Status.PENDING + if self.is_submitted: + now = pendulum.now().date() + if self.start_date > now: + return Status.PENDING + elif self.end_date < now: + return Status.EXPIRED + return Status.ACTIVE + else: + return Status.PENDING @property def budget(self): diff --git a/tests/factories.py b/tests/factories.py index 23b48c93..75ce839e 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -1,3 +1,4 @@ +import operator import random import string import factory @@ -41,14 +42,22 @@ def random_phone_number(): return "".join(random.choices(string.digits, k=10)) +def random_past_date(year_min=1, year_max=5): + return _random_date(year_min, year_max, operator.sub) + + def random_future_date(year_min=1, year_max=5): + return _random_date(year_min, year_max, operator.add) + + +def _random_date(year_min, year_max, operation): if year_min == year_max: inc = year_min else: inc = random.randrange(year_min, year_max) return datetime.date( - datetime.date.today().year + inc, + operation(datetime.date.today().year, inc), random.randrange(1, 12), random.randrange(1, 28), ) diff --git a/tests/models/test_task_order.py b/tests/models/test_task_order.py index afd9611d..c6179bf6 100644 --- a/tests/models/test_task_order.py +++ b/tests/models/test_task_order.py @@ -1,9 +1,37 @@ from atst.models.task_order import TaskOrder, Status +from tests.factories import random_future_date, random_past_date -def test_default_status(): + +class TestTaskOrderStatus: + + def test_pending_status(self): + to = TaskOrder() + assert to.status == Status.PENDING + + to = TaskOrder(number='42', start_date=random_future_date()) + assert to.status == Status.PENDING + + def test_active_status(self): + to = TaskOrder( + number='42', + start_date=random_past_date(), + end_date=random_future_date(), + ) + assert to.status == Status.ACTIVE + + def test_expired_status(self): + to = TaskOrder( + number='42', + start_date=random_past_date(), + end_date=random_past_date(), + ) + assert to.status == Status.EXPIRED + + +def test_is_submitted(): to = TaskOrder() - assert to.status == Status.PENDING + assert not to.is_submitted - with_args = TaskOrder(number="42") - assert to.status == Status.PENDING + to = TaskOrder(number='42') + assert to.is_submitted