Skip to content

Commit

Permalink
Update plan service to work with Accounts (#777)
Browse files Browse the repository at this point in the history
  • Loading branch information
nora-codecov authored Aug 28, 2024
1 parent da49020 commit 66c7dd3
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
16 changes: 15 additions & 1 deletion plan/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,16 @@ def __init__(self, current_org: Owner):
No value
"""
self.current_org = current_org
self.has_account = False if self.current_org.account is None else True
if self.current_org.plan not in USER_PLAN_REPRESENTATIONS:
raise ValueError("Unsupported plan")
else:
self.plan_data = USER_PLAN_REPRESENTATIONS[self.current_org.plan]
if self.has_account:
self.plan_data = USER_PLAN_REPRESENTATIONS[
self.current_org.account.plan
]
else:
self.plan_data = USER_PLAN_REPRESENTATIONS[self.current_org.plan]

def update_plan(self, name, user_count: int | None) -> None:
if name not in USER_PLAN_REPRESENTATIONS:
Expand Down Expand Up @@ -75,6 +81,8 @@ def plan_name(self) -> str:
def plan_user_count(self) -> int:
if get_config("setup", "enterprise_license"):
return license_seats()
if self.has_account:
return self.current_org.account.total_seat_count
return self.current_org.plan_user_count

@property
Expand Down Expand Up @@ -269,6 +277,12 @@ def has_trial_dates(self) -> bool:
def has_seats_left(self) -> bool:
if get_config("setup", "enterprise_license"):
return enterprise_has_seats_left()
if self.has_account:
# edge case: IF the User is already a plan_activated_user on any of the Orgs in the Account,
# AND their Account is at capacity,
# AND they try to become a plan_activated_user on another Org in the Account,
# has_seats_left will evaluate as False even though the User should be allowed to activate on the Org.
return self.current_org.account.can_activate_user()
return (
self.plan_activated_users is None
or len(self.plan_activated_users) < self.plan_user_count
Expand Down
57 changes: 56 additions & 1 deletion plan/tests/test_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
from django.test import TestCase
from freezegun import freeze_time
from pytest import raises
from shared.django_apps.codecov_auth.tests.factories import AccountsUsersFactory

from codecov.commands.exceptions import ValidationError
from codecov_auth.tests.factories import OwnerFactory
from codecov_auth.tests.factories import AccountFactory, OwnerFactory
from plan.constants import (
BASIC_PLAN,
FREE_PLAN,
Expand Down Expand Up @@ -363,6 +364,60 @@ def test_plan_service_update_plan_succeeds(self):
assert current_org.plan == PlanName.TEAM_MONTHLY.value
assert current_org.plan_user_count == 8

def test_has_account(self):
current_org = OwnerFactory()
plan_service = PlanService(current_org=current_org)
self.assertFalse(plan_service.has_account)

current_org.account = AccountFactory()
current_org.save()
plan_service = PlanService(current_org=current_org)
self.assertTrue(plan_service.has_account)

def test_plan_data_has_account(self):
current_org = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
plan_service = PlanService(current_org=current_org)
self.assertEqual(plan_service.plan_name, PlanName.BASIC_PLAN_NAME.value)

current_org.account = AccountFactory(plan=PlanName.CODECOV_PRO_YEARLY.value)
current_org.save()
plan_service = PlanService(current_org=current_org)
self.assertEqual(plan_service.plan_name, PlanName.CODECOV_PRO_YEARLY.value)

def test_plan_user_count_has_account(self):
org = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value, plan_user_count=5)
account = AccountFactory(
plan=PlanName.BASIC_PLAN_NAME.value, plan_seat_count=50, free_seat_count=3
)

plan_service = PlanService(current_org=org)
self.assertEqual(plan_service.plan_user_count, 5)

org.account = account
org.save()
plan_service = PlanService(current_org=org)
self.assertEqual(plan_service.plan_user_count, 53)

def test_has_seats_left_has_account(self):
org = OwnerFactory(
plan=PlanName.BASIC_PLAN_NAME.value,
plan_user_count=5,
plan_activated_users=[1, 2, 3],
)
account = AccountFactory(
plan=PlanName.BASIC_PLAN_NAME.value, plan_seat_count=5, free_seat_count=3
)
for i in range(8):
AccountsUsersFactory(account=account)

plan_service = PlanService(current_org=org)
self.assertEqual(plan_service.has_seats_left, True)

org.account = account
org.save()
plan_service = PlanService(current_org=org)
self.assertEqual(plan_service.has_seats_left, False)


class AvailablePlansBeforeTrial(TestCase):
"""
Expand Down

0 comments on commit 66c7dd3

Please sign in to comment.