Skip to content

Commit dc555dd

Browse files
authored
e2e: add pre-request with magic link (#760)
1 parent 6ce8e72 commit dc555dd

File tree

4 files changed

+111
-2
lines changed

4 files changed

+111
-2
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { expect, Page } from '@playwright/test';
2+
import { Persona } from './sign-in.page';
3+
4+
export class PreRequestFeedbackEmailPage {
5+
constructor(private page: Page) {}
6+
7+
async goto(magicLink: string) {
8+
expect(magicLink).toMatch(/\/fr\/pre-request\/token\//);
9+
10+
await this.page.goto(magicLink);
11+
}
12+
13+
async checkDetails(receiverEmail: Persona, message?: string) {
14+
await expect(this.page.getByText(receiverEmail)).toBeVisible();
15+
16+
if (message) {
17+
await expect(this.page.getByText(message)).toBeVisible();
18+
}
19+
}
20+
21+
async submitEmail(giverEmail: Persona) {
22+
await this.page.getByRole('textbox', { name: 'Votre email' }).fill(giverEmail);
23+
await this.page.getByRole('button', { name: 'Valider' }).click();
24+
25+
await this.page.waitForURL('/fr/pre-request/success');
26+
await expect(this.page.getByText(giverEmail)).toBeVisible();
27+
}
28+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { expect, Page } from '@playwright/test';
2+
3+
export class PreRequestFeedbackTokenPage {
4+
constructor(private page: Page) {}
5+
6+
async goto() {
7+
await this.page.goto('/fr/request');
8+
9+
await this.page.getByRole('radio', { name: 'Avec un lien magique' }).check();
10+
await expect(this.page.getByText('Emails de vos collègues')).toBeDisabled();
11+
}
12+
13+
async generate(message = '') {
14+
if (message) {
15+
await this.page.getByRole('textbox', { name: 'Message' }).fill(message);
16+
}
17+
await this.page.getByRole('button', { name: 'Générer' }).click();
18+
19+
await this.page.waitForURL('/fr/request/success');
20+
}
21+
22+
async getMagicLink(): Promise<string> {
23+
await this.page.context().grantPermissions(['clipboard-read', 'clipboard-write']);
24+
25+
await this.page.getByRole('button', { name: 'Lien magique' }).click();
26+
27+
await expect(this.page.getByText('Copié dans le presse-papier !')).toBeVisible();
28+
29+
return await this.page.evaluate(() => navigator.clipboard.readText());
30+
}
31+
32+
async gotoGenerateAndGetMagicLink(message = ''): Promise<string> {
33+
await this.goto();
34+
await this.generate(message);
35+
return await this.getMagicLink();
36+
}
37+
}

client/e2e/pages/request-feedback.page.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ export class RequestFeedbackPage {
1414
await emailsField.press('Tab');
1515

1616
if (message) {
17-
const messageField = this.page.getByText('Message');
18-
messageField.fill(message);
17+
await this.page.getByRole('textbox', { name: 'Message' }).fill(message);
1918
}
2019

2120
await this.page.getByRole('button', { name: 'Envoyer' }).click();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { expect, test } from '@playwright/test';
2+
import { FeedbackHistoryDetailsPage } from './pages/feedback-history-details.page';
3+
import { FeedbackHistoryPage } from './pages/feedback-history.page';
4+
import { FirestorePage } from './pages/firestore.page';
5+
import { PreRequestFeedbackEmailPage } from './pages/pre-request-feedback-email.page';
6+
import { PreRequestFeedbackTokenPage } from './pages/pre-request-feedback-token.page';
7+
import { Persona, SignInPage } from './pages/sign-in.page';
8+
import { UserMenuPage } from './pages/user-menu.page';
9+
10+
const feedbackMessage = 'Quel est votre feedback ?';
11+
12+
test.beforeEach(({ page }) => new FirestorePage(page).reset());
13+
14+
test('Submit spontaneous feedback', async ({ page }) => {
15+
// ====== Alfred generate magic link ======
16+
17+
await new SignInPage(page).gotoAndSignIn(Persona.Alfred);
18+
19+
const magicLink = await new PreRequestFeedbackTokenPage(page).gotoGenerateAndGetMagicLink(feedbackMessage);
20+
21+
await new UserMenuPage(page).signOut();
22+
23+
// ====== Bernard use magic link (not authenticated) ======
24+
25+
const preRequestEmail = new PreRequestFeedbackEmailPage(page);
26+
await preRequestEmail.goto(magicLink);
27+
await preRequestEmail.checkDetails(Persona.Alfred, feedbackMessage);
28+
await preRequestEmail.submitEmail(Persona.Bernard);
29+
30+
// ====== Bernard checks the requested feedback (from Alfred) is ready to be replied ======
31+
32+
await new SignInPage(page).gotoAndSignIn(Persona.Bernard);
33+
34+
const bernardHistoryPage = new FeedbackHistoryPage(page);
35+
await bernardHistoryPage.goto('receivedRequest');
36+
37+
const alfredDetailsLink = await bernardHistoryPage.findDetailsLink(Persona.Alfred);
38+
await expect(
39+
alfredDetailsLink,
40+
'Feedback receiver should be visible in the page "Répondre aux demandes de feedZback"',
41+
).toBeVisible();
42+
await alfredDetailsLink.click();
43+
44+
await new FeedbackHistoryDetailsPage(page).matchPending('receivedRequest', Persona.Alfred, feedbackMessage);
45+
});

0 commit comments

Comments
 (0)