passbolt-styleguide
Version:
Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.
795 lines (608 loc) • 35.4 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 SmtpProviders from "./SmtpProviders.data";
import {ManageSmtpAdministrationSettings} from "./ManageSmtpAdministrationSettings";
import ManageSmtpAdministrationSettingsPage from "./ManageSmtpAdministrationSettings.test.page";
import {waitFor} from "@testing-library/react";
import {defaultProps} from "./ManageSmtpAdministrationSettings.test.data";
import NotifyError from "../../Common/Error/NotifyError/NotifyError";
import {mockApiResponse} from "../../../../../test/mocks/mockApiResponse";
import {
defaultSmtpSettings,
withoutSmtpSettings,
withExistingSmtpSettings,
withAwsSesSmtpSettings,
withKnownProviderSmtpSettings,
withNoAuthenticationMethod,
withUsernameAuthenticationMethod,
} from "../../../contexts/AdminSmtpSettingsContext.test.data";
import {enableFetchMocks} from "jest-fetch-mock";
import PassboltApiFetchError from "../../../../shared/lib/Error/PassboltApiFetchError";
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(withoutSmtpSettings()));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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(withoutSmtpSettings()));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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(withoutSmtpSettings()));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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(withoutSmtpSettings()));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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(withoutSmtpSettings()));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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 = withExistingSmtpSettings({client: "passbolt.dev", source: "file"});
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings({source: "file"});
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings({source: "env"});
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings({source: "db"});
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withAwsSesSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings({
tls: true,
port: 587
});
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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(aweSesConfiguration.tls);
}
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("Something went wrong");
const props = defaultProps({
dialogContext: {
open: jest.fn()
}
});
fetch.doMockOnceIf(/smtp\/settings.json/, () => { throw expectedError; });
new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
expect(page.authenticationMethodValue).toBe(ManageSmtpAdministrationSettings.AUTHENTICATION_METHOD_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 = withUsernameAuthenticationMethod();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
expect(page.authenticationMethodValue).toBe(ManageSmtpAdministrationSettings.AUTHENTICATION_METHOD_USERNAME);
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 = withNoAuthenticationMethod();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
expect(page.authenticationMethodValue).toBe(ManageSmtpAdministrationSettings.AUTHENTICATION_METHOD_NONE);
expect(page.isUsernameVisible).toBeFalsy();
expect(page.isPasswordVisible).toBeFalsy();
});
});
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 = withExistingSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withKnownProviderSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
expect.assertions(4);
const props = defaultProps();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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 = withExistingSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
expect.assertions(14);
const props = defaultProps();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
const emptyFields = {
username: "",
password: "",
sender_email: "",
sender_name: "",
host: "",
port: "",
client: "passbolt.dev:9090"
};
await page.setFormWith(emptyFields);
await page.clickOn(page.toolbarActionsSaveButton, () => true);
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);
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 cannot trigger the “Save settings” action", async() => {
const smtpSettings = withKnownProviderSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
expect.assertions(1);
const props = defaultProps();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
expect(page.isSaveButtonEnabled()).toBeFalsy();
});
it("As a signed-in administrator saving the “Email server” settings, I cannot edit the form", async() => {
expect.assertions(8);
const smtpSettings = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
expect(page.username.disabled).toBe(false);
await page.setFormWith(formToSave);
expect(page.isSaveButtonEnabled()).toBe(true);
await page.saveSettings();
expect(page.isSaveButtonEnabled()).toBe(false);
expect(page.username.disabled).toBe(true);
promiseResolution(mockApiResponse(expectedSettingsToSave));
await waitFor(() => {});
expect(page.isSaveButtonEnabled()).toBe(true);
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
await page.setFormWith(formToSave);
await page.saveSettings();
promiseResolution();
await waitFor(() => {});
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
await page.setFormWith(formToSave);
await page.saveSettings();
promiseRejection();
await waitFor(() => {});
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
await page.selectAuthenticationMethod(0);
expect(page.isSaveButtonEnabled()).toBe(true);
expect(page.isUsernameVisible).toBe(false);
expect(page.isPasswordVisible).toBe(false);
await page.saveSettings();
promiseResolution(mockApiResponse(expectedSettingsToSave));
await waitFor(() => {});
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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();
promiseResolution(mockApiResponse(expectedSettingsToSave));
await waitFor(() => {});
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
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, () => true);
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 = withKnownProviderSmtpSettings();
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();
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
await page.setFormWith(newData);
page.unmountManagerComponent();
await waitFor(() => {});
expect(page.username).toBeNull();
expect(page.password).toBeNull();
expect(page.sender_name).toBeNull();
expect(page.sender_email).toBeNull();
page.remountManagerComponent();
await waitFor(() => {});
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 cannot trigger the “Send test email” workflow', async() => {
expect.assertions(2);
const smtpSettings = defaultSmtpSettings();
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
expect(page.exists).toBeTruthy();
expect(page.toolbarActionsTestButton.classList.contains("disabled")).toBeTruthy();
});
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 = withKnownProviderSmtpSettings();
//first call is a GET call for the settings
fetch.doMockOnceIf(/smtp\/settings.json/, () => mockApiResponse(smtpSettings));
const page = new ManageSmtpAdministrationSettingsPage(defaultProps());
await waitFor(() => {});
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, () => true);
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 = withKnownProviderSmtpSettings();
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);
});
const page = new ManageSmtpAdministrationSettingsPage(props);
await waitFor(() => {});
// equivalent of `await page.saveSettings()` without the check of form change state is it shouldn't change.
await page.clickOn(page.toolbarActionsTestButton, () => true);
await page.testSettings();
expect(page.sendTestEmailDialog).toBeTruthy();
await page.runTestFromDialog();
await page.showLogs();
expect(page.logDetails.value).toBe(JSON.stringify(debugLog.debug, null, 4));
});
});
});