passbolt-styleguide
Version:
Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.
932 lines (749 loc) • 41.5 kB
JavaScript
/**
* 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.",
);
});
});
});