diff --git a/app/components/tooltip.gjs b/app/components/tooltip.gjs index ecb54e6e232..b3548546a31 100644 --- a/app/components/tooltip.gjs +++ b/app/components/tooltip.gjs @@ -64,10 +64,12 @@ export default class Tooltip extends Component { return () => cleanup(); }); + // The `{{~@x~}}` is used for whitespace control to ensure we don't insert a leading whitespace element } diff --git a/e2e/routes/settings/tokens/index.spec.ts b/e2e/routes/settings/tokens/index.spec.ts index 63661616294..51667fb0691 100644 --- a/e2e/routes/settings/tokens/index.spec.ts +++ b/e2e/routes/settings/tokens/index.spec.ts @@ -28,4 +28,29 @@ test.describe('/settings/tokens', { tag: '@routes' }, () => { await expect(tokens[1].locator('[data-test-name]')).toHaveText('token-1'); await expect(tokens[1].locator('[data-test-token]')).toHaveCount(0); }); + + test('scope formatting', async ({ page, msw }) => { + let user = msw.db.user.create({ + login: 'johnnydee', + name: 'John Doe', + email: 'john@doe.com', + avatar: 'https://avatars2.githubusercontent.com/u/1234567?v=4', + }); + + await msw.authenticateAs(user); + + msw.db.apiToken.create({ + user, + endpointScopes: ['publish-new', 'publish-update', 'yank'], + crateScopes: ['serde', 'serde-*', 'serde_*'], + }); + + await page.goto('/settings/tokens'); + await expect(page).toHaveURL('/settings/tokens'); + await expect(page.locator('[data-test-api-token]')).toHaveCount(1); + await expect(page.locator('[data-test-endpoint-scopes]')).toHaveText( + 'Scopes: publish-new, publish-update, and yank', + ); + await expect(page.locator('[data-test-crate-scopes]')).toHaveText('Crates: serde, serde-*, and serde_*'); + }); }); diff --git a/tests/routes/settings/tokens/index-test.js b/tests/routes/settings/tokens/index-test.js index 25d29c56a01..0e17c79da6e 100644 --- a/tests/routes/settings/tokens/index-test.js +++ b/tests/routes/settings/tokens/index-test.js @@ -41,4 +41,20 @@ module('/settings/tokens', function (hooks) { assert.dom('[data-test-name]', tokens[1]).hasText('token-1'); assert.dom('[data-test-token]', tokens[1]).doesNotExist(); }); + + test('scope formatting', async function (assert) { + let { user } = prepare(this); + + this.db.apiToken.create({ + user, + endpointScopes: ['publish-new', 'publish-update', 'yank'], + crateScopes: ['serde', 'serde-*', 'serde_*'], + }); + + await visit('/settings/tokens'); + assert.strictEqual(currentURL(), '/settings/tokens'); + assert.dom('[data-test-api-token]').exists({ count: 1 }); + assert.dom('[data-test-endpoint-scopes]').hasText('Scopes: publish-new, publish-update, and yank'); + assert.dom('[data-test-crate-scopes]').hasText('Crates: serde, serde-*, and serde_*'); + }); });