Skip to content

Commit ee7658d

Browse files
committed
crate.range: Show error page if versions fail to load
1 parent 975ef7b commit ee7658d

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

app/routes/crate/range.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,23 @@ export default class VersionRoute extends Route {
1414
async model({ range }, transition) {
1515
let crate = this.modelFor('crate');
1616

17-
let versions = await crate.get('versions');
18-
let allVersionNums = versions.map(it => it.num);
19-
let unyankedVersionNums = versions.filter(it => !it.yanked).map(it => it.num);
17+
try {
18+
let versions = await crate.hasMany('versions').load();
19+
let allVersionNums = versions.map(it => it.num);
20+
let unyankedVersionNums = versions.filter(it => !it.yanked).map(it => it.num);
2021

21-
let npmRange = cargoRangeToNpm(range);
22-
// find a version that matches the specified range
23-
let versionNum = maxSatisfying(unyankedVersionNums, npmRange) ?? maxSatisfying(allVersionNums, npmRange);
24-
if (versionNum) {
25-
this.router.replaceWith('crate.version', versionNum);
26-
} else {
27-
let title = `${crate.name}: No matching version found for ${range}`;
28-
this.router.replaceWith('catch-all', { transition, title });
22+
let npmRange = cargoRangeToNpm(range);
23+
// find a version that matches the specified range
24+
let versionNum = maxSatisfying(unyankedVersionNums, npmRange) ?? maxSatisfying(allVersionNums, npmRange);
25+
if (versionNum) {
26+
this.router.replaceWith('crate.version', versionNum);
27+
} else {
28+
let title = `${crate.name}: No matching version found for ${range}`;
29+
this.router.replaceWith('catch-all', { transition, title });
30+
}
31+
} catch (error) {
32+
let title = `${crate.name}: Failed to load version data`;
33+
this.router.replaceWith('catch-all', { transition, error, title, tryAgain: true });
2934
}
3035
}
3136
}

tests/routes/crate/range-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,24 @@ module('Route | crate.range', function (hooks) {
112112
assert.dom('[data-test-go-back]').exists();
113113
assert.dom('[data-test-try-again]').doesNotExist();
114114
});
115+
116+
test('shows an error page if versions fail to load', async function (assert) {
117+
let crate = this.server.create('crate', { name: 'foo' });
118+
this.server.create('version', { crate, num: '3.2.1' });
119+
120+
this.server.get('/api/v1/crates/:crate_name/versions', {}, 500);
121+
122+
// Load `crate` and then explicitly unload the side-loaded `versions`.
123+
let store = this.owner.lookup('service:store');
124+
let crateRecord = await store.findRecord('crate', 'foo');
125+
let versions = crateRecord.hasMany('versions').value();
126+
versions.forEach(record => record.unloadRecord());
127+
128+
await visit('/crates/foo/range/^3');
129+
assert.equal(currentURL(), '/crates/foo/range/%5E3');
130+
assert.dom('[data-test-404-page]').exists();
131+
assert.dom('[data-test-title]').hasText('foo: Failed to load version data');
132+
assert.dom('[data-test-go-back]').doesNotExist();
133+
assert.dom('[data-test-try-again]').exists();
134+
});
115135
});

0 commit comments

Comments
 (0)