Merge branch 'dev' of ssh://git.science.uu.nl/ics/sp/2025/n25b/pepperplus-ui into fix/deep-clone-data

This commit is contained in:
JobvAlewijk
2025-12-07 17:07:00 +01:00
28 changed files with 858 additions and 180 deletions

View File

@@ -1,7 +1,7 @@
import { describe, it, beforeEach } from '@jest/globals';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { renderWithProviders, resetFlowStore } from '../.././/./../../test-utils/test-utils';
import { renderWithProviders } from '../.././/./../../test-utils/test-utils';
import NormNode, { NormReduce, NormConnects, type NormNodeData } from '../../../../../src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode'
import useFlowStore from '../../../../../src/pages/VisProgPage/visualProgrammingUI/VisProgStores';
import type { Node } from '@xyflow/react';
@@ -13,7 +13,6 @@ describe('NormNode', () => {
let user: ReturnType<typeof userEvent.setup>;
beforeEach(() => {
resetFlowStore();
user = userEvent.setup();
});

View File

@@ -1,15 +1,13 @@
import { describe, it, beforeEach } from '@jest/globals';
import { screen } from '@testing-library/react';
import { renderWithProviders, resetFlowStore } from '../.././/./../../test-utils/test-utils';
import StartNode, { StartReduce, StartConnects } from '../../../../../src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode';
import type { Node } from '@xyflow/react';
import { describe, it } from '@jest/globals';
import '@testing-library/jest-dom';
import { screen } from '@testing-library/react';
import type { Node } from '@xyflow/react';
import { renderWithProviders } from '../.././/./../../test-utils/test-utils';
import StartNode, { StartReduce, StartConnects } from '../../../../../src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode';
describe('StartNode', () => {
beforeEach(() => {
resetFlowStore();
});
describe('Rendering', () => {
it('renders the StartNode correctly', () => {

View File

@@ -1,7 +1,7 @@
import { describe, it, beforeEach } from '@jest/globals';
import { screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { renderWithProviders, resetFlowStore } from '../.././/./../../test-utils/test-utils';
import { renderWithProviders } from '../.././/./../../test-utils/test-utils';
import TriggerNode, { TriggerReduce, TriggerConnects, TriggerNodeCanConnect, type TriggerNodeData } from '../../../../../src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode';
import useFlowStore from '../../../../../src/pages/VisProgPage/visualProgrammingUI/VisProgStores';
import type { Node } from '@xyflow/react';
@@ -11,7 +11,6 @@ describe('TriggerNode', () => {
let user: ReturnType<typeof userEvent.setup>;
beforeEach(() => {
resetFlowStore();
user = userEvent.setup();
});
@@ -193,22 +192,19 @@ describe('TriggerNode', () => {
},
};
const allNodes: Node[] = [triggerNode];
const result = TriggerReduce(triggerNode, allNodes);
const allNodes: Node[] = [triggerNode];
const result = TriggerReduce(triggerNode, allNodes);
expect(result).toEqual({
id: "trigger-1",
type: "keywords",
label: 'Keyword Trigger',
keywords: [
{
"id": "kw1",
"keyword": "hello",
},],
});
expect(result).toEqual({
id: 'trigger-1',
type: 'keywords',
label: 'Keyword Trigger',
keywords: [{ id: 'kw1', keyword: 'hello' }],
});
});
});
describe('TriggerConnects Function', () => {
it('should handle connection without errors', () => {
const node1: Node = {

View File

@@ -1,6 +1,6 @@
import { describe, beforeEach } from '@jest/globals';
import { screen } from '@testing-library/react';
import { renderWithProviders, resetFlowStore } from '../.././/./../../test-utils/test-utils';
import { renderWithProviders } from '../.././/./../../test-utils/test-utils';
import type { XYPosition } from '@xyflow/react';
import { NodeTypes, NodeDefaults, NodeConnects, NodeReduces, NodesInPhase } from '../../../../../src/pages/VisProgPage/visualProgrammingUI/NodeRegistry';
import '@testing-library/jest-dom'
@@ -10,12 +10,11 @@ import useFlowStore from '../../../../../src/pages/VisProgPage/visualProgramming
describe('NormNode', () => {
beforeEach(() => {
resetFlowStore();
jest.clearAllMocks();
});
function createNode(id: string, type: string, position: XYPosition, data: Record<string, unknown>, deletable?: boolean) {
const defaultData = JSON.parse(JSON.stringify(NodeDefaults[type as keyof typeof NodeDefaults]))
const defaultData = NodeDefaults[type as keyof typeof NodeDefaults]
const newData = {
id: id,
type: type,
@@ -46,30 +45,35 @@ describe('NormNode', () => {
describe('Rendering', () => {
test.each(getAllTypes())('it should render %s node with the default data', (nodeType) => {
const lengthBefore = screen.getAllByText(/.*/).length;
const lengthBefore = screen.getAllByText(/.*/).length;
const newNode = createNode(nodeType + "1", nodeType, {x: 200, y:200}, {})
const uiElement = Object.entries(NodeTypes).find(([t])=>t==nodeType)?.[1];
expect(uiElement).toBeDefined();
const props = {
id:newNode.id,
type:newNode.type as string,
data:newNode.data as any,
selected:false,
isConnectable:true,
zIndex:0,
dragging:false,
selectable:true,
deletable:true,
draggable:true,
positionAbsoluteX:0,
positionAbsoluteY:0,}
const newNode = createNode(nodeType + "1", nodeType, {x: 200, y:200}, {});
renderWithProviders(createElement(uiElement as React.ComponentType<any>, props));
const lengthAfter = screen.getAllByText(/.*/).length;
expect(lengthBefore + 1 == lengthAfter)
});
const found = Object.entries(NodeTypes).find(([t]) => t === nodeType);
const uiElement = found ? found[1] : null;
expect(uiElement).not.toBeNull();
const props = {
id: newNode.id,
type: newNode.type as string,
data: newNode.data as any,
selected: false,
isConnectable: true,
zIndex: 0,
dragging: false,
selectable: true,
deletable: true,
draggable: true,
positionAbsoluteX: 0,
positionAbsoluteY: 0,
};
renderWithProviders(createElement(uiElement as React.ComponentType<any>, props));
const lengthAfter = screen.getAllByText(/.*/).length;
expect(lengthBefore + 1 === lengthAfter);
});
});