diff --git a/shared/django_apps/codecov_auth/migrations/0065_alter_account_plan_alter_owner_plan.py b/shared/django_apps/codecov_auth/migrations/0065_alter_account_plan_alter_owner_plan.py new file mode 100644 index 000000000..e4eb9feb8 --- /dev/null +++ b/shared/django_apps/codecov_auth/migrations/0065_alter_account_plan_alter_owner_plan.py @@ -0,0 +1,62 @@ +# Generated by Django 4.2.16 on 2025-01-30 13:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + """ + BEGIN; + -- + -- Alter field plan on account + -- + -- (no-op) + -- + -- Raw SQL operation + -- + ALTER TYPE plans ADD VALUE IF NOT EXISTS 'users-developer'; + -- + -- Alter field plan on owner + -- + -- (no-op) + COMMIT; + """ + + dependencies = [ + ("codecov_auth", "0064_plan_stripe_id"), + ] + + operations = [ + migrations.AlterField( + model_name="account", + name="plan", + field=models.CharField( + choices=[ + ("users-basic", "BASIC_PLAN_NAME"), + ("users-trial", "TRIAL_PLAN_NAME"), + ("users-pr-inappm", "CODECOV_PRO_MONTHLY"), + ("users-pr-inappy", "CODECOV_PRO_YEARLY"), + ("users-sentrym", "SENTRY_MONTHLY"), + ("users-sentryy", "SENTRY_YEARLY"), + ("users-teamm", "TEAM_MONTHLY"), + ("users-teamy", "TEAM_YEARLY"), + ("users", "GHM_PLAN_NAME"), + ("users-free", "FREE_PLAN_NAME"), + ("users-inappm", "CODECOV_PRO_MONTHLY_LEGACY"), + ("users-inappy", "CODECOV_PRO_YEARLY_LEGACY"), + ("users-enterprisem", "ENTERPRISE_CLOUD_MONTHLY"), + ("users-enterprisey", "ENTERPRISE_CLOUD_YEARLY"), + ("users-developer", "USERS_DEVELOPER"), + ], + default="users-developer", + max_length=50, + ), + ), + migrations.RunSQL( + "ALTER TYPE plans ADD VALUE IF NOT EXISTS 'users-developer';" + ), + migrations.AlterField( + model_name="owner", + name="plan", + field=models.TextField(blank=True, default="users-developer", null=True), + ), + ] diff --git a/shared/django_apps/codecov_auth/models.py b/shared/django_apps/codecov_auth/models.py index f32afbb1f..17d80cf80 100644 --- a/shared/django_apps/codecov_auth/models.py +++ b/shared/django_apps/codecov_auth/models.py @@ -145,7 +145,7 @@ class Account(BaseModel): max_length=50, choices=PlanName.choices(), null=False, - default=PlanName.BASIC_PLAN_NAME.value, + default=PlanName.USERS_DEVELOPER.value, ) plan_seat_count = models.SmallIntegerField(default=1, null=False, blank=True) free_seat_count = models.SmallIntegerField(default=0, null=False, blank=True) @@ -328,7 +328,7 @@ class Meta: cache = models.JSONField(null=True) # Really an ENUM in db plan = models.TextField( - null=True, default=PlanName.BASIC_PLAN_NAME.value, blank=True + null=True, default=PlanName.USERS_DEVELOPER.value, blank=True ) plan_provider = models.TextField( null=True, choices=PlanProviders.choices, blank=True diff --git a/shared/django_apps/reports/migrations/0039_reportsession_upload_storage_path_idx.py b/shared/django_apps/reports/migrations/0039_reportsession_upload_storage_path_idx.py index 3c0db4075..7b1e43c49 100644 --- a/shared/django_apps/reports/migrations/0039_reportsession_upload_storage_path_idx.py +++ b/shared/django_apps/reports/migrations/0039_reportsession_upload_storage_path_idx.py @@ -1,6 +1,7 @@ # Generated by Django 4.2.16 on 2025-01-28 15:28 from django.db import migrations, models + from shared.django_apps.migration_utils import RiskyAddIndex """ diff --git a/shared/plan/constants.py b/shared/plan/constants.py index 30583dbde..1c9288741 100644 --- a/shared/plan/constants.py +++ b/shared/plan/constants.py @@ -4,7 +4,7 @@ class MonthlyUploadLimits(enum.Enum): - CODECOV_BASIC_PLAN = 250 + CODECOV_FREE_PLAN = 250 CODECOV_TEAM_PLAN = 2500 @@ -23,6 +23,9 @@ class PlanMarketingName(enum.Enum): TEAM = "Team" +DEFAULT_FREE_PLAN = "users-developer" + + class PlanName(enum.Enum): # If you add or remove, make a migration for Account table BASIC_PLAN_NAME = "users-basic" @@ -39,6 +42,7 @@ class PlanName(enum.Enum): CODECOV_PRO_YEARLY_LEGACY = "users-inappy" ENTERPRISE_CLOUD_MONTHLY = "users-enterprisem" ENTERPRISE_CLOUD_YEARLY = "users-enterprisey" + USERS_DEVELOPER = "users-developer" @classmethod def choices(cls): @@ -292,7 +296,7 @@ def convert_to_DTO(self) -> dict: "Unlimited private repositories", ], tier_name=TierName.BASIC.value, - monthly_uploads_limit=MonthlyUploadLimits.CODECOV_BASIC_PLAN.value, + monthly_uploads_limit=MonthlyUploadLimits.CODECOV_FREE_PLAN.value, trial_days=None, ) @@ -311,9 +315,25 @@ def convert_to_DTO(self) -> dict: monthly_uploads_limit=None, ) +DEVELOPER_PLAN = PlanData( + marketing_name=PlanMarketingName.FREE.value, + value=DEFAULT_FREE_PLAN, + billing_rate=None, + base_unit_price=PlanPrice.CODECOV_FREE.value, + benefits=[ + "Up to 1 user", + "Unlimited public repositories", + "Unlimited private repositories", + ], + tier_name=TierName.TEAM.value, + trial_days=None, + monthly_uploads_limit=250, +) + FREE_PLAN_REPRESENTATIONS = { PlanName.FREE_PLAN_NAME.value: FREE_PLAN, PlanName.BASIC_PLAN_NAME.value: BASIC_PLAN, + DEFAULT_FREE_PLAN: DEVELOPER_PLAN, } TEAM_PLAN_REPRESENTATIONS = { @@ -389,6 +409,7 @@ def convert_to_DTO(self) -> dict: } PLANS_THAT_CAN_TRIAL = [ + DEFAULT_FREE_PLAN, PlanName.FREE_PLAN_NAME.value, PlanName.BASIC_PLAN_NAME.value, PlanName.CODECOV_PRO_MONTHLY.value, diff --git a/shared/plan/service.py b/shared/plan/service.py index d0f412501..a441a14a3 100644 --- a/shared/plan/service.py +++ b/shared/plan/service.py @@ -8,6 +8,7 @@ from shared.django_apps.codecov.commands.exceptions import ValidationError from shared.django_apps.codecov_auth.models import Owner, Plan, Service from shared.plan.constants import ( + DEFAULT_FREE_PLAN, TEAM_PLAN_MAX_USERS, TRIAL_PLAN_SEATS, PlanBillingRate, @@ -69,9 +70,11 @@ def current_org(self) -> Owner: return self.current_org def set_default_plan_data(self) -> None: - """Sets the organization to the default basic plan.""" - log.info(f"Setting plan to users-basic for owner {self.current_org.ownerid}") - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + """Sets the organization to the default developer plan.""" + log.info( + f"Setting plan to {DEFAULT_FREE_PLAN} for owner {self.current_org.ownerid}" + ) + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.plan_activated_users = None self.current_org.plan_user_count = 1 self.current_org.stripe_subscription_id = None @@ -155,9 +158,8 @@ def tier_name(self) -> TierName: def available_plans(self, owner: Owner) -> List[Plan]: """Returns the available plans for the owner and organization.""" available_plans = { - Plan.objects.select_related("tier").get(name=PlanName.BASIC_PLAN_NAME.value) + Plan.objects.select_related("tier").get(name=DEFAULT_FREE_PLAN) } - curr_plan = self.plan_data if not curr_plan.paid_plan: available_plans.add(curr_plan) diff --git a/tests/helper.py b/tests/helper.py index a065ed883..b92739ed7 100644 --- a/tests/helper.py +++ b/tests/helper.py @@ -3,6 +3,7 @@ from shared.django_apps.codecov_auth.models import BillingRate from shared.django_apps.codecov_auth.tests.factories import PlanFactory, TierFactory from shared.plan.constants import ( + DEFAULT_FREE_PLAN, PlanName, PlanPrice, TierName, @@ -72,17 +73,6 @@ def mock_all_plans_and_tiers(): ) basic_tier = TierFactory(tier_name=TierName.BASIC.value) - PlanFactory( - name=PlanName.BASIC_PLAN_NAME.value, - tier=basic_tier, - marketing_name="Developer", - benefits=[ - "Up to 1 user", - "Unlimited public repositories", - "Unlimited private repositories", - ], - monthly_uploads_limit=250, - ) PlanFactory( name=PlanName.FREE_PLAN_NAME.value, tier=basic_tier, @@ -217,3 +207,18 @@ def mock_all_plans_and_tiers(): "Priority Support", ], ) + + PlanFactory( + name=DEFAULT_FREE_PLAN, + tier=team_tier, + marketing_name="Developer", + billing_rate=None, + base_unit_price=0, + paid_plan=False, + monthly_uploads_limit=250, + benefits=[ + "Up to 1 user", + "Unlimited public repositories", + "Unlimited private repositories", + ], + ) diff --git a/tests/unit/django_apps/codecov_auth/test_codecov_auth_models.py b/tests/unit/django_apps/codecov_auth/test_codecov_auth_models.py index 57ffd20ac..7c17982c2 100644 --- a/tests/unit/django_apps/codecov_auth/test_codecov_auth_models.py +++ b/tests/unit/django_apps/codecov_auth/test_codecov_auth_models.py @@ -36,7 +36,8 @@ ) from shared.django_apps.core.tests.factories import RepositoryFactory from shared.plan.constants import ( - BASIC_PLAN, + DEFAULT_FREE_PLAN, + DEVELOPER_PLAN, ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS, PlanName, ) @@ -380,11 +381,11 @@ def test_can_activate_user_cannot_activate_account(self): def test_fields_that_account_overrides(self): mock_all_plans_and_tiers() to_activate = OwnerFactory() - self.owner.plan = PlanName.BASIC_PLAN_NAME.value + self.owner.plan = DEFAULT_FREE_PLAN self.owner.plan_user_count = 1 self.owner.save() self.assertTrue(self.owner.can_activate_user(to_activate)) - org_pretty_plan = asdict(BASIC_PLAN) + org_pretty_plan = asdict(DEVELOPER_PLAN) org_pretty_plan.update({"quantity": 1}) self.assertEqual(self.owner.pretty_plan, org_pretty_plan) @@ -527,7 +528,7 @@ def test_has_yaml(self): class TestOrganizationLevelTokenModel(TestCase): def test_can_save_org_token_for_org_basic_plan(self): - owner = OwnerFactory(plan="users-basic") + owner = OwnerFactory(plan=DEFAULT_FREE_PLAN) owner.save() token = OrganizationLevelToken(owner=owner) token.save() @@ -545,7 +546,7 @@ def test_token_is_deleted_when_changing_user_plan( owner.save() org_token.save() assert OrganizationLevelToken.objects.filter(owner=owner).count() == 1 - owner.plan = "users-basic" + owner.plan = DEFAULT_FREE_PLAN owner.save() assert OrganizationLevelToken.objects.filter(owner=owner).count() == 0 @@ -759,7 +760,7 @@ def test_account_with_users(self): self.assertEqual(account.activated_student_count, 0) self.assertEqual(account.total_seat_count, 1) self.assertEqual(account.available_seat_count, 0) - pretty_plan = asdict(BASIC_PLAN) + pretty_plan = asdict(DEVELOPER_PLAN) pretty_plan.update({"quantity": 1}) self.assertEqual(account.pretty_plan, pretty_plan) @@ -772,21 +773,21 @@ def test_create_account_for_enterprise_experience(self): user_for_owner_1 = UserFactory(email="hello@email.com", name="Luigi") owner_1 = OwnerFactory( username="codecov-1", - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, plan_user_count=1, organizations=[], user_id=user_for_owner_1.id, # has user ) owner_2 = OwnerFactory( username="codecov-sentry", - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, plan_user_count=1, organizations=[], user_id=None, # no user ) owner_3 = OwnerFactory( username="sentry-1", - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, plan_user_count=1, organizations=[], user_id=None, # no user @@ -810,7 +811,7 @@ def test_create_account_for_enterprise_experience(self): username="codecov-org", stripe_customer_id=stripe_customer_id, stripe_subscription_id=stripe_subscription_id, - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, plan_user_count=50, plan_activated_users=[owner_1.ownerid, owner_2.ownerid], free=10, @@ -930,7 +931,7 @@ def test_create_account_for_enterprise_experience(self): self.assertEqual(enterprise_account.activated_student_count, 0) self.assertEqual(enterprise_account.total_seat_count, 60) self.assertEqual(enterprise_account.available_seat_count, 57) - pretty_plan = asdict(BASIC_PLAN) + pretty_plan = asdict(DEVELOPER_PLAN) pretty_plan.update({"quantity": 50}) self.assertEqual(enterprise_account.pretty_plan, pretty_plan) diff --git a/tests/unit/plan/test_plan.py b/tests/unit/plan/test_plan.py index 4729ac109..7bd7781b6 100644 --- a/tests/unit/plan/test_plan.py +++ b/tests/unit/plan/test_plan.py @@ -12,6 +12,7 @@ TierFactory, ) from shared.plan.constants import ( + DEFAULT_FREE_PLAN, FREE_PLAN_REPRESENTATIONS, TRIAL_PLAN_REPRESENTATION, TRIAL_PLAN_SEATS, @@ -32,7 +33,7 @@ def setUpClass(cls): mock_all_plans_and_tiers() def test_plan_service_trial_status_not_started(self): - current_org = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value) + current_org = OwnerFactory(plan=DEFAULT_FREE_PLAN) plan_service = PlanService(current_org=current_org) assert plan_service.trial_status == TrialStatus.NOT_STARTED.value @@ -41,7 +42,7 @@ def test_plan_service_trial_status_expired(self): trial_start_date = datetime.utcnow() trial_end_date_expired = trial_start_date - timedelta(days=1) current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date_expired, trial_status=TrialStatus.EXPIRED.value, @@ -68,7 +69,7 @@ def test_plan_service_expire_trial_when_upgrading_successful_if_trial_is_not_sta self, ): current_org_with_ongoing_trial = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=None, trial_end_date=None, trial_status=TrialStatus.NOT_STARTED.value, @@ -86,7 +87,7 @@ def test_plan_service_expire_trial_when_upgrading_successful_if_trial_is_ongoing trial_start_date = datetime.utcnow() trial_end_date_ongoing = trial_start_date + timedelta(days=5) current_org_with_ongoing_trial = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date_ongoing, trial_status=TrialStatus.ONGOING.value, @@ -105,7 +106,7 @@ def test_plan_service_expire_trial_users_pretrial_users_count_if_existing( trial_end_date_ongoing = trial_start_date + timedelta(days=5) pretrial_users_count = 5 current_org_with_ongoing_trial = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date_ongoing, trial_status=TrialStatus.ONGOING.value, @@ -124,7 +125,7 @@ def test_plan_service_start_trial_errors_if_status_is_ongoing(self): days=TrialDaysAmount.CODECOV_SENTRY.value ) current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date, trial_status=TrialStatus.ONGOING.value, @@ -139,7 +140,7 @@ def test_plan_service_start_trial_errors_if_status_is_expired(self): trial_start_date = datetime.utcnow() trial_end_date = trial_start_date + timedelta(days=-1) current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date, trial_status=TrialStatus.EXPIRED.value, @@ -152,7 +153,7 @@ def test_plan_service_start_trial_errors_if_status_is_expired(self): def test_plan_service_start_trial_errors_if_status_is_cannot_trial(self): current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=None, trial_end_date=None, trial_status=TrialStatus.CANNOT_TRIAL.value, @@ -181,7 +182,7 @@ def test_plan_service_start_trial_succeeds_if_trial_has_not_started(self): trial_end_date = None plan_user_count = 5 current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date, trial_status=TrialStatus.NOT_STARTED.value, @@ -207,7 +208,7 @@ def test_plan_service_start_trial_manually(self): trial_end_date = None plan_user_count = 5 current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date, trial_status=TrialStatus.NOT_STARTED.value, @@ -243,31 +244,29 @@ def test_plan_service_start_trial_manually_already_on_paid_plan(self): current_owner=current_owner, end_date="2024-01-01 00:00:00" ) - def test_plan_service_returns_plan_data_for_non_trial_basic_plan(self): + def test_plan_service_returns_plan_data_for_non_trial_developer_plan(self): trial_start_date = None trial_end_date = None current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=trial_start_date, trial_end_date=trial_end_date, ) plan_service = PlanService(current_org=current_org) - basic_plan = FREE_PLAN_REPRESENTATIONS[PlanName.BASIC_PLAN_NAME.value] + developer_plan = FREE_PLAN_REPRESENTATIONS[DEFAULT_FREE_PLAN] assert plan_service.current_org == current_org assert plan_service.trial_status == TrialStatus.NOT_STARTED.value - assert plan_service.marketing_name == basic_plan.marketing_name - assert plan_service.plan_name == basic_plan.value - assert plan_service.tier_name == basic_plan.tier_name - assert plan_service.billing_rate == basic_plan.billing_rate - assert plan_service.base_unit_price == basic_plan.base_unit_price - assert plan_service.benefits == basic_plan.benefits + assert plan_service.marketing_name == developer_plan.marketing_name + assert plan_service.plan_name == developer_plan.value + assert plan_service.tier_name == developer_plan.tier_name + assert plan_service.billing_rate == developer_plan.billing_rate + assert plan_service.base_unit_price == developer_plan.base_unit_price + assert plan_service.benefits == developer_plan.benefits assert ( - plan_service.monthly_uploads_limit == basic_plan.monthly_uploads_limit + plan_service.monthly_uploads_limit == developer_plan.monthly_uploads_limit ) # should be 250 - assert ( - plan_service.monthly_uploads_limit == 250 - ) # should be 250 since not trialing + assert plan_service.monthly_uploads_limit == 250 def test_plan_service_returns_plan_data_for_trialing_user_trial_plan(self): trial_start_date = datetime.utcnow() @@ -305,7 +304,7 @@ def test_plan_service_sets_default_plan_data_values_correctly(self): plan_service = PlanService(current_org=current_org) plan_service.set_default_plan_data() - assert current_org.plan == PlanName.BASIC_PLAN_NAME.value + assert current_org.plan == DEFAULT_FREE_PLAN assert current_org.plan_user_count == 1 assert current_org.plan_activated_users is None assert current_org.stripe_subscription_id is None @@ -353,13 +352,13 @@ def test_plan_service_gitlab_with_root_org(self): class AvailablePlansBeforeTrial(TestCase): """ - - users-basic, no trial -> users-pr-inappm/y, users-basic - - users-free, no trial -> users-pr-inappm/y, users-basic, users-free - - users-teamm/y, no trial -> users-pr-inappm/y, users-basic, users-teamm/y - - users-pr-inappm/y, no trial -> users-pr-inappm/y, users-basic - - sentry customer, users-basic, no trial -> users-pr-inappm/y, users-sentrym/y, users-basic - - sentry customer, users-teamm/y, no trial -> users-pr-inappm/y, users-sentrym/y, users-basic, users-teamm/y - - sentry customer, users-sentrym/y, no trial -> users-pr-inappm/y, users-sentrym/y, users-basic + - DEFAULT_FREE_PLAN, no trial -> users-pr-inappm/y, DEFAULT_FREE_PLAN + - users-free, no trial -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-free + - users-teamm/y, no trial -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-teamm/y + - users-pr-inappm/y, no trial -> users-pr-inappm/y, DEFAULT_FREE_PLAN + - sentry customer, DEFAULT_FREE_PLAN, no trial -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN + - sentry customer, users-teamm/y, no trial -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN, users-teamm/y + - sentry customer, users-sentrym/y, no trial -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN """ @classmethod @@ -375,16 +374,16 @@ def setUp(self): ) self.owner = OwnerFactory() - def test_available_plans_for_basic_plan_non_trial( + def test_available_plans_for_developer_plan_non_trial( self, ): - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.save() plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -407,7 +406,7 @@ def test_available_plans_for_free_plan_non_trial( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.FREE_PLAN_NAME.value, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, @@ -431,7 +430,7 @@ def test_available_plans_for_team_plan_non_trial( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -452,7 +451,7 @@ def test_available_plans_for_pro_plan_non_trial(self): plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -467,17 +466,17 @@ def test_available_plans_for_pro_plan_non_trial(self): ) @patch("shared.plan.service.is_sentry_user") - def test_available_plans_for_sentry_customer_basic_plan_non_trial( + def test_available_plans_for_sentry_customer_developer_plan_non_trial( self, is_sentry_user ): is_sentry_user.return_value = True - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.save() plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -504,7 +503,7 @@ def test_available_plans_for_sentry_customer_team_plan_non_trial( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -512,7 +511,6 @@ def test_available_plans_for_sentry_customer_team_plan_non_trial( PlanName.TEAM_MONTHLY.value, PlanName.TEAM_YEARLY.value, } - assert ( set( plan["value"] for plan in plan_service.available_plans(owner=self.owner) @@ -529,7 +527,7 @@ def test_available_plans_for_sentry_plan_non_trial(self, is_sentry_user): plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -549,12 +547,12 @@ def test_available_plans_for_sentry_plan_non_trial(self, is_sentry_user): @freeze_time("2023-06-19") class AvailablePlansExpiredTrialLessThanTenUsers(TestCase): """ - - users-basic, has trialed, less than 10 users -> users-pr-inappm/y, users-basic, users-teamm/y - - users-teamm/y, has trialed, less than 10 users -> users-pr-inappm/y, users-basic, users-teamm/y - - users-pr-inappm/y, has trialed, less than 10 users -> users-pr-inappm/y, users-basic, users-teamm/y - - sentry customer, users-basic, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, users-basic, users-teamm/y - - sentry customer, users-teamm/y, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, users-basic, users-teamm/y - - sentry customer, users-sentrym/y, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, users-basic, users-teamm/y + - {DEFAULT_FREE_PLAN}, has trialed, less than 10 users -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-teamm/y + - users-teamm/y, has trialed, less than 10 users -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-teamm/y + - users-pr-inappm/y, has trialed, less than 10 users -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-teamm/y + - sentry customer, DEFAULT_FREE_PLAN, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN, users-teamm/y + - sentry customer, users-teamm/y, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN, users-teamm/y + - sentry customer, users-sentrym/y, has trialed, less than 10 users -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN, users-teamm/y """ @classmethod @@ -571,22 +569,21 @@ def setUp(self): ) self.owner = OwnerFactory() - def test_available_plans_for_basic_plan_expired_trial_less_than_10_users( + def test_available_plans_for_developer_plan_expired_trial_less_than_10_users( self, ): - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.save() plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, PlanName.TEAM_YEARLY.value, } - assert ( set( plan["value"] for plan in plan_service.available_plans(owner=self.owner) @@ -603,13 +600,12 @@ def test_available_plans_for_team_plan_expired_trial_less_than_10_users( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, PlanName.TEAM_YEARLY.value, } - assert ( set( plan["value"] for plan in plan_service.available_plans(owner=self.owner) @@ -624,7 +620,7 @@ def test_available_plans_for_pro_plan_expired_trial_less_than_10_users(self): plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -639,17 +635,17 @@ def test_available_plans_for_pro_plan_expired_trial_less_than_10_users(self): ) @patch("shared.plan.service.is_sentry_user") - def test_available_plans_for_sentry_customer_basic_plan_expired_trial_less_than_10_users( + def test_available_plans_for_sentry_customer_developer_plan_expired_trial_less_than_10_users( self, is_sentry_user ): is_sentry_user.return_value = True - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.save() plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -674,9 +670,8 @@ def test_available_plans_for_sentry_customer_team_plan_expired_trial_less_than_1 self.current_org.save() plan_service = PlanService(current_org=self.current_org) - expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -703,7 +698,7 @@ def test_available_plans_for_sentry_plan_expired_trial_less_than_10_users( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -723,9 +718,9 @@ def test_available_plans_for_sentry_plan_expired_trial_less_than_10_users( @freeze_time("2023-06-19") class AvailablePlansExpiredTrialMoreThanTenActivatedUsers(TestCase): """ - - users-pr-inappm/y, has trialed, more than 10 activated users -> users-pr-inappm/y, users-basic - - sentry customer, users-basic, has trialed, more than 10 activated users -> users-pr-inappm/y, users-sentrym/y, users-basic - - sentry customer, users-sentrym/y, has trialed, more than 10 activated users -> users-pr-inappm/y, users-sentrym/y, users-basic + - users-pr-inappm/y, has trialed, more than 10 activated users -> users-pr-inappm/y, DEFAULT_FREE_PLAN + - sentry customer, DEFAULT_FREE_PLAN, has trialed, more than 10 activated users -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN + - sentry customer, users-sentrym/y, has trialed, more than 10 activated users -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN """ @classmethod @@ -750,7 +745,7 @@ def test_available_plans_for_pro_plan_expired_trial_more_than_10_users(self): plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, } @@ -763,23 +758,22 @@ def test_available_plans_for_pro_plan_expired_trial_more_than_10_users(self): ) @patch("shared.plan.service.is_sentry_user") - def test_available_plans_for_sentry_customer_basic_plan_expired_trial_more_than_10_users( + def test_available_plans_for_sentry_customer_developer_plan_expired_trial_more_than_10_users( self, is_sentry_user ): is_sentry_user.return_value = True - self.current_org.plan = PlanName.BASIC_PLAN_NAME.value + self.current_org.plan = DEFAULT_FREE_PLAN self.current_org.save() plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, PlanName.SENTRY_YEARLY.value, } - assert ( set( plan["value"] for plan in plan_service.available_plans(owner=self.owner) @@ -798,7 +792,7 @@ def test_available_plans_for_sentry_plan_expired_trial_more_than_10_users( plan_service = PlanService(current_org=self.current_org) expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.SENTRY_MONTHLY.value, @@ -826,7 +820,7 @@ def setUpClass(cls): def setUp(self): self.expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -898,7 +892,7 @@ def test_trial_not_started(self): self.plan_service = PlanService(current_org=self.current_org) self.expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.CODECOV_PRO_YEARLY.value, PlanName.TEAM_MONTHLY.value, @@ -918,11 +912,11 @@ def test_trial_not_started(self): class AvailablePlansOngoingTrial(TestCase): """ Non Sentry User is trialing - when <=10 activated seats -> users-pr-inappm/y, users-basic, users-teamm/y - when > 10 activated seats -> users-pr-inappm/y, users-basic + when <=10 activated seats -> users-pr-inappm/y, DEFAULT_FREE_PLAN, users-teamm/y + when > 10 activated seats -> users-pr-inappm/y, DEFAULT_FREE_PLAN Sentry User is trialing - when <=10 activated seats -> users-pr-inappm/y, users-sentrym/y, users-basic, users-teamm/y - when > 10 activated seats -> users-pr-inappm/y, users-sentrym/y, users-basic + when <=10 activated seats -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN, users-teamm/y + when > 10 activated seats -> users-pr-inappm/y, users-sentrym/y, DEFAULT_FREE_PLAN """ @classmethod @@ -932,7 +926,7 @@ def setUpClass(cls): def setUp(self): self.current_org = OwnerFactory( - plan=PlanName.BASIC_PLAN_NAME.value, + plan=DEFAULT_FREE_PLAN, trial_start_date=datetime.utcnow(), trial_end_date=datetime.utcnow() + timedelta(days=14), trial_status=TrialStatus.ONGOING.value, @@ -943,9 +937,9 @@ def setUp(self): self.plan_service = PlanService(current_org=self.current_org) def test_non_sentry_user(self): - # [Basic, Pro Monthly, Pro Yearly, Team Monthly, Team Yearly] + # [Developer, Pro Monthly, Pro Yearly, Team Monthly, Team Yearly] expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_YEARLY.value, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.TEAM_MONTHLY.value, @@ -976,9 +970,9 @@ def test_non_sentry_user(self): self.current_org.plan_activated_users = [i for i in range(11)] self.current_org.save() - # [Basic, Pro Monthly, Pro Yearly] + # [Developer, Pro Monthly, Pro Yearly] expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_YEARLY.value, PlanName.CODECOV_PRO_MONTHLY.value, } @@ -999,9 +993,9 @@ def test_sentry_user(self, is_sentry_user): is_sentry_user.return_value = True - # [Basic, Pro Monthly, Pro Yearly, Sentry Monthly, Sentry Yearly, Team Monthly, Team Yearly] + # [Developer, Pro Monthly, Pro Yearly, Sentry Monthly, Sentry Yearly, Team Monthly, Team Yearly] expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_YEARLY.value, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.SENTRY_MONTHLY.value, @@ -1033,9 +1027,9 @@ def test_sentry_user(self, is_sentry_user): self.current_org.plan_activated_users = [i for i in range(11)] self.current_org.save() - # [Basic, Pro Monthly, Pro Yearly, Sentry Monthly, Sentry Yearly] + # [Developer, Pro Monthly, Pro Yearly, Sentry Monthly, Sentry Yearly] expected_result = { - PlanName.BASIC_PLAN_NAME.value, + DEFAULT_FREE_PLAN, PlanName.CODECOV_PRO_YEARLY.value, PlanName.CODECOV_PRO_MONTHLY.value, PlanName.SENTRY_MONTHLY.value,