refactor MockBug in preperation for adding `status` field to `Node`
[utils.git] / src / budget_sync / test / mock_bug.py
index acc2cae94337f862cf85f28120b6d0785df5962d..e63ab46c185e3e3f91c8107b18b7dac06f22b53a 100644 (file)
@@ -1,18 +1,19 @@
-from typing import Optional
+from typing import Optional, Union
+from budget_sync.util import BugStatus
 
 
 class MockBug:
     def __init__(self,
                  bug_id: int,
-                 cf_budget_parent: Optional[int],
-                 cf_budget: str,
-                 cf_total_budget: str,
-                 cf_nlnet_milestone: Optional[str],
-                 cf_payees_list: str,
-                 summary: str):
+                 cf_budget_parent: Optional[int] = None,
+                 cf_budget: str = "0",
+                 cf_total_budget: str = "0",
+                 cf_nlnet_milestone: Optional[str] = None,
+                 cf_payees_list: str = "",
+                 summary: str = "<default summary>",
+                 status: Union[str, BugStatus] = BugStatus.CONFIRMED):
         self.id = bug_id
-        if cf_budget_parent is not None:
-            self.cf_budget_parent = cf_budget_parent
+        self.__budget_parent = cf_budget_parent
         self.cf_budget = cf_budget
         self.cf_total_budget = cf_total_budget
         if cf_nlnet_milestone is None:
@@ -20,13 +21,35 @@ class MockBug:
         self.cf_nlnet_milestone = cf_nlnet_milestone
         self.cf_payees_list = cf_payees_list
         self.summary = summary
+        self.status = str(status)
+
+    @property
+    def cf_budget_parent(self) -> int:
+        if self.__budget_parent is None:
+            raise AttributeError(
+                "'MockBug' object has no attribute 'cf_budget_parent'")
+        return self.__budget_parent
+
+    @cf_budget_parent.setter
+    def cf_budget_parent(self, value: int):
+        if isinstance(value, int):
+            self.__budget_parent = value
+        else:
+            raise TypeError("cf_budget_parent must be an int")
+
+    @cf_budget_parent.deleter
+    def cf_budget_parent(self):
+        self.cf_budget_parent  # trigger AttributeError if property cleared
+        self.__budget_parent = None
 
     def __repr__(self):
         cf_budget_parent = getattr(self, "cf_budget_parent", None)
+        status = BugStatus.cast(self.status, unknown_allowed=True)
         return (f"MockBug(bug_id={self.id!r}, "
                 f"cf_budget_parent={cf_budget_parent!r}, "
                 f"cf_budget={self.cf_budget!r}, "
                 f"cf_total_budget={self.cf_total_budget!r}, "
                 f"cf_nlnet_milestone={self.cf_nlnet_milestone!r}, "
                 f"cf_payees_list={self.cf_payees_list!r}, "
-                f"summary={self.summary!r})")
+                f"summary={self.summary!r}, "
+                f"status={status!r})")