Skip to content

Commit 6864b22

Browse files
committed
routes/application: Show banner message if it is set
1 parent 84aed12 commit 6864b22

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

app/routes/application.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,16 @@ export default class ApplicationRoute extends Route {
6464
let timeout = Ember.testing ? 0 : 1000;
6565
await rawTimeout(timeout);
6666

67-
let { read_only: readOnly } = await ajax('/api/v1/site_metadata');
68-
if (readOnly) {
69-
let message =
67+
let { read_only, banner_message } = await ajax('/api/v1/site_metadata');
68+
69+
if (!banner_message && read_only) {
70+
banner_message =
7071
'crates.io is currently in read-only mode for maintenance reasons. ' +
7172
'Some functionality will be temporarily unavailable.';
73+
}
7274

73-
this.notifications.info(message, { autoClear: false });
75+
if (banner_message) {
76+
this.notifications.info(banner_message, { autoClear: false });
7477
}
7578
});
7679

e2e/acceptance/read-only-mode.spec.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,25 @@ test.describe('Acceptance | Read-only Mode', { tag: '@acceptance' }, () => {
3939
await checkSentryEventsNumber(ember, 1);
4040
await checkSentryEventsHasName(ember, ['AjaxError']);
4141
});
42+
43+
test('banner message is shown when present', async ({ page, msw }) => {
44+
await msw.worker.use(
45+
http.get('/api/v1/site_metadata', () => HttpResponse.json({ banner_message: 'test message' })),
46+
);
47+
await page.goto('/');
48+
49+
await expect(page.locator('[data-test-notification-message="info"]')).toContainText('test message');
50+
});
51+
52+
test('banner message takes precedence over read-only mode', async ({ page, msw }) => {
53+
await msw.worker.use(
54+
http.get('/api/v1/site_metadata', () => HttpResponse.json({ read_only: true, banner_message: 'test message' })),
55+
);
56+
await page.goto('/');
57+
58+
await expect(page.locator('[data-test-notification-message="info"]')).toContainText('test message');
59+
await expect(page.locator('[data-test-notification-message="info"]')).not.toContainText('read-only mode');
60+
});
4261
});
4362

4463
async function checkSentryEventsNumber(ember: AppFixtures['ember'], expected: number) {

tests/acceptance/read-only-mode-test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,21 @@ module('Acceptance | Read-only Mode', function (hooks) {
3838
assert.deepEqual(this.owner.lookup('service:sentry').events.length, 1);
3939
assert.true(this.owner.lookup('service:sentry').events[0].error instanceof AjaxError);
4040
});
41+
42+
test('banner message is shown when present', async function (assert) {
43+
this.worker.use(http.get('/api/v1/site_metadata', () => HttpResponse.json({ banner_message: 'test message' })));
44+
45+
await visit('/');
46+
assert.dom('[data-test-notification-message="info"]').includesText('test message');
47+
});
48+
49+
test('banner message takes precedence over read-only mode', async function (assert) {
50+
this.worker.use(
51+
http.get('/api/v1/site_metadata', () => HttpResponse.json({ read_only: true, banner_message: 'test message' })),
52+
);
53+
54+
await visit('/');
55+
assert.dom('[data-test-notification-message="info"]').includesText('test message');
56+
assert.dom('[data-test-notification-message="info"]').doesNotIncludeText('read-only mode');
57+
});
4158
});

0 commit comments

Comments
 (0)