Skip to content

controllers/crates: default to sort by recent downloads #7889

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion app/controllers/crates.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export default class CratesController extends Controller {
queryParams = ['page', 'per_page', 'sort'];
@tracked page = '1';
@tracked per_page = 50;
@tracked sort = 'alpha';
@tracked sort = 'recent-downloads';

@reads('model.meta.total') totalItems;
@pagination() pagination;
Expand Down
8 changes: 4 additions & 4 deletions e2e/acceptance/crates.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { test, expect } from '@/e2e/helper';
import { expect, test } from '@/e2e/helper';

test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => {
// should match the default set in the crates controller
Expand Down Expand Up @@ -72,7 +72,7 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => {

await page.goto('/crates');

await expect(page.locator('[data-test-crates-sort] [data-test-current-order]')).toHaveText('Alphabetical');
await expect(page.locator('[data-test-crates-sort] [data-test-current-order]')).toHaveText('Recent Downloads');
});

test('downloads appears for each crate on crate list', async ({ page, mirage }) => {
Expand All @@ -81,7 +81,7 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => {
});

await page.goto('/crates');
await expect(page.locator('[data-test-crate-row="0"] [data-test-downloads]')).toHaveText('All-Time: 497');
await expect(page.locator('[data-test-crate-row="0"] [data-test-downloads]')).toHaveText('All-Time: 21,573');
});

test('recent downloads appears for each crate on crate list', async ({ page, mirage }) => {
Expand All @@ -90,6 +90,6 @@ test.describe('Acceptance | crates page', { tag: '@acceptance' }, () => {
});

await page.goto('/crates');
await expect(page.locator('[data-test-crate-row="0"] [data-test-recent-downloads]')).toHaveText('Recent: 497');
await expect(page.locator('[data-test-crate-row="0"] [data-test-recent-downloads]')).toHaveText('Recent: 2,000');
});
});
2 changes: 2 additions & 0 deletions mirage/route-handlers/crates.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ export function list(schema, request) {

if (request.queryParams.sort === 'alpha') {
crates = crates.sort((a, b) => compareStrings(a.id.toLowerCase(), b.id.toLowerCase()));
} else if (request.queryParams.sort === 'recent-downloads') {
crates = crates.sort((a, b) => b.recent_downloads - a.recent_downloads);
}

return { ...this.serialize(crates.slice(start, end)), meta: { total: crates.length } };
Expand Down
12 changes: 8 additions & 4 deletions tests/acceptance/crates-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,25 +66,29 @@ module('Acceptance | crates page', function (hooks) {
assert.dom('[data-test-crates-nav] [data-test-total-rows]').hasText(`${total}`);
});

test('crates default sort is alphabetical', async function (assert) {
test('crates default sort is by recent downloads', async function (assert) {
this.server.loadFixtures();

await visit('/crates');

assert.dom('[data-test-crates-sort] [data-test-current-order]').hasText('Alphabetical');
assert.dom('[data-test-crates-sort] [data-test-current-order]').hasText('Recent Downloads');
});

test('downloads appears for each crate on crate list', async function (assert) {
this.server.loadFixtures();

await visit('/crates');
assert.dom('[data-test-crate-row="0"] [data-test-downloads]').hasText('All-Time: 497');

let formatted = Number(21_573).toLocaleString();
assert.dom('[data-test-crate-row="0"] [data-test-downloads]').hasText(`All-Time: ${formatted}`);
});

test('recent downloads appears for each crate on crate list', async function (assert) {
this.server.loadFixtures();

await visit('/crates');
assert.dom('[data-test-crate-row="0"] [data-test-recent-downloads]').hasText('Recent: 497');

let formatted = Number(2000).toLocaleString();
assert.dom('[data-test-crate-row="0"] [data-test-recent-downloads]').hasText(`Recent: ${formatted}`);
});
});
Loading