import { module, test } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { render, waitFor } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; import { Response as MirageResponse } from 'ember-cli-mirage'; import { MirageTestContext } from 'ember-cli-mirage/test-support'; import { setupMirage } from 'ember-cli-mirage/test-support'; import config from '@cardstack/web-client/config/environment'; interface Context extends MirageTestContext {} let statusPageUrl = `${config.urls.statusPageUrl}/api/v2/incidents/unresolved.json`; module('Integration | Component | degraded-service-banner', function (hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('It doesn not display a banner when there are no incidents', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [], } ); }); await render(hbs``); assert.dom('[data-test-degraded-service-banner]').doesNotExist(); }); test('It shows a critical impact incident as severe', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [ { name: 'All systems down.', impact: 'critical', }, ], } ); }); await render(hbs``); await waitFor('[data-test-degraded-service-banner]'); assert .dom('[data-test-degraded-service-banner]') .containsText( 'All systems down. For more details, check our status page' ); assert .dom('[data-test-degraded-service-banner]') .hasClass('degraded-service-banner--severe'); }); test('It shows a major impact incident as severe', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [ { name: 'All systems down.', impact: 'major', }, ], } ); }); await render(hbs``); await waitFor('[data-test-degraded-service-banner]'); assert .dom('[data-test-degraded-service-banner]') .hasClass('degraded-service-banner--severe'); }); test('It shows a minor impact incident as default', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [ { name: 'One small system down.', impact: 'minor', }, ], } ); }); await render(hbs``); await waitFor('[data-test-degraded-service-banner]'); assert .dom('[data-test-degraded-service-banner]') .containsText( 'One small system down. For more details, check our status page' ); assert .dom('[data-test-degraded-service-banner]') .doesNotHaveClass('degraded-service-banner--severe'); }); test('It shows only the most recent and most impactful incident', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [ { name: 'All systems down.', impact: 'major', started_at: '2021-10-10T10:10:00.000Z', }, { name: 'One small system down.', impact: 'minor', started_at: '2021-10-10T10:10:00.003Z', }, { name: 'World down.', impact: 'critical', started_at: '2021-10-10T10:10:00.002Z', }, { name: 'Internet down.', impact: 'critical', started_at: '2021-10-10T10:10:00.001Z', }, ], } ); }); await render(hbs``); await waitFor('[data-test-degraded-service-banner]'); assert .dom('[data-test-degraded-service-banner]') .containsText('World down. For more details, check our status page'); assert .dom('[data-test-degraded-service-banner]') .hasClass('degraded-service-banner--severe'); }); test('It adds punctuation if missing', async function (this: Context, assert) { this.server.get(statusPageUrl, function () { return new MirageResponse( 200, {}, { incidents: [ { name: 'We are experiencing issues', impact: 'major', }, ], } ); }); await render(hbs``); await waitFor('[data-test-degraded-service-banner]'); assert .dom('[data-test-degraded-service-banner]') .containsText( 'We are experiencing issues. For more details, check our status page' ); }); });