Skip to content

Commit dfe8b8a

Browse files
authored
Merge pull request #7023 from categulario/fix/badges-not-assigned
badges not assigned
2 parents 6594678 + 3e65545 commit dfe8b8a

2 files changed

Lines changed: 65 additions & 3 deletions

File tree

backend/services/users/user_service.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -900,9 +900,6 @@ async def check_and_update_mapper_level(
900900
user = await UserService.get_user_by_id(user_id, db)
901901
user_level = await MappingLevel.get_by_id(user.mapping_level, db)
902902

903-
if user_level.id == (await MappingLevel.get_max_level(db)).id:
904-
return # User has achieved the highest level, no need to proceed
905-
906903
async with db.transaction():
907904
# Update user stats
908905
if not stats:
@@ -923,9 +920,15 @@ async def check_and_update_mapper_level(
923920
# Assign levels based on badges
924921
next_level = await MappingLevel.get_next(user_level.ordering, db)
925922

923+
if not next_level:
924+
return # User has achieved the highest level, no need to proceed
925+
926926
if await MappingLevel.all_badges_satisfied(next_level.id, user.id, db):
927927
if next_level.approvals_required == 0:
928928
await user.set_mapping_level(next_level, db)
929+
await UserService.notify_level_upgrade(
930+
user_id, user.username, next_level.name, db
931+
)
929932
else:
930933
await UserNextLevel.nominate(user.id, next_level.id, db)
931934

@@ -950,6 +953,9 @@ async def approve_level(user_id: int, voter_id: int, db: Database):
950953
await user.set_mapping_level(requested_level, db)
951954
await UserNextLevel.clear(user_id, requested_level.id, db)
952955
await UserLevelVote.clear(user_id, requested_level.id, db)
956+
await UserService.notify_level_upgrade(
957+
user_id, user.username, requested_level.name, db
958+
)
953959

954960
@staticmethod
955961
async def next_level(user_id: int, db: Database) -> Optional[UserNextLevelDTO]:

tests/api/unit/services/users/test_user_service.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ async def test_check_and_update_mapper_level_happy_path(self, mock_get):
186186
new_level = await MappingLevel.get_by_id(user.mapping_level, self.db)
187187
assert new_level.id == 2
188188
assert new_level.name == "INTERMEDIATE"
189+
# Message is sent
190+
message_count = await self.db.execute(
191+
"select count(*) from messages where to_user_id = :user_id",
192+
{
193+
"user_id": self.test_user.id,
194+
},
195+
)
196+
assert message_count == 1
189197

190198
@patch.object(AsyncClient, "get")
191199
async def test_check_and_update_mapper_level_no_level_upgrade(self, mock_get):
@@ -262,12 +270,49 @@ async def test_check_and_update_mapper_level_max_level(self, mock_get):
262270
"result": {
263271
"topics": {"changeset": {"value": 2000.0}},
264272
},
273+
"user": {
274+
"changesets": {"count": 2000.0},
275+
},
276+
}
277+
)
278+
mock_get.return_value = mock_response
279+
await self.test_user.set_mapping_level(
280+
await MappingLevel.get_by_id(3, self.db), self.db
281+
)
282+
283+
# Act
284+
await UserService.check_and_update_mapper_level(self.test_user.id, self.db)
285+
286+
# Assert
287+
# no level is upgraded
288+
user = await User.get_by_id(self.test_user.id, self.db)
289+
new_level = await MappingLevel.get_by_id(user.mapping_level, self.db)
290+
assert new_level.id == 3
291+
assert new_level.name == "ADVANCED"
292+
293+
@patch.object(AsyncClient, "get")
294+
async def test_check_and_update_mapper_level_assignes_badges_on_top_level(
295+
self, mock_get
296+
):
297+
# Arrange
298+
mock_response = AsyncMock()
299+
mock_response.status_code = 200
300+
mock_response.json = MagicMock(
301+
return_value={
302+
"result": {
303+
"topics": {"changeset": {"value": 2000.0}},
304+
},
305+
"user": {
306+
"changesets": {"count": 251.0},
307+
},
265308
}
266309
)
267310
mock_get.return_value = mock_response
268311
await self.test_user.set_mapping_level(
269312
await MappingLevel.get_by_id(3, self.db), self.db
270313
)
314+
badges = await MappingBadge.get_related_to_user(self.test_user.id, self.db)
315+
assert len(badges) == 0
271316

272317
# Act
273318
await UserService.check_and_update_mapper_level(self.test_user.id, self.db)
@@ -278,6 +323,9 @@ async def test_check_and_update_mapper_level_max_level(self, mock_get):
278323
new_level = await MappingLevel.get_by_id(user.mapping_level, self.db)
279324
assert new_level.id == 3
280325
assert new_level.name == "ADVANCED"
326+
# The badge is assigned
327+
badges = await MappingBadge.get_related_to_user(self.test_user.id, self.db)
328+
assert len(badges) == 1
281329

282330
@patch.object(AsyncClient, "get")
283331
async def test_get_user_dto_by_username(self, mock_get):
@@ -378,6 +426,14 @@ async def test_approve_level(self):
378426
)
379427
# votes are cleared
380428
assert await UserLevelVote.count(self.test_user.id, level.id, self.db) == 0
429+
# Message is sent
430+
message_count = await self.db.execute(
431+
"select count(*) from messages where to_user_id = :user_id",
432+
{
433+
"user_id": self.test_user.id,
434+
},
435+
)
436+
assert message_count == 1
381437

382438
async def test_next_level(self):
383439
next_level = await UserService.next_level(self.test_user.id, self.db)

0 commit comments

Comments
 (0)