Linden Crandall 5075f5c5d8
Some checks are pending
Automatisch Backend Tests / test (push) Waiting to run
Automatisch CI / linter (push) Waiting to run
Automatisch CI / start-backend-server (push) Waiting to run
Automatisch CI / start-backend-worker (push) Waiting to run
Automatisch CI / build-web (push) Waiting to run
Automatisch UI Tests / test (push) Waiting to run
commit upstream files
2025-02-06 04:14:18 +09:00

93 lines
2.8 KiB
JavaScript

const { BasePage } = require('../../base-page');
const { expect } = require('@playwright/test');
export class GithubPopup extends BasePage {
/**
* @param {import('@playwright/test').Page} page
*/
static async handle (page) {
const popup = new GithubPopup(page);
return await popup.handleAuthFlow();
}
getPathname () {
const url = this.page.url();
try {
return new URL(url).pathname;
} catch (e) {
return new URL(`https://github.com/${url}`).pathname;
}
}
async handleAuthFlow () {
if (this.getPathname() === '/login') {
await this.handleLogin();
}
if (this.page.isClosed()) { return; }
if (this.getPathname() === '/login/oauth/authorize') {
await this.handleAuthorize();
}
}
async handleLogin () {
const loginInput = this.page.getByLabel('Username or email address');
loginInput.click();
await loginInput.fill(process.env.GITHUB_USERNAME);
const passwordInput = this.page.getByLabel('Password');
passwordInput.click();
await passwordInput.fill(process.env.GITHUB_PASSWORD);
await this.page.getByRole('button', { name: 'Sign in' }).click();
// await this.page.waitForTimeout(2000);
if (this.page.isClosed()) {
return;
}
// await this.page.waitForLoadState('networkidle', 30000);
this.page.waitForEvent('load');
if (this.page.isClosed()) {
return;
}
await this.page.waitForURL(function (url) {
const u = new URL(url);
return (
u.pathname === '/login/oauth/authorize'
) && u.searchParams.get('client_id');
});
}
async handleAuthorize () {
if (this.page.isClosed()) { return; }
const authorizeButton = this.page.getByRole(
'button',
{ name: 'Authorize' }
);
await this.page.waitForEvent('load');
await authorizeButton.click();
await this.page.waitForURL(function (url) {
const u = new URL(url);
return (
u.pathname === '/login/oauth/authorize'
) && (
u.searchParams.get('client_id') === null
);
});
const passwordInput = this.page.getByLabel('Password');
if (await passwordInput.isVisible()) {
await passwordInput.fill(process.env.GITHUB_PASSWORD);
const submitButton = this.page
.getByRole('button')
.filter({ hasText: /confirm|submit|enter|go|sign in/gmi });
if (await submitButton.isVisible()) {
submitButton.waitFor();
await expect(submitButton).toBeEnabled();
await submitButton.click();
} else {
throw {
page: this.page,
error: 'Could not find submit button for confirming user account'
};
}
}
await this.page.waitForEvent('close');
}
}