Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,12 @@ import {
CamelRouteVisualEntity,
CatalogKind,
createVisualizationNode,
ICamelComponentDefinition,
ICamelProcessorDefinition,
IKameletDefinition,
KameletVisualEntity,
KaotoSchemaDefinition,
} from '../../../../models';
import { EntityType } from '../../../../models/entities';
import { IVisualizationNode } from '../../../../models/visualization/base-visual-entity';
import { setupDynamicCatalogRegistryMock } from '../../../../models/visualization/flows/dynamic-catalog-registry-mock';
import { VisualFlowsApi } from '../../../../models/visualization/flows/support/flows-visibility';
import { VisibleFlowsContext, VisibleFlowsProvider } from '../../../../providers';
import { EntitiesContext, EntitiesProvider } from '../../../../providers/entities.provider';
Expand All @@ -27,27 +25,18 @@ import { CanvasNode } from '../canvas.models';
import { FlowService } from '../flow.service';
import { CanvasForm } from './CanvasForm';

jest.mock('../../../../dynamic-catalog/dynamic-catalog-registry');

describe('CanvasForm', () => {
let camelRouteVisualEntity: CamelRouteVisualEntity;
let selectedNode: CanvasNode;
let componentCatalogMap: Record<string, ICamelComponentDefinition>;
let patternCatalogMap: Record<string, ICamelProcessorDefinition>;
let kameletCatalogMap: Record<string, IKameletDefinition>;

beforeAll(async () => {
const catalogsMap = await getFirstCatalogMap(catalogLibrary as CatalogLibrary);
componentCatalogMap = catalogsMap.componentCatalogMap;
patternCatalogMap = catalogsMap.patternCatalogMap;
kameletCatalogMap = catalogsMap.kameletsCatalogMap;

CamelCatalogService.setCatalogKey(CatalogKind.Component, componentCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Pattern, patternCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Kamelet, kameletCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Processor, catalogsMap.modelCatalogMap);

setupDynamicCatalogRegistryMock(catalogsMap);

CamelCatalogService.setCatalogKey(CatalogKind.Language, catalogsMap.languageCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Dataformat, catalogsMap.dataformatCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Loadbalancer, catalogsMap.loadbalancerCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Entity, catalogsMap.entitiesCatalog);
});

beforeEach(async () => {
Expand Down Expand Up @@ -125,7 +114,7 @@ describe('CanvasForm', () => {
},
};

jest.spyOn(vizNode, 'getNodeSchema').mockReturnValue(undefined);
jest.spyOn(vizNode, 'getNodeSchema').mockResolvedValue(undefined);
jest.spyOn(vizNode, 'getNodeDefinition').mockReturnValue(undefined);

const { container } = await act(async () =>
Expand Down Expand Up @@ -166,7 +155,7 @@ describe('CanvasForm', () => {
},
};

jest.spyOn(vizNode, 'getNodeSchema').mockReturnValue(null as unknown as KaotoSchemaDefinition['schema']);
jest.spyOn(vizNode, 'getNodeSchema').mockResolvedValue(null as unknown as KaotoSchemaDefinition['schema']);
jest.spyOn(vizNode, 'getNodeDefinition').mockReturnValue(null);

const { container } = await act(async () =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,39 @@ import catalogLibrary from '@kaoto/camel-catalog/index.json';
import { CatalogLibrary, RouteDefinition } from '@kaoto/camel-catalog/types';
import { CanvasFormTabsContext, SuggestionRegistryProvider } from '@kaoto/forms';
import { KaotoFormPageObject } from '@kaoto/forms/testing';
import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';

import {
CamelCatalogService,
CamelRouteVisualEntity,
CatalogKind,
ICamelComponentDefinition,
ICamelProcessorDefinition,
IKameletDefinition,
} from '../../../../models';
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';

import { CamelCatalogService, CamelRouteVisualEntity, CatalogKind } from '../../../../models';
import { IVisualizationNode } from '../../../../models/visualization/base-visual-entity';
import { setupDynamicCatalogRegistryMock } from '../../../../models/visualization/flows/dynamic-catalog-registry-mock';
import { VisibleFlowsProvider } from '../../../../providers';
import { EntitiesContext } from '../../../../providers/entities.provider';
import { TestProvidersWrapper } from '../../../../stubs';
import { getFirstCatalogMap } from '../../../../stubs/test-load-catalog';
import { ROOT_PATH } from '../../../../utils';
import { CanvasFormBody } from './CanvasFormBody';

describe('CanvasFormBody', () => {
let componentCatalogMap: Record<string, ICamelComponentDefinition>;
let patternCatalogMap: Record<string, ICamelProcessorDefinition>;
let kameletCatalogMap: Record<string, IKameletDefinition>;
jest.mock('../../../../dynamic-catalog/dynamic-catalog-registry');

describe('CanvasFormBody', () => {
beforeAll(async () => {
const catalogsMap = await getFirstCatalogMap(catalogLibrary as CatalogLibrary);
componentCatalogMap = catalogsMap.componentCatalogMap;
patternCatalogMap = catalogsMap.patternCatalogMap;
kameletCatalogMap = catalogsMap.kameletsCatalogMap;

CamelCatalogService.setCatalogKey(CatalogKind.Component, componentCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Pattern, patternCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Kamelet, kameletCatalogMap);
CamelCatalogService.setCatalogKey(CatalogKind.Processor, catalogsMap.modelCatalogMap);

setupDynamicCatalogRegistryMock(catalogsMap);

CamelCatalogService.setCatalogKey(CatalogKind.Language, catalogsMap.languageCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Dataformat, catalogsMap.dataformatCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Loadbalancer, catalogsMap.loadbalancerCatalog);
CamelCatalogService.setCatalogKey(CatalogKind.Entity, catalogsMap.entitiesCatalog);
});

describe('should persists changes from both expression editor and main form', () => {
beforeEach(() => {
jest.spyOn(console, 'error').mockImplementation(() => {});
});

afterEach(() => {
cleanup();
jest.restoreAllMocks();
});

it('expression => main form', async () => {
const camelRoute = {
from: {
Expand Down Expand Up @@ -83,6 +72,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.toggleExpressionFieldForProperty(ROOT_PATH);
Expand Down Expand Up @@ -137,6 +134,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.inputText('Name', 'bar');
Expand All @@ -159,6 +164,11 @@ describe('CanvasFormBody', () => {
jest.spyOn(console, 'error').mockImplementation(() => {});
});

afterEach(() => {
cleanup();
jest.restoreAllMocks();
});

it('dataformat => main form', async () => {
const camelRoute = {
from: {
Expand Down Expand Up @@ -196,6 +206,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.toggleOneOfFieldForProperty(ROOT_PATH);
Expand Down Expand Up @@ -247,6 +265,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.inputText('Id', 'modified', { index: 0 });
Expand All @@ -266,6 +292,11 @@ describe('CanvasFormBody', () => {
jest.spyOn(console, 'error').mockImplementation(() => {});
});

afterEach(() => {
cleanup();
jest.restoreAllMocks();
});

it('loadbalancer => main form', async () => {
const camelRoute = {
from: {
Expand Down Expand Up @@ -303,6 +334,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.toggleOneOfFieldForProperty(ROOT_PATH);
Expand Down Expand Up @@ -354,6 +393,14 @@ describe('CanvasFormBody', () => {
</EntitiesContext.Provider>,
);

// Wait for async schema to load and form to render
await waitFor(
() => {
expect(screen.getByRole('button', { name: 'All' })).toBeInTheDocument();
},
{ timeout: 5000 },
);

const formPageObject = new KaotoFormPageObject(screen, act);
await formPageObject.showAllFields();
await formPageObject.inputText('Id', 'modified', { index: 0 });
Expand All @@ -371,7 +418,7 @@ describe('CanvasFormBody', () => {
it('should show suggestions', async () => {
const { Provider, camelResource } = TestProvidersWrapper();
const vizNode = await camelResource.getVisualEntities()[0].toVizNode();
jest.spyOn(vizNode, 'getNodeSchema').mockReturnValue({
jest.spyOn(vizNode, 'getNodeSchema').mockResolvedValue({
type: 'object',
properties: {
name: {
Expand All @@ -395,6 +442,11 @@ describe('CanvasFormBody', () => {
</Provider>,
);

// Wait for async schema to load
await waitFor(() => {
expect(screen.queryByRole('button', { name: 'All' })).toBeInTheDocument();
});

const formPageObject = new KaotoFormPageObject(screen, act);
const inputField = formPageObject.getFieldByDisplayName('Name')!;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { isDefined, KaotoForm } from '@kaoto/forms';
import { FunctionComponent, useCallback, useContext, useMemo, useRef } from 'react';
import { FunctionComponent, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';

import { IVisualizationNode } from '../../../../models';
import { EntitiesContext } from '../../../../providers/entities.provider';
Expand All @@ -15,7 +15,21 @@ interface CanvasFormTabsProps {
export const CanvasFormBody: FunctionComponent<CanvasFormTabsProps> = ({ vizNode }) => {
const entitiesContext = useContext(EntitiesContext);
const omitFields = useRef(vizNode.getOmitFormFields() ?? []);
const schema = useMemo(() => vizNode.getNodeSchema(), [vizNode]);
const [schema, setSchema] = useState<Record<string, unknown> | undefined>(undefined);

useEffect(() => {
let cancelled = false;

vizNode.getNodeSchema().then((loadedSchema) => {
if (!cancelled) {
setSchema(loadedSchema);
}
});

return () => {
cancelled = true;
};
}, [vizNode, vizNode.lastUpdate]);

const isUnknownComponent = useMemo(() => {
return !isDefined(schema) || Object.keys(schema).length === 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ exports[`CanvasForm should render 1`] = `
class="pf-v6-l-grid__item pf-m-11-col form-header"
>
<img
alt="choice"
alt="Choice"
class="form-header__icon-test|route.from.steps.1.choice"
src="file-mock-data"
/>
Expand All @@ -32,7 +32,7 @@ exports[`CanvasForm should render 1`] = `
data-ouia-component-type="PF6/Title"
data-ouia-safe="true"
>
choice
Choice
</h2>
</div>
<div
Expand Down Expand Up @@ -171,7 +171,7 @@ exports[`CanvasForm should render 1`] = `
/>
<div
class="pf-v6-c-card kaoto-form kaoto-form__empty"
data-ouia-component-id="OUIA-Generated-Card-2"
data-ouia-component-id="OUIA-Generated-Card-3"
data-ouia-component-type="PF6/Card"
data-ouia-safe="true"
data-testid="no-field-found"
Expand Down Expand Up @@ -248,7 +248,7 @@ exports[`CanvasForm should render nothing if no schema and no definition is avai
<div>
<div
class="pf-v6-c-card canvas-form"
data-ouia-component-id="OUIA-Generated-Card-5"
data-ouia-component-id="OUIA-Generated-Card-6"
data-ouia-component-type="PF6/Card"
data-ouia-safe="true"
id=""
Expand Down Expand Up @@ -410,7 +410,7 @@ exports[`CanvasForm should render nothing if no schema and no definition is avai
>
<div
class="pf-v6-c-card"
data-ouia-component-id="OUIA-Generated-Card-6"
data-ouia-component-id="OUIA-Generated-Card-7"
data-ouia-component-type="PF6/Card"
data-ouia-safe="true"
id=""
Expand Down Expand Up @@ -459,7 +459,7 @@ exports[`CanvasForm should render nothing if no schema and no definition is avai
>
<div
class="pf-v6-c-alert pf-m-warning"
data-ouia-component-id="OUIA-Generated-Alert-warning-2"
data-ouia-component-id="OUIA-Generated-Alert-warning-3"
data-ouia-component-type="PF6/Alert"
data-ouia-safe="true"
>
Expand Down Expand Up @@ -507,7 +507,7 @@ exports[`CanvasForm should render nothing if no schema is available 1`] = `
<div>
<div
class="pf-v6-c-card canvas-form"
data-ouia-component-id="OUIA-Generated-Card-3"
data-ouia-component-id="OUIA-Generated-Card-4"
data-ouia-component-type="PF6/Card"
data-ouia-safe="true"
id=""
Expand Down Expand Up @@ -669,7 +669,7 @@ exports[`CanvasForm should render nothing if no schema is available 1`] = `
>
<div
class="pf-v6-c-card"
data-ouia-component-id="OUIA-Generated-Card-4"
data-ouia-component-id="OUIA-Generated-Card-5"
data-ouia-component-type="PF6/Card"
data-ouia-safe="true"
id=""
Expand Down Expand Up @@ -715,7 +715,7 @@ exports[`CanvasForm should render nothing if no schema is available 1`] = `
>
<div
class="pf-v6-c-alert pf-m-warning"
data-ouia-component-id="OUIA-Generated-Alert-warning-1"
data-ouia-component-id="OUIA-Generated-Alert-warning-2"
data-ouia-component-type="PF6/Alert"
data-ouia-safe="true"
>
Expand Down
Loading
Loading