Skip to content

Commit ba8751c

Browse files
Onatcerkorridor
authored andcommitted
add api key e2e tests and improve labels
1 parent 21b33a0 commit ba8751c

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

e2e/profile.spec.ts

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,69 @@
1-
import { test, expect } from '../playwright/fixtures';
2-
import { PLAYWRIGHT_BASE_URL } from '../playwright/config';
1+
import {test, expect} from '../playwright/fixtures';
2+
import {PLAYWRIGHT_BASE_URL} from '../playwright/config';
33

4-
test('test that user name can be updated', async ({ page }) => {
4+
test('test that user name can be updated', async ({page}) => {
55
await page.goto(PLAYWRIGHT_BASE_URL + '/user/profile');
6-
await page.getByLabel('Name').fill('NEW NAME');
6+
await page.getByLabel('Name', {exact: true} ).fill('NEW NAME');
77
await Promise.all([
8-
page.getByRole('button', { name: 'Save' }).first().click(),
8+
page.getByRole('button', {name: 'Save'}).first().click(),
99
page.waitForResponse('**/user/profile-information'),
1010
]);
1111
await page.reload();
12-
await expect(page.getByLabel('Name')).toHaveValue('NEW NAME');
12+
await expect(page.getByLabel('Name', {exact: true})).toHaveValue('NEW NAME');
1313
});
1414

15-
test.skip('test that user email can be updated', async ({ page }) => {
15+
test.skip('test that user email can be updated', async ({page}) => {
1616
// this does not work because of email verification currently
1717
await page.goto(PLAYWRIGHT_BASE_URL + '/user/profile');
1818
const emailId = Math.round(Math.random() * 10000);
1919
await page.getByLabel('Email').fill(`newemail+${emailId}@test.com`);
20-
await page.getByRole('button', { name: 'Save' }).first().click();
20+
await page.getByRole('button', {name: 'Save'}).first().click();
2121
await page.reload();
2222
await expect(page.getByLabel('Email')).toHaveValue(
2323
`newemail+${emailId}@test.com`
2424
);
2525
});
26+
27+
async function createNewApiToken(page) {
28+
await page.getByLabel('API Key Name').fill('NEW API KEY');
29+
await Promise.all([
30+
page.getByRole('button', {name: 'Create API Key'}).click(),
31+
page.waitForResponse('**/users/me/api-tokens')
32+
]);
33+
34+
await expect(page.locator('body')).toContainText('API Token created successfully');
35+
await page.getByRole('dialog').getByText('Close').click();
36+
await expect(page.locator('body')).toContainText('NEW API KEY');
37+
}
38+
39+
test('test that user can create an API key', async ({page}) => {
40+
await page.goto(PLAYWRIGHT_BASE_URL + '/user/profile');
41+
await createNewApiToken(page);
42+
});
43+
44+
test('test that user can delete an API key', async ({page}) => {
45+
await page.goto(PLAYWRIGHT_BASE_URL + '/user/profile');
46+
await createNewApiToken(page);
47+
page.getByLabel('Delete API Token NEW API KEY').click();
48+
await expect(page.getByRole('dialog')).toContainText('Are you sure you would like to delete this API token?');
49+
await Promise.all([
50+
page.getByRole('dialog').getByRole('button', {name: 'Delete'}).click(),
51+
page.waitForResponse('**/users/me/api-tokens')
52+
]);
53+
await expect(page.locator('body')).not.toContainText('NEW API KEY');
54+
});
55+
56+
57+
test('test that user can revoke an API key', async ({page}) => {
58+
await page.goto(PLAYWRIGHT_BASE_URL + '/user/profile');
59+
await createNewApiToken(page);
60+
page.getByLabel('Revoke API Token NEW API KEY').click();
61+
await expect(page.getByRole('dialog')).toContainText('Are you sure you would like to revoke this API token?');
62+
await Promise.all([
63+
page.getByRole('dialog').getByRole('button', {name: 'Revoke'}).click(),
64+
page.waitForResponse('**/users/me/api-tokens')
65+
]);
66+
await expect(page.getByRole('button', {name: 'Revoke'})).toBeHidden();
67+
await expect(page.locator('body')).toContainText('NEW API KEY');
68+
await expect(page.locator('body')).toContainText('Revoked');
69+
});

resources/js/Pages/Profile/Partials/ApiTokensForm.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ const revokeApiTokenMutation = useMutation({
157157
<template #form>
158158
<!-- Token Name -->
159159
<div class="col-span-6 sm:col-span-4">
160-
<InputLabel for="name" value="Name" />
160+
<InputLabel for="api_key_name" value="API Key Name" />
161161
<TextInput
162-
id="name"
162+
id="api_key_name"
163163
v-model="createApiTokenForm.name"
164164
type="text"
165165
class="mt-1 block w-full" />
@@ -172,9 +172,7 @@ const revokeApiTokenMutation = useMutation({
172172
API Tokens are valid for 1 year
173173
</span>
174174
</div>
175-
176175
</div>
177-
178176
</template>
179177

180178
<template #actions>
@@ -187,7 +185,7 @@ const revokeApiTokenMutation = useMutation({
187185
<PrimaryButton
188186
:class="{ 'opacity-25': createApiTokenForm.processing }"
189187
:disabled="createApiTokenForm.processing">
190-
Create
188+
Create API Key
191189
</PrimaryButton>
192190
</template>
193191
</FormSection>
@@ -236,11 +234,13 @@ const revokeApiTokenMutation = useMutation({
236234
<button
237235
v-if="!token.revoked"
238236
class="cursor-pointer ms-6 text-sm text-text-secondary"
237+
:aria-label="'Revoke API Token ' + token.name"
239238
@click="confirmApiTokenRevocation(token)">
240239
Revoke
241240
</button>
242241
<button
243242
class="cursor-pointer ms-6 text-sm text-red-500"
243+
:aria-label="'Delete API Token ' + token.name"
244244
@click="confirmApiTokenDeletion(token)">
245245
Delete
246246
</button>
@@ -254,7 +254,7 @@ const revokeApiTokenMutation = useMutation({
254254

255255
<!-- Token Value Modal -->
256256
<DialogModal :show="displayingToken" @close="displayingToken = false">
257-
<template #title> API Token </template>
257+
<template #title> API Token created successfully </template>
258258

259259
<template #content>
260260
<div>

0 commit comments

Comments
 (0)