diff --git a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java index 49bbf77cc..06ceb4a63 100644 --- a/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java +++ b/src/main/java/org/patinanetwork/codebloom/common/components/LeaderboardManager.java @@ -61,7 +61,10 @@ public void generateAchievementsForAllWinners() { log.info("on leaderboard for {}", pair.getRight().getResolvedName()); List> users = leaderboardRepository.getRankedIndexedLeaderboardUsersById( currentLeaderboard.getId(), pair.getLeft()); - List> winners = users.subList(0, maxWinners(users.size())); + List> usersWithPoints = users.stream() + .filter(indexed -> indexed.getItem().getTotalScore() > 0) + .toList(); + List> winners = usersWithPoints.subList(0, maxWinners(usersWithPoints.size())); for (int i = 0; i < winners.size(); i++) { int place = i + 1; @@ -83,7 +86,10 @@ public void generateAchievementsForAllWinners() { // handle global leaderboard List> users = leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById( currentLeaderboard.getId(), LeaderboardFilterOptions.DEFAULT); - List> winners = users.subList(0, maxWinners(users.size())); + List> usersWithPoints = users.stream() + .filter(indexed -> indexed.getItem().getTotalScore() > 0) + .toList(); + List> winners = usersWithPoints.subList(0, maxWinners(usersWithPoints.size())); for (int i = 0; i < winners.size(); i++) { int place = i + 1; diff --git a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java index 77291520e..2f50b4d4a 100644 --- a/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java +++ b/src/test/java/org/patinanetwork/codebloom/common/components/LeaderboardManagerTest.java @@ -444,6 +444,71 @@ void testWithAvailableLeaderboardAndThreeWinnersGlobalButFourUsers() { winners.get(1).getItem().getId()); } + @Test + void testUsersWithZeroPointsAreExcludedFromAchievements() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var users = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(150_000).build(), + randomPartialUserWithScore().totalScore(0).build(), + randomPartialUserWithScore().totalScore(0).build())); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(users); + + leaderboardManager.generateAchievementsForAllWinners(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Achievement.class); + verify(achievementRepository, times(1)).createAchievement(captor.capture()); + + var achievements = captor.getAllValues(); + var userOneAchievement = achievements.get(0); + assertAchievement( + userOneAchievement, + null, + AchievementPlaceEnum.ONE, + users.get(0).getItem().getId()); + } + + @Test + void testUsersWithZeroPointsAreExcludedFromTagAchievements() { + var latestLeaderboard = Leaderboard.builder() + .id(UUID.randomUUID().toString()) + .name("Test Leaderboard") + .createdAt(StandardizedLocalDateTime.now()) + .build(); + + var users = Indexed.ofDefaultList(List.of( + randomPartialUserWithScore().totalScore(0).build(), + randomPartialUserWithScore().totalScore(0).build())); + + users.forEach(winner -> { + var user = winner.getItem(); + user.setTags(List.of(UserTag.builder() + .id(UUID.randomUUID().toString()) + .tag(Tag.Sbu) + .userId(user.getId()) + .build())); + }); + + when(leaderboardRepository.getRecentLeaderboardMetadata()).thenReturn(latestLeaderboard); + when(leaderboardRepository.getGlobalRankedIndexedLeaderboardUsersById(eq(latestLeaderboard.getId()), any())) + .thenReturn(users); + + when(leaderboardRepository.getRankedIndexedLeaderboardUsersById( + eq(latestLeaderboard.getId()), argThat(opt -> opt.isSbu()))) + .thenReturn(users); + + leaderboardManager.generateAchievementsForAllWinners(); + + verify(achievementRepository, times(0)).createAchievement(any()); + } + @Test void testGetLeaderboardMetadata() { String testId = UUID.randomUUID().toString();