From 0c3ed7211477730780c6a8ee5ec7a7210a99a336 Mon Sep 17 00:00:00 2001 From: Nadzeya H <84857215+nadzyah@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:11:24 +0300 Subject: [PATCH] For non-kernel artefacts, set due date to be today + 10 days (#154) * For non-kernel artefacts, set due date to be today + 10 days * Move tests to the approprite file * Use context sensitive default instead of event listener --- backend/test_observer/data_access/models.py | 21 +++++- .../controllers/artefacts/test_artefacts.py | 10 ++- .../test_executions/test_start_test.py | 74 +++++++++++++++++++ 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/backend/test_observer/data_access/models.py b/backend/test_observer/data_access/models.py index 0485f852..bb395449 100644 --- a/backend/test_observer/data_access/models.py +++ b/backend/test_observer/data_access/models.py @@ -17,7 +17,8 @@ # Written by: # Nadzeya Hutsko # Omar Selo -from datetime import date, datetime + +from datetime import date, datetime, timedelta from typing import TypeVar from sqlalchemy import ( @@ -29,6 +30,7 @@ UniqueConstraint, column, ) +from sqlalchemy.engine.default import DefaultExecutionContext from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.orm import ( DeclarativeBase, @@ -37,6 +39,7 @@ relationship, ) from sqlalchemy.sql import func +from sqlalchemy.ext.hybrid import hybrid_property from test_observer.data_access.models_enums import ( ArtefactStatus, @@ -77,6 +80,15 @@ def data_model_repr(obj: DataModel, *keys: str) -> str: return f"{type(obj).__name__}({', '.join(kwargs)})" +def determine_due_date(context: DefaultExecutionContext): + name = context.get_current_parameters()["name"] + is_kernel = name.startswith("linux-") or name.endswith("-kernel") + if not is_kernel: + # If not a kernel, return a date 10 days from now + return date.today() + timedelta(days=10) + return None + + class User(Base): """ ORM representing users that can be assigned to review artefacts @@ -148,7 +160,7 @@ class Artefact(Base): assignee_id: Mapped[int | None] = mapped_column(ForeignKey("app_user.id")) assignee: Mapped[User | None] = relationship(back_populates="assignments") # Default fields - due_date: Mapped[date | None] + due_date: Mapped[date | None] = mapped_column(default=determine_due_date) status: Mapped[ArtefactStatus] = mapped_column(default=ArtefactStatus.UNDECIDED) bug_link: Mapped[str] = mapped_column(default="") @@ -186,6 +198,11 @@ def __repr__(self) -> str: "status", ) + @hybrid_property + def is_kernel(self) -> bool: + """Kernel artefacts start with 'linix-' or end with '-kernel'""" + return self.name.startswith("linux-") or self.name.endswith("-kernel") + class ArtefactBuild(Base): """A model to represent specific builds of artefact (e.g. arm64 revision 2)""" diff --git a/backend/tests/controllers/artefacts/test_artefacts.py b/backend/tests/controllers/artefacts/test_artefacts.py index 4a6f294d..5a9b24cd 100644 --- a/backend/tests/controllers/artefacts/test_artefacts.py +++ b/backend/tests/controllers/artefacts/test_artefacts.py @@ -57,7 +57,11 @@ def test_get_latest_artefacts_by_family( "stage": relevant_artefact.stage.name, "status": relevant_artefact.status, "assignee": None, - "due_date": None, + "due_date": ( + relevant_artefact.due_date.strftime("%Y-%m-%d") + if relevant_artefact.due_date + else None + ), "bug_link": "", } ] @@ -219,7 +223,9 @@ def test_artefact_signoff_approve(test_client: TestClient, generator: DataGenera "stage": artefact.stage.name, "status": artefact.status, "assignee": None, - "due_date": None, + "due_date": ( + artefact.due_date.strftime("%Y-%m-%d") if artefact.due_date else None + ), "bug_link": "", } diff --git a/backend/tests/controllers/test_executions/test_start_test.py b/backend/tests/controllers/test_executions/test_start_test.py index 55e2d3d3..0eccfdba 100644 --- a/backend/tests/controllers/test_executions/test_start_test.py +++ b/backend/tests/controllers/test_executions/test_start_test.py @@ -14,6 +14,8 @@ # along with this program. If not, see . # +from datetime import date, timedelta + from fastapi.testclient import TestClient from sqlalchemy.orm import Session @@ -194,3 +196,75 @@ def test_new_artefacts_get_assigned_a_reviewer( artefact = db_session.query(Artefact).filter(Artefact.name == "core22").one() assert artefact.assignee is not None assert artefact.assignee.launchpad_handle == user.launchpad_handle + + +def test_non_kernel_artefact_due_date(db_session: Session, test_client: TestClient): + """ + For non-kernel snaps, the default due date should be set to now + 10 days + """ + test_client.put( + "/v1/test-executions/start-test", + json={ + "family": FamilyName.SNAP, + "name": "core22", + "version": "abec123", + "revision": 123, + "track": "22", + "store": "ubuntu", + "arch": "arm64", + "execution_stage": "beta", + "environment": "cm3", + "ci_link": "http://localhost", + }, + ) + + artefact = ( + db_session.query(Artefact) + .filter( + Artefact.name == "core22", + Artefact.version == "abec123", + Artefact.store == "ubuntu", + Artefact.track == "22", + Artefact.stage.has(name="beta"), + ) + .one_or_none() + ) + + assert artefact is not None + assert artefact.due_date == date.today() + timedelta(10) + + +def test_kernel_artefact_due_date(db_session: Session, test_client: TestClient): + """ + For kernel artefacts, due date shouldn't be set to default + """ + test_client.put( + "/v1/test-executions/start-test", + json={ + "family": FamilyName.SNAP, + "name": "pi-kernel", + "version": "abec123", + "revision": 123, + "track": "22", + "store": "ubuntu", + "arch": "arm64", + "execution_stage": "beta", + "environment": "cm3", + "ci_link": "http://localhost", + }, + ) + + artefact = ( + db_session.query(Artefact) + .filter( + Artefact.name == "pi-kernel", + Artefact.version == "abec123", + Artefact.store == "ubuntu", + Artefact.track == "22", + Artefact.stage.has(name="beta"), + ) + .one_or_none() + ) + + assert artefact is not None + assert artefact.due_date is None