UNPKG

passbolt-styleguide

Version:

Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.

336 lines (269 loc) 14.5 kB
/** * Passbolt ~ Open source password manager for teams * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com) * * Licensed under GNU Affero General Public License version 3 of the or any later version. * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com) * @license https://opensource.org/licenses/AGPL-3.0 AGPL License * @link https://www.passbolt.com Passbolt(tm) * @since 3.8.3 */ import {enableFetchMocks} from 'jest-fetch-mock'; import {mockApiResponse} from '../../../../../test/mocks/mockApiResponse'; import {defaultAppContext} from '../../../contexts/ApiAppContext.test.data'; import DisplaySelfRegistrationAdministrationPage from './DisplaySelfRegistrationAdministration.test.page'; import {defaultProps, domains, mockResult} from './DisplaySelfRegistrationAdministration.test.data'; import {waitFor} from '@testing-library/react'; import * as uuid from 'uuid'; import {ActionFeedbackContext} from "../../../contexts/ActionFeedbackContext"; import ConfirmSaveSelfRegistrationSettings from './ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings'; import ConfirmDeletionSelfRegistrationSettings from './ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings'; jest.mock('uuid'); /** * Unit tests on DisplaySelfRegistrationAdministration in regard of specifications */ describe("DisplaySelfRegistrationAdministration", () => { beforeEach(() => { enableFetchMocks(); jest.resetModules(); jest.restoreAllMocks(); jest.useFakeTimers(); }); afterEach(() => { jest.clearAllTimers(); }); let page; // The page to test against const props = defaultProps(); // The props to pass const context = defaultAppContext(); const gmailDomain = "gmail.com"; const requiredDomain = "A domain is required."; describe("As a logged in administrator I can enable the User self registration", () => { beforeEach(() => { fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult([]))); page = new DisplaySelfRegistrationAdministrationPage(context, props); }); it('As a logged in administrator when the User self registration is not configured, I can access the User self registration settings page', async() => { fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult(null, false))); page = new DisplaySelfRegistrationAdministrationPage(context, props); expect.assertions(7); expect(page.exists()).toBeTruthy(); expect(page.toggle.checked).toBeFalsy(); expect(page.disabledDescription).toBeDefined(); expect(page.helpBox).toBeDefined(); expect(page.helpBoxButton).toBeDefined(); expect(page.saveSettingsButton).toBeDefined(); // We expect to have the button disable for the first usage expect(page.saveSettingsButton.className.includes("disabled")).toBeTruthy(); }); it('As a logged in administrator I can enable the User self registration setting', async() => { expect.assertions(3); expect(page.helpBoxButton).toBeDefined(); expect(page.helpBoxButton.textContent).toEqual("Read the documentation"); expect(page.helpBoxButton.getAttribute('href')).toEqual('https://help.passbolt.com/configure/self-registration'); }); it('As a logged in administrator I can enable the User self registration setting', async() => { expect.assertions(5); await page.clickOnToggle(); expect(page.toggle.checked).toBeTruthy(); expect(page.enabledLabel).toBeDefined(); expect(page.enabledDescription).toBeDefined(); // We should pre-populate with profesional domain expect(page.firstInputRow.value).toEqual("passbolt.com"); expect(page.firstDeleteButton.getAttribute("disabled")).toBeNull(); }); it('As a logged in administrator I can enable the User self registration setting', async() => { expect.assertions(5); const contextWithPublicDomain = defaultAppContext({ loggedInUser: { username: "user@gmail.com" } }); fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult([]))); page = new DisplaySelfRegistrationAdministrationPage(context, defaultProps({ context: contextWithPublicDomain })); await waitFor(() => {}); await page.clickOnToggle(); expect(page.toggle.checked).toBeTruthy(); expect(page.enabledLabel).toBeDefined(); expect(page.enabledDescription).toBeDefined(); // We should not pre-populate with public domain expect(page.firstInputRow.value).toEqual(""); expect(page.firstDeleteButton.getAttribute("disabled")).toBeNull(); }); }); describe("As a logged administrator I can add domains to the User self registration list", () => { beforeEach(() => { fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult())); page = new DisplaySelfRegistrationAdministrationPage(context, props); let index = 0; jest.spyOn(uuid, 'v4').mockImplementation(() => (index++).toString()); }); it('As a logged in administrator I can add a new input field to the User self registration list', async() => { expect.assertions(7); // We expect to not have 4 items expect(page.inputByIndex(0).value).toBe('passbolt.com'); expect(page.inputByIndex(1).value).toBe('passbolt.io'); expect(page.inputByIndex(2).value).toBe('passbolt.lu'); expect(page.inputByIndex(3)).toBeNull(); await page.addDomain(); expect(page.inputByIndex(3)).toBeDefined(); expect(page.inputByIndex(3).value).toBe(''); //We expected to have a delete button closed to the input expect(page.deleteButtonByIndex(3)).toBeDefined(); }); it("As an administrator on the self registration admin settings form, I want to see the new row having focus when I click on the add a new row button", async() => { expect.assertions(1); await page.addDomain(); expect(page.hasFocus(page.inputByIndex(3))).toBeTruthy(); }); it('As a logged in administrator I can add a new non-professional domain to the User self registration but I should see a warning message', async() => { expect.assertions(7); //Mock API calls fetch.doMockIf(/self-registration\/settings*/, () => mockApiResponse(mockResult([gmailDomain]))); expect(page.warningMessage).toBeNull(); await page.addDomain(); await page.fillInput(page.inputByIndex(3), gmailDomain); expect(page.warningMessage).toBeDefined(); expect(page.warningMessage.textContent).toBe("This is not a safe professional domain"); expect(page.subtitle.classList.contains('warning')).toBeTruthy(); //Warning should not block the save await page.clickOnSave(); expect(page.warningMessage).toBeDefined(); expect(page.warningMessage.textContent).toBe("This is not a safe professional domain"); expect(page.subtitle.classList.contains('warning')).toBeTruthy(); }); }); describe("As a logged administrator I can save a list of domains", () => { beforeEach(() => { mockUuidGeneration(); jest.spyOn(ActionFeedbackContext._currentValue, 'displaySuccess').mockImplementation(() => {}); }); it('As a logged in administrator I can save a list of domains when there is no error and one domain field filled in', async() => { expect.assertions(2); //Mock API calls fetch.doMockIf(/self-registration\/settings*/, () => mockApiResponse(mockResult([]))); page = new DisplaySelfRegistrationAdministrationPage(context, props); await waitFor(() => {}); await page.clickOnToggle(); await page.clickOnSave(); // We expect to have a banner when settings changes are not saved expect(page.settingsChangedBanner).not.toBeNull(); expect(props.dialogContext.open).toHaveBeenCalledWith(ConfirmSaveSelfRegistrationSettings, expect.objectContaining({"domains": new Map(Object.entries(domains))})); }); it('As a logged in administrator I can save a list of domains when there is no error and at least one domain filled in ', async() => { expect.assertions(2); //Mock get all fetch.doMockIf(/self-registration\/settings*/, () => mockApiResponse(mockResult())); page = new DisplaySelfRegistrationAdministrationPage(context, props); await waitFor(() => {}); await page.addDomain(); // fill with non profession domain await page.fillInput(page.inputByIndex(3), gmailDomain); // We expect to have a banner when settings changes are not saved expect(page.settingsChangedBanner).not.toBeNull(); await page.clickOnSave(); expect(props.dialogContext.open).toHaveBeenCalledWith(ConfirmSaveSelfRegistrationSettings, expect.objectContaining({"domains": new Map(Object.entries(domains))})); }); it('As a logged in administrator I cannot save the User self registration list when the format is not valid', async() => { expect.assertions(7); //Mock API calls fetch.doMockIf(/self-registration\/settings*/, () => mockApiResponse(mockResult())); page = new DisplaySelfRegistrationAdministrationPage(context, props); await waitFor(() => {}); jest.spyOn(page.inputByIndex(1), 'focus'); // fill with non profession domain await page.fillInput(page.inputByIndex(1), ""); await page.clickOnSave(); expect(page.errorMessage.textContent).toBe(requiredDomain); expect(page.subtitle.classList.contains('error')).toBeTruthy(); // Check if input is focus expect(page.inputByIndex(1).focus).toHaveBeenCalled(); await page.fillInput(page.inputByIndex(1), "127.0.0.1"); expect(page.errorMessage.textContent).toBe("This should be a valid domain"); expect(page.subtitle.classList.contains('error')).toBeTruthy(); await page.fillInput(page.inputByIndex(1), "passbolt.com"); await page.fillInput(page.inputByIndex(2), "passbolt.com"); //Check duplication expect(page.errorMessage.textContent).toBe("This domain already exist"); expect(page.subtitle.classList.contains('error')).toBeTruthy(); }); it('As an administrator on the self registration admin settings form, I want to see the warning message on a row domain even when there are errors on other domains rows', async() => { expect.assertions(4); //Mock API calls fetch.doMockIf(/self-registration\/settings*/, () => mockApiResponse(mockResult())); page = new DisplaySelfRegistrationAdministrationPage(context, props); await waitFor(() => {}); jest.spyOn(page.inputByIndex(1), 'focus'); // fill with non profession domain await page.fillInput(page.inputByIndex(1), ""); await page.clickOnSave(); expect(page.errorMessage.textContent).toBe("A domain is required."); // Lets add a new domain await page.addDomain(); await page.fillInput(page.inputByIndex(2), gmailDomain); await page.focusOut(page.inputByIndex(2)); expect(page.warningMessage).toBeDefined(); expect(page.warningMessage.textContent).toBe("This is not a safe professional domain"); expect(page.subtitle.classList.contains('warning')).toBeTruthy(); }); }); describe("As a logged administrator I can remove a domain from the list", () => { beforeEach(() => { mockUuidGeneration(); fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult())); page = new DisplaySelfRegistrationAdministrationPage(context, props); }); it('As a logged in administrator I can remove a domain from an existing list of domains', async() => { expect.assertions(2); expect(page.inputByIndex(1).value).toBe("passbolt.io"); await page.removeDomain(1); expect(page.inputByIndex(1)).toBeNull(); }); it('As a logged in administrator I can not remove the domain when there’s only one item in the list of domains allowed to self register', async() => { expect.assertions(4); expect(page.inputByIndex(1).value).toBe("passbolt.io"); await page.removeDomain(1); await page.removeDomain(2); expect(page.inputByIndex(1)).toBeNull(); expect(page.inputByIndex(2)).toBeNull(); expect(page.deleteButtonByIndex(0).classList.contains("disabled")).toBeTruthy(); }); it('As a logged in administrator I can reset the “User self registration” settings when I disable and enable the setting', async() => { expect.assertions(5); //Disable settings await page.clickOnToggle(); await page.clickOnSave(); //Test to check that data are not anymore present on the UI await page.clickOnToggle(); expect(props.dialogContext.open).toHaveBeenCalledWith(ConfirmDeletionSelfRegistrationSettings, expect.objectContaining({onClose: expect.any(Function), onSubmit: expect.any(Function)})); //As index are generated by the function, a new input should have an incremented index expect(page.inputByIndex(0)).toBeNull(); expect(page.inputByIndex(2)).toBeNull(); expect(page.inputByIndex(3)).not.toBeNull(); //New input should be prepopulate with the domain of the organization expect(page.firstInputRow.value).toEqual("passbolt.com"); }); it("As an administrator on the self registration admin settings form, I should not see an error when I enable the settings which previously were containing error", async() => { expect.assertions(4); //We generate an error await page.fillInput(page.inputByIndex(1), ""); await page.clickOnSave(); expect(page.errorMessage.textContent).toBe(requiredDomain); expect(page.subtitle.classList.contains('error')).toBeTruthy(); // We disable self registration await page.clickOnToggle(); // We enable it agzain await page.clickOnToggle(); expect(page.errorMessage).toBeNull(); expect(page.subtitle.classList.contains('error')).toBeFalsy(); }); }); }); function mockUuidGeneration() { let index = 0; jest.spyOn(uuid, 'v4').mockImplementation(() => (index++).toString()); }