Skip to content

Commit e895d6e

Browse files
committed
test,lint,format check
1 parent 607f50f commit e895d6e

File tree

5 files changed

+156
-68
lines changed

5 files changed

+156
-68
lines changed

backend/apps/github/management/commands/github_update_users.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ def handle(self, *args, **options):
5151
prefix = f"{idx + offset + 1} of {active_users_count - offset}"
5252
print(f"{prefix:<10} {user.title}")
5353

54-
profile, _ = MemberProfile.objects.get_or_create(github_user=user)
54+
profile, created = MemberProfile.objects.get_or_create(github_user=user)
55+
if created:
56+
profile.github_user = user
5557
profile.contributions_count = user_contributions.get(user.id, 0)
5658
profiles.append(profile)
5759

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.8 on 2025-11-26 14:23
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('owasp', '0067_memberprofile_backward_compatibility'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='memberprofile',
15+
name='has_public_member_page',
16+
field=models.BooleanField(default=True, help_text="Whether the member's profile is publicly visible on the OWASP website", verbose_name='Has Public Member Page'),
17+
),
18+
]

backend/tests/apps/github/api/internal/queries/user_test.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,49 +16,61 @@ def mock_user(self):
1616

1717
def test_resolve_user_existing_with_public_member_page(self, mock_user):
1818
"""Test resolving an existing user with has_public_member_page=True."""
19-
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
20-
mock_queryset = mock_filter.return_value
21-
mock_queryset.first.return_value = mock_user
19+
with patch("apps.github.models.user.User.objects.select_related") as mock_select_related:
20+
mock_queryset = mock_select_related.return_value
21+
mock_queryset.filter.return_value.first.return_value = mock_user
2222

2323
result = UserQuery().user(login="test-user")
2424

2525
assert result == mock_user
26-
mock_filter.assert_called_once_with(has_public_member_page=True, login="test-user")
27-
mock_queryset.first.assert_called_once()
26+
mock_select_related.assert_called_once_with("owasp_profile")
27+
mock_queryset.filter.assert_called_once_with(
28+
owasp_profile__has_public_member_page=True, login="test-user"
29+
)
30+
mock_queryset.filter.return_value.first.assert_called_once()
2831

2932
def test_resolve_user_not_found_when_has_public_member_page_false(self):
3033
"""Test resolving a user with has_public_member_page=False returns None."""
31-
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
32-
mock_queryset = mock_filter.return_value
33-
mock_queryset.first.return_value = None
34+
with patch("apps.github.models.user.User.objects.select_related") as mock_select_related:
35+
mock_queryset = mock_select_related.return_value
36+
mock_queryset.filter.return_value.first.return_value = None
3437

3538
result = UserQuery().user(login="test-user")
3639

3740
assert result is None
38-
mock_filter.assert_called_once_with(has_public_member_page=True, login="test-user")
39-
mock_queryset.first.assert_called_once()
41+
mock_select_related.assert_called_once_with("owasp_profile")
42+
mock_queryset.filter.assert_called_once_with(
43+
owasp_profile__has_public_member_page=True, login="test-user"
44+
)
45+
mock_queryset.filter.return_value.first.assert_called_once()
4046

4147
def test_resolve_user_not_found(self):
4248
"""Test resolving a non-existent user."""
43-
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
44-
mock_queryset = mock_filter.return_value
45-
mock_queryset.first.return_value = None
49+
with patch("apps.github.models.user.User.objects.select_related") as mock_select_related:
50+
mock_queryset = mock_select_related.return_value
51+
mock_queryset.filter.return_value.first.return_value = None
4652

4753
result = UserQuery().user(login="non-existent")
4854

4955
assert result is None
50-
mock_filter.assert_called_once_with(has_public_member_page=True, login="non-existent")
51-
mock_queryset.first.assert_called_once()
56+
mock_select_related.assert_called_once_with("owasp_profile")
57+
mock_queryset.filter.assert_called_once_with(
58+
owasp_profile__has_public_member_page=True, login="non-existent"
59+
)
60+
mock_queryset.filter.return_value.first.assert_called_once()
5261

5362
def test_resolve_user_filters_by_public_member_page_and_login(self):
5463
"""Test that user query filters by both has_public_member_page and login."""
55-
with patch("apps.github.models.user.User.objects.filter") as mock_filter:
56-
mock_queryset = mock_filter.return_value
57-
mock_queryset.first.return_value = None
64+
with patch("apps.github.models.user.User.objects.select_related") as mock_select_related:
65+
mock_queryset = mock_select_related.return_value
66+
mock_queryset.filter.return_value.first.return_value = None
5867

5968
UserQuery().user(login="test-user")
6069

61-
mock_filter.assert_called_once_with(has_public_member_page=True, login="test-user")
70+
mock_select_related.assert_called_once_with("owasp_profile")
71+
mock_queryset.filter.assert_called_once_with(
72+
owasp_profile__has_public_member_page=True, login="test-user"
73+
)
6274

6375
def test_top_contributed_repositories(self):
6476
"""Test resolving top contributed repositories."""

backend/tests/apps/github/management/commands/github_update_users_test.py

Lines changed: 94 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,23 @@ def test_handle_with_default_offset(
3838
self, mock_repository_contributor, mock_user, mock_member_profile
3939
):
4040
"""Test command execution with default offset."""
41-
mock_member_profile.objects.get_or_create.return_value = (MagicMock(), False)
42-
mock_user1 = MagicMock(id=1, title="User 1", contributions_count=0)
43-
mock_user2 = MagicMock(id=2, title="User 2", contributions_count=0)
44-
mock_user3 = MagicMock(id=3, title="User 3", contributions_count=0)
41+
mock_profile1 = MagicMock(contributions_count=0)
42+
mock_profile2 = MagicMock(contributions_count=0)
43+
mock_profile3 = MagicMock(contributions_count=0)
44+
45+
def get_or_create_side_effect(github_user):
46+
if github_user.id == 1:
47+
return mock_profile1, False
48+
if github_user.id == 2:
49+
return mock_profile2, False
50+
if github_user.id == 3:
51+
return mock_profile3, False
52+
return MagicMock(), False
53+
54+
mock_member_profile.objects.get_or_create.side_effect = get_or_create_side_effect
55+
mock_user1 = MagicMock(id=1, title="User 1")
56+
mock_user2 = MagicMock(id=2, title="User 2")
57+
mock_user3 = MagicMock(id=3, title="User 3")
4558

4659
mock_users_queryset = MagicMock()
4760
mock_users_queryset.count.return_value = 3
@@ -73,12 +86,16 @@ def test_handle_with_default_offset(
7386
mock_print.assert_any_call("2 of 3 User 2")
7487
mock_print.assert_any_call("3 of 3 User 3")
7588

76-
assert mock_user1.contributions_count == 10
77-
assert mock_user2.contributions_count == 20
78-
assert mock_user3.contributions_count == 30
89+
assert mock_profile1.contributions_count == 10
90+
assert mock_profile2.contributions_count == 20
91+
assert mock_profile3.contributions_count == 30
7992

80-
assert mock_user.bulk_save.call_count == 2
81-
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1, mock_user2, mock_user3]
93+
assert mock_member_profile.bulk_save.call_count == 2
94+
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == [
95+
mock_profile1,
96+
mock_profile2,
97+
mock_profile3,
98+
]
8299

83100
@patch("apps.github.management.commands.github_update_users.MemberProfile")
84101
@patch("apps.github.management.commands.github_update_users.User")
@@ -88,9 +105,19 @@ def test_handle_with_custom_offset(
88105
self, mock_repository_contributor, mock_user, mock_member_profile
89106
):
90107
"""Test command execution with custom offset."""
91-
mock_member_profile.objects.get_or_create.return_value = (MagicMock(), False)
92-
mock_user1 = MagicMock(id=2, title="User 2", contributions_count=0)
93-
mock_user2 = MagicMock(id=3, title="User 3", contributions_count=0)
108+
mock_profile1 = MagicMock(contributions_count=0)
109+
mock_profile2 = MagicMock(contributions_count=0)
110+
111+
def get_or_create_side_effect(github_user):
112+
if github_user.id == 2:
113+
return mock_profile1, False
114+
if github_user.id == 3:
115+
return mock_profile2, False
116+
return MagicMock(), False
117+
118+
mock_member_profile.objects.get_or_create.side_effect = get_or_create_side_effect
119+
mock_user1 = MagicMock(id=2, title="User 2")
120+
mock_user2 = MagicMock(id=3, title="User 3")
94121

95122
mock_users_queryset = MagicMock()
96123
mock_users_queryset.count.return_value = 3
@@ -117,11 +144,14 @@ def test_handle_with_custom_offset(
117144
mock_print.assert_any_call("2 of 2 User 2")
118145
mock_print.assert_any_call("3 of 2 User 3")
119146

120-
assert mock_user1.contributions_count == 20
121-
assert mock_user2.contributions_count == 30
147+
assert mock_profile1.contributions_count == 20
148+
assert mock_profile2.contributions_count == 30
122149

123-
assert mock_user.bulk_save.call_count == 2
124-
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1, mock_user2]
150+
assert mock_member_profile.bulk_save.call_count == 2
151+
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == [
152+
mock_profile1,
153+
mock_profile2,
154+
]
125155

126156
@patch("apps.github.management.commands.github_update_users.MemberProfile")
127157
@patch("apps.github.management.commands.github_update_users.User")
@@ -130,10 +160,19 @@ def test_handle_with_custom_offset(
130160
def test_handle_with_users_having_no_contributions(
131161
self, mock_repository_contributor, mock_user, mock_member_profile
132162
):
133-
"""Test command execution when users have no contributions."""
134-
mock_member_profile.objects.get_or_create.return_value = (MagicMock(), False)
135-
mock_user1 = MagicMock(id=1, title="User 1", contributions_count=0)
136-
mock_user2 = MagicMock(id=2, title="User 2", contributions_count=0)
163+
mock_profile1 = MagicMock(contributions_count=0)
164+
mock_profile2 = MagicMock(contributions_count=0)
165+
166+
def get_or_create_side_effect(github_user):
167+
if github_user.id == 1:
168+
return mock_profile1, False
169+
if github_user.id == 2:
170+
return mock_profile2, False
171+
return MagicMock(), False
172+
173+
mock_member_profile.objects.get_or_create.side_effect = get_or_create_side_effect
174+
mock_user1 = MagicMock(id=1, title="User 1")
175+
mock_user2 = MagicMock(id=2, title="User 2")
137176

138177
mock_users_queryset = MagicMock()
139178
mock_users_queryset.count.return_value = 2
@@ -153,11 +192,14 @@ def test_handle_with_users_having_no_contributions(
153192
mock_print.assert_any_call("1 of 2 User 1")
154193
mock_print.assert_any_call("2 of 2 User 2")
155194

156-
assert mock_user1.contributions_count == 0
157-
assert mock_user2.contributions_count == 0
195+
assert mock_profile1.contributions_count == 0
196+
assert mock_profile2.contributions_count == 0
158197

159-
assert mock_user.bulk_save.call_count == 1
160-
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1, mock_user2]
198+
assert mock_member_profile.bulk_save.call_count == 1
199+
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == [
200+
mock_profile1,
201+
mock_profile2,
202+
]
161203

162204
@patch("apps.github.management.commands.github_update_users.MemberProfile")
163205
@patch("apps.github.management.commands.github_update_users.User")
@@ -167,12 +209,15 @@ def test_handle_with_single_user(
167209
self, mock_repository_contributor, mock_user, mock_member_profile
168210
):
169211
"""Test command execution with single user."""
170-
mock_member_profile.objects.get_or_create.return_value = (MagicMock(), False)
171-
mock_user1 = MagicMock(id=1, title="User 1", contributions_count=0)
212+
mock_profile1 = MagicMock(contributions_count=0)
213+
mock_member_profile.objects.get_or_create.return_value = (mock_profile1, False)
214+
mock_user1 = MagicMock(id=1, title="User 1")
172215

173216
mock_users_queryset = MagicMock()
174217
mock_users_queryset.count.return_value = 1
175218
mock_users_queryset.__getitem__.return_value = [mock_user1]
219+
mock_users_queryset.count.return_value = 1
220+
mock_users_queryset.__getitem__.return_value = [mock_user1]
176221

177222
mock_user.objects.order_by.return_value = mock_users_queryset
178223

@@ -188,10 +233,10 @@ def test_handle_with_single_user(
188233

189234
mock_print.assert_called_once_with("1 of 1 User 1")
190235

191-
assert mock_user1.contributions_count == 15
236+
assert mock_profile1.contributions_count == 15
192237

193-
assert mock_user.bulk_save.call_count == 2
194-
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1]
238+
assert mock_member_profile.bulk_save.call_count == 2
239+
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == [mock_profile1]
195240

196241
@patch("apps.github.management.commands.github_update_users.MemberProfile")
197242
@patch("apps.github.management.commands.github_update_users.User")
@@ -218,8 +263,6 @@ def test_handle_with_empty_user_list(
218263

219264
mock_print.assert_not_called()
220265

221-
assert mock_user.bulk_save.call_count == 1
222-
assert mock_user.bulk_save.call_args_list[-1][0][0] == []
223266
assert mock_member_profile.bulk_save.call_count == 1
224267
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == []
225268

@@ -231,9 +274,19 @@ def test_handle_with_exact_batch_size(
231274
self, mock_repository_contributor, mock_user, mock_member_profile
232275
):
233276
"""Test command execution when user count equals batch size."""
234-
mock_member_profile.objects.get_or_create.return_value = (MagicMock(), False)
235-
mock_user1 = MagicMock(id=1, title="User 1", contributions_count=0)
236-
mock_user2 = MagicMock(id=2, title="User 2", contributions_count=0)
277+
mock_profile1 = MagicMock(contributions_count=0)
278+
mock_profile2 = MagicMock(contributions_count=0)
279+
280+
def get_or_create_side_effect(github_user):
281+
if github_user.id == 1:
282+
return mock_profile1, False
283+
if github_user.id == 2:
284+
return mock_profile2, False
285+
return MagicMock(), False
286+
287+
mock_member_profile.objects.get_or_create.side_effect = get_or_create_side_effect
288+
mock_user1 = MagicMock(id=1, title="User 1")
289+
mock_user2 = MagicMock(id=2, title="User 2")
237290

238291
mock_users_queryset = MagicMock()
239292
mock_users_queryset.count.return_value = 2
@@ -256,11 +309,14 @@ def test_handle_with_exact_batch_size(
256309
mock_print.assert_any_call("1 of 2 User 1")
257310
mock_print.assert_any_call("2 of 2 User 2")
258311

259-
assert mock_user1.contributions_count == 10
260-
assert mock_user2.contributions_count == 20
312+
assert mock_profile1.contributions_count == 10
313+
assert mock_profile2.contributions_count == 20
261314

262-
assert mock_user.bulk_save.call_count == 2
263-
assert mock_user.bulk_save.call_args_list[-1][0][0] == [mock_user1, mock_user2]
315+
assert mock_member_profile.bulk_save.call_count == 2
316+
assert mock_member_profile.bulk_save.call_args_list[-1][0][0] == [
317+
mock_profile1,
318+
mock_profile2,
319+
]
264320

265321
@patch("apps.github.management.commands.github_update_users.MemberProfile")
266322
@patch("apps.github.management.commands.github_update_users.User")
@@ -275,9 +331,6 @@ def test_handle_member_profile_created(
275331

276332
mock_user1 = MagicMock(
277333
id=1,
278-
contributions_count=0,
279-
is_owasp_staff=True,
280-
has_public_member_page=False,
281334
)
282335

283336
mock_users_queryset = MagicMock()
@@ -296,6 +349,4 @@ def test_handle_member_profile_created(
296349

297350
assert mock_profile.github_user == mock_user1
298351
assert mock_profile.contributions_count == 5
299-
assert mock_profile.is_owasp_staff is True
300-
assert mock_profile.has_public_member_page is False
301352
mock_member_profile.bulk_save.assert_called_once()

backend/tests/apps/nest/management/commands/nest_update_badges_test.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,18 @@ def make_mock_former_employees(mock_former_employee):
3131

3232
def extract_is_owasp_staff(arg):
3333
"""Extract is_owasp_staff value from Q object, dict, or tuple."""
34+
key_to_check = "owasp_profile__is_owasp_staff"
35+
legacy_key_to_check = "is_owasp_staff"
3436
if hasattr(arg, "children"):
3537
for key, value in arg.children:
36-
if key == "is_owasp_staff":
38+
if key in (key_to_check, legacy_key_to_check):
3739
return value
38-
if isinstance(arg, dict) and "is_owasp_staff" in arg:
39-
return arg["is_owasp_staff"]
40-
if isinstance(arg, tuple) and len(arg) == 2 and arg[0] == "is_owasp_staff":
40+
if isinstance(arg, dict):
41+
if key_to_check in arg:
42+
return arg[key_to_check]
43+
if legacy_key_to_check in arg:
44+
return arg[legacy_key_to_check]
45+
if isinstance(arg, tuple) and len(arg) == 2 and arg[0] in (key_to_check, legacy_key_to_check):
4146
return arg[1]
4247
return None
4348

@@ -53,7 +58,7 @@ def get_mock_for_staff_value(value):
5358
return None
5459

5560
def user_filter_side_effect(*args, **kwargs):
56-
staff_value = kwargs.get("is_owasp_staff")
61+
staff_value = kwargs.get("owasp_profile__is_owasp_staff", kwargs.get("is_owasp_staff"))
5762
if staff_value is not None:
5863
return get_mock_for_staff_value(staff_value)
5964
for arg in args:

0 commit comments

Comments
 (0)