mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-07-01 15:47:23 +00:00
Add UI E2E tests for the login page for OIDC being enabled and when it is disabled
This commit is contained in:
185
test/cypress/e2e/ui/Login.cy.js
Normal file
185
test/cypress/e2e/ui/Login.cy.js
Normal file
@ -0,0 +1,185 @@
|
||||
/// <reference types="cypress" />
|
||||
|
||||
import {TEST_USER_EMAIL, TEST_USER_NICKNAME, TEST_USER_PASSWORD} from "../../support/constants";
|
||||
|
||||
describe('Login', () => {
|
||||
beforeEach(() => {
|
||||
// Clear all cookies and local storage so we start fresh
|
||||
cy.clearCookies();
|
||||
cy.clearLocalStorage();
|
||||
});
|
||||
|
||||
describe('when OIDC is not enabled', () => {
|
||||
beforeEach(() => {
|
||||
cy.configureOidc(false);
|
||||
cy.visit('/');
|
||||
})
|
||||
|
||||
it('should show the login form', () => {
|
||||
cy.get('input[data-cy="identity"]').should('exist');
|
||||
cy.get('input[data-cy="password"]').should('exist');
|
||||
cy.get('button[data-cy="sign-in"]').should('exist');
|
||||
});
|
||||
|
||||
it('should NOT show the button to sign in with an identity provider', () => {
|
||||
cy.get('button[data-cy="oidc-login"]').should('not.exist');
|
||||
});
|
||||
|
||||
describe('logging in with a username and password', () => {
|
||||
// These tests are duplicated below. The difference is that OIDC is disabled here.
|
||||
beforeEach(() => {
|
||||
// Delete and recreate the test user
|
||||
cy.deleteTestUser();
|
||||
cy.createTestUser();
|
||||
});
|
||||
|
||||
it('should log the user in when the credentials are correct', () => {
|
||||
// Fill in the form with the test user's email and the correct password
|
||||
cy.get('input[data-cy="identity"]').type(TEST_USER_EMAIL);
|
||||
cy.get('input[data-cy="password"]').type(TEST_USER_PASSWORD);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before proceeding
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 200 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 200);
|
||||
|
||||
// Expect the user to be redirected to the dashboard with a welcome message
|
||||
cy.get('h1[data-cy="page-title"]').should('contain.text', `Hi ${TEST_USER_NICKNAME}`);
|
||||
});
|
||||
|
||||
it('should show an error message if the password is incorrect', () => {
|
||||
// Fill in the form with the test user's email and an incorrect password
|
||||
cy.get('input[data-cy="identity"]').type(TEST_USER_EMAIL);
|
||||
cy.get('input[data-cy="password"]').type(`${TEST_USER_PASSWORD}_obviously_not_correct`);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before checking the error message
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 401 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 401);
|
||||
// Expect an error message on the UI
|
||||
cy.get('div[data-cy="password-error"]').should('contain.text', 'Invalid password');
|
||||
});
|
||||
|
||||
it('should show an error message if the email is incorrect', () => {
|
||||
// Fill in the form with the test user's email and an incorrect password
|
||||
cy.get('input[data-cy="identity"]').type(`definitely_not_${TEST_USER_EMAIL}`);
|
||||
cy.get('input[data-cy="password"]').type(TEST_USER_PASSWORD);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before checking the error message
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 401 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 401);
|
||||
// Expect an error message on the UI
|
||||
cy.get('div[data-cy="password-error"]').should('contain.text', 'No relevant user found');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('when OIDC is enabled', () => {
|
||||
beforeEach(() => {
|
||||
cy.configureOidc(true);
|
||||
cy.visit('/');
|
||||
});
|
||||
|
||||
it('should show the login form', () => {
|
||||
cy.get('input[data-cy="identity"]').should('exist');
|
||||
cy.get('input[data-cy="password"]').should('exist');
|
||||
cy.get('button[data-cy="sign-in"]').should('exist');
|
||||
});
|
||||
|
||||
it('should show the button to sign in with the configured identity provider', () => {
|
||||
cy.get('button[data-cy="oidc-login"]').should('exist');
|
||||
cy.get('button[data-cy="oidc-login"]').should('contain.text', 'Sign in with ACME OIDC Provider');
|
||||
});
|
||||
|
||||
describe('logging in with a username and password', () => {
|
||||
// These tests are the same as the ones above, but we need to repeat them here because the OIDC configuration
|
||||
beforeEach(() => {
|
||||
// Delete and recreate the test user
|
||||
cy.deleteTestUser();
|
||||
cy.createTestUser();
|
||||
});
|
||||
|
||||
it('should log the user in when the credentials are correct', () => {
|
||||
// Fill in the form with the test user's email and the correct password
|
||||
cy.get('input[data-cy="identity"]').type(TEST_USER_EMAIL);
|
||||
cy.get('input[data-cy="password"]').type(TEST_USER_PASSWORD);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before proceeding
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 200 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 200);
|
||||
|
||||
// Expect the user to be redirected to the dashboard with a welcome message
|
||||
cy.get('h1[data-cy="page-title"]').should('contain.text', `Hi ${TEST_USER_NICKNAME}`);
|
||||
|
||||
});
|
||||
|
||||
it('should show an error message if the password is incorrect', () => {
|
||||
// Fill in the form with the test user's email and an incorrect password
|
||||
cy.get('input[data-cy="identity"]').type(TEST_USER_EMAIL);
|
||||
cy.get('input[data-cy="password"]').type(`${TEST_USER_PASSWORD}_obviously_not_correct`);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before checking the error message
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 401 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 401);
|
||||
// Expect an error message on the UI
|
||||
cy.get('div[data-cy="password-error"]').should('contain.text', 'Invalid password');
|
||||
});
|
||||
|
||||
it('should show an error message if the email is incorrect', () => {
|
||||
// Fill in the form with the test user's email and an incorrect password
|
||||
cy.get('input[data-cy="identity"]').type(`definitely_not_${TEST_USER_EMAIL}`);
|
||||
cy.get('input[data-cy="password"]').type(TEST_USER_PASSWORD);
|
||||
|
||||
// Intercept the POST request to /api/tokens, so we can wait for it to complete before checking the error message
|
||||
cy.intercept('POST', '/api/tokens').as('login');
|
||||
|
||||
// Click the sign-in button
|
||||
cy.get('button[data-cy="sign-in"]').click();
|
||||
cy.wait('@login');
|
||||
|
||||
// Expect a 401 from the backend
|
||||
cy.get('@login').its('response.statusCode').should('eq', 401);
|
||||
// Expect an error message on the UI
|
||||
cy.get('div[data-cy="password-error"]').should('contain.text', 'No relevant user found');
|
||||
});
|
||||
});
|
||||
|
||||
describe('logging in with OIDC', () => {
|
||||
beforeEach(() => {
|
||||
// Delete and recreate the test user
|
||||
cy.deleteTestUser();
|
||||
cy.createTestUser();
|
||||
});
|
||||
|
||||
// TODO: Create a dummy OIDC provider that we can use for testing so we can test this fully.
|
||||
});
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user