datajunction-ui 0.0.1-rc.9 → 0.0.2-0.dev1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +2 -0
- package/.prettierignore +3 -1
- package/Makefile +9 -0
- package/cleanup-deps.sh +70 -0
- package/dj-logo.svg +10 -0
- package/package.json +53 -14
- package/public/favicon.ico +0 -0
- package/public/index.html +1 -1
- package/runit.sh +30 -0
- package/runit2.sh +30 -0
- package/src/__tests__/reportWebVitals.test.jsx +44 -0
- package/src/app/__tests__/__snapshots__/index.test.tsx.snap +5 -109
- package/src/app/components/AddNodeDropdown.jsx +44 -0
- package/src/app/components/ListGroupItem.jsx +9 -1
- package/src/app/components/NamespaceHeader.jsx +4 -13
- package/src/app/components/NodeListActions.jsx +69 -0
- package/src/app/components/NodeMaterializationDelete.jsx +90 -0
- package/src/app/components/NotificationBell.tsx +223 -0
- package/src/app/components/QueryInfo.jsx +172 -0
- package/src/app/components/Search.jsx +94 -0
- package/src/app/components/Tab.jsx +8 -1
- package/src/app/components/ToggleSwitch.jsx +20 -0
- package/src/app/components/UserMenu.tsx +100 -0
- package/src/app/components/__tests__/NodeListActions.test.jsx +94 -0
- package/src/app/components/__tests__/NodeMaterializationDelete.test.jsx +263 -0
- package/src/app/components/__tests__/NotificationBell.test.tsx +302 -0
- package/src/app/components/__tests__/QueryInfo.test.jsx +183 -0
- package/src/app/components/__tests__/Search.test.jsx +307 -0
- package/src/app/components/__tests__/Tab.test.jsx +27 -0
- package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
- package/src/app/components/__tests__/UserMenu.test.tsx +241 -0
- package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +8 -3
- package/src/app/components/__tests__/__snapshots__/NamespaceHeader.test.jsx.snap +2 -18
- package/src/app/components/djgraph/Collapse.jsx +47 -0
- package/src/app/components/djgraph/DJNode.jsx +61 -83
- package/src/app/components/djgraph/DJNodeColumns.jsx +75 -0
- package/src/app/components/djgraph/DJNodeDimensions.jsx +75 -0
- package/src/app/components/djgraph/LayoutFlow.jsx +106 -0
- package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
- package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
- package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
- package/src/app/components/djgraph/__tests__/__snapshots__/DJNode.test.tsx.snap +84 -40
- package/src/app/components/forms/Action.jsx +8 -0
- package/src/app/components/forms/NodeNameField.jsx +64 -0
- package/src/app/components/search.css +17 -0
- package/src/app/constants.js +2 -0
- package/src/app/icons/AddItemIcon.jsx +16 -0
- package/src/app/icons/AlertIcon.jsx +33 -0
- package/src/app/icons/CollapsedIcon.jsx +15 -0
- package/src/app/icons/CommitIcon.jsx +45 -0
- package/src/app/icons/DJLogo.jsx +36 -0
- package/src/app/icons/DeleteIcon.jsx +21 -0
- package/src/app/icons/DiffIcon.jsx +63 -0
- package/src/app/icons/EditIcon.jsx +18 -0
- package/src/app/icons/ExpandedIcon.jsx +15 -0
- package/src/app/icons/EyeIcon.jsx +20 -0
- package/src/app/icons/FilterIcon.jsx +7 -0
- package/src/app/icons/HorizontalHierarchyIcon.jsx +15 -0
- package/src/app/icons/InvalidIcon.jsx +16 -0
- package/src/app/icons/JupyterExportIcon.jsx +25 -0
- package/src/app/icons/LoadingIcon.jsx +14 -0
- package/src/app/icons/NodeIcon.jsx +49 -0
- package/src/app/icons/NotificationIcon.jsx +27 -0
- package/src/app/icons/PythonIcon.jsx +14 -0
- package/src/app/icons/SettingsIcon.jsx +28 -0
- package/src/app/icons/TableIcon.jsx +14 -0
- package/src/app/icons/ValidIcon.jsx +16 -0
- package/src/app/icons/WrenchIcon.jsx +36 -0
- package/src/app/index.tsx +130 -37
- package/src/app/pages/AddEditNodePage/AlertMessage.jsx +10 -0
- package/src/app/pages/AddEditNodePage/ColumnMetadata.jsx +61 -0
- package/src/app/pages/AddEditNodePage/ColumnsMetadataInput.jsx +72 -0
- package/src/app/pages/AddEditNodePage/ColumnsSelect.jsx +84 -0
- package/src/app/pages/AddEditNodePage/CustomMetadataField.jsx +144 -0
- package/src/app/pages/AddEditNodePage/DescriptionField.jsx +17 -0
- package/src/app/pages/AddEditNodePage/DisplayNameField.jsx +16 -0
- package/src/app/pages/AddEditNodePage/ExperimentationExtension.jsx +338 -0
- package/src/app/pages/AddEditNodePage/FormikSelect.jsx +64 -0
- package/src/app/pages/AddEditNodePage/FullNameField.jsx +38 -0
- package/src/app/pages/AddEditNodePage/Loadable.jsx +20 -0
- package/src/app/pages/AddEditNodePage/MetricMetadataFields.jsx +75 -0
- package/src/app/pages/AddEditNodePage/MetricQueryField.jsx +71 -0
- package/src/app/pages/AddEditNodePage/NamespaceField.jsx +40 -0
- package/src/app/pages/AddEditNodePage/NodeModeField.jsx +14 -0
- package/src/app/pages/AddEditNodePage/NodeQueryField.jsx +94 -0
- package/src/app/pages/AddEditNodePage/OwnersField.jsx +54 -0
- package/src/app/pages/AddEditNodePage/RequiredDimensionsSelect.jsx +54 -0
- package/src/app/pages/AddEditNodePage/TagsField.jsx +47 -0
- package/src/app/pages/AddEditNodePage/UpstreamNodeField.jsx +49 -0
- package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +110 -0
- package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +291 -0
- package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +75 -0
- package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +31 -0
- package/src/app/pages/AddEditNodePage/__tests__/NodeQueryField.test.jsx +30 -0
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +54 -0
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +3 -0
- package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +3 -0
- package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +224 -0
- package/src/app/pages/AddEditNodePage/index.jsx +545 -0
- package/src/app/pages/AddEditTagPage/Loadable.jsx +16 -0
- package/src/app/pages/AddEditTagPage/__tests__/AddEditTagPage.test.jsx +107 -0
- package/src/app/pages/AddEditTagPage/index.jsx +132 -0
- package/src/app/pages/CubeBuilderPage/DimensionsSelect.jsx +152 -0
- package/src/app/pages/CubeBuilderPage/Loadable.jsx +16 -0
- package/src/app/pages/CubeBuilderPage/MetricsSelect.jsx +75 -0
- package/src/app/pages/CubeBuilderPage/__tests__/index.test.jsx +373 -0
- package/src/app/pages/CubeBuilderPage/index.jsx +291 -0
- package/src/app/pages/LoginPage/LoginForm.jsx +124 -0
- package/src/app/pages/LoginPage/SignupForm.jsx +156 -0
- package/src/app/pages/LoginPage/__tests__/index.test.jsx +97 -0
- package/src/app/pages/LoginPage/assets/sign-in-with-github.png +0 -0
- package/src/app/pages/LoginPage/assets/sign-in-with-google.png +0 -0
- package/src/app/pages/LoginPage/index.jsx +17 -0
- package/src/app/pages/NamespacePage/AddNamespacePopover.jsx +85 -0
- package/src/app/pages/NamespacePage/Explorer.jsx +232 -0
- package/src/app/pages/NamespacePage/FieldControl.jsx +21 -0
- package/src/app/pages/NamespacePage/NodeModeSelect.jsx +27 -0
- package/src/app/pages/NamespacePage/NodeTypeSelect.jsx +30 -0
- package/src/app/pages/NamespacePage/TagSelect.jsx +44 -0
- package/src/app/pages/NamespacePage/UserSelect.jsx +47 -0
- package/src/app/pages/NamespacePage/__tests__/AddNamespacePopover.test.jsx +283 -0
- package/src/app/pages/NamespacePage/__tests__/index.test.jsx +331 -0
- package/src/app/pages/NamespacePage/index.jsx +356 -42
- package/src/app/pages/NodePage/AddBackfillPopover.jsx +165 -0
- package/src/app/pages/NodePage/AddComplexDimensionLinkPopover.jsx +367 -0
- package/src/app/pages/NodePage/AddMaterializationPopover.jsx +222 -0
- package/src/app/pages/NodePage/AvailabilityStateBlock.jsx +67 -0
- package/src/app/pages/NodePage/ClientCodePopover.jsx +94 -0
- package/src/app/pages/NodePage/DimensionFilter.jsx +86 -0
- package/src/app/pages/NodePage/EditColumnDescriptionPopover.jsx +116 -0
- package/src/app/pages/NodePage/EditColumnPopover.jsx +116 -0
- package/src/app/pages/NodePage/LinkDimensionPopover.jsx +164 -0
- package/src/app/pages/NodePage/ManageDimensionLinksDialog.jsx +526 -0
- package/src/app/pages/NodePage/MaterializationConfigField.jsx +60 -0
- package/src/app/pages/NodePage/NodeColumnTab.jsx +421 -30
- package/src/app/pages/NodePage/NodeDependenciesTab.jsx +153 -0
- package/src/app/pages/NodePage/NodeGraphTab.jsx +119 -148
- package/src/app/pages/NodePage/NodeHistory.jsx +236 -0
- package/src/app/pages/NodePage/NodeInfoTab.jsx +346 -49
- package/src/app/pages/NodePage/NodeLineageTab.jsx +84 -0
- package/src/app/pages/NodePage/NodeMaterializationTab.jsx +585 -0
- package/src/app/pages/NodePage/NodeRevisionMaterializationTab.jsx +58 -0
- package/src/app/pages/NodePage/NodeStatus.jsx +100 -31
- package/src/app/pages/NodePage/NodeValidateTab.jsx +367 -0
- package/src/app/pages/NodePage/NodesWithDimension.jsx +42 -0
- package/src/app/pages/NodePage/NotebookDownload.jsx +36 -0
- package/src/app/pages/NodePage/PartitionColumnPopover.jsx +151 -0
- package/src/app/pages/NodePage/PartitionValueForm.jsx +60 -0
- package/src/app/pages/NodePage/RevisionDiff.jsx +209 -0
- package/src/app/pages/NodePage/WatchNodeButton.jsx +226 -0
- package/src/app/pages/NodePage/__tests__/AddBackfillPopover.test.jsx +56 -0
- package/src/app/pages/NodePage/__tests__/AddComplexDimensionLinkPopover.test.jsx +459 -0
- package/src/app/pages/NodePage/__tests__/AddMaterializationPopover.test.jsx +87 -0
- package/src/app/pages/NodePage/__tests__/DimensionFilter.test.jsx +74 -0
- package/src/app/pages/NodePage/__tests__/EditColumnDescriptionPopover.test.jsx +149 -0
- package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +144 -0
- package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +132 -0
- package/src/app/pages/NodePage/__tests__/ManageDimensionLinksDialog.test.jsx +390 -0
- package/src/app/pages/NodePage/__tests__/NodeColumnTab.test.jsx +166 -0
- package/src/app/pages/NodePage/__tests__/NodeDependenciesTab.test.jsx +151 -0
- package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +595 -0
- package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +58 -0
- package/src/app/pages/NodePage/__tests__/NodeMaterializationTab.test.jsx +190 -0
- package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +882 -0
- package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
- package/src/app/pages/NodePage/__tests__/RevisionDiff.test.jsx +164 -0
- package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +19 -0
- package/src/app/pages/NodePage/index.jsx +190 -44
- package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
- package/src/app/pages/NotificationsPage/Loadable.jsx +6 -0
- package/src/app/pages/NotificationsPage/__tests__/index.test.jsx +287 -0
- package/src/app/pages/NotificationsPage/index.jsx +136 -0
- package/src/app/pages/OverviewPage/ByStatusPanel.jsx +69 -0
- package/src/app/pages/OverviewPage/DimensionNodeUsagePanel.jsx +48 -0
- package/src/app/pages/OverviewPage/GovernanceWarningsPanel.jsx +107 -0
- package/src/app/pages/OverviewPage/Loadable.jsx +16 -0
- package/src/app/pages/OverviewPage/NodesByTypePanel.jsx +63 -0
- package/src/app/pages/OverviewPage/OverviewPanel.jsx +94 -0
- package/src/app/pages/OverviewPage/TrendsPanel.jsx +66 -0
- package/src/app/pages/OverviewPage/__tests__/ByStatusPanel.test.jsx +36 -0
- package/src/app/pages/OverviewPage/__tests__/DimensionNodeUsagePanel.test.jsx +76 -0
- package/src/app/pages/OverviewPage/__tests__/GovernanceWarningsPanel.test.jsx +77 -0
- package/src/app/pages/OverviewPage/__tests__/NodesByTypePanel.test.jsx +86 -0
- package/src/app/pages/OverviewPage/__tests__/OverviewPanel.test.jsx +78 -0
- package/src/app/pages/OverviewPage/__tests__/TrendsPanel.test.jsx +120 -0
- package/src/app/pages/OverviewPage/__tests__/index.test.jsx +54 -0
- package/src/app/pages/OverviewPage/index.jsx +22 -0
- package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
- package/src/app/pages/RegisterTablePage/__tests__/RegisterTablePage.test.jsx +112 -0
- package/src/app/pages/RegisterTablePage/__tests__/__snapshots__/RegisterTablePage.test.jsx.snap +38 -0
- package/src/app/pages/RegisterTablePage/index.jsx +142 -0
- package/src/app/pages/Root/__tests__/index.test.jsx +44 -0
- package/src/app/pages/Root/index.tsx +92 -10
- package/src/app/pages/SQLBuilderPage/Loadable.jsx +16 -0
- package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
- package/src/app/pages/SQLBuilderPage/index.jsx +390 -0
- package/src/app/pages/SettingsPage/CreateServiceAccountModal.jsx +152 -0
- package/src/app/pages/SettingsPage/Loadable.jsx +16 -0
- package/src/app/pages/SettingsPage/NotificationSubscriptionsSection.jsx +189 -0
- package/src/app/pages/SettingsPage/ProfileSection.jsx +41 -0
- package/src/app/pages/SettingsPage/ServiceAccountsSection.jsx +95 -0
- package/src/app/pages/SettingsPage/__tests__/CreateServiceAccountModal.test.jsx +318 -0
- package/src/app/pages/SettingsPage/__tests__/NotificationSubscriptionsSection.test.jsx +233 -0
- package/src/app/pages/SettingsPage/__tests__/ProfileSection.test.jsx +65 -0
- package/src/app/pages/SettingsPage/__tests__/ServiceAccountsSection.test.jsx +150 -0
- package/src/app/pages/SettingsPage/__tests__/index.test.jsx +184 -0
- package/src/app/pages/SettingsPage/index.jsx +148 -0
- package/src/app/pages/TagPage/Loadable.jsx +16 -0
- package/src/app/pages/TagPage/__tests__/TagPage.test.jsx +70 -0
- package/src/app/pages/TagPage/index.jsx +79 -0
- package/src/app/services/DJService.js +1444 -21
- package/src/app/services/__tests__/DJService.test.jsx +2118 -0
- package/src/app/utils/__tests__/date.test.js +198 -0
- package/src/app/utils/date.js +65 -0
- package/src/index.tsx +1 -0
- package/src/mocks/mockNodes.jsx +1477 -0
- package/src/setupTests.ts +31 -1
- package/src/styles/dag.css +117 -5
- package/src/styles/index.css +1028 -31
- package/src/styles/loading.css +34 -0
- package/src/styles/login.css +81 -0
- package/src/styles/nav-bar.css +274 -0
- package/src/styles/node-creation.scss +276 -0
- package/src/styles/node-list.css +4 -0
- package/src/styles/overview.css +72 -0
- package/src/styles/settings.css +787 -0
- package/src/styles/sorted-table.css +15 -0
- package/src/styles/styles.scss +44 -0
- package/src/styles/styles.scss.d.ts +9 -0
- package/src/utils/form.jsx +23 -0
- package/webpack.config.js +17 -6
- package/.babelrc +0 -4
- package/.env.local +0 -4
- package/.env.production +0 -1
- package/.github/pull_request_template.md +0 -11
- package/.github/workflows/ci.yml +0 -33
- package/.vscode/extensions.json +0 -7
- package/.vscode/launch.json +0 -15
- package/.vscode/settings.json +0 -25
- package/Dockerfile +0 -7
- package/src/app/pages/ListNamespacesPage/Loadable.jsx +0 -14
- package/src/app/pages/ListNamespacesPage/index.jsx +0 -62
- package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -45
- package/src/app/pages/NamespacePage/__tests__/index.test.tsx +0 -14
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
render,
|
|
4
|
+
fireEvent,
|
|
5
|
+
waitFor,
|
|
6
|
+
screen,
|
|
7
|
+
within,
|
|
8
|
+
} from '@testing-library/react';
|
|
9
|
+
import EditColumnDescriptionPopover from '../EditColumnDescriptionPopover';
|
|
10
|
+
import DJClientContext from '../../../providers/djclient';
|
|
11
|
+
|
|
12
|
+
const mockDjClient = {
|
|
13
|
+
DataJunctionAPI: {
|
|
14
|
+
setColumnDescription: jest.fn(),
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
describe('<EditColumnDescriptionPopover />', () => {
|
|
19
|
+
it('renders correctly and handles successful form submission', async () => {
|
|
20
|
+
// Mock necessary data
|
|
21
|
+
const column = {
|
|
22
|
+
name: 'column1',
|
|
23
|
+
description: 'Initial description',
|
|
24
|
+
};
|
|
25
|
+
const node = { name: 'default.node1' };
|
|
26
|
+
|
|
27
|
+
// Mock onSubmit function
|
|
28
|
+
const onSubmitMock = jest.fn();
|
|
29
|
+
|
|
30
|
+
mockDjClient.DataJunctionAPI.setColumnDescription.mockReturnValue({
|
|
31
|
+
status: 200,
|
|
32
|
+
json: { message: 'Description updated successfully' },
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Render the component
|
|
36
|
+
render(
|
|
37
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
38
|
+
<EditColumnDescriptionPopover
|
|
39
|
+
column={column}
|
|
40
|
+
node={node}
|
|
41
|
+
onSubmit={onSubmitMock}
|
|
42
|
+
/>
|
|
43
|
+
</DJClientContext.Provider>,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
// Open the popover
|
|
47
|
+
fireEvent.click(screen.getByLabelText('EditColumnDescription'));
|
|
48
|
+
|
|
49
|
+
// Update the description
|
|
50
|
+
const dialog = screen.getByRole('dialog', { name: /edit-description/i });
|
|
51
|
+
const descriptionTextarea = within(dialog).getByRole('textbox');
|
|
52
|
+
fireEvent.change(descriptionTextarea, {
|
|
53
|
+
target: { value: 'Updated description' },
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Submit the form
|
|
57
|
+
fireEvent.click(screen.getByText('Save'));
|
|
58
|
+
|
|
59
|
+
// Expect setColumnDescription to be called
|
|
60
|
+
await waitFor(() => {
|
|
61
|
+
expect(
|
|
62
|
+
mockDjClient.DataJunctionAPI.setColumnDescription,
|
|
63
|
+
).toHaveBeenCalledWith('default.node1', 'column1', 'Updated description');
|
|
64
|
+
expect(screen.getByText('Saved!')).toBeInTheDocument();
|
|
65
|
+
expect(onSubmitMock).toHaveBeenCalled();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('handles failed form submission', async () => {
|
|
70
|
+
// Mock necessary data
|
|
71
|
+
const column = {
|
|
72
|
+
name: 'column1',
|
|
73
|
+
description: 'Initial description',
|
|
74
|
+
};
|
|
75
|
+
const node = { name: 'default.node1' };
|
|
76
|
+
|
|
77
|
+
// Mock onSubmit function
|
|
78
|
+
const onSubmitMock = jest.fn();
|
|
79
|
+
|
|
80
|
+
mockDjClient.DataJunctionAPI.setColumnDescription.mockReturnValue({
|
|
81
|
+
status: 500,
|
|
82
|
+
json: { message: 'Server error' },
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Render the component
|
|
86
|
+
render(
|
|
87
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
88
|
+
<EditColumnDescriptionPopover
|
|
89
|
+
column={column}
|
|
90
|
+
node={node}
|
|
91
|
+
onSubmit={onSubmitMock}
|
|
92
|
+
/>
|
|
93
|
+
</DJClientContext.Provider>,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Open the popover
|
|
97
|
+
fireEvent.click(screen.getByLabelText('EditColumnDescription'));
|
|
98
|
+
|
|
99
|
+
// Update the description
|
|
100
|
+
const dialog = screen.getByRole('dialog', { name: /edit-description/i });
|
|
101
|
+
const descriptionTextarea = within(dialog).getByRole('textbox');
|
|
102
|
+
fireEvent.change(descriptionTextarea, {
|
|
103
|
+
target: { value: 'Updated description' },
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Submit the form
|
|
107
|
+
fireEvent.click(screen.getByText('Save'));
|
|
108
|
+
|
|
109
|
+
// Expect setColumnDescription to be called and the failure message to show up
|
|
110
|
+
await waitFor(() => {
|
|
111
|
+
expect(
|
|
112
|
+
mockDjClient.DataJunctionAPI.setColumnDescription,
|
|
113
|
+
).toHaveBeenCalledWith('default.node1', 'column1', 'Updated description');
|
|
114
|
+
expect(screen.getByText('Server error')).toBeInTheDocument();
|
|
115
|
+
expect(onSubmitMock).toHaveBeenCalled();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('renders with empty initial description', async () => {
|
|
120
|
+
// Mock necessary data with no description
|
|
121
|
+
const column = {
|
|
122
|
+
name: 'column1',
|
|
123
|
+
description: null,
|
|
124
|
+
};
|
|
125
|
+
const node = { name: 'default.node1' };
|
|
126
|
+
|
|
127
|
+
// Mock onSubmit function
|
|
128
|
+
const onSubmitMock = jest.fn();
|
|
129
|
+
|
|
130
|
+
// Render the component
|
|
131
|
+
render(
|
|
132
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
133
|
+
<EditColumnDescriptionPopover
|
|
134
|
+
column={column}
|
|
135
|
+
node={node}
|
|
136
|
+
onSubmit={onSubmitMock}
|
|
137
|
+
/>
|
|
138
|
+
</DJClientContext.Provider>,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Open the popover
|
|
142
|
+
fireEvent.click(screen.getByLabelText('EditColumnDescription'));
|
|
143
|
+
|
|
144
|
+
// Check that the textarea is empty
|
|
145
|
+
const dialog = screen.getByRole('dialog', { name: /edit-description/i });
|
|
146
|
+
const descriptionTextarea = within(dialog).getByRole('textbox');
|
|
147
|
+
expect(descriptionTextarea.value).toBe('');
|
|
148
|
+
});
|
|
149
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, fireEvent, waitFor, screen } from '@testing-library/react';
|
|
3
|
+
import EditColumnPopover from '../EditColumnPopover';
|
|
4
|
+
import DJClientContext from '../../../providers/djclient';
|
|
5
|
+
|
|
6
|
+
const mockDjClient = {
|
|
7
|
+
DataJunctionAPI: {
|
|
8
|
+
setAttributes: jest.fn(),
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe('<EditColumnPopover />', () => {
|
|
13
|
+
it('renders correctly and handles form submission', async () => {
|
|
14
|
+
// Mock necessary data
|
|
15
|
+
const column = {
|
|
16
|
+
name: 'column1',
|
|
17
|
+
dimension: { name: 'dimension1' },
|
|
18
|
+
attributes: [
|
|
19
|
+
{ attribute_type: { name: 'primary_key', namespace: 'system' } },
|
|
20
|
+
],
|
|
21
|
+
};
|
|
22
|
+
const node = { name: 'default.node1' };
|
|
23
|
+
const options = [
|
|
24
|
+
{ value: 'dimension', label: 'Dimension' },
|
|
25
|
+
{ value: 'primary_key', label: 'Primary Key' },
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
// Mock onSubmit function
|
|
29
|
+
const onSubmitMock = jest.fn();
|
|
30
|
+
|
|
31
|
+
mockDjClient.DataJunctionAPI.setAttributes.mockReturnValue({
|
|
32
|
+
status: 201,
|
|
33
|
+
json: [
|
|
34
|
+
{
|
|
35
|
+
name: 'id',
|
|
36
|
+
type: 'int',
|
|
37
|
+
attributes: [
|
|
38
|
+
{ attribute_type: { name: 'primary_key', namespace: 'system' } },
|
|
39
|
+
],
|
|
40
|
+
dimension: null,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Render the component
|
|
46
|
+
const { getByLabelText, getByText, getByTestId } = render(
|
|
47
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
48
|
+
<EditColumnPopover
|
|
49
|
+
column={column}
|
|
50
|
+
node={node}
|
|
51
|
+
options={options}
|
|
52
|
+
onSubmit={onSubmitMock}
|
|
53
|
+
/>
|
|
54
|
+
</DJClientContext.Provider>,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Open the popover
|
|
58
|
+
fireEvent.click(getByLabelText('EditColumn'));
|
|
59
|
+
|
|
60
|
+
// Click on one attribute in the select
|
|
61
|
+
const editAttributes = getByTestId('edit-attributes');
|
|
62
|
+
fireEvent.keyDown(editAttributes.firstChild, { key: 'ArrowDown' });
|
|
63
|
+
fireEvent.click(screen.getByText('Dimension'));
|
|
64
|
+
fireEvent.click(getByText('Save'));
|
|
65
|
+
|
|
66
|
+
// Expect setAttributes to be called
|
|
67
|
+
await waitFor(() => {
|
|
68
|
+
expect(mockDjClient.DataJunctionAPI.setAttributes).toHaveBeenCalled();
|
|
69
|
+
expect(getByText('Saved!')).toBeInTheDocument();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Add Primary Key to the existing Dimension selection (don't click Dimension again)
|
|
73
|
+
fireEvent.keyDown(editAttributes.firstChild, { key: 'ArrowDown' });
|
|
74
|
+
fireEvent.click(screen.getByText('Primary Key'));
|
|
75
|
+
fireEvent.click(getByText('Save'));
|
|
76
|
+
|
|
77
|
+
// Expect setAttributes to be called with both attributes
|
|
78
|
+
await waitFor(() => {
|
|
79
|
+
expect(mockDjClient.DataJunctionAPI.setAttributes).toHaveBeenCalledWith(
|
|
80
|
+
'default.node1',
|
|
81
|
+
'column1',
|
|
82
|
+
['primary_key', 'dimension'],
|
|
83
|
+
);
|
|
84
|
+
expect(getByText('Saved!')).toBeInTheDocument();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Close the popover
|
|
88
|
+
fireEvent.click(getByLabelText('EditColumn'));
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('handles failed form submission', async () => {
|
|
92
|
+
// Mock necessary data
|
|
93
|
+
const column = {
|
|
94
|
+
name: 'column1',
|
|
95
|
+
dimension: { name: 'dimension1' },
|
|
96
|
+
attributes: [
|
|
97
|
+
{ attribute_type: { name: 'primary_key', namespace: 'system' } },
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
const node = { name: 'default.node1' };
|
|
101
|
+
const options = [
|
|
102
|
+
{ value: 'dimension', label: 'Dimension' },
|
|
103
|
+
{ value: 'primary_key', label: 'Primary Key' },
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
// Mock onSubmit function
|
|
107
|
+
const onSubmitMock = jest.fn();
|
|
108
|
+
|
|
109
|
+
mockDjClient.DataJunctionAPI.setAttributes.mockReturnValue({
|
|
110
|
+
status: 500,
|
|
111
|
+
json: { message: 'bad request' },
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Render the component
|
|
115
|
+
const { getByLabelText, getByText, getByTestId } = render(
|
|
116
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
117
|
+
<EditColumnPopover
|
|
118
|
+
column={column}
|
|
119
|
+
node={node}
|
|
120
|
+
options={options}
|
|
121
|
+
onSubmit={onSubmitMock}
|
|
122
|
+
/>
|
|
123
|
+
</DJClientContext.Provider>,
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// Open the popover
|
|
127
|
+
fireEvent.click(getByLabelText('EditColumn'));
|
|
128
|
+
|
|
129
|
+
// Click on one attribute in the select
|
|
130
|
+
const editAttributes = getByTestId('edit-attributes');
|
|
131
|
+
fireEvent.keyDown(editAttributes.firstChild, { key: 'ArrowDown' });
|
|
132
|
+
fireEvent.click(screen.getByText('Dimension'));
|
|
133
|
+
fireEvent.click(getByText('Save'));
|
|
134
|
+
|
|
135
|
+
// Expect setAttributes to be called and the failure message to show up
|
|
136
|
+
await waitFor(() => {
|
|
137
|
+
expect(mockDjClient.DataJunctionAPI.setAttributes).toHaveBeenCalled();
|
|
138
|
+
expect(getByText('bad request')).toBeInTheDocument();
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Close the popover
|
|
142
|
+
fireEvent.click(getByLabelText('EditColumn'));
|
|
143
|
+
});
|
|
144
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, fireEvent, waitFor, screen } from '@testing-library/react';
|
|
3
|
+
import LinkDimensionPopover from '../LinkDimensionPopover';
|
|
4
|
+
import DJClientContext from '../../../providers/djclient';
|
|
5
|
+
|
|
6
|
+
const mockDjClient = {
|
|
7
|
+
DataJunctionAPI: {
|
|
8
|
+
linkDimension: jest.fn(),
|
|
9
|
+
unlinkDimension: jest.fn(),
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
describe('<LinkDimensionPopover />', () => {
|
|
14
|
+
it('renders correctly and handles form submission', async () => {
|
|
15
|
+
// Mock necessary data
|
|
16
|
+
const column = {
|
|
17
|
+
name: 'column1',
|
|
18
|
+
dimension: { name: 'default.dimension1' },
|
|
19
|
+
};
|
|
20
|
+
const node = { name: 'default.node1' };
|
|
21
|
+
const options = [
|
|
22
|
+
{ value: 'default.dimension1', label: 'Dimension 1' },
|
|
23
|
+
{ value: 'default.dimension2', label: 'Dimension 2' },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
// Mock onSubmit function
|
|
27
|
+
const onSubmitMock = jest.fn();
|
|
28
|
+
|
|
29
|
+
mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({
|
|
30
|
+
status: 200,
|
|
31
|
+
json: { message: 'Success' },
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// Render the component - start with no dimensions
|
|
35
|
+
const { getByLabelText, getByText, getByTestId } = render(
|
|
36
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
37
|
+
<LinkDimensionPopover
|
|
38
|
+
column={column}
|
|
39
|
+
dimensionNodes={[]}
|
|
40
|
+
node={node}
|
|
41
|
+
options={options}
|
|
42
|
+
onSubmit={onSubmitMock}
|
|
43
|
+
/>
|
|
44
|
+
</DJClientContext.Provider>,
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
// Open the popover
|
|
48
|
+
fireEvent.click(getByLabelText('LinkDimension'));
|
|
49
|
+
|
|
50
|
+
// Click on a dimension to add it
|
|
51
|
+
const linkDimension = getByTestId('link-dimension');
|
|
52
|
+
fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' });
|
|
53
|
+
await waitFor(() => {
|
|
54
|
+
expect(screen.getByText('Dimension 2')).toBeInTheDocument();
|
|
55
|
+
});
|
|
56
|
+
fireEvent.click(screen.getByText('Dimension 2'));
|
|
57
|
+
|
|
58
|
+
// Now save (this will link dimension2)
|
|
59
|
+
fireEvent.click(getByText('Save'));
|
|
60
|
+
|
|
61
|
+
// Expect linkDimension to be called with success message
|
|
62
|
+
await waitFor(() => {
|
|
63
|
+
expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith(
|
|
64
|
+
'default.node1',
|
|
65
|
+
'column1',
|
|
66
|
+
'default.dimension2',
|
|
67
|
+
);
|
|
68
|
+
expect(getByText('Saved!')).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('handles failed form submission', async () => {
|
|
73
|
+
// Mock necessary data
|
|
74
|
+
const column = {
|
|
75
|
+
name: 'column1',
|
|
76
|
+
dimension: { name: 'default.dimension1' },
|
|
77
|
+
};
|
|
78
|
+
const node = { name: 'default.node1' };
|
|
79
|
+
const options = [
|
|
80
|
+
{ value: 'default.dimension1', label: 'Dimension 1' },
|
|
81
|
+
{ value: 'default.dimension2', label: 'Dimension 2' },
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
// Mock onSubmit function
|
|
85
|
+
const onSubmitMock = jest.fn();
|
|
86
|
+
|
|
87
|
+
mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({
|
|
88
|
+
status: 500,
|
|
89
|
+
json: { message: 'Failed due to nonexistent dimension' },
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Render the component - start with no dimensions to test adding one that fails
|
|
93
|
+
const { getByLabelText, getByText, getByTestId } = render(
|
|
94
|
+
<DJClientContext.Provider value={mockDjClient}>
|
|
95
|
+
<LinkDimensionPopover
|
|
96
|
+
column={column}
|
|
97
|
+
dimensionNodes={[]}
|
|
98
|
+
node={node}
|
|
99
|
+
options={options}
|
|
100
|
+
onSubmit={onSubmitMock}
|
|
101
|
+
/>
|
|
102
|
+
</DJClientContext.Provider>,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// Open the popover
|
|
106
|
+
fireEvent.click(getByLabelText('LinkDimension'));
|
|
107
|
+
|
|
108
|
+
// Click on a dimension to add it
|
|
109
|
+
const linkDimension = getByTestId('link-dimension');
|
|
110
|
+
fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' });
|
|
111
|
+
await waitFor(() => {
|
|
112
|
+
expect(screen.getByText('Dimension 2')).toBeInTheDocument();
|
|
113
|
+
});
|
|
114
|
+
fireEvent.click(screen.getByText('Dimension 2'));
|
|
115
|
+
|
|
116
|
+
// Now save (this will attempt to link dimension2 which will fail)
|
|
117
|
+
fireEvent.click(getByText('Save'));
|
|
118
|
+
|
|
119
|
+
// Expect linkDimension to be called with failure message
|
|
120
|
+
await waitFor(() => {
|
|
121
|
+
expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith(
|
|
122
|
+
'default.node1',
|
|
123
|
+
'column1',
|
|
124
|
+
'default.dimension2',
|
|
125
|
+
);
|
|
126
|
+
// The linkDimension failure message should be shown
|
|
127
|
+
expect(
|
|
128
|
+
getByText('Failed due to nonexistent dimension'),
|
|
129
|
+
).toBeInTheDocument();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|