passbolt-styleguide
Version:
Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.
245 lines (205 loc) • 10.2 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.3
*/
import { mockApiResponse } from "../../../../../test/mocks/mockApiResponse";
import {
defaultProps,
mockResult,
} from "../../../components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data";
import { enableFetchMocks } from "jest-fetch-mock";
import SelfRegistrationDomainsViewModel from "../../../../shared/models/selfRegistration/SelfRegistrationDomainsViewModel";
import { AdminSelfRegistrationContextProvider } from "../../../contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext";
import MapObject from "../../../lib/Map/MapObject";
import SelfRegistrationDto from "../../../../shared/models/selfRegistration/SelfRegistrationDto";
import ConfirmSaveSelfRegistrationSettings from "../../../components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings";
import ConfirmDeletionSelfRegistrationSettings from "../../../components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings";
import NotifyError from "../../../components/Common/Error/NotifyError/NotifyError";
import PassboltServiceUnavailableError from "../../../../shared/lib/Error/PassboltServiceUnavailableError";
describe("AdministrationSelfRegistrationContext", () => {
let adminSelfRegistrationContext; // The adminSelfRegistrationContext to test
const props = defaultProps(); // The props to pass
const mockApiCalls = () => {
fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse(mockResult()));
};
//Initialize context by default
const initContext = async () => {
mockApiCalls();
await adminSelfRegistrationContext.findSettings();
};
beforeEach(() => {
jest.resetAllMocks();
adminSelfRegistrationContext = new AdminSelfRegistrationContextProvider(props);
mockState(adminSelfRegistrationContext);
enableFetchMocks();
});
describe("AdministrationSelfRegistrationContext::findSettings", () => {
it("should get the current settings and store it in its state", async () => {
expect.assertions(3);
// Mock the call to API
mockApiCalls();
const expectedResult = new SelfRegistrationDomainsViewModel(mockResult());
await adminSelfRegistrationContext.findSettings();
const domains = adminSelfRegistrationContext.getAllowedDomains();
expect(domains.values()).toEqual(expectedResult.allowedDomains.values());
expect(adminSelfRegistrationContext.getCurrentSettings()).toEqual(mockResult());
expect(adminSelfRegistrationContext.isProcessing()).toBeFalsy();
});
it("should set processing to true when loading settings", async () => {
expect.assertions(1);
adminSelfRegistrationContext.setProcessing(false);
try {
await adminSelfRegistrationContext.findSettings();
} catch {
expect(adminSelfRegistrationContext.isProcessing()).toBeTruthy();
}
});
});
describe("AdministrationSelfRegistrationContext::hasSettingsChanges", () => {
let keys = null;
beforeEach(async () => {
await initContext();
keys = MapObject.iterators(adminSelfRegistrationContext.getAllowedDomains());
});
it("should return true if settings is different then current setting", () => {
expect.assertions(1);
const domains = MapObject.clone(adminSelfRegistrationContext.getAllowedDomains());
domains.set(keys[0], "passbot.com");
adminSelfRegistrationContext.setDomains({ allowedDomains: domains });
expect(adminSelfRegistrationContext.hasSettingsChanges()).toBeTruthy();
});
it("should return false if settings is different then current setting", () => {
expect.assertions(1);
const [firstValue] = adminSelfRegistrationContext.getAllowedDomains().values();
const domains = MapObject.clone(adminSelfRegistrationContext.getAllowedDomains());
domains.set(keys[0], "passbot.com");
adminSelfRegistrationContext.setDomains({ allowedDomains: domains });
domains.set(keys[0], firstValue);
adminSelfRegistrationContext.setDomains({ allowedDomains: domains });
expect(adminSelfRegistrationContext.hasSettingsChanges()).toBeFalsy();
});
});
describe("AdminUserDirectoryContext::clearContext", () => {
beforeEach(async () => {
await initContext();
});
it("should clear the context and set it by default", () => {
expect.assertions(3);
adminSelfRegistrationContext.setDomains({ allowedDomains: { test: "value" } });
adminSelfRegistrationContext.clearContext();
expect(adminSelfRegistrationContext.isProcessing()).toBeTruthy();
expect(adminSelfRegistrationContext.getCurrentSettings()).toBe(null);
expect(adminSelfRegistrationContext.getAllowedDomains()).toEqual(new Map());
});
});
describe("AdminUserDirectoryContext::save", () => {
beforeEach(async () => {
await initContext();
});
it("should display ConfirmSaveSelfRegistrationSettings if form is valid", async () => {
await adminSelfRegistrationContext.save();
expect.assertions(2);
expect(adminSelfRegistrationContext.isSubmitted).toBeTruthy();
expect(props.dialogContext.open).toHaveBeenCalledWith(
ConfirmSaveSelfRegistrationSettings,
expect.objectContaining({ domains: adminSelfRegistrationContext.getAllowedDomains() }),
);
});
it("should display ConfirmDeletionSelfRegistrationSettings if form is valid and domains are empty", async () => {
adminSelfRegistrationContext.setDomains({ allowedDomains: new Map() });
await adminSelfRegistrationContext.save();
expect.assertions(2);
expect(adminSelfRegistrationContext.isSubmitted).toBeTruthy();
expect(props.dialogContext.open).toHaveBeenCalledWith(
ConfirmDeletionSelfRegistrationSettings,
expect.objectContaining({ onClose: expect.any(Function), onSubmit: expect.any(Function) }),
);
});
});
describe("AdminUserDirectoryContext::saveSettings", () => {
beforeEach(async () => {
await initContext();
});
it("should save settings and display feedback", async () => {
fetch.doMockOnceIf(/self-registration\/settings*/, () => mockApiResponse({}));
jest.spyOn(adminSelfRegistrationContext, "findSettings").mockImplementation();
await adminSelfRegistrationContext.saveSettings();
expect.assertions(4);
//Save should set processing to false in any case
expect(adminSelfRegistrationContext.isProcessing()).toBeFalsy();
expect(adminSelfRegistrationContext.findSettings).toHaveBeenCalled();
expect(props.actionFeedbackContext.displaySuccess).toHaveBeenCalledWith(
"The self registration settings for the organization were updated.",
);
expect(JSON.parse(fetch.mock.calls[1][1].body)).toEqual(
expect.objectContaining(
new SelfRegistrationDto(
{ allowedDomains: adminSelfRegistrationContext.getAllowedDomains() },
adminSelfRegistrationContext.getCurrentSettings(),
),
),
);
});
it("should not save settings and display feedback when we have an error", async () => {
const error = { message: "Unable to reach the server, an unexpected error occurred" };
fetch.doMockOnceIf(/self-registration\/settings*/, () => Promise.reject(error));
jest.spyOn(adminSelfRegistrationContext, "findSettings").mockImplementation();
await adminSelfRegistrationContext.saveSettings();
expect.assertions(4);
//Save should set processing to false in any case
expect(adminSelfRegistrationContext.isProcessing()).toBeFalsy();
expect(adminSelfRegistrationContext.findSettings).not.toHaveBeenCalled();
expect(props.dialogContext.open).toHaveBeenCalledWith(NotifyError, {
error: new PassboltServiceUnavailableError(error.message),
});
expect(JSON.parse(fetch.mock.calls[1][1].body)).toEqual(
expect.objectContaining(
new SelfRegistrationDto(
{ allowedDomains: adminSelfRegistrationContext.getAllowedDomains() },
adminSelfRegistrationContext.getCurrentSettings(),
),
),
);
});
});
describe("AdminMfaContext::errors", () => {
it("should update error object with targeted property", async () => {
expect.assertions(1);
await adminSelfRegistrationContext.setError("uuid1", "error");
expect(adminSelfRegistrationContext.getErrors().get("uuid1")).toBe("error");
});
it("should init errors with default property", async () => {
expect.assertions(1);
expect(adminSelfRegistrationContext.getErrors()).toEqual(new Map());
});
});
describe("AdminMfaContext::setSubmitted", () => {
it("should set submit and focus", async () => {
expect.assertions(2);
await adminSelfRegistrationContext.setSubmitted(true);
expect(adminSelfRegistrationContext.isSubmitted()).toBeTruthy();
expect(adminSelfRegistrationContext.shouldFocus()).toBeTruthy();
});
});
});
function mockState(adminSelfRegistrationContext) {
const setStateMock = (state) => {
let newState;
if (typeof state === "function") {
newState = state(adminSelfRegistrationContext.state);
} else {
newState = state;
}
adminSelfRegistrationContext.state = Object.assign(adminSelfRegistrationContext.state, newState);
};
jest.spyOn(adminSelfRegistrationContext, "setState").mockImplementation(setStateMock);
}