Skip to content

Commit a282bbc

Browse files
authored
Merge pull request #3079 from codecrafters-io/feat-leaderboard-anonymous-access-update
feat(leaderboard): add route info metadata for anonymous access
2 parents 3f1f0c8 + 2360dfc commit a282bbc

File tree

2 files changed

+47
-34
lines changed

2 files changed

+47
-34
lines changed

app/routes/leaderboard.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type LeaderboardModel from 'codecrafters-frontend/models/leaderboard';
77
import type Store from '@ember-data/store';
88
import { inject as service } from '@ember/service';
99
import type LeaderboardEntryModel from 'codecrafters-frontend/models/leaderboard-entry';
10+
import RouteInfoMetadata from 'codecrafters-frontend/utils/route-info-metadata';
1011

1112
export type ModelType = {
1213
language: LanguageModel;
@@ -15,15 +16,17 @@ export type ModelType = {
1516
};
1617

1718
export default class LeaderboardRoute extends BaseRoute {
18-
allowsAnonymousAccess = true;
19-
2019
@service declare authenticator: AuthenticatorService;
2120
@service declare store: Store;
2221

2322
activate(): void {
2423
scrollToTop();
2524
}
2625

26+
buildRouteInfoMetadata() {
27+
return new RouteInfoMetadata({ allowsAnonymousAccess: true });
28+
}
29+
2730
async model(params: { language_slug: string }): Promise<ModelType> {
2831
(await this.store.findAll('course', {
2932
include: 'extensions,stages,language-configurations.language',

tests/acceptance/leaderboard-page/view-test.js

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,25 @@ module('Acceptance | leaderboard-page | view', function (hooks) {
2121
}
2222
});
2323

24-
test('can view', async function (assert) {
24+
test('can view as anonymous user', async function (assert) {
25+
const language = this.server.schema.languages.all().models.find((language) => language.slug === 'rust');
26+
const leaderboard = language.leaderboard;
27+
28+
const sampleUserData = [
29+
{ username: 'Gufran', score: 6750, leaderboard },
30+
{ username: 'torvalds', score: 5250, leaderboard },
31+
];
32+
33+
createLeaderboardEntriesFromSampleData(this.server, sampleUserData);
34+
35+
await leaderboardPage.visit({ language_slug: 'rust' });
36+
assert.strictEqual(currentURL(), '/leaderboards/rust');
37+
38+
assert.strictEqual(leaderboardPage.entriesTable.entries.length, 2, '2 entries should be shown');
39+
await percySnapshot('Leaderboard Page - Anonymous User');
40+
});
41+
42+
test('can view as authenticated user', async function (assert) {
2543
const currentUser = signInAsStaff(this.owner, this.server);
2644

2745
const language = this.server.schema.languages.all().models.find((language) => language.slug === 'rust');
@@ -51,22 +69,11 @@ module('Acceptance | leaderboard-page | view', function (hooks) {
5169
];
5270

5371
for (const sampleUserDatum of sampleUserData) {
54-
let user = this.server.schema.users.all().models.find((user) => user.username === sampleUserDatum.username);
55-
56-
user ||= this.server.create('user', {
57-
username: sampleUserDatum.username,
58-
avatarUrl: `https://github.com/${sampleUserDatum.username}.png`,
59-
});
60-
61-
this.server.create('leaderboard-entry', {
62-
leaderboard,
63-
user: user,
64-
score: sampleUserDatum.score,
65-
scoreUpdatesCount: Math.floor(sampleUserDatum.score / 10),
66-
relatedCourseSlugs: ['redis', 'shell', 'sqlite', 'grep'].slice(0, Math.floor(sampleUserDatum.score / 50)),
67-
});
72+
sampleUserDatum.leaderboard = leaderboard;
6873
}
6974

75+
createLeaderboardEntriesFromSampleData(this.server, sampleUserData);
76+
7077
await leaderboardPage.visit({ language_slug: 'rust' });
7178
assert.strictEqual(currentURL(), '/leaderboards/rust');
7279

@@ -89,23 +96,7 @@ module('Acceptance | leaderboard-page | view', function (hooks) {
8996
{ username: 'python-user-2', score: 700, leaderboard: pythonLanguage.leaderboard },
9097
];
9198

92-
for (const sampleUserDatum of sampleUserData) {
93-
let user = this.server.schema.users.all().models.find((user) => user.username === sampleUserDatum.username);
94-
95-
user ||= this.server.create('user', {
96-
username: sampleUserDatum.username,
97-
avatarUrl: `https://github.com/${sampleUserDatum.username}.png`,
98-
});
99-
100-
// Create entries for both languages
101-
this.server.create('leaderboard-entry', {
102-
leaderboard: sampleUserDatum.leaderboard,
103-
user: user,
104-
score: sampleUserDatum.score,
105-
scoreUpdatesCount: Math.floor(sampleUserDatum.score / 10),
106-
relatedCourseSlugs: ['redis', 'shell'],
107-
});
108-
}
99+
createLeaderboardEntriesFromSampleData(this.server, sampleUserData);
109100

110101
// Start on Rust leaderboard
111102
await leaderboardPage.visit({ language_slug: 'rust' });
@@ -126,3 +117,22 @@ module('Acceptance | leaderboard-page | view', function (hooks) {
126117
// Test that surrounding entries are shown if user is not within top 10
127118
// Test that surrounding entries are not shown if user is within top 10
128119
});
120+
121+
function createLeaderboardEntriesFromSampleData(server, sampleUserData) {
122+
for (const sampleUserDatum of sampleUserData) {
123+
let user = server.schema.users.all().models.find((user) => user.username === sampleUserDatum.username);
124+
125+
user ||= server.create('user', {
126+
username: sampleUserDatum.username,
127+
avatarUrl: `https://github.com/${sampleUserDatum.username}.png`,
128+
});
129+
130+
server.create('leaderboard-entry', {
131+
leaderboard: sampleUserDatum.leaderboard,
132+
user: user,
133+
score: sampleUserDatum.score,
134+
scoreUpdatesCount: Math.floor(sampleUserDatum.score / 10),
135+
relatedCourseSlugs: ['redis', 'shell', 'sqlite', 'grep'].slice(0, Math.floor(sampleUserDatum.score / 50)),
136+
});
137+
}
138+
}

0 commit comments

Comments
 (0)