passbolt-styleguide
Version:
Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.
230 lines (208 loc) • 8.6 kB
JavaScript
/**
* Passbolt ~ Open source password manager for teams
* Copyright (c) 2021 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) 2021 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.9.0
*/
import SaveResourcePage from "./SaveResource.test.page";
import { defaultProps } from "./SaveResource.test.data";
import { waitForTrue } from "../../../../test/utils/waitFor";
import {
RESOURCE_TYPE_PASSWORD_AND_DESCRIPTION_SLUG,
RESOURCE_TYPE_V5_DEFAULT_SLUG,
} from "../../../shared/models/entity/resourceType/resourceTypeSchemasDefinition";
import MetadataTypesSettingsEntity from "../../../shared/models/entity/metadata/metadataTypesSettingsEntity";
import { defaultMetadataTypesSettingsV6Dto } from "../../../shared/models/entity/metadata/metadataTypesSettingsEntity.test.data";
import { SECRET_DATA_OBJECT_TYPE } from "../../../shared/models/entity/secretData/secretDataEntity";
import { act } from "react";
beforeEach(() => {
jest.resetModules();
});
describe("See the Create Resource - save resource", () => {
it("As a signed-in user creating a password on the quickaccess, I should fill the form with meta received", async () => {
expect.assertions(4);
// data mocked
const props = defaultProps(); // The props to pass
let page;
const resourceMetaFromTab = {
name: "Passbolt",
uri: "https://passbolt.com",
username: "username",
secret_clear: "secret",
};
// functions mocked
jest.spyOn(props.context.port, "request").mockImplementationOnce(() => resourceMetaFromTab);
// process
await act(() => (page = new SaveResourcePage(props)));
// expectations
expect(page.name.value).toBe(resourceMetaFromTab.name);
expect(page.username.value).toBe(resourceMetaFromTab.username);
expect(page.uri.value).toBe(resourceMetaFromTab.uri);
expect(page.password.value).toBe(resourceMetaFromTab.secret_clear);
});
it("As a signed-in user creating a password on the quickaccess, I should be able to save resource v4", async () => {
expect.assertions(2);
// data mocked
const props = defaultProps(); // The props to pass
let page;
const resourceMetaFromTab = {
name: "Passbolt",
uris: ["https://passbolt.com"],
username: "username",
secret_clear: "secret",
};
// functions mocked
jest.spyOn(props.context.port, "request").mockImplementationOnce(() => resourceMetaFromTab);
// process
await act(() => (page = new SaveResourcePage(props)));
await page.save();
// expected data
const resourceTypeId = props.resourceTypes.getFirstBySlug(RESOURCE_TYPE_PASSWORD_AND_DESCRIPTION_SLUG).id;
const resourceDto = {
metadata: {
name: resourceMetaFromTab.name,
username: resourceMetaFromTab.username,
uris: resourceMetaFromTab.uris,
resource_type_id: resourceTypeId,
},
resource_type_id: resourceTypeId,
folder_parent_id: null,
expired: props.passwordExpiryContext.getDefaultExpirationDate(),
};
const secretDto = {
password: resourceMetaFromTab.secret_clear,
description: "",
resource_type_id: resourceTypeId,
};
// expectations
expect(props.context.port.request).toHaveBeenCalledWith("passbolt.resources.create", resourceDto, secretDto);
expect(props.context.closeWindow).toHaveBeenCalledTimes(1);
});
it("As a signed-in user creating a password on the quickaccess, I should be able to save resource v5", async () => {
expect.assertions(2);
// data mocked
const metadataTypeSettings = new MetadataTypesSettingsEntity(defaultMetadataTypesSettingsV6Dto());
const props = defaultProps({ metadataTypeSettings }); // The props to pass
let page;
const resourceMetaFromTab = {
name: "Passbolt",
uris: ["https://passbolt.com"],
username: "username",
secret_clear: "secret",
};
// functions mocked
jest.spyOn(props.context.port, "request").mockImplementationOnce(() => resourceMetaFromTab);
// process
await act(() => (page = new SaveResourcePage(props)));
await page.save();
// expected data
const resourceTypeId = props.resourceTypes.getFirstBySlug(RESOURCE_TYPE_V5_DEFAULT_SLUG).id;
const resourceDto = {
metadata: {
object_type: "PASSBOLT_RESOURCE_METADATA",
name: resourceMetaFromTab.name,
username: resourceMetaFromTab.username,
uris: [resourceMetaFromTab.uri],
resource_type_id: resourceTypeId,
},
resource_type_id: resourceTypeId,
folder_parent_id: null,
expired: props.passwordExpiryContext.getDefaultExpirationDate(),
};
const secretDto = {
password: resourceMetaFromTab.secret_clear,
description: "",
resource_type_id: resourceTypeId,
object_type: SECRET_DATA_OBJECT_TYPE,
};
// expectations
expect(props.context.port.request).toHaveBeenCalledWith("passbolt.resources.create", resourceDto, secretDto);
expect(props.context.closeWindow).toHaveBeenCalledTimes(1);
});
it("As a signed-in user, I can change the content of the form", async () => {
expect.assertions(4);
// data mocked
const props = defaultProps(); // The props to pass
let page;
const resourceMetaFromTab = {
name: "",
uri: "",
username: "",
secret_clear: "",
};
// functions mocked
jest.spyOn(props.context.port, "request").mockImplementationOnce(() => resourceMetaFromTab);
// process
await act(() => (page = new SaveResourcePage(props)));
const expectedData = {
name: "Test input",
uri: "https://another.uri.com",
username: "ada@passbolt.com",
password: "test",
};
await page.setFormWith(expectedData);
expect(page.name.value).toStrictEqual(expectedData.name);
expect(page.uri.value).toStrictEqual(expectedData.uri);
expect(page.username.value).toStrictEqual(expectedData.username);
expect(page.password.value).toStrictEqual(expectedData.password);
});
it("As a signed-in user, I can see error messages if the data is invalid", async () => {
expect.assertions(2);
// data mocked
const props = defaultProps(); // The props to pass
const resourceMetaFromTab = {
name: "",
uris: ["test"],
username: "",
secret_clear: "",
};
// functions mocked
props.context.port.addRequestListener("passbolt.quickaccess.prepare-autosave", () => resourceMetaFromTab);
// process
const page = new SaveResourcePage(props);
await waitForTrue(() => page.uri.value === resourceMetaFromTab.uri);
await page.save();
expect(page.nameError.textContent).toStrictEqual("A name is required.");
expect(page.passwordError.textContent).toStrictEqual("A password is required.");
});
it("As a signed-in user, I can see error messages from the API", async () => {
expect.assertions(4);
// data mocked
const props = defaultProps(); // The props to pass
const resourceMetaFromTab = {
name: "Test",
secret_clear: "password",
};
const apiError = new Error();
apiError.name = "PassboltApiFetchError";
apiError.data = {
code: 400,
body: {
name: ["The name is invalid"],
uri: ["The uri is invalid", "The uri contains a forbidden scheme"],
username: ["The username is invalid"],
password: ["The password is too weak"],
},
};
// functions mocked
props.context.port.addRequestListener("passbolt.quickaccess.prepare-autosave", () => resourceMetaFromTab);
props.context.port.addRequestListener("passbolt.resources.create", () => {
throw apiError;
});
// process
const page = new SaveResourcePage(props);
await waitForTrue(() => page.name.value === resourceMetaFromTab.name);
await page.save();
expect(page.nameError.textContent).toStrictEqual("The name is invalid");
expect(page.uriError.textContent).toStrictEqual("The uri is invalid, The uri contains a forbidden scheme");
expect(page.usernameError.textContent).toStrictEqual("The username is invalid");
expect(page.passwordError.textContent).toStrictEqual("The password is too weak");
});
});