Skip to content

Commit a68c56e

Browse files
committed
keyword: Show error page if data loading fails
... or empty list if no crates match or keyword does not exist
1 parent 7a845ad commit a68c56e

File tree

4 files changed

+24
-30
lines changed

4 files changed

+24
-30
lines changed

app/routes/keyword.js

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,7 @@
1-
import { NotFoundError } from '@ember-data/adapter/error';
21
import Route from '@ember/routing/route';
3-
import { inject as service } from '@ember/service';
42

53
export default class KeywordRoute extends Route {
6-
@service notifications;
7-
@service router;
8-
@service store;
9-
10-
async model({ keyword_id }) {
11-
try {
12-
return await this.store.find('keyword', keyword_id);
13-
} catch (error) {
14-
if (error instanceof NotFoundError) {
15-
this.notifications.error(`Keyword '${keyword_id}' does not exist`);
16-
return this.router.replaceWith('index');
17-
}
18-
19-
throw error;
20-
}
4+
model({ keyword_id }) {
5+
return keyword_id;
216
}
227
}

app/routes/keyword/index.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,22 @@ import Route from '@ember/routing/route';
22
import { inject as service } from '@ember/service';
33

44
export default class KeywordIndexRoute extends Route {
5+
@service router;
56
@service store;
67

78
queryParams = {
89
page: { refreshModel: true },
910
sort: { refreshModel: true },
1011
};
1112

12-
model(params) {
13-
params.keyword = this.modelFor('keyword').id;
14-
return this.store.query('crate', params);
13+
async model(params, transition) {
14+
let keyword = this.modelFor('keyword');
15+
try {
16+
return await this.store.query('crate', { ...params, keyword });
17+
} catch (error) {
18+
let title = `${keyword}: Failed to load crates`;
19+
this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
20+
}
1521
}
1622

1723
setupController(controller) {

app/templates/keyword/index.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
{{page-title this.keyword.keyword ' - Keywords'}}
1+
{{page-title this.keyword ' - Keywords'}}
22

3-
<PageHeader @title="All Crates" @suffix="for keyword '{{this.keyword.keyword}}'"/>
3+
<PageHeader @title="All Crates" @suffix="for keyword '{{this.keyword}}'"/>
44

55
<div local-class="results-meta">
66
<ResultsCount

tests/routes/keyword-test.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ import { visit } from '../helpers/visit-ignoring-abort';
88
module('Route | keyword', function (hooks) {
99
setupApplicationTest(hooks);
1010

11-
test("shows an error message if the keyword can't be found", async function (assert) {
12-
await visit('/keywords/unknown');
13-
assert.equal(currentURL(), '/');
14-
assert.dom('[data-test-notification-message]').hasText("Keyword 'unknown' does not exist");
11+
test('shows an empty list if the keyword does not exist on the server', async function (assert) {
12+
await visit('/keywords/foo');
13+
assert.equal(currentURL(), '/keywords/foo');
14+
assert.dom('[data-test-crate-row]').doesNotExist();
1515
});
1616

1717
test('server error causes the error page to be shown', async function (assert) {
18-
this.server.get('/api/v1/keywords/:keywordId', {}, 500);
18+
this.server.get('/api/v1/crates', {}, 500);
1919

20-
await visit('/keywords/error');
21-
assert.equal(currentURL(), '/keywords/error');
22-
assert.dom('[data-test-error-message]').includesText('GET /api/v1/keywords/error returned a 500');
20+
await visit('/keywords/foo');
21+
assert.equal(currentURL(), '/keywords/foo');
22+
assert.dom('[data-test-404-page]').exists();
23+
assert.dom('[data-test-title]').hasText('foo: Failed to load crates');
24+
assert.dom('[data-test-go-back]').doesNotExist();
25+
assert.dom('[data-test-try-again]').exists();
2326
});
2427
});

0 commit comments

Comments
 (0)