Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
33880b3
chore: fix typo
Miodec Nov 10, 2025
8aa1f51
fix: wpm sometimes goes negative in zen mode
Miodec Nov 12, 2025
9cb19e3
feat(theme): added pale_nimbus (@conner-mcnicholas) (#7055)
conner-mcnicholas Nov 12, 2025
12e3d65
impr(quotes): add English quotes from The Time Traveler's Wife: Novel…
prathampt Nov 12, 2025
c76f8dc
fix: add input validation for new filter preset modal (@amandevelops)…
AmanDevelops Nov 12, 2025
946f418
impr: randomize themes based on system theme (@fehmer) (#7075)
fehmer Nov 12, 2025
318da6e
impr(quotes): added code_bash quotes (@thesomewhatyou) (#7076)
thesomewhatyou Nov 12, 2025
05e1b82
impr(languages): fixed the default hungarian word list, and also adde…
dotleon Nov 12, 2025
478836b
docs: Add author name requirement to PR titles (@fehmer) (#7089)
fehmer Nov 12, 2025
027e572
fix: ae/oe chars being registered as two mistakes when mistyped (@the…
thedev0ps Nov 12, 2025
013f710
fix(quote): fix run-on sentence in quote 5580 (@mak448a) (#7092)
mak448a Nov 12, 2025
8db1140
chore: update vitest to 4.0.8 (@fehmer) (#7096)
fehmer Nov 12, 2025
f44e491
chore(language): update code_jule (@adamperkowski) (#7097)
adamperkowski Nov 12, 2025
b1b57dc
impr(quotes): add more code_java quotes (@theFaustus) (#7100)
theFaustus Nov 12, 2025
d502f67
impr(quotes): add English quotes (@notfpt) (#7098)
notfpt Nov 12, 2025
556208e
impr(quotes): add Hungarian quotes (@Tekkermester) (#7071)
Tekkermester Nov 12, 2025
6adfcb0
refactor: use virtual module for env-config (@fehmer) (#7095)
fehmer Nov 12, 2025
d74051e
feat(leaderboard): add friends filter to daily/weekly leaderboard (@f…
fehmer Nov 12, 2025
60fffb1
chore: release v25.46.0
Miodec Nov 12, 2025
8ee7e94
fix(leaderboards): show correct rank in friends weekly leaderboard (@…
fehmer Nov 12, 2025
81f09b9
build: extract vite plugins (@fehmer) (#7103)
fehmer Nov 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 124 additions & 39 deletions backend/__tests__/__integration__/services/weekly-xp-leaderboard.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,22 +48,25 @@ describe("Weekly XP Leaderboards", () => {
const results = await lb.getResults(0, 10, leaderboardsConfig, true);

//THEN
expect(results).toEqual([
{
...user1,
rank: 1,
timeTypedSeconds: 10,
totalXp: 150,
isPremium: false,
},
{
...user2,
rank: 2,
timeTypedSeconds: 7,
totalXp: 100,
isPremium: true,
},
]);
expect(results).toEqual({
count: 2,
entries: [
{
...user1,
rank: 1,
timeTypedSeconds: 10,
totalXp: 150,
isPremium: false,
},
{
...user2,
rank: 2,
timeTypedSeconds: 7,
totalXp: 100,
isPremium: true,
},
],
});
});
});

Expand All @@ -77,10 +80,13 @@ describe("Weekly XP Leaderboards", () => {
const results = await lb.getResults(0, 10, leaderboardsConfig, true);

//THEN
expect(results).toEqual([
{ rank: 1, totalXp: 150, ...user1 },
{ rank: 2, totalXp: 100, ...user2 },
]);
expect(results).toEqual({
count: 2,
entries: [
{ rank: 1, totalXp: 150, ...user1 },
{ rank: 2, totalXp: 100, ...user2 },
],
});
});

it("gets results for page", async () => {
Expand All @@ -94,10 +100,13 @@ describe("Weekly XP Leaderboards", () => {
const results = await lb.getResults(1, 2, leaderboardsConfig, true);

//THEN
expect(results).toEqual([
{ rank: 3, totalXp: 50, ...user3 },
{ rank: 4, totalXp: 25, ...user4 },
]);
expect(results).toEqual({
count: 4,
entries: [
{ rank: 3, totalXp: 50, ...user3 },
{ rank: 4, totalXp: 25, ...user4 },
],
});
});

it("gets results without premium", async () => {
Expand All @@ -109,10 +118,73 @@ describe("Weekly XP Leaderboards", () => {
const results = await lb.getResults(0, 10, leaderboardsConfig, false);

//THEN
expect(results).toEqual([
{ rank: 1, totalXp: 150, ...user1, isPremium: undefined },
{ rank: 2, totalXp: 100, ...user2, isPremium: undefined },
expect(results).toEqual({
count: 2,
entries: [
{ rank: 1, totalXp: 150, ...user1, isPremium: undefined },
{ rank: 2, totalXp: 100, ...user2, isPremium: undefined },
],
});
});

it("gets results for friends only", async () => {
//GIVEN
const _user1 = await givenResult(100);
const user2 = await givenResult(75);
const _user3 = await givenResult(50);
const user4 = await givenResult(25);

//WHEN
const results = await lb.getResults(0, 5, leaderboardsConfig, true, [
user2.uid,
user4.uid,
new ObjectId().toHexString(),
]);

//THEN
expect(results).toEqual({
count: 2,
entries: [
{ rank: 2, friendsRank: 1, totalXp: 75, ...user2 },
{ rank: 4, friendsRank: 2, totalXp: 25, ...user4 },
],
});
});

it("gets results for friends only with page", async () => {
//GIVEN
const user1 = await givenResult(100);
const user2 = await givenResult(75);
const _user3 = await givenResult(50);
const user4 = await givenResult(25);
const _user5 = await givenResult(5);

//WHEN
const results = await lb.getResults(1, 2, leaderboardsConfig, true, [
user1.uid,
user2.uid,
user4.uid,
new ObjectId().toHexString(),
]);

//THEN
expect(results).toEqual({
count: 3,
entries: [{ rank: 4, friendsRank: 3, totalXp: 25, ...user4 }],
});
});

it("should return empty list if no friends", async () => {
//GIVEN

//WHEN
const results = await lb.getResults(0, 5, leaderboardsConfig, true, []);

//THEN
expect(results).toEqual({
count: 0,
entries: [],
});
});
});

Expand All @@ -127,18 +199,30 @@ describe("Weekly XP Leaderboards", () => {
//THEN
expect(rank).toEqual({ rank: 2, totalXp: 100, ...user1 });
});
});

describe("getCount", () => {
it("gets count", async () => {
it("should return null for unknown user", async () => {
expect(await lb.getRank("decoy", leaderboardsConfig)).toBeNull();
expect(
await lb.getRank("decoy", leaderboardsConfig, ["unknown", "unknown2"])
).toBeNull();
});

it("gets rank for friends", async () => {
//GIVEN
await givenResult(100);
await givenResult(150);
const user1 = await givenResult(50);
const user2 = await givenResult(60);
const _user3 = await givenResult(70);

//WHEN
const count = await lb.getCount();
//THEN
expect(count).toEqual(2);
const friends = [user1.uid, user2.uid, "decoy"];

//WHEN / THEN
expect(
await lb.getRank(user2.uid, leaderboardsConfig, friends)
).toEqual({ rank: 2, friendsRank: 1, totalXp: 60, ...user2 });

expect(
await lb.getRank(user1.uid, leaderboardsConfig, friends)
).toEqual({ rank: 3, friendsRank: 2, totalXp: 50, ...user1 });
});
});

Expand All @@ -154,9 +238,10 @@ describe("Weekly XP Leaderboards", () => {
);
//THEN
expect(await lb.getRank(cheater.uid, leaderboardsConfig)).toBeNull();
expect(await lb.getResults(0, 50, leaderboardsConfig, true)).toEqual([
{ rank: 1, totalXp: 1000, ...validUser },
]);
expect(await lb.getResults(0, 50, leaderboardsConfig, true)).toEqual({
count: 1,
entries: [{ rank: 1, totalXp: 1000, ...validUser }],
});
});

async function givenResult(
Expand Down
Loading
Loading