Koha-clms/t/cypress/component/baseResource.ts

514 lines
22 KiB
TypeScript

import UseBaseResource from "@cypress/component/UseBaseResource.vue";
const globalConfig = {
global: {
stores: ["mainStore", "navigationStore"],
testingStore: {
initialState: {
authorisedValues: {
av_test: [
{
description: "Test value",
value: "test_value",
},
],
},
},
},
},
props: {
resourceConfig: cy.getBaseResourceConfig(),
},
};
describe("useBaseResource - toolbar methods", () => {
beforeEach(() => {
globalConfig.props.resourceConfig = cy.getBaseResourceConfig();
});
it("toolbarButtons - default buttons", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const toolbarButtons = baseResource.toolbarButtons.value;
const defaultButtonsShowComponent = toolbarButtons({}, "show", {});
expect(defaultButtonsShowComponent).to.have.length(2);
expect(defaultButtonsShowComponent[0].action).to.be.equal("edit");
expect(defaultButtonsShowComponent[1].action).to.be.equal("delete");
const defaultButtonsListComponent = toolbarButtons({}, "list", {});
expect(defaultButtonsListComponent).to.have.length(1);
expect(defaultButtonsListComponent[0].action).to.be.equal("add");
});
});
it("toolbarButtons - additional buttons", () => {
const additionalToolbarButtons = () => {
return {
list: [{ action: "testList", label: "Test" }],
show: [{ action: "testShow", label: "Test" }],
};
};
globalConfig.props.resourceConfig.additionalToolbarButtons =
additionalToolbarButtons;
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const toolbarButtons = baseResource.toolbarButtons.value;
const defaultButtonsShowComponent = toolbarButtons({}, "show", {});
expect(defaultButtonsShowComponent).to.have.length(3);
expect(defaultButtonsShowComponent[2].action).to.be.equal(
"testShow"
);
const defaultButtonsListComponent = toolbarButtons({}, "list", {});
expect(defaultButtonsListComponent).to.have.length(2);
expect(defaultButtonsListComponent[1].action).to.be.equal(
"testList"
);
});
});
it("toolbarButtons - additional buttons with the order set by the index property", () => {
const additionalToolbarButtons = () => {
return {
list: [{ action: "testList", label: "Test" }],
show: [{ action: "testShow", label: "Test", index: -1 }],
};
};
globalConfig.props.resourceConfig.additionalToolbarButtons =
additionalToolbarButtons;
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const toolbarButtons = baseResource.toolbarButtons.value;
const defaultButtonsShowComponent = toolbarButtons({}, "show", {});
expect(defaultButtonsShowComponent).to.have.length(3);
expect(defaultButtonsShowComponent[0].action).to.be.equal(
"testShow"
);
const defaultButtonsListComponent = toolbarButtons({}, "list", {});
expect(defaultButtonsListComponent).to.have.length(2);
expect(defaultButtonsListComponent[1].action).to.be.equal(
"testList"
);
});
});
it("goToResourceAdd", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const goToResourceAdd = baseResource.goToResourceAdd;
const router = baseResource.router;
cy.stub(router, "push");
goToResourceAdd();
expect(router.push).to.have.been.calledWith({ name: "testAdd" });
});
});
it("goToResourceEdit", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const goToResourceEdit = baseResource.goToResourceEdit;
const router = baseResource.router;
cy.stub(router, "push");
goToResourceEdit({ id: 1 });
expect(router.push).to.have.been.calledWith({
name: "testEdit",
params: {
id: 1,
},
});
});
});
it("goToResourceShow", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const goToResourceShow = baseResource.goToResourceShow;
const router = baseResource.router;
cy.stub(router, "push");
goToResourceShow({ id: 1 });
expect(router.push).to.have.been.calledWith({
name: "testShow",
params: {
id: 1,
},
});
});
});
it("goToResourceList", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const goToResourceList = baseResource.goToResourceList;
const router = baseResource.router;
cy.stub(router, "push");
goToResourceList({ id: 1 });
expect(router.push).to.have.been.calledWith({ name: "testList" });
});
});
// it("doResourceDelete", () => {
// cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
// cy.get_mainStore().then((mainStore) => {
// const baseResource = component.result;
// const doResourceDelete = baseResource.doResourceDelete;
// // const router = baseResource.router;
// // cy.stub(router, "push");
// cy.stub(mainStore, "setConfirmationDialog")
// // const confDialogSpy = cy.spy(mainStore, "setConfirmationDialog");
// doResourceDelete({id: 1, name: "Test"});
// expect(mainStore.setConfirmationDialog).to.have.been.called();
// })
// });
// });
});
describe("useBaseResource - datatables methods", () => {
beforeEach(() => {
globalConfig.props.resourceConfig = cy.getBaseResourceConfig();
});
it("getResourceTableUrl", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getResourceTableUrl = baseResource.getResourceTableUrl;
expect(getResourceTableUrl()).to.be.equal("testTableUrl");
});
});
it("getResourceShowURL", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getResourceShowURL = baseResource.getResourceShowURL;
const router = baseResource.router;
cy.stub(router, "resolve").callsFake(() => {
return {
href: "testShow",
};
});
getResourceShowURL(10);
expect(router.resolve).to.have.been.calledWith({
name: "testShow",
params: { id: 10 },
});
});
});
it("getFilterValues - no additionalFilters", () => {
const filters = {
filterValue: true,
anotherFilterValue: "filter",
andAnother: "another",
};
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFilterValues = baseResource.getFilterValues;
const filterResult = getFilterValues(filters);
expect(Object.keys(filterResult)).to.have.length(3);
expect(filterResult.filterValue).to.equal(true);
expect(filterResult.anotherFilterValue).to.equal("filter");
expect(filterResult.andAnother).to.equal("another");
});
});
it("getFilterValues - with additionalFilters", () => {
const filters = {
filterValue: true,
};
globalConfig.props.resourceConfig.table.additionalFilters = [
{ name: "additionalFilter", value: "test" },
{ name: "filterValue", value: false },
];
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFilterValues = baseResource.getFilterValues;
const filterResult = getFilterValues(filters);
expect(Object.keys(filterResult)).to.have.length(2);
expect(filterResult.filterValue).to.equal(true);
expect(filterResult.additionalFilter).to.equal("test");
});
});
});
describe("useBaseResource - resource display methods", () => {
beforeEach(() => {
globalConfig.props.resourceConfig = cy.getBaseResourceConfig();
});
it("getFieldGroupings - form with no field groups", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithNoGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Form");
expect(fieldGroupings[0].name).to.equal(null);
expect(fieldGroupings[0].fields).to.have.length(3);
expect(fieldGroupings[0].fields[2].name).to.equal("formField");
expect(
fieldGroupings[0].fields[1].relationshipFields[0]
.relationshipName
).to.equal("relationships");
expect(fieldGroupings[0].hasDataToDisplay).to.equal(false);
});
});
it("getFieldGroupings - show with no field groups", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithNoGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Show", {
name: "A name value",
});
expect(fieldGroupings[0].name).to.equal(null);
expect(fieldGroupings[0].fields).to.have.length(4);
expect(fieldGroupings[0].fields[2].name).to.equal("showField");
expect(fieldGroupings[0].hasDataToDisplay).to.equal(true);
});
});
it("getFieldGroupings - show with no field group and additional fields", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithNoGroups();
globalConfig.props.resourceConfig.extendedAttributesResourceType =
"test";
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Show", {
name: "A name value",
});
expect(fieldGroupings[0].fields[4].name).to.equal(
"additional_fields"
);
});
});
it("getFieldGroupings - form with field groups", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Form");
expect(fieldGroupings).to.have.length(2);
const firstGroup = fieldGroupings[0];
expect(firstGroup.name).to.equal("Group 2");
expect(firstGroup.fields).to.have.length(2);
expect(firstGroup.fields[0].name).to.equal("name");
expect(firstGroup.fields[1].name).to.equal("formField");
const secondGroup = fieldGroupings[1];
expect(secondGroup.name).to.equal("Group 3");
expect(secondGroup.fields).to.have.length(1);
expect(secondGroup.fields[0].name).to.equal("relationships");
});
});
it("getFieldGroupings - show with field groups and limited data in the resource", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Show", {
name: "A name value",
});
expect(fieldGroupings).to.have.length(1);
const firstGroup = fieldGroupings[0];
expect(firstGroup.name).to.equal("Group 2");
expect(firstGroup.fields).to.have.length(1);
expect(firstGroup.fields[0].name).to.equal("name");
});
});
it("getFieldGroupings - show with field groups and fully populated data in the resource", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Show", {
name: "A name value",
showField: "test",
displayName: "test",
});
expect(fieldGroupings).to.have.length(3);
const firstGroup = fieldGroupings[0];
expect(firstGroup.name).to.equal("Group 2");
expect(firstGroup.fields).to.have.length(1);
expect(firstGroup.fields[0].name).to.equal("name");
const secondGroup = fieldGroupings[1];
expect(secondGroup.name).to.equal("Group 3");
expect(secondGroup.fields).to.have.length(2);
expect(secondGroup.fields[0].name).to.equal("relationships");
expect(secondGroup.fields[1].name).to.equal("displayName");
const thirdGroup = fieldGroupings[2];
expect(thirdGroup.name).to.equal("Group 1");
expect(thirdGroup.fields).to.have.length(1);
expect(thirdGroup.fields[0].name).to.equal("showField");
});
});
it("getFieldGroupings - show with field groups and splitScreen mode enabled", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithGroups();
globalConfig.props.resourceConfig.showGroupsDisplayMode = "splitScreen";
globalConfig.props.resourceConfig.splitScreenGroupings = [
{ name: "Group 1", pane: 1 },
{ name: "Group 2", pane: 2 },
{ name: "Group 3", pane: 2 },
];
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getFieldGroupings = baseResource.getFieldGroupings;
const fieldGroupings = getFieldGroupings("Show", {
name: "A name value",
showField: "test",
displayName: "test",
});
const firstGroup = fieldGroupings[0];
expect(firstGroup.splitPane).to.equal(2);
const secondGroup = fieldGroupings[1];
expect(secondGroup.splitPane).to.equal(2);
const thirdGroup = fieldGroupings[2];
expect(thirdGroup.splitPane).to.equal(1);
});
});
it("getResource", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const getResource = baseResource.getResource;
const apiClient = globalConfig.props.resourceConfig.apiClient;
const apiSpy = cy.spy(apiClient, "get");
const componentData = {
instancedResource: {
afterResourceFetch: () => {},
},
resource: {
value: {},
},
initialized: {
value: false,
},
};
const resourceFetchSpy = cy.spy(
componentData.instancedResource,
"afterResourceFetch"
);
getResource(1, componentData, "Form")
.then(() => {
expect(apiSpy).to.have.been.called;
})
.then(() => {
expect(resourceFetchSpy).to.be.calledWith(
componentData,
{ id: 1, name: "Object 1" },
"Form"
);
});
});
});
it("resourceNamePlural", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const resourceNamePlural = baseResource.resourceNamePlural;
expect(resourceNamePlural.value).to.equal("testObjects");
});
});
});
describe("useBaseResource - resource creation methods", () => {
beforeEach(() => {
globalConfig.props.resourceConfig = cy.getBaseResourceConfig();
});
it("additionalFieldsChanged", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const additionalFieldsChanged =
baseResource.additionalFieldsChanged;
const resource = {
extended_attributes: null,
};
const additionalFieldValues = "A new value";
additionalFieldsChanged(additionalFieldValues, resource);
expect(resource.extended_attributes).to.equal(
additionalFieldValues
);
});
});
it("newResource", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithNoGroups();
globalConfig.props.resourceConfig.extendedAttributesResourceType =
"test";
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const newResource = baseResource.newResource;
expect(newResource.value).to.deep.equal({
id: null,
name: "",
relationships: [],
showField: "",
formField: "",
displayName: "",
select: "",
textarea: "",
boolean: false,
checkbox: false,
dummyType: null,
defaultValue: "This is a default value",
extended_attributes: [],
});
});
});
});
describe("useBaseResource - resource utility methods", () => {
beforeEach(() => {
globalConfig.props.resourceConfig = cy.getBaseResourceConfig();
});
it("hasAdditionalFields", () => {
globalConfig.props.resourceConfig.extendedAttributesResourceType =
"test";
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const hasAdditionalFields = baseResource.hasAdditionalFields;
expect(hasAdditionalFields.value).to.equal(true);
});
});
it("refreshTemplateState", () => {
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const baseResource = component.result;
const refreshTemplateState = baseResource.refreshTemplateState;
const refreshTemplate = baseResource.refreshTemplate;
expect(refreshTemplate.value).to.equal(0);
refreshTemplateState();
expect(refreshTemplate.value).to.equal(1);
refreshTemplateState();
expect(refreshTemplate.value).to.equal(2);
});
});
it("populateAttributesWithAuthorisedValues", () => {
globalConfig.props.resourceConfig.resourceAttrs =
cy.getResourceAttrsWithNoGroups();
cy.mount(UseBaseResource, globalConfig).then(({ component }) => {
const avCatResourceAttr =
globalConfig.props.resourceConfig.resourceAttrs.find(
ra => !!ra.avCat
);
expect(avCatResourceAttr.options).to.exist;
expect(Object.keys(avCatResourceAttr.options)).to.have.length(1);
expect(avCatResourceAttr.options[0].description).to.equal(
"Test value"
);
expect(avCatResourceAttr.options[0].value).to.equal("test_value");
const avRelationshipField =
globalConfig.props.resourceConfig.resourceAttrs
.find(ra => ra.name === "relationships")
.relationshipFields.find(rf => !!rf.avCat);
expect(avRelationshipField.options).to.exist;
expect(Object.keys(avRelationshipField.options)).to.have.length(1);
expect(avRelationshipField.options[0].description).to.equal(
"Test value"
);
expect(avRelationshipField.options[0].value).to.equal("test_value");
});
});
});