Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.

Commit 9500517

Browse files
committed
update with tests
1 parent a114d31 commit 9500517

File tree

12 files changed

+75
-90
lines changed

12 files changed

+75
-90
lines changed

api/internal/owner/views.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from rest_framework.exceptions import PermissionDenied, ValidationError
88
from rest_framework.response import Response
99
from shared.django_apps.codecov_auth.models import Owner
10+
from shared.plan.constants import DEFAULT_FREE_PLAN
1011

1112
from api.shared.mixins import OwnerPropertyMixin
1213
from api.shared.owner.mixins import OwnerViewSetMixin, UserViewSetMixin
@@ -15,7 +16,6 @@
1516
from services.billing import BillingService
1617
from services.decorators import stripe_safe
1718
from services.task import TaskService
18-
from shared.plan.constants import DEFAULT_FREE_PLAN
1919

2020
from .serializers import (
2121
AccountDetailsSerializer,
@@ -46,11 +46,13 @@ def retrieve(self, *args, **kwargs):
4646
return res
4747

4848
@stripe_safe
49-
def update(self, *args, **kwargs):
50-
# Delete once gazebo uses the new free plan
51-
if "plan" in args[0].data and args[0].data["plan"]["value"] == "users-basic":
52-
args[0].data["plan"]["value"] = DEFAULT_FREE_PLAN
53-
return super().update(*args, **kwargs)
49+
def update(self, request, *args, **kwargs):
50+
# Temporary fix. Remove once Gazebo uses the new free plan
51+
plan_value = request.data.get("plan", {}).get("value")
52+
if plan_value == "users-basic":
53+
request.data["plan"]["value"] = DEFAULT_FREE_PLAN
54+
55+
return super().update(request, *args, **kwargs)
5456

5557
def destroy(self, request, *args, **kwargs):
5658
if self.owner.ownerid != request.current_owner.ownerid:

api/internal/tests/views/test_account_viewset.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
OwnerFactory,
1515
UserFactory,
1616
)
17-
from shared.plan.constants import PlanName, TrialStatus
17+
from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName, TrialStatus
1818
from stripe import StripeError
1919

2020
from api.internal.tests.test_utils import GetAdminProviderAdapter
@@ -164,7 +164,7 @@ def test_retrieve_account_gets_account_fields(self):
164164
"inactive_user_count": 1,
165165
"plan": {
166166
"marketing_name": "Developer",
167-
"value": PlanName.BASIC_PLAN_NAME.value,
167+
"value": DEFAULT_FREE_PLAN,
168168
"billing_rate": None,
169169
"base_unit_price": 0,
170170
"benefits": [
@@ -249,7 +249,7 @@ def test_retrieve_account_gets_account_fields_when_there_are_scheduled_details(
249249
"plan_provider": owner.plan_provider,
250250
"plan": {
251251
"marketing_name": "Developer",
252-
"value": PlanName.BASIC_PLAN_NAME.value,
252+
"value": DEFAULT_FREE_PLAN,
253253
"billing_rate": None,
254254
"base_unit_price": 0,
255255
"benefits": [
@@ -346,7 +346,7 @@ def test_retrieve_account_returns_last_phase_when_more_than_one_scheduled_phases
346346
"inactive_user_count": 1,
347347
"plan": {
348348
"marketing_name": "Developer",
349-
"value": PlanName.BASIC_PLAN_NAME.value,
349+
"value": DEFAULT_FREE_PLAN,
350350
"billing_rate": None,
351351
"base_unit_price": 0,
352352
"benefits": [
@@ -420,7 +420,7 @@ def test_retrieve_account_gets_none_for_schedule_details_when_schedule_is_nonexi
420420
"inactive_user_count": 1,
421421
"plan": {
422422
"marketing_name": "Developer",
423-
"value": PlanName.BASIC_PLAN_NAME.value,
423+
"value": DEFAULT_FREE_PLAN,
424424
"billing_rate": None,
425425
"base_unit_price": 0,
426426
"benefits": [
@@ -488,13 +488,13 @@ def test_retrieve_account_gets_account_students(self):
488488
}
489489

490490
def test_account_with_free_user_plan(self):
491-
self.current_owner.plan = PlanName.BASIC_PLAN_NAME.value
491+
self.current_owner.plan = DEFAULT_FREE_PLAN
492492
self.current_owner.save()
493493
response = self._retrieve()
494494
assert response.status_code == status.HTTP_200_OK
495495
assert response.data["plan"] == {
496496
"marketing_name": "Developer",
497-
"value": PlanName.BASIC_PLAN_NAME.value,
497+
"value": DEFAULT_FREE_PLAN,
498498
"billing_rate": None,
499499
"base_unit_price": 0,
500500
"benefits": [
@@ -690,7 +690,7 @@ def test_update_can_set_plan_auto_activate_on_org_with_account(self):
690690
assert self.current_owner.plan_auto_activate is False
691691
assert response.data["plan_auto_activate"] is False
692692

693-
def test_update_can_set_plan_to_users_basic(self):
693+
def test_update_can_set_plan_to_users_basic_should_set_to_developer(self):
694694
self.current_owner.plan = PlanName.CODECOV_PRO_YEARLY.value
695695
self.current_owner.save()
696696

@@ -706,7 +706,7 @@ def test_update_can_set_plan_to_users_basic(self):
706706

707707
self.current_owner.refresh_from_db()
708708

709-
assert self.current_owner.plan == PlanName.BASIC_PLAN_NAME.value
709+
assert self.current_owner.plan == DEFAULT_FREE_PLAN
710710
assert self.current_owner.plan_activated_users is None
711711
assert self.current_owner.plan_user_count == 1
712712
assert response.data["plan_auto_activate"] is True
@@ -963,7 +963,7 @@ def test_update_must_fail_if_quantity_and_plan_are_equal_to_the_owners_current_o
963963
)
964964

965965
def test_update_team_plan_must_fail_if_too_many_activated_users_during_trial(self):
966-
self.current_owner.plan = PlanName.BASIC_PLAN_NAME.value
966+
self.current_owner.plan = DEFAULT_FREE_PLAN
967967
self.current_owner.plan_user_count = 1
968968
self.current_owner.trial_status = TrialStatus.ONGOING.value
969969
self.current_owner.plan_activated_users = list(range(11))
@@ -987,7 +987,7 @@ def test_update_team_plan_must_fail_if_too_many_activated_users_during_trial(sel
987987
assert response.json() == {
988988
"plan": {
989989
"value": [
990-
f"Invalid value for plan: {desired_plan['value']}; must be one of ['users-basic', 'users-pr-inappm', 'users-pr-inappy']"
990+
f"Invalid value for plan: {desired_plan['value']}; must be one of ['users-pr-inappm', '{DEFAULT_FREE_PLAN}', 'users-pr-inappy']"
991991
]
992992
}
993993
}
@@ -1567,7 +1567,7 @@ def test_update_sentry_plan_non_sentry_user(
15671567
assert res.json() == {
15681568
"plan": {
15691569
"value": [
1570-
"Invalid value for plan: users-sentrym; must be one of ['users-basic', 'users-pr-inappm', 'users-pr-inappy', 'users-teamm', 'users-teamy']"
1570+
f"Invalid value for plan: users-sentrym; must be one of ['users-pr-inappm', 'users-pr-inappy', 'users-teamm', 'users-teamy', '{DEFAULT_FREE_PLAN}']"
15711571
]
15721572
}
15731573
}

billing/helpers.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,6 @@ def mock_all_plans_and_tiers():
4242
)
4343

4444
basic_tier = TierFactory(tier_name=TierName.BASIC.value)
45-
PlanFactory(
46-
name=PlanName.BASIC_PLAN_NAME.value,
47-
tier=basic_tier,
48-
marketing_name="Developer",
49-
benefits=[
50-
"Up to 1 user",
51-
"Unlimited public repositories",
52-
"Unlimited private repositories",
53-
],
54-
monthly_uploads_limit=250,
55-
)
5645
PlanFactory(
5746
name=PlanName.FREE_PLAN_NAME.value,
5847
tier=basic_tier,

billing/tests/test_views.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from rest_framework.reverse import reverse
1010
from rest_framework.test import APIRequestFactory, APITestCase
1111
from shared.django_apps.core.tests.factories import OwnerFactory, RepositoryFactory
12-
from shared.plan.constants import PlanName
12+
from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName
1313

1414
from billing.helpers import mock_all_plans_and_tiers
1515

@@ -494,7 +494,7 @@ def test_customer_subscription_deleted_sets_plan_to_free(self):
494494
)
495495
self.owner.refresh_from_db()
496496

497-
assert self.owner.plan == PlanName.BASIC_PLAN_NAME.value
497+
assert self.owner.plan == DEFAULT_FREE_PLAN
498498
assert self.owner.plan_user_count == 1
499499
assert self.owner.plan_activated_users is None
500500
assert self.owner.stripe_subscription_id is None
@@ -523,12 +523,12 @@ def test_customer_subscription_deleted_sets_plan_to_free_mutliple_owner(self):
523523
self.owner.refresh_from_db()
524524
self.other_owner.refresh_from_db()
525525

526-
assert self.owner.plan == PlanName.BASIC_PLAN_NAME.value
526+
assert self.owner.plan == DEFAULT_FREE_PLAN
527527
assert self.owner.plan_user_count == 1
528528
assert self.owner.plan_activated_users is None
529529
assert self.owner.stripe_subscription_id is None
530530

531-
assert self.other_owner.plan == PlanName.BASIC_PLAN_NAME.value
531+
assert self.other_owner.plan == DEFAULT_FREE_PLAN
532532
assert self.other_owner.plan_user_count == 1
533533
assert self.other_owner.plan_activated_users is None
534534
assert self.other_owner.stripe_subscription_id is None
@@ -874,7 +874,7 @@ def test_customer_subscription_updated_sets_free_and_deactivates_all_repos_if_in
874874
)
875875
self.owner.refresh_from_db()
876876

877-
assert self.owner.plan == PlanName.BASIC_PLAN_NAME.value
877+
assert self.owner.plan == DEFAULT_FREE_PLAN
878878
assert self.owner.plan_user_count == 1
879879
assert self.owner.plan_auto_activate == False
880880
assert self.owner.stripe_subscription_id is None
@@ -969,14 +969,14 @@ def test_customer_subscription_updated_sets_free_and_deactivates_all_repos_if_in
969969
self.owner.refresh_from_db()
970970
self.other_owner.refresh_from_db()
971971

972-
assert self.owner.plan == PlanName.BASIC_PLAN_NAME.value
972+
assert self.owner.plan == DEFAULT_FREE_PLAN
973973
assert self.owner.plan_user_count == 1
974974
assert self.owner.plan_auto_activate == False
975975
assert self.owner.stripe_subscription_id is None
976976
assert (
977977
self.owner.repository_set.filter(active=True, activated=True).count() == 0
978978
)
979-
assert self.other_owner.plan == PlanName.BASIC_PLAN_NAME.value
979+
assert self.other_owner.plan == DEFAULT_FREE_PLAN
980980
assert self.other_owner.plan_user_count == 1
981981
assert self.other_owner.plan_auto_activate == False
982982
assert self.other_owner.stripe_subscription_id is None

codecov_auth/commands/owner/interactors/tests/test_cancel_trial.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from shared.django_apps.codecov.commands.exceptions import ValidationError
88
from shared.django_apps.codecov_auth.tests.factories import PlanFactory, TierFactory
99
from shared.django_apps.core.tests.factories import OwnerFactory
10-
from shared.plan.constants import PlanName, TierName, TrialStatus
10+
from shared.plan.constants import DEFAULT_FREE_PLAN, PlanName, TierName, TrialStatus
1111

1212
from codecov.commands.exceptions import Unauthorized
1313
from codecov.commands.exceptions import ValidationError as CodecovValidationError
@@ -18,7 +18,7 @@
1818

1919
class CancelTrialInteractorTest(TransactionTestCase):
2020
def setUp(self):
21-
self.tier = TierFactory(tier_name=TierName.BASIC.value)
21+
self.tier = TierFactory(tier_name=DEFAULT_FREE_PLAN)
2222
self.plan = PlanFactory(tier=self.tier)
2323

2424
@async_to_sync
@@ -103,7 +103,7 @@ def test_cancel_trial_starts_trial_for_org_that_has_trial_ongoing(self):
103103
now = datetime.now()
104104
assert current_user.trial_end_date == now
105105
assert current_user.trial_status == TrialStatus.EXPIRED.value
106-
assert current_user.plan == PlanName.BASIC_PLAN_NAME.value
106+
assert current_user.plan == DEFAULT_FREE_PLAN
107107
assert current_user.plan_activated_users is None
108108
assert current_user.plan_user_count == 1
109109
assert current_user.stripe_subscription_id is None

codecov_auth/tests/test_admin.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
)
2828
from shared.django_apps.core.tests.factories import PullFactory, RepositoryFactory
2929
from shared.plan.constants import (
30+
DEFAULT_FREE_PLAN,
3031
ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS,
3132
PlanName,
3233
)
@@ -74,10 +75,8 @@ def test_owner_admin_detail_page(self):
7475
self.assertEqual(response.status_code, 200)
7576

7677
def test_owner_admin_impersonate_owner(self):
77-
owner_to_impersonate = OwnerFactory(
78-
service="bitbucket", plan=PlanName.BASIC_PLAN_NAME.value
79-
)
80-
other_owner = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
78+
owner_to_impersonate = OwnerFactory(service="bitbucket", plan=DEFAULT_FREE_PLAN)
79+
other_owner = OwnerFactory(plan=DEFAULT_FREE_PLAN)
8180

8281
with self.subTest("more than one user selected"):
8382
response = self.client.post(
@@ -111,7 +110,7 @@ def test_owner_admin_impersonate_owner(self):
111110

112111
@patch("codecov_auth.admin.TaskService.delete_owner")
113112
def test_delete_queryset(self, delete_mock):
114-
user_to_delete = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
113+
user_to_delete = OwnerFactory(plan=DEFAULT_FREE_PLAN)
115114
ownerid = user_to_delete.ownerid
116115
queryset = MagicMock()
117116
queryset.__iter__.return_value = [user_to_delete]
@@ -122,14 +121,14 @@ def test_delete_queryset(self, delete_mock):
122121

123122
@patch("codecov_auth.admin.TaskService.delete_owner")
124123
def test_delete_model(self, delete_mock):
125-
user_to_delete = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
124+
user_to_delete = OwnerFactory(plan=DEFAULT_FREE_PLAN)
126125
ownerid = user_to_delete.ownerid
127126
self.owner_admin.delete_model(MagicMock(), user_to_delete)
128127
delete_mock.assert_called_once_with(ownerid=ownerid)
129128

130129
@patch("codecov_auth.admin.admin.ModelAdmin.get_deleted_objects")
131130
def test_confirmation_deleted_objects(self, mocked_deleted_objs):
132-
user_to_delete = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
131+
user_to_delete = OwnerFactory(plan=DEFAULT_FREE_PLAN)
133132
deleted_objs = [
134133
'Owner: <a href="/admin/codecov_auth/owner/{}/change/">{};</a>'.format(
135134
user_to_delete.ownerid, user_to_delete
@@ -149,7 +148,7 @@ def test_confirmation_deleted_objects(self, mocked_deleted_objs):
149148

150149
@patch("codecov_auth.admin.admin.ModelAdmin.log_change")
151150
def test_prev_and_new_values_in_log_entry(self, mocked_super_log_change):
152-
owner = OwnerFactory(staff=True, plan=PlanName.BASIC_PLAN_NAME.value)
151+
owner = OwnerFactory(staff=True, plan=DEFAULT_FREE_PLAN)
153152
owner.save()
154153
owner.staff = False
155154
form = MagicMock()
@@ -169,7 +168,7 @@ def test_prev_and_new_values_in_log_entry(self, mocked_super_log_change):
169168
]
170169

171170
def test_inline_orgwide_tokens_display(self):
172-
owner = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
171+
owner = OwnerFactory(plan=DEFAULT_FREE_PLAN)
173172
request_url = reverse("admin:codecov_auth_owner_change", args=[owner.ownerid])
174173
request = RequestFactory().get(request_url)
175174
request.user = self.staff_user
@@ -202,7 +201,7 @@ def test_inline_orgwide_permissions(self):
202201
def test_inline_orgwide_add_token_permission_no_token_and_user_in_enterprise_cloud_plan(
203202
self,
204203
):
205-
owner = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
204+
owner = OwnerFactory(plan=DEFAULT_FREE_PLAN)
206205
assert owner.plan not in ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS
207206
assert OrganizationLevelToken.objects.filter(owner=owner).count() == 0
208207
request_url = reverse("admin:codecov_auth_owner_change", args=[owner.ownerid])
@@ -305,7 +304,7 @@ def test_org_token_request_doesnt_call_service_to_refresh_token(self, mock_refre
305304
mock_refresh.assert_not_called()
306305

307306
def test_start_trial_ui_display(self):
308-
owner = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
307+
owner = OwnerFactory(plan=DEFAULT_FREE_PLAN)
309308

310309
res = self.client.post(
311310
reverse("admin:codecov_auth_owner_changelist"),
@@ -320,7 +319,7 @@ def test_start_trial_ui_display(self):
320319
@patch("shared.plan.service.PlanService.start_trial_manually")
321320
def test_start_trial_action(self, mock_start_trial_service):
322321
mock_start_trial_service.return_value = None
323-
org_to_be_trialed = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
322+
org_to_be_trialed = OwnerFactory(plan=DEFAULT_FREE_PLAN)
324323

325324
res = self.client.post(
326325
reverse("admin:codecov_auth_owner_changelist"),
@@ -337,7 +336,7 @@ def test_start_trial_action(self, mock_start_trial_service):
337336
@patch("shared.plan.service.PlanService._start_trial_helper")
338337
def test_extend_trial_action(self, mock_start_trial_service):
339338
mock_start_trial_service.return_value = None
340-
org_to_be_trialed = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
339+
org_to_be_trialed = OwnerFactory(plan=DEFAULT_FREE_PLAN)
341340
org_to_be_trialed.plan = PlanName.TRIAL_PLAN_NAME.value
342341
org_to_be_trialed.save()
343342

@@ -360,7 +359,7 @@ def test_start_trial_paid_plan(self, mock_start_trial_service):
360359
"Cannot trial from a paid plan"
361360
)
362361

363-
org_to_be_trialed = OwnerFactory(plan=PlanName.BASIC_PLAN_NAME.value)
362+
org_to_be_trialed = OwnerFactory(plan=DEFAULT_FREE_PLAN)
364363

365364
res = self.client.post(
366365
reverse("admin:codecov_auth_owner_changelist"),
@@ -581,7 +580,8 @@ def test_detail_page(self):
581580
self.assertEqual(res.status_code, 200)
582581
decoded_res = res.content.decode("utf-8")
583582
self.assertIn(
584-
'<option value="users-basic" selected>BASIC_PLAN_NAME</option>', decoded_res
583+
'<option value="users-developer" selected>USERS_DEVELOPER</option>',
584+
decoded_res,
585585
)
586586
self.assertIn("Organizations (read only)", decoded_res)
587587
self.assertIn("Stripe Billing (click save to commit changes)", decoded_res)
@@ -910,7 +910,7 @@ def setUp(self):
910910
admin_site.register(Plan)
911911

912912
self.tier = TierFactory()
913-
self.plan = PlanFactory(name=PlanName.BASIC_PLAN_NAME.value, tier=self.tier)
913+
self.plan = PlanFactory(name=DEFAULT_FREE_PLAN, tier=self.tier)
914914

915915
def test_plan_admin_modal_display(self):
916916
response = self.client.get(
@@ -1016,7 +1016,7 @@ def setUp(self):
10161016
admin_site.register(Tier)
10171017

10181018
self.tier = TierFactory()
1019-
self.plan = PlanFactory(name=PlanName.BASIC_PLAN_NAME.value, tier=self.tier)
1019+
self.plan = PlanFactory(name=DEFAULT_FREE_PLAN, tier=self.tier)
10201020

10211021
def test_tier_modal_plans_display(self):
10221022
response = self.client.get(

codecov_auth/tests/unit/views/test_github.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from freezegun import freeze_time
1111
from shared.config import ConfigHelper
1212
from shared.django_apps.core.tests.factories import OwnerFactory
13+
from shared.plan.constants import DEFAULT_FREE_PLAN
1314
from shared.torngit import Github
1415
from shared.torngit.exceptions import TorngitClientGeneralError
1516

@@ -203,7 +204,7 @@ async def is_student(*args, **kwargs):
203204
assert owner.root_parent_service_id is None
204205
assert not owner.staff
205206
assert owner.cache is None
206-
assert owner.plan == "users-basic"
207+
assert owner.plan == DEFAULT_FREE_PLAN
207208
assert owner.plan_provider is None
208209
assert owner.plan_user_count == 1
209210
assert owner.plan_auto_activate is True

0 commit comments

Comments
 (0)