Skip to content

Commit 1ebfdef

Browse files
committed
crate.version-dependencies: Show error page if data loading fails
1 parent d2b938b commit 1ebfdef

File tree

2 files changed

+76
-18
lines changed

2 files changed

+76
-18
lines changed

app/routes/crate/version-dependencies.js

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

44
export default class VersionRoute extends Route {
5-
@service notifications;
65
@service router;
76

8-
async model(params) {
7+
async model(params, transition) {
98
let crate = this.modelFor('crate');
10-
let versions = await crate.get('versions');
9+
10+
let versions;
11+
try {
12+
versions = await crate.get('versions');
13+
} catch (error) {
14+
let title = `${crate.name}: Failed to load version data`;
15+
return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
16+
}
1117

1218
let requestedVersion = params.version_num;
1319
let version = versions.find(version => version.num === requestedVersion);
1420
if (!version) {
15-
this.notifications.error(`Version '${requestedVersion}' of crate '${crate.name}' does not exist`);
16-
this.router.replaceWith('crate.index');
21+
let title = `${crate.name}: Version ${requestedVersion} not found`;
22+
return this.router.replaceWith('catch-all', { transition, title });
1723
}
1824

1925
try {
2026
await version.loadDepsTask.perform();
21-
} catch {
22-
this.notifications.error(
23-
`Failed to load the list of dependencies for the '${crate.name}' crate. Please try again later!`,
24-
);
25-
this.router.replaceWith('crate.index');
27+
} catch (error) {
28+
let title = `${crate.name}: Failed to load dependencies`;
29+
return this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
2630
}
2731

2832
return version;

tests/acceptance/crate-dependencies-test.js

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { currentURL, visit } from '@ember/test-helpers';
1+
import { currentURL } from '@ember/test-helpers';
22
import { module, test } from 'qunit';
33

44
import percySnapshot from '@percy/ember';
@@ -8,6 +8,7 @@ import { getPageTitle } from 'ember-page-title/test-support';
88
import { setupApplicationTest } from 'cargo/tests/helpers';
99

1010
import axeConfig from '../axe-config';
11+
import { visit } from '../helpers/visit-ignoring-abort';
1112

1213
module('Acceptance | crate dependencies page', function (hooks) {
1314
setupApplicationTest(hooks);
@@ -39,17 +40,70 @@ module('Acceptance | crate dependencies page', function (hooks) {
3940
assert.dom('[data-test-dev-dependencies] li').doesNotExist();
4041
});
4142

43+
test('shows an error page if crate not found', async function (assert) {
44+
await visit('/crates/foo/1.0.0/dependencies');
45+
assert.equal(currentURL(), '/crates/foo/1.0.0/dependencies');
46+
assert.dom('[data-test-404-page]').exists();
47+
assert.dom('[data-test-title]').hasText('foo: Crate not found');
48+
assert.dom('[data-test-go-back]').exists();
49+
assert.dom('[data-test-try-again]').doesNotExist();
50+
});
51+
52+
test('shows an error page if crate fails to load', async function (assert) {
53+
this.server.get('/api/v1/crates/:crate_name', {}, 500);
54+
55+
await visit('/crates/foo/1.0.0/dependencies');
56+
assert.equal(currentURL(), '/crates/foo/1.0.0/dependencies');
57+
assert.dom('[data-test-404-page]').exists();
58+
assert.dom('[data-test-title]').hasText('foo: Failed to load crate data');
59+
assert.dom('[data-test-go-back]').doesNotExist();
60+
assert.dom('[data-test-try-again]').exists();
61+
});
62+
63+
test('shows an error page if version is not found', async function (assert) {
64+
let crate = this.server.create('crate', { name: 'foo' });
65+
this.server.create('version', { crate, num: '2.0.0' });
66+
67+
await visit('/crates/foo/1.0.0/dependencies');
68+
assert.equal(currentURL(), '/crates/foo/1.0.0/dependencies');
69+
assert.dom('[data-test-404-page]').exists();
70+
assert.dom('[data-test-title]').hasText('foo: Version 1.0.0 not found');
71+
assert.dom('[data-test-go-back]').exists();
72+
assert.dom('[data-test-try-again]').doesNotExist();
73+
});
74+
75+
test('shows an error page if versions fail to load', async function (assert) {
76+
let crate = this.server.create('crate', { name: 'foo' });
77+
this.server.create('version', { crate, num: '2.0.0' });
78+
79+
this.server.get('/api/v1/crates/:crate_name/versions', {}, 500);
80+
81+
// Load `crate` and then explicitly unload the side-loaded `versions`.
82+
let store = this.owner.lookup('service:store');
83+
let crateRecord = await store.findRecord('crate', 'foo');
84+
let versions = crateRecord.hasMany('versions').value();
85+
versions.forEach(record => record.unloadRecord());
86+
87+
await visit('/crates/foo/1.0.0/dependencies');
88+
assert.equal(currentURL(), '/crates/foo/1.0.0/dependencies');
89+
assert.dom('[data-test-404-page]').exists();
90+
assert.dom('[data-test-title]').hasText('foo: Failed to load version data');
91+
assert.dom('[data-test-go-back]').doesNotExist();
92+
assert.dom('[data-test-try-again]').exists();
93+
});
94+
4295
test('shows error message if loading of dependencies fails', async function (assert) {
43-
this.server.loadFixtures();
96+
let crate = this.server.create('crate', { name: 'foo' });
97+
this.server.create('version', { crate, num: '1.0.0' });
4498

4599
this.server.get('/api/v1/crates/:crate_name/:version_num/dependencies', {}, 500);
46100

47-
await visit('/crates/nanomsg/dependencies');
48-
assert.equal(currentURL(), '/crates/nanomsg');
49-
50-
assert
51-
.dom('[data-test-notification-message="error"]')
52-
.hasText("Failed to load the list of dependencies for the 'nanomsg' crate. Please try again later!");
101+
await visit('/crates/foo/1.0.0/dependencies');
102+
assert.equal(currentURL(), '/crates/foo/1.0.0/dependencies');
103+
assert.dom('[data-test-404-page]').exists();
104+
assert.dom('[data-test-title]').hasText('foo: Failed to load dependencies');
105+
assert.dom('[data-test-go-back]').doesNotExist();
106+
assert.dom('[data-test-try-again]').exists();
53107
});
54108

55109
test('hides description if loading of dependency details fails', async function (assert) {

0 commit comments

Comments
 (0)