test: add accept invitation invalid token tests
This commit is contained in:
5
packages/e2e-tests/.env-example
Normal file
5
packages/e2e-tests/.env-example
Normal file
@@ -0,0 +1,5 @@
|
||||
POSTGRES_DB=automatisch
|
||||
POSTGRES_USER=automatisch_user
|
||||
POSTGRES_PASSWORD=automatisch_password
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_HOST=localhost
|
@@ -1,3 +1,4 @@
|
||||
const { expect } = require('@playwright/test');
|
||||
const { BasePage } = require('./base-page');
|
||||
|
||||
export class AcceptInvitation extends BasePage {
|
||||
@@ -14,6 +15,7 @@ export class AcceptInvitation extends BasePage {
|
||||
this.passwordConfirmationTextField = this.page.getByTestId('confirm-password-text-field');
|
||||
this.submitButton = this.page.getByTestId('submit-button');
|
||||
this.pageTitle = this.page.getByTestId('accept-invitation-form-title');
|
||||
this.formErrorMessage = this.page.getByTestId('accept-invitation-form-error');
|
||||
}
|
||||
|
||||
async open(token) {
|
||||
@@ -28,4 +30,17 @@ export class AcceptInvitation extends BasePage {
|
||||
|
||||
await this.submitButton.click();
|
||||
}
|
||||
|
||||
async fillPasswordField(password) {
|
||||
await this.passwordTextField.fill(password);
|
||||
await this.passwordConfirmationTextField.fill(password);
|
||||
}
|
||||
|
||||
async excpectSubmitButtonToBeDisabled() {
|
||||
await expect(this.submitButton).toBeDisabled();
|
||||
}
|
||||
|
||||
async expectAlertToBeVisible() {
|
||||
await expect(this.formErrorMessage).toBeVisible();
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,3 @@
|
||||
const path = require('node:path');
|
||||
const { ApplicationsModal } = require('./applications-modal');
|
||||
const { AuthenticatedPage } = require('./authenticated-page');
|
||||
|
||||
|
@@ -5,6 +5,7 @@ const { ExecutionsPage } = require('./executions-page');
|
||||
const { FlowEditorPage } = require('./flow-editor-page');
|
||||
const { UserInterfacePage } = require('./user-interface-page');
|
||||
const { LoginPage } = require('./login-page');
|
||||
const { AcceptInvitation } = require('./accept-invitation-page');
|
||||
const { adminFixtures } = require('./admin');
|
||||
|
||||
exports.test = test.extend({
|
||||
@@ -46,6 +47,11 @@ exports.publicTest = test.extend({
|
||||
|
||||
await use(loginPage);
|
||||
},
|
||||
|
||||
acceptInvitationPage: async ({ page }, use) => {
|
||||
const acceptInvitationPage = new AcceptInvitation(page);
|
||||
await use(acceptInvitationPage);
|
||||
}
|
||||
});
|
||||
|
||||
expect.extend({
|
||||
|
11
packages/e2e-tests/fixtures/postgres-client-config.js
Normal file
11
packages/e2e-tests/fixtures/postgres-client-config.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const { Client } = require('pg');
|
||||
|
||||
const client = new Client({
|
||||
host: process.env.POSTGRES_HOST,
|
||||
user: process.env.POSTGRES_USERNAME,
|
||||
port: process.env.POSTGRES_PORT,
|
||||
password: process.env.POSTGRES_PASSWORD,
|
||||
database: process.env.POSTGRES_DATABASE
|
||||
});
|
||||
|
||||
exports.client = client;
|
@@ -32,7 +32,9 @@
|
||||
"eslint": "^8.13.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"luxon": "^3.4.4",
|
||||
"micro": "^10.0.1",
|
||||
"pg": "^8.12.0",
|
||||
"prettier": "^2.5.1"
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const { defineConfig, devices } = require('@playwright/test');
|
||||
|
||||
/**
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
test.describe('Apps page', () => {
|
||||
|
@@ -1,5 +1,4 @@
|
||||
// @ts-check
|
||||
const { publicTest, test, expect } = require('../../fixtures/index');
|
||||
const { publicTest, expect } = require('../../fixtures/index');
|
||||
|
||||
publicTest.describe('Login page', () => {
|
||||
publicTest('shows login form', async ({ loginPage }) => {
|
||||
|
@@ -1,8 +1,7 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
test.describe('Connections page', () => {
|
||||
test.beforeEach(async ({ page, connectionsPage }) => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.getByTestId('apps-page-drawer-link').click();
|
||||
await page.goto('/app/ntfy/connections');
|
||||
});
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
// no execution data exists in an empty account
|
||||
|
@@ -1,8 +1,7 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
test.describe('Executions page', () => {
|
||||
test.beforeEach(async ({ page, executionsPage }) => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.getByTestId('executions-page-drawer-link').click();
|
||||
});
|
||||
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
test('Ensure creating a new flow works', async ({ page }) => {
|
||||
|
@@ -1,4 +1,3 @@
|
||||
// @ts-check
|
||||
const { test, expect } = require('../../fixtures/index');
|
||||
|
||||
test.describe('User interface page', () => {
|
||||
|
62
packages/e2e-tests/tests/user-invitation/invitation.spec.js
Normal file
62
packages/e2e-tests/tests/user-invitation/invitation.spec.js
Normal file
@@ -0,0 +1,62 @@
|
||||
const { AdminCreateUserPage } = require('../../fixtures/admin/create-user-page');
|
||||
const { publicTest, expect } = require('../../fixtures/index');
|
||||
const { client } = require('../../fixtures/postgres-client-config');
|
||||
const { DateTime } = require('luxon');
|
||||
|
||||
publicTest.describe('Accept invitation page', () => {
|
||||
publicTest.beforeAll(async () => {
|
||||
await client.connect();
|
||||
});
|
||||
|
||||
publicTest.afterAll(async () => {
|
||||
await client.end();
|
||||
});
|
||||
|
||||
publicTest('should not be able to set the password if token is empty', async ({ acceptInvitationPage }) => {
|
||||
await acceptInvitationPage.open('');
|
||||
await acceptInvitationPage.excpectSubmitButtonToBeDisabled();
|
||||
await acceptInvitationPage.fillPasswordField('something');
|
||||
await acceptInvitationPage.excpectSubmitButtonToBeDisabled();
|
||||
});
|
||||
|
||||
publicTest('should not be able to set the password if token is expired', async ({ acceptInvitationPage, page }) => {
|
||||
const expiredTokenDate = DateTime.now().minus({days: 3}).toISO();
|
||||
const expiredToken = (Math.random() + 1).toString(36).substring(2);
|
||||
|
||||
const adminCreateUserPage = new AdminCreateUserPage(page);
|
||||
adminCreateUserPage.seed(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER));
|
||||
const user = adminCreateUserPage.generateUser();
|
||||
|
||||
const queryRole = {
|
||||
text: 'SELECT * FROM roles WHERE name = $1',
|
||||
values: ['Admin']
|
||||
};
|
||||
|
||||
try {
|
||||
const queryRoleIdResult = await client.query(queryRole);
|
||||
expect(queryRoleIdResult.rowCount).toEqual(1);
|
||||
|
||||
const insertUser = {
|
||||
text: 'INSERT INTO users (email, full_name, role_id, status, invitation_token, invitation_token_sent_at) VALUES ($1, $2, $3, $4, $5, $6)',
|
||||
values: [user.email, user.fullName, queryRoleIdResult.rows[0].id, 'invited', expiredToken, expiredTokenDate],
|
||||
};
|
||||
|
||||
const insertUserResult = await client.query(insertUser);
|
||||
expect(insertUserResult.rowCount).toBe(1);
|
||||
expect(insertUserResult.command).toBe('INSERT');
|
||||
} catch (err) {
|
||||
console.error(err.message);
|
||||
throw err;
|
||||
}
|
||||
|
||||
await acceptInvitationPage.open(expiredToken);
|
||||
await acceptInvitationPage.acceptInvitation('something');
|
||||
await acceptInvitationPage.expectAlertToBeVisible();
|
||||
});
|
||||
|
||||
publicTest('should not be able to set the password if token is not in db', async ({ acceptInvitationPage }) => {
|
||||
await acceptInvitationPage.open('abc');
|
||||
await acceptInvitationPage.acceptInvitation('something');
|
||||
await acceptInvitationPage.expectAlertToBeVisible();
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user