diff --git a/app/components/header.hbs b/app/components/header.hbs index 1426d929173..fce814ad134 100644 --- a/app/components/header.hbs +++ b/app/components/header.hbs @@ -27,7 +27,7 @@ Dashboard - Account Settings + Account Settings Owner Invites + + + Cancel + + + + diff --git a/tests/routes/settings/tokens/new-test.js b/tests/routes/settings/tokens/new-test.js new file mode 100644 index 00000000000..0e7ffa7f296 --- /dev/null +++ b/tests/routes/settings/tokens/new-test.js @@ -0,0 +1,111 @@ +import { click, currentURL, fillIn, waitFor } from '@ember/test-helpers'; +import { module, test } from 'qunit'; + +import { defer } from 'rsvp'; + +import { Response } from 'miragejs'; + +import { setupApplicationTest } from 'cargo/tests/helpers'; + +import { visit } from '../../../helpers/visit-ignoring-abort'; + +module('/settings/tokens/new', function (hooks) { + setupApplicationTest(hooks); + + function prepare(context) { + let user = context.server.create('user', { + login: 'johnnydee', + name: 'John Doe', + email: 'john@doe.com', + avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', + }); + + context.authenticateAs(user); + } + + test('can navigate to the route', async function (assert) { + prepare(this); + + await visit('/'); + assert.strictEqual(currentURL(), '/'); + + await click('[data-test-user-menu] [data-test-toggle]'); + await click('[data-test-user-menu] [data-test-settings]'); + assert.strictEqual(currentURL(), '/settings/profile'); + + await click('[data-test-settings-menu] [data-test-tokens] a'); + assert.strictEqual(currentURL(), '/settings/tokens'); + + await click('[data-test-new-token-button]', { altKey: true }); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + }); + + test('access is blocked if unauthenticated', async function (assert) { + await visit('/settings/tokens/new'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + assert.dom('[data-test-title]').hasText('This page requires authentication'); + assert.dom('[data-test-login]').exists(); + }); + + test('happy path', async function (assert) { + prepare(this); + + await visit('/settings/tokens/new'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + + await fillIn('[data-test-name]', 'token-name'); + await click('[data-test-generate]'); + + let token = this.server.schema.apiTokens.findBy({ name: 'token-name' }); + assert.ok(Boolean(token), 'API token has been created in the backend database'); + + assert.strictEqual(currentURL(), '/settings/tokens'); + assert.dom('[data-test-api-token="1"] [data-test-name]').hasText('token-name'); + assert.dom('[data-test-api-token="1"] [data-test-token]').hasText(token.token); + }); + + test('loading and error state', async function (assert) { + prepare(this); + + let deferred = defer(); + this.server.put('/api/v1/me/tokens', deferred.promise); + + await visit('/settings/tokens/new'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + + await fillIn('[data-test-name]', 'token-name'); + let clickPromise = click('[data-test-generate]'); + await waitFor('[data-test-generate] [data-test-spinner]'); + assert.dom('[data-test-name]').isDisabled(); + assert.dom('[data-test-generate]').isDisabled(); + + deferred.resolve(new Response(500)); + await clickPromise; + + let message = 'An error has occurred while generating your API token. Please try again later!'; + assert.dom('[data-test-notification-message="error"]').hasText(message); + assert.dom('[data-test-name]').isEnabled(); + assert.dom('[data-test-generate]').isEnabled(); + }); + + test('cancel button navigates back to the token list', async function (assert) { + prepare(this); + + await visit('/settings/tokens/new'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + + await click('[data-test-cancel]'); + assert.strictEqual(currentURL(), '/settings/tokens'); + }); + + test('empty name shows an error', async function (assert) { + prepare(this); + + await visit('/settings/tokens/new'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + + await click('[data-test-generate]'); + assert.strictEqual(currentURL(), '/settings/tokens/new'); + assert.dom('[data-test-name]').hasAria('invalid', 'true'); + }); +});