import * as React from "react"; import { render, fireEvent, cleanup, screen } from "@testing-library/react"; import "@testing-library/jest-dom/extend-expect"; import Editor from "./Editor"; import { ComponentTypes } from "@sc/plugins/webcomponents/v2/types"; import { sampleContentData } from "./module.stories"; const components = Object.keys(ComponentTypes); describe("Editor (Rendering)", () => { afterEach(cleanup); it(`Should show editor in the dom`, () => { const { getByTestId } = render( ); expect(getByTestId("Editor-Default")).not.toBe(null); }); it(`Should show the same number of items in the dom as there are items in the content prop`, () => { const { queryAllByTestId } = render( ); expect(queryAllByTestId("Editor-EditorObject-Item").length).toEqual( sampleContentData.length ); }); it(`Should show items in the dom as specific in the content prop and match components found in the components prop`, () => { const { debug, queryAllByTestId } = render( ); sampleContentData.forEach((itm) => { expect(queryAllByTestId(`WC-${itm.type}-EDIT`)).not.toBe(null); }); }); it(`Should show a default drag handle component near each object when selected`, () => { const { debug, queryAllByTestId } = render( ); expect(queryAllByTestId(`Editor-EditorObject`).length).toEqual( sampleContentData.length ); }); it(`Should show an item legend if the itemLegendIsVisible prop is true`, () => { const { getByTestId } = render( ); expect(getByTestId("Editor-ItemLegend")).not.toBe(false); }); it(`Props in the item legend should match the object provided in the itemLegendSettings prop`, () => { const title = "Item Legend Title!"; const { getByText } = render( ); expect(getByText(title)).not.toBe(false); }); // // it(`Should show a wrapper component around each object in the dom`, () => { // // expect(true).toBe(false); // // }); // it(`Should keep track of the changes that occur in the content prop via the undoStack prop`, () => { // expect(true).toBe(false); // }); // it(`Should keep track of the current undo position in the undoPosition prop. Number decrements on undo actions, increments on redo.`, () => { // expect(true).toBe(false); // }); test.todo( `Should only be able to drag section objects up and down if dragMode prop is set to BLOCK` ); test.skip(`Should not be able to add new items if canAddItems prop is false`, () => {}); test.skip(`Should not be able to drag items if canDrag prop is false`, () => {}); test.skip(`Should be able to move items one pixel at a time if dragMode prop is set to PIXELBYPIXEL`, () => {}); test.skip(`Should show a snap guide if in PIXELBYPIXEL mode and dragging an object next to the vertical or horizontal cross-section of another object`, () => {}); test.skip(`Should show a custom cursor component when one is provided in the cursorComponent prop`, () => {}); test.skip(`Should show a custom wrapper component around each object when a custom component is provided in the editorObjectComponent prop`, () => {}); test.skip(`Should modify the editor object (e.g. colors, etc.) according to the editorObjectSettings prop`, () => {}); test.skip(`Should show a custom drag handle component near each object when selected and a custom component is provided in the dragHandleComponent prop`, () => {}); test.skip(`Should modify the drag handle (e.g. colors, etc.) according to the dragHandleSettings prop`, () => {}); test.skip(`Should show a custom resize handler component for resizable editor objects when one is provided in the resizeHandleComponent prop`, () => {}); test.skip(`Should modify the resize handler (e.g. colors, etc.) according to the resizeHandlerSettings prop`, () => {}); test.skip(`Should not allow any changes of any kind when the readOnly prop is set to true`, () => {}); test.skip(`Should show editor component in a zoomed state the corresponds with the number in the zoom prop`, () => {}); test.skip(`Should show the component provided in the itemLegendComponent prop instead of the default one if one is provided`, () => {}); }); describe("Editor (Actions)", () => { afterEach(cleanup); const Edtr = ( ); it("Should change the state when I hover over it", () => { const { queryAllByTestId, debug } = render(Edtr); fireEvent.mouseEnter(queryAllByTestId("Editor-EditorObject")[0]); expect(queryAllByTestId("Editor-EditorObject-State-Hover")).not.toBe(null); }); it("Should change the state when I hover away from it", () => { const stateId = "Editor-EditorObject-State-Hover"; const { debug, queryAllByTestId } = render(Edtr); fireEvent.mouseEnter(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(stateId).length).toEqual(1); fireEvent.mouseLeave(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(stateId).length).toEqual(0); }); it("Should change the state when I click on it", () => { const stateId = "Editor-EditorObject-State-Active"; const { debug, queryAllByTestId } = render(Edtr); expect(queryAllByTestId(stateId).length).toEqual(0); fireEvent.click(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(stateId).length).toEqual(1); }); it("Should not clear the state if active when i hover away from it", () => { const hoverId = "Editor-EditorObject-State-Hover"; const activeId = "Editor-EditorObject-State-Active"; // Render the editor const { debug, queryAllByTestId } = render(Edtr); // Make the mouse enter the second object fireEvent.mouseEnter(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(hoverId).length).toEqual(1); // Make the mouse leave the second object fireEvent.mouseLeave(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(hoverId).length).toEqual(0); // Click the second object fireEvent.click(queryAllByTestId("Editor-EditorObject")[1]); expect(queryAllByTestId(activeId).length).toEqual(1); // Make the mouse leave the second object fireEvent.mouseLeave(queryAllByTestId("Editor-EditorObject")[1]); // The state should remain active expect(queryAllByTestId(activeId).length).toEqual(1); }); it("Should clear the state of all others when i click on it", () => { const activeId = "Editor-EditorObject-State-Active"; const normalId = "Editor-EditorObject-State-Normal"; const editorObjectId = "Editor-EditorObject"; // render the editor const { debug, queryAllByTestId } = render(Edtr); // click the first object fireEvent.click(queryAllByTestId(editorObjectId)[0]); expect(queryAllByTestId(activeId).length).toEqual(1); // click the second object fireEvent.click(queryAllByTestId(editorObjectId)[1]); expect(queryAllByTestId(activeId).length).toEqual(1); // confirm that the first object no longer has an active state expect( queryAllByTestId(editorObjectId)[0].firstChild.getAttribute("data-testid") ).toBe(normalId); // debug(); }); // it(`Should show a cursor when dragging items around in OBJECT mode`, () => { // expect(true).toBe(false); // }); // it(`Should only be able to move items above, beneath, and inside existing objects if dragMode prop is set to OBJECT`, () => { // expect(true).toBe(false); // }); test.skip(`Should be able to open an objects property (if provided) when I double click on it`, () => {}); test.skip(`Should be able to remove items via [delete] on my keyboard`, () => {}); test.skip(`Should be able to duplicate an item by pressing [CTRL/CMD] + [D] on my keyboard`, () => {}); test.skip(`Should be able to replace the content in the editor through the updateContent method`, () => {}); test.skip(`Should be able to change the style properties of an item in the editor through the updateComponentStyle method`, () => {}); test.skip(`Should be able to update anything about an item through the updateComponentSettings method`, () => {}); }); describe("Editor (Methods)", () => { test.skip(`Should trigger the addThisAfterThat() method when an item is to be added to the editor`, () => {}); test.skip(`Should trigger the removeItem() method when an item should be removed from the content array`, () => {}); test.skip(`Should trigger the duplicateItem() method when an item should be duplicated`, () => {}); test.skip(`Should trigger the moveThisByThat() method when an item should be moved to another location`, () => {}); test.skip(`Should trigger the updateContent() method when the editor's content should be updated`, () => {}); test.skip(`Should trigger the updateComponentStyle() method when an items style should be changed`, () => {}); test.skip(`Should trigger the updateComponentSettings() method when something should change about an item`, () => {}); test.skip(`Should trigger the setActiveObject() method when an item's state should be active`, () => {}); test.skip(`Should trigger the doUndoRedo() method when the editor's content needs to return to a previous state`, () => {}); test.skip(`Should trigger the chagneState() method when the item's state should change`, () => {}); test.skip(`Should be able to enable or disable the editors canDrag property from anywhere in the editor`, () => {}); test.skip(`Should be able to retrieve a list of all the direct ancestors to a provided editor item from anywhere inside the editor`, () => {}); test.skip(`Should be able to retrieve a list of the items (and a useful icon) in the editor using the listComponents method from anywhere inside the editor`, () => {}); }); describe("Editor (Events)", () => { test.skip(`Should trigger onAdd() event with appropriate payload when a new item is added to the editor`, () => {}); test.skip(`Should trigger onRemove() event with appropriate payload when an item is removed from the editor`, () => {}); test.skip(`Should trigger onDuplicate() event with appropriate payload when an item is duplicated in the editor`, () => {}); test.skip(`Should trigger onMove() event with appropriate payload when an item is moved in the editor`, () => {}); test.skip(`Should trigger onStateChange() event with appropriate payload when the state of an item changes in the editor`, () => {}); test.skip(`Should trigger onChange() event with appropriate payload when an item in the editor changes in some way`, () => {}); test.skip(`Should trigger onKeyUp() event with appropriate payload when a key is pressed in the editor`, () => {}); test.skip(`Should trigger onSelect() event with appropriate payload when an item is selected in the editor`, () => {}); test.skip(`Should trigger onUndo() event with appropriate payload when an undo action is supposed to happen`, () => {}); test.skip(`Should trigger onRedo() event with appropriate payload when redo action is supposed to happen`, () => {}); }); describe("Editor (Hooks)", () => { test.skip(`Hooks: Should trigger _onAddItem_ hook when a new item is added to the editor`, () => {}); test.skip(`Hooks: Should trigger _onRemoveItem_ hook when an item is removed from the editor`, () => {}); test.skip(`Hooks: Should trigger _onDuplicateItem_ hook when an item is duplicated in the editor`, () => {}); test.skip(`Hooks: Should trigger _onMoveItem_ hook when an item is duplicated in the editor`, () => {}); test.skip(`Hooks: Should trigger _onResizeItem_ hook when an item is resizing in the editor`, () => {}); test.skip(`Hooks: Should trigger _onResizeItemEnd_ hook when an item is done resizing itself`, () => {}); test.skip(`Hooks: Should trigger _onItemStateChange_ hook when the state of an item changes in the editor`, () => {}); test.skip(`Hooks: Should trigger _onChange_ hook when an item in the editor changes in some way`, () => {}); test.skip(`Hooks: Should trigger _onKeyUp_ hook when a key is pressed in the editor`, () => {}); test.skip(`Hooks: Should trigger _onSelectItem_ hook when an item is selected in the editor`, () => {}); test.skip(`Hooks: Should trigger _onUndo_ hook when an undo action is supposed to happen`, () => {}); test.skip(`Hooks: Should trigger _onRedo_ hook when redo action is supposed to happen`, () => {}); test.skip(`Hooks: Should trigger _onEditorRender_ hook when Editor is rendered`, () => {}); test.skip(`Hooks: Should trigger _onEditorObjectRender_ hook when Editor Object is rendered`, () => {}); test.skip(`Hooks: Should trigger _onComponentLoaderRender_ hook when the Component Loader is rendered`, () => {}); test.skip(`Hooks: Should trigger _onWebComponentWrapperRender_ hook when componentWrapper is rendered`, () => {}); });