From 7e9c830e69e08b4e0486e03734170db9f32e6fb7 Mon Sep 17 00:00:00 2001 From: Ajay Singh Date: Tue, 10 Dec 2024 11:27:36 -0800 Subject: [PATCH 1/3] tests and properties for is___plan --- shared/plan/service.py | 45 ++++++++++++++++- tests/unit/plan/test_plan.py | 93 ++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/shared/plan/service.py b/shared/plan/service.py index 38a78b1c8..fd0eade46 100644 --- a/shared/plan/service.py +++ b/shared/plan/service.py @@ -7,6 +7,7 @@ from shared.django_apps.codecov_auth.models import Owner from shared.plan.constants import ( BASIC_PLAN, + ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS, FREE_PLAN, FREE_PLAN_REPRESENTATIONS, PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS, @@ -16,6 +17,7 @@ TRIAL_PLAN_REPRESENTATION, TRIAL_PLAN_SEATS, USER_PLAN_REPRESENTATIONS, + PlanBillingRate, PlanData, PlanName, TrialDaysAmount, @@ -124,7 +126,7 @@ def marketing_name(self) -> str: return self.plan_data.marketing_name @property - def billing_rate(self) -> Optional[str]: + def billing_rate(self) -> Optional[PlanBillingRate]: """Returns the billing rate for the plan.""" return self.plan_data.billing_rate @@ -282,7 +284,7 @@ def trial_end_date(self) -> Optional[datetime]: return self.current_org.trial_end_date @property - def trial_total_days(self) -> Optional[int]: + def trial_total_days(self) -> Optional[TrialDaysAmount]: """Returns the total number of trial days.""" return self.plan_data.trial_days @@ -311,3 +313,42 @@ def has_seats_left(self) -> bool: self.plan_activated_users is None or len(self.plan_activated_users) < self.plan_user_count ) + + @property + def is_enterprise_plan(self) -> bool: + if self.plan_name in ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS: + return True + return False + + @property + def is_free_plan(self) -> bool: + if self.plan_name in FREE_PLAN_REPRESENTATIONS: + return True + return False + + @property + def is_pro_plan(self) -> bool: + if ( + self.plan_name in PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS + or self.plan_name in SENTRY_PAID_USER_PLAN_REPRESENTATIONS + ): + return True + return False + + @property + def is_sentry_plan(self) -> bool: + if self.plan_name in SENTRY_PAID_USER_PLAN_REPRESENTATIONS: + return True + return False + + @property + def is_team_plan(self) -> bool: + if self.plan_name in TEAM_PLAN_REPRESENTATIONS: + return True + return False + + @property + def is_trial_plan(self) -> bool: + if self.plan_name in TRIAL_PLAN_REPRESENTATION: + return True + return False diff --git a/tests/unit/plan/test_plan.py b/tests/unit/plan/test_plan.py index 239f10c8e..d4b73a255 100644 --- a/tests/unit/plan/test_plan.py +++ b/tests/unit/plan/test_plan.py @@ -786,3 +786,96 @@ def test_sentry_user(self, is_sentry_user): # Can not do Team plan when at 11 activated users assert self.plan_service.available_plans(owner=self.owner) == expected_result + + +class PlanServiceIs___PlanTests(TestCase): + def test_is_trial_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.TRIAL_PLAN_NAME.value, + trial_start_date=datetime.utcnow(), + trial_end_date=datetime.utcnow() + timedelta(days=14), + trial_status=TrialStatus.ONGOING.value, + plan_user_count=1000, + plan_activated_users=None, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == True + assert self.plan_service.is_sentry_plan == False + assert self.plan_service.is_team_plan == False + assert self.plan_service.is_free_plan == False + assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_enterprise_plan == False + + def test_is_team_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.TEAM_MONTHLY.value, + trial_status=TrialStatus.EXPIRED.value, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == False + assert self.plan_service.is_sentry_plan == False + assert self.plan_service.is_team_plan == True + assert self.plan_service.is_free_plan == False + assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_enterprise_plan == False + + def test_is_sentry_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.SENTRY_MONTHLY.value, + trial_status=TrialStatus.EXPIRED.value, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == False + assert self.plan_service.is_sentry_plan == True + assert self.plan_service.is_team_plan == False + assert self.plan_service.is_free_plan == False + assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_enterprise_plan == False + + def test_is_free_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.FREE_PLAN.value, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == False + assert self.plan_service.is_sentry_plan == False + assert self.plan_service.is_team_plan == False + assert self.plan_service.is_free_plan == True + assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_enterprise_plan == False + + def test_is_pro_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.CODECOV_PRO_MONTHLY.value, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == False + assert self.plan_service.is_sentry_plan == False + assert self.plan_service.is_team_plan == False + assert self.plan_service.is_free_plan == False + assert self.plan_service.is_pro_plan == True + assert self.plan_service.is_enterprise_plan == False + + def test_is_enterprise_plan(self): + self.current_org = OwnerFactory( + plan=PlanName.ENTERPRISE_PLAN.value, + ) + self.owner = OwnerFactory() + self.plan_service = PlanService(current_org=self.current_org) + + assert self.plan_service.is_trial_plan == False + assert self.plan_service.is_sentry_plan == False + assert self.plan_service.is_team_plan == False + assert self.plan_service.is_free_plan == False + assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_enterprise_plan == True From c405579af9b2e77ac24d27e41f18b7ef89f8919b Mon Sep 17 00:00:00 2001 From: Ajay Singh Date: Tue, 10 Dec 2024 11:37:43 -0800 Subject: [PATCH 2/3] fix tests --- tests/unit/plan/test_plan.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/plan/test_plan.py b/tests/unit/plan/test_plan.py index d4b73a255..de6f48805 100644 --- a/tests/unit/plan/test_plan.py +++ b/tests/unit/plan/test_plan.py @@ -835,12 +835,12 @@ def test_is_sentry_plan(self): assert self.plan_service.is_sentry_plan == True assert self.plan_service.is_team_plan == False assert self.plan_service.is_free_plan == False - assert self.plan_service.is_pro_plan == False + assert self.plan_service.is_pro_plan == True assert self.plan_service.is_enterprise_plan == False def test_is_free_plan(self): self.current_org = OwnerFactory( - plan=PlanName.FREE_PLAN.value, + plan=PlanName.FREE_PLAN_NAME.value, ) self.owner = OwnerFactory() self.plan_service = PlanService(current_org=self.current_org) @@ -868,7 +868,7 @@ def test_is_pro_plan(self): def test_is_enterprise_plan(self): self.current_org = OwnerFactory( - plan=PlanName.ENTERPRISE_PLAN.value, + plan=PlanName.ENTERPRISE_CLOUD_YEARLY.value, ) self.owner = OwnerFactory() self.plan_service = PlanService(current_org=self.current_org) From 781873f609bc5066823dbc9df169cb03d14d52ec Mon Sep 17 00:00:00 2001 From: Ajay Singh Date: Tue, 10 Dec 2024 11:41:02 -0800 Subject: [PATCH 3/3] little clean up --- shared/plan/service.py | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/shared/plan/service.py b/shared/plan/service.py index fd0eade46..66ffdf1f3 100644 --- a/shared/plan/service.py +++ b/shared/plan/service.py @@ -316,39 +316,27 @@ def has_seats_left(self) -> bool: @property def is_enterprise_plan(self) -> bool: - if self.plan_name in ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS: - return True - return False + return self.plan_name in ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS @property def is_free_plan(self) -> bool: - if self.plan_name in FREE_PLAN_REPRESENTATIONS: - return True - return False + return self.plan_name in FREE_PLAN_REPRESENTATIONS @property def is_pro_plan(self) -> bool: - if ( + return ( self.plan_name in PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS or self.plan_name in SENTRY_PAID_USER_PLAN_REPRESENTATIONS - ): - return True - return False + ) @property def is_sentry_plan(self) -> bool: - if self.plan_name in SENTRY_PAID_USER_PLAN_REPRESENTATIONS: - return True - return False + return self.plan_name in SENTRY_PAID_USER_PLAN_REPRESENTATIONS @property def is_team_plan(self) -> bool: - if self.plan_name in TEAM_PLAN_REPRESENTATIONS: - return True - return False + return self.plan_name in TEAM_PLAN_REPRESENTATIONS @property def is_trial_plan(self) -> bool: - if self.plan_name in TRIAL_PLAN_REPRESENTATION: - return True - return False + return self.plan_name in TRIAL_PLAN_REPRESENTATION