From 4c4cfe8e13635a44aef45c63423c3bb9342e5678 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 21 Mar 2021 11:54:36 +0100 Subject: [PATCH 1/3] tests/crate: Add "unknown crate" test --- tests/acceptance/crate-test.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index bba3a199949..45e4399bfcc 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -1,4 +1,4 @@ -import { click, currentRouteName, currentURL, visit, waitFor } from '@ember/test-helpers'; +import { click, currentRouteName, currentURL, waitFor } from '@ember/test-helpers'; import { module, skip, test } from 'qunit'; import percySnapshot from '@percy/ember'; @@ -8,6 +8,7 @@ import { getPageTitle } from 'ember-page-title/test-support'; import { setupApplicationTest } from 'cargo/tests/helpers'; import axeConfig from '../axe-config'; +import { visit } from '../helpers/visit-ignoring-abort'; module('Acceptance | crate page', function (hooks) { setupApplicationTest(hooks); @@ -80,6 +81,12 @@ module('Acceptance | crate page', function (hooks) { await a11yAudit(axeConfig); }); + test('unknown crate shows an error message', async function (assert) { + await visit('/crates/nanomsg'); + assert.equal(currentURL(), '/'); + assert.dom('[data-test-notification-message]').hasText("Crate 'nanomsg' does not exist"); + }); + test('unknown versions fall back to latest version and show an error message', async function (assert) { this.server.create('crate', { name: 'nanomsg' }); this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); From 0a547525ca7beaa999591a9265cc336fd56cfae1 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 21 Mar 2021 11:59:57 +0100 Subject: [PATCH 2/3] Show generic flash message if crate data fails to load Rethrowing the error means that it ends up creating noise on Sentry even for regular network errors. --- app/routes/crate.js | 5 +++-- tests/acceptance/crate-test.js | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/routes/crate.js b/app/routes/crate.js index c4e3a3ee553..923dd294cfd 100644 --- a/app/routes/crate.js +++ b/app/routes/crate.js @@ -10,10 +10,11 @@ export default class CrateRoute extends Route { } catch (error) { if (error.errors?.some(e => e.detail === 'Not Found')) { this.notifications.error(`Crate '${params.crate_id}' does not exist`); - this.replaceWith('index'); } else { - throw error; + this.notifications.error(`Loading data for the '${params.crate_id}' crate failed. Please try again later!`); } + + this.replaceWith('index'); } } diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index 45e4399bfcc..035c49a61a5 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -87,6 +87,16 @@ module('Acceptance | crate page', function (hooks) { assert.dom('[data-test-notification-message]').hasText("Crate 'nanomsg' does not exist"); }); + test('other crate loading error shows an error message', async function (assert) { + this.server.get('/api/v1/crates/:crate_name', {}, 500); + + await visit('/crates/nanomsg'); + assert.equal(currentURL(), '/'); + assert + .dom('[data-test-notification-message]') + .hasText("Loading data for the 'nanomsg' crate failed. Please try again later!"); + }); + test('unknown versions fall back to latest version and show an error message', async function (assert) { this.server.create('crate', { name: 'nanomsg' }); this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); From d71eec61d8ffbbca3baad5ec52a21f0595486f10 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 21 Mar 2021 12:09:34 +0100 Subject: [PATCH 3/3] Show generic flash message if versions list fails to load Letting the error bubble up means that it ends up creating noise on Sentry even for regular network errors. --- app/routes/crate/version.js | 10 +++++++++- tests/acceptance/crate-test.js | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/routes/crate/version.js b/app/routes/crate/version.js index 7402d6b5ecb..07dc15e1206 100644 --- a/app/routes/crate/version.js +++ b/app/routes/crate/version.js @@ -11,7 +11,15 @@ export default class VersionRoute extends Route { async model(params) { let crate = this.modelFor('crate'); - let versions = await crate.get('versions'); + + let versions; + try { + versions = await crate.get('versions'); + } catch { + this.notifications.error(`Loading data for the '${crate.name}' crate failed. Please try again later!`); + this.replaceWith('index'); + return; + } let version; let requestedVersion = params.version_num; diff --git a/tests/acceptance/crate-test.js b/tests/acceptance/crate-test.js index 035c49a61a5..89fd29b04db 100644 --- a/tests/acceptance/crate-test.js +++ b/tests/acceptance/crate-test.js @@ -110,6 +110,21 @@ module('Acceptance | crate page', function (hooks) { assert.dom('[data-test-notification-message]').hasText("Version '0.7.0' of crate 'nanomsg' does not exist"); }); + test('other versions loading error shows an error message', async function (assert) { + this.server.create('crate', { name: 'nanomsg' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.0' }); + this.server.create('version', { crateId: 'nanomsg', num: '0.6.1' }); + + this.server.get('/api/v1/crates/:crate_name/versions', {}, 500); + + await visit('/'); + await click('[data-test-just-updated] [data-test-crate-link="0"]'); + assert.equal(currentURL(), '/'); + assert + .dom('[data-test-notification-message]') + .hasText("Loading data for the 'nanomsg' crate failed. Please try again later!"); + }); + test('navigating to the all versions page', async function (assert) { this.server.loadFixtures();