mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-05-07 06:22:29 +00:00
186 lines
8.4 KiB
JavaScript
186 lines
8.4 KiB
JavaScript
/// <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.
|
|
});
|
|
});
|
|
});
|