UNPKG

passbolt-styleguide

Version:

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

932 lines (749 loc) 41.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.0 */ /** * Unit tests on ManageSmtpAdministrationSettings in regard of specifications */ import "../../../../../test/mocks/mockPortal.js"; import SmtpProviders from "./SmtpProviders.data"; import ManageSmtpAdministrationSettingsPage from "./ManageSmtpAdministrationSettings.test.page"; import { defaultProps } from "./ManageSmtpAdministrationSettings.test.data"; import NotifyError from "../../Common/Error/NotifyError/NotifyError"; import { mockApiResponse } from "../../../../../test/mocks/mockApiResponse"; import { defaultSmtpSettingsDto, defaultWithoutSmtpSettingsDto, defaultExistingSmtpSettingsDto, withAwsSesSmtpSettingsDto, withKnownProviderSmtpSettingsDto, withNoAuthenticationSmtpSettingsDto, withUsernameAuthenticationSmtpSettingsDto, withOAuthSmtpSettingsDto, } from "../../../contexts/AdminSmtpSettingsContext.test.data"; import { enableFetchMocks } from "jest-fetch-mock"; import PassboltApiFetchError from "../../../../shared/lib/Error/PassboltApiFetchError"; import { waitForTrue } from "../../../../../test/utils/waitFor"; import { act } from "react"; import { screen, waitFor } from "@testing-library/react"; beforeEach(() => { enableFetchMocks(); jest.resetModules(); }); describe("ManageSmtpAdministrationSettings", () => { describe("As AD I should see the SMTP settings", () => { it("As a signed-in administrator I can see the SMTP settings screen", async () => { expect.assertions(4); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(defaultWithoutSmtpSettingsDto())); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); expect(page.exists()).toBeTruthy(); expect(page.title.textContent).toBe("Email server"); expect(page.providerButtons).toBeTruthy(); expect(page.providerButtons.length).toBe(SmtpProviders.length); }); it("As a signed-in administrator I can see a provider different than “other” corresponding setting page", async () => { expect.assertions(10); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(defaultWithoutSmtpSettingsDto())); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); const otherSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "other"); await page.selectProvider(otherSmtpProviderIndex); const initialForm = { username: "username test", password: "password test", sender_name: "sender name test", sender_email: "sender email test", }; await page.setFormWith(initialForm); expect(page.providerValue).toBe("Other"); expect(page.username.value).toBe(initialForm.username); expect(page.password.value).toBe(initialForm.password); expect(page.sender_name.value).toBe(initialForm.sender_name); expect(page.sender_email.value).toBe(initialForm.sender_email); const gmailSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "google-mail"); await page.selectProviderInSelectField(gmailSmtpProviderIndex); expect(page.providerValue).toBe("Google Mail"); expect(page.username.value).toBe(initialForm.username); expect(page.password.value).toBe(initialForm.password); expect(page.sender_name.value).toBe(initialForm.sender_name); expect(page.sender_email.value).toBe(initialForm.sender_email); }); it("As a signed-in administrator in the Email server settings I can read the SMTP server password via the show button", async () => { expect.assertions(2); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(defaultWithoutSmtpSettingsDto())); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); const providerIndex = 0; await page.selectProvider(providerIndex); const passwordField = page.password; expect(passwordField.getAttribute("type")).toBe("password"); await page.togglePasswordShow(); expect(passwordField.getAttribute("type")).toBe("text"); }); it("As a signed-in administrator in the Email server settings with a provider selected, I can see the full list of providers in the “Email provider” dropdown", async () => { expect.assertions(2); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(defaultWithoutSmtpSettingsDto())); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); const providerIndex = 0; await page.selectProvider(providerIndex); expect(page.providerSelectFieldItems.length).toBe(SmtpProviders.length - 1); expect(page.providerValue).toBe(SmtpProviders[providerIndex].name); }); it("As a signed-in administrator in the Email server settings with a selected provider, I can see the advanced settings of the provider pre-populated", async () => { expect.assertions(6); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(defaultWithoutSmtpSettingsDto())); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); const otherSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "other"); await page.selectProvider(otherSmtpProviderIndex); expect(page.host.value).toBe(""); expect(page.tlsValue).toBe("Yes"); expect(page.port.value).toBe(""); const gmailSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "google-mail"); await page.selectProviderInSelectField(gmailSmtpProviderIndex); await page.showAdvancedSettings(); const provider = SmtpProviders[gmailSmtpProviderIndex]; expect(page.host.value).toBe(provider.defaultConfiguration.host); expect(page.tlsValue).toBe(provider.defaultConfiguration.tls ? "Yes" : "No"); expect(page.port.value).toBe(provider.defaultConfiguration.port.toString()); }); }); describe("As a signed-in administrator I can see the current SMTP settings", () => { it("As a signed-in administrator on the administration workspace, I can see the Email server settings populated with the configuration file settings", async () => { expect.assertions(8); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto({ client: "passbolt.dev", source: "file" }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.username.value).toBe(smtpSettings.username); expect(page.password.value).toBe(smtpSettings.password); expect(page.host.value).toBe(smtpSettings.host); expect(page.tlsValue).toBe(smtpSettings.tls ? "Yes" : "No"); expect(page.port.value).toBe(smtpSettings.port.toString()); expect(page.client.value).toBe(smtpSettings.client.toString()); expect(page.sender_email.value).toBe(smtpSettings.sender_email); expect(page.sender_name.value).toBe(smtpSettings.sender_name); }); it("As a signed-in administrator when the Email server settings are configured via configuration file, I can see a source warning message when I modify a field.", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto({ source: "file" }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.settingsFromFileWarningMessage).toBeFalsy(); await page.setFormWith({ username: "test" }); expect(page.settingsFromFileWarningMessage).toBeTruthy(); }); it("As a signed-in administrator when the Email server settings are configured via configuration file, I can see a source warning message when I modify a field.", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto({ source: "env" }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.settingsFromFileWarningMessage).toBeFalsy(); await page.setFormWith({ username: "test" }); expect(page.settingsFromFileWarningMessage).toBeTruthy(); }); it("As a signed-in administrator when the Email server settings are configured via the database, I do not see a source warning message when I modify a field. ", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto({ source: "db" }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.settingsFromFileWarningMessage).toBeFalsy(); await page.setFormWith({ username: "test" }); expect(page.settingsFromFileWarningMessage).toBeFalsy(); }); it("As a signed-in administrator in the Email server settings I can see that a selected provider changes to “Other” when I modify the settings", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = withAwsSesSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); const awsSesProvider = SmtpProviders.find((provider) => provider.id === "aws-ses"); const otherProvider = SmtpProviders.find((provider) => provider.id === "other"); expect(page.providerValue).toBe(awsSesProvider.name); await page.showAdvancedSettings(); await page.setFormWith({ host: `${awsSesProvider.defaultConfiguration.host}comcom` }); expect(page.providerValue).toBe(otherProvider.name); }); it("As a signed-in administrator in the Email server settings I can see that manual settings change to a specific provider when the setting match the default provider settings", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto({ tls: true, port: 587, }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); const awsSesProvider = SmtpProviders.find((provider) => provider.id === "aws-ses"); const otherProvider = SmtpProviders.find((provider) => provider.id === "other"); //By default, the TLS selected value in the component state is Yes. To ensure more coverage we pick a config without TLS. const aweSesConfiguration = awsSesProvider.availableConfigurations.find( (configuration) => configuration.port === 25, ); expect(page.providerValue).toBe(otherProvider.name); await page.setFormWith({ host: aweSesConfiguration.host, port: aweSesConfiguration.port, }); const desiredTlsValue = aweSesConfiguration.tls ? "Yes" : "No"; if (page.tlsValue !== desiredTlsValue) { await page.setTls(); } expect(page.providerValue).toBe(awsSesProvider.name); }); it("As a signed-in administrator in the Email server settings I can see an error dialog with error details if an error occurs during the fetch of the SMTP settings", async () => { expect.assertions(1); const expectedError = new PassboltApiFetchError("Unable to reach the server, an unexpected error occurred"); const props = defaultProps({ dialogContext: { open: jest.fn(), }, }); fetch.doMockOnceIf(/smtp\/settings.json/, () => { throw expectedError; }); await act(async () => new ManageSmtpAdministrationSettingsPage(props)); expect(props.dialogContext.open).toHaveBeenCalledWith(NotifyError, { error: expectedError, }); }); it("As a signed-in administrator in the Email server settings I can see that a selected authentication method is set to “Username and password” if both username and password returned by the API are set", async () => { expect.assertions(3); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.authenticationMethodValue).toBe("Username & password"); expect(page.username.value).toBe(smtpSettings.username); expect(page.password.value).toBe(smtpSettings.password); }); it("As a signed-in administrator in the Email server settings I can see that a selected authentication method is set to “Username only” if username is set but password returned by the API is set to null", async () => { expect.assertions(3); const props = defaultProps(); const smtpSettings = withUsernameAuthenticationSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.authenticationMethodValue).toBe("Username only"); expect(page.username.value).toBe(smtpSettings.username); expect(page.isPasswordVisible).toBeFalsy(); }); it("As a signed-in administrator in the Email server settings I can see that a selected authentication method is set to “None” if username and password returned by the API are set to null", async () => { expect.assertions(3); const props = defaultProps(); const smtpSettings = withNoAuthenticationSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.authenticationMethodValue).toBe("None"); expect(page.isUsernameVisible).toBeFalsy(); expect(page.isPasswordVisible).toBeFalsy(); }); it("As a signed-in administrator in the Email server settings I can see that a selected authentication method is set to OAuth (Client Credentials Grant) if OAuth fields are returned by the API", async () => { expect.assertions(6); const props = defaultProps(); const smtpSettings = withOAuthSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.authenticationMethodValue).toBe("OAuth (Client Credentials Grant)"); expect(page.isUsernameVisible).toBeFalsy(); expect(page.isPasswordVisible).toBeFalsy(); expect(page.isOAuthUsernameVisible).toBeTruthy(); expect(page.oauth_username.value).toBe(smtpSettings.oauth_username); expect(page.client_id.value).toBe(smtpSettings.client_id); }); it("As a signed-in administrator in the Email server settings I can select the OAuth authentication method from the dropdown when provider is Office 365", async () => { expect.assertions(6); const props = defaultProps(); const smtpSettings = withOAuthSmtpSettingsDto({ username: "test username", password: "test password", oauth_username: null, tenant_id: null, client_id: null, client_secret: null, }); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); // Select dropdown shows 3 items (excludes currently selected "Username & password") // Items: None=0, Username only=1, OAuth (Client Credentials Grant)=2 await page.selectAuthenticationMethod(2); expect(page.authenticationMethodValue).toBe("OAuth (Client Credentials Grant)"); expect(page.isUsernameVisible).toBeFalsy(); expect(page.isPasswordVisible).toBeFalsy(); expect(page.isOAuthUsernameVisible).toBeTruthy(); expect(page.tenant_id).toBeTruthy(); expect(page.client_secret).toBeTruthy(); }); it("As a signed-in administrator in the Email server settings with OAuth authentication, I can see an error message when the OAuth Username is not a valid email", async () => { expect.assertions(2); const props = defaultProps(); const smtpSettings = withOAuthSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.setFormWith({ oauth_username: "not-an-email" }); await page.clickOn(page.toolbarActionsSaveButton, () => true); expect(page.oauth_username_error).toBeTruthy(); expect(page.oauth_username_error.textContent).toBe("OAuth Username must be a valid email."); }); }); describe("As a signed-in administrator I can access the different help pages", () => { it("As a signed-in administrator I can access the Email server help page", async () => { expect.assertions(1); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.passboltHelpPage).toBeTruthy(); }); it("As a signed-in administrator in the “Email server” setting, after choosing a provider different than 'Other' I can see a second helpbox", async () => { expect.assertions(5); const props = defaultProps(); const smtpSettings = defaultExistingSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); const awsSesSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "aws-ses"); await page.selectProviderInSelectField(awsSesSmtpProviderIndex); expect(page.passboltHelpPage).toBeTruthy(); expect(page.smtpProviderHelpPage).toBeTruthy(); expect(page.smtpProviderHelpPage.getAttribute("href")).toBe(SmtpProviders[awsSesSmtpProviderIndex].help_page); expect(page.smtpProviderHelpPage.getAttribute("target")).toBe("_blank"); expect(page.smtpProviderHelpPage.getAttribute("rel")).toBe("noopener noreferrer"); }); it("As a signed-in administrator in the “Email server” setting, I cannot see the second helpbox when the provider is 'Other'", async () => { const smtpSettings = withKnownProviderSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); expect.assertions(4); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.passboltHelpPage).toBeTruthy(); expect(page.smtpProviderHelpPage).toBeTruthy(); const otherSmtpProviderIndex = SmtpProviders.findIndex((provider) => provider.id === "other"); await page.selectProviderInSelectField(otherSmtpProviderIndex - 1); expect(page.passboltHelpPage).toBeTruthy(); expect(page.smtpProviderHelpPage).toBeFalsy(); }); it("As a signed-in administrator in the “Email server” setting, I can see error message on fields that are not valid", async () => { const smtpSettings = defaultExistingSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); expect.assertions(14); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); const emptyFields = { username: "", password: "", sender_email: "", sender_name: "", host: "", port: "", client: "passbolt.dev:9090", }; await page.setFormWith(emptyFields); await page.clickOn(page.toolbarActionsSaveButton); expect(page.username_error).toBeFalsy(); expect(page.password_error).toBeFalsy(); expect(page.sender_email_error.textContent).toBe("Sender email is required"); expect(page.sender_name_error.textContent).toBe("Sender name is required"); expect(page.host_error.textContent).toBe("SMTP Host is required"); expect(page.port_error.textContent).toBe("Port must be a valid number"); expect(page.client_error.textContent).toBe("SMTP client should be a valid domain or IP address"); const withFieldErroneous = { username: 1234, password: 1234, sender_email: "email at passbolt dot com", sender_name: 1234, host: "this is no host", port: -1, client: "passboltveryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryeryerylongdomain.subdomain.dev", }; await page.setFormWith(withFieldErroneous); await waitForTrue(() => page.client_error.textContent === "SMTP client should be a valid domain or IP address"); expect(page.username_error).toBeFalsy(); expect(page.password_error).toBeFalsy(); expect(page.sender_email_error.textContent).toBe("Sender email must be a valid email"); expect(page.sender_name_error?.textContent).toBeFalsy(); expect(page.host_error?.textContent).toBeFalsy(); expect(page.port_error.textContent).toBe("Port must be a number between 1 and 65535"); expect(page.client_error.textContent).toBe("SMTP client should be a valid domain or IP address"); }); }); describe("As a signed-in administrator I can save the Email server settings", () => { it("As a signed-in administrator when the “Email server” settings have not changed, I can still trigger the “Save settings” action", async () => { const smtpSettings = withKnownProviderSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); expect.assertions(1); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); expect(page.isSaveButtonEnabled()).toBeTruthy(); }); it("As a signed-in administrator saving the “Email server” settings, I cannot edit the form", async () => { expect.assertions(10); const smtpSettings = withKnownProviderSmtpSettingsDto(); const formToSave = { username: "username test", password: "password test", sender_name: "sender name test", sender_email: "sender@passbolt.com", }; const expectedSettingsToSave = { ...smtpSettings, ...formToSave, }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let promiseResolution = null; fetch.doMockOnceIf( /smtp\/settings.json/, (data) => new Promise((resolve) => { const requestBody = JSON.parse(data.body.toString()); expect(requestBody).toStrictEqual(expectedSettingsToSave); promiseResolution = resolve; }), ); const props = defaultProps(); let page; await act(async () => { page = new ManageSmtpAdministrationSettingsPage(props); }); await waitFor(() => { expect(page.username.disabled).toBe(false); }); await page.setFormWith(formToSave); await waitFor(() => { expect(page.isSaveButtonEnabled()).toBe(true); }); await page.saveSettings(); await waitFor(() => { expect(page.isSaveButtonEnabled()).toBe(false); }); expect(page.username.disabled).toBe(true); await act(() => promiseResolution(mockApiResponse(expectedSettingsToSave))); // After save completes, form is editable again (not processing) and save button is enabled expect(page.username.disabled).toBe(false); // After save completes, the "Don't forget to save" warning should disappear and save button should be enabled (not processing) await waitFor(() => { expect(page.isSaveButtonEnabled()).toBe(true); }); expect(page.warningMessage).toBeNull(); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledTimes(1); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledWith( "The SMTP settings have been saved successfully", ); }); it("As a signed-in administrator on the “Email server” settings page, I can edit the form after saving the settings with success", async () => { expect.assertions(1); const smtpSettings = withKnownProviderSmtpSettingsDto(); const formToSave = { username: "username test", password: "password test", sender_name: "sender name test", sender_email: "sender@passbolt.com", }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let promiseResolution = null; fetch.doMockOnceIf( /smtp\/settings.json/, () => new Promise((resolve) => { promiseResolution = resolve; }), ); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.setFormWith(formToSave); await page.saveSettings(); await act(async () => promiseResolution()); expect(page.username.disabled).toBe(false); }); it("As a signed-in administrator on the “Email server” settings page, I can edit the form after an unsuccessful attempt to save the settings", async () => { expect.assertions(1); const smtpSettings = withKnownProviderSmtpSettingsDto(); const formToSave = { username: "username test", password: "password test", sender_name: "sender name test", sender_email: "sender@passbolt.com", }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let promiseRejection = null; fetch.doMockOnceIf( /smtp\/settings.json/, () => new Promise((resolve, reject) => { promiseRejection = reject; }), ); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.setFormWith(formToSave); await page.saveSettings(); await act(async () => promiseRejection()); expect(page.username.disabled).toBe(false); }); it("As a signed-in administrator on the “Email server” settings page, I can update the authentication method to 'None' and save the form", async () => { expect.assertions(6); const smtpSettings = withKnownProviderSmtpSettingsDto(); const expectedSettingsToSave = { ...smtpSettings, username: null, password: null, }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let promiseResolution = null; fetch.doMockOnceIf( /smtp\/settings.json/, (data) => new Promise((resolve) => { const requestBody = JSON.parse(data.body.toString()); expect(requestBody).toStrictEqual(expectedSettingsToSave); promiseResolution = resolve; }), ); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.selectAuthenticationMethod(0); expect(page.isSaveButtonEnabled()).toBe(true); expect(page.isUsernameVisible).toBe(false); expect(page.isPasswordVisible).toBe(false); await page.saveSettings(); await act(async () => promiseResolution(mockApiResponse(expectedSettingsToSave))); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledTimes(1); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledWith( "The SMTP settings have been saved successfully", ); }); it("As a signed-in administrator on the “Email server” settings page, I can update the authentication method to 'Username only' and save the form", async () => { expect.assertions(6); const smtpSettings = withKnownProviderSmtpSettingsDto(); const expectedSettingsToSave = { ...smtpSettings, username: "username-only", password: null, }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let promiseResolution = null; fetch.doMockOnceIf( /smtp\/settings.json/, (data) => new Promise((resolve) => { const requestBody = JSON.parse(data.body.toString()); expect(requestBody).toStrictEqual(expectedSettingsToSave); promiseResolution = resolve; }), ); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.selectAuthenticationMethod(1); expect(page.isSaveButtonEnabled()).toBe(true); expect(page.isUsernameVisible).toBe(true); expect(page.isPasswordVisible).toBe(false); await page.setFormWith({ username: expectedSettingsToSave.username }); await page.saveSettings(); await act(async () => promiseResolution(mockApiResponse(expectedSettingsToSave))); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledTimes(1); expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledWith( "The SMTP settings have been saved successfully", ); }); it("As a signed-in administrator in the “Email server” setting, I cannot save the “Email server” setting when the form does not validate\nAs a signed-in administrator when the SMTP server is configured, I can save the Email server setting when the form validates", async () => { expect.assertions(2); const sender_email = "sender@passbolt.com"; const smtpSettings = withKnownProviderSmtpSettingsDto(); const expectedSettingsToSave = { ...smtpSettings, sender_email, }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); //second call is a POST to save the settings let hasBeenCalledAlready = false; fetch.doMockOnceIf(/smtp\/settings.json/, async (data) => { const requestBody = JSON.parse(data.body.toString()); expect(requestBody).toStrictEqual(expectedSettingsToSave); //we expect just one call as saving an invalid shouldn't produce an API call expect(hasBeenCalledAlready).toBe(false); hasBeenCalledAlready = true; }); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.setFormWith({ sender_email: "" }); // equivalent of `await page.saveSettings()` without the check of form change state is it shouldn't change. await page.clickOn(page.toolbarActionsSaveButton); await page.setFormWith({ sender_email }); await page.saveSettings(); }); it("As a signed-in administrator I can cancel the “Email server” settings when I do not click on the save button and leave the page", async () => { expect.assertions(8); const smtpSettings = withKnownProviderSmtpSettingsDto(); const newData = { username: "username test", password: "password test", sender_name: "sender name test", sender_email: "sender@passbolt.com", }; //2 calls expected due to mounting component twice fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); const props = defaultProps(); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(props))); await page.setFormWith(newData); page.unmountManagerComponent(); expect(page.username).toBeNull(); expect(page.password).toBeNull(); expect(page.sender_name).toBeNull(); expect(page.sender_email).toBeNull(); await act(async () => page.remountManagerComponent()); expect(page.username.value).toBe(smtpSettings.username); expect(page.password.value).toBe(smtpSettings.password); expect(page.sender_name.value).toBe(smtpSettings.sender_name); expect(page.sender_email.value).toBe(smtpSettings.sender_email); }); it("As a signed-in administrator when the “Email server” settings are empty, I can still trigger the “Send test email” button", async () => { expect.assertions(2); const smtpSettings = defaultSmtpSettingsDto(); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); expect(page.exists).toBeTruthy(); expect(page.toolbarActionsTestButton.hasAttribute("disabled")).toBeFalsy(); }); it("As a signed-in administrator in the “Email server” setting, I cannot trigger the “Send test email” workflow when the form does not validate\nAs a signed-in administrator when the “Email server” settings form validate, I can trigger the “Send test email” workflow", async () => { expect.assertions(2); const sender_email = "sender@passbolt.com"; const smtpSettings = withKnownProviderSmtpSettingsDto(); //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); let page; await act(() => { page = new ManageSmtpAdministrationSettingsPage(defaultProps()); }); await page.setFormWith({ sender_email: "" }); // equivalent of `await page.saveSettings()` without the check of form change state is it shouldn't change. await page.clickOn(page.toolbarActionsTestButton); expect(page.sender_email_error.textContent).toBe("Sender email is required"); await page.setFormWith({ sender_email }); await page.testSettings(); expect(page.sendTestEmailDialog).toBeTruthy(); }); it("As a signed-in administrator on the “Send test email” dialog, I can see the “Email sent” dialog when the test email was successfully sent", async () => { expect.assertions(3); const props = defaultProps(); const smtpSettings = withKnownProviderSmtpSettingsDto(); const debugLog = { debug: [{ message: "everything is fine" }], }; //first call is a GET call for the settings fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings)); fetch.doMockOnceIf(/smtp\/email.json/, async (data) => { const requestBody = JSON.parse(data.body.toString()); expect(requestBody).toStrictEqual({ ...smtpSettings, email_test_to: props.context.loggedInUser.username, }); return mockApiResponse(debugLog); }); let page; await act(() => (page = new ManageSmtpAdministrationSettingsPage(props))); // equivalent of `await page.saveSettings()` without the check of form change state is it shouldn't change. await page.clickOn(page.toolbarActionsTestButton); await page.testSettings(); expect(page.sendTestEmailDialog).toBeTruthy(); await page.runTestFromDialog(); // Wait until the text is found (This will ensure the state has been updated) await screen.findByText("Logs"); await page.showLogs(); expect(page.logDetails.value).toBe(JSON.stringify(debugLog.debug, null, 4)); }); }); describe("As AD I should not be able to see the source of the configuration", () => { it("when it's coming from the database", async () => { expect.assertions(1); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse( defaultExistingSmtpSettingsDto({ source: "db", }), ), ); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); await waitForTrue(() => Boolean(page.settingsSource)); expect(page.settingsSource.textContent).toStrictEqual("This current configuration source is: database."); }); it("when it's coming from a file", async () => { expect.assertions(1); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse( defaultExistingSmtpSettingsDto({ source: "file", }), ), ); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); await waitForTrue(() => Boolean(page.settingsSource)); expect(page.settingsSource.textContent).toStrictEqual("This current configuration source is: file."); }); it("when it's coming from a environment variables", async () => { expect.assertions(1); fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse( defaultExistingSmtpSettingsDto({ source: "env", }), ), ); let page; await act(async () => (page = new ManageSmtpAdministrationSettingsPage(defaultProps()))); await waitForTrue(() => Boolean(page.settingsSource)); expect(page.settingsSource.textContent).toStrictEqual( "This current configuration source is: environment variables.", ); }); }); });