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.
Files changed (244) hide show
  1. package/.env +2 -0
  2. package/.prettierignore +3 -1
  3. package/Makefile +9 -0
  4. package/cleanup-deps.sh +70 -0
  5. package/dj-logo.svg +10 -0
  6. package/package.json +53 -14
  7. package/public/favicon.ico +0 -0
  8. package/public/index.html +1 -1
  9. package/runit.sh +30 -0
  10. package/runit2.sh +30 -0
  11. package/src/__tests__/reportWebVitals.test.jsx +44 -0
  12. package/src/app/__tests__/__snapshots__/index.test.tsx.snap +5 -109
  13. package/src/app/components/AddNodeDropdown.jsx +44 -0
  14. package/src/app/components/ListGroupItem.jsx +9 -1
  15. package/src/app/components/NamespaceHeader.jsx +4 -13
  16. package/src/app/components/NodeListActions.jsx +69 -0
  17. package/src/app/components/NodeMaterializationDelete.jsx +90 -0
  18. package/src/app/components/NotificationBell.tsx +223 -0
  19. package/src/app/components/QueryInfo.jsx +172 -0
  20. package/src/app/components/Search.jsx +94 -0
  21. package/src/app/components/Tab.jsx +8 -1
  22. package/src/app/components/ToggleSwitch.jsx +20 -0
  23. package/src/app/components/UserMenu.tsx +100 -0
  24. package/src/app/components/__tests__/NodeListActions.test.jsx +94 -0
  25. package/src/app/components/__tests__/NodeMaterializationDelete.test.jsx +263 -0
  26. package/src/app/components/__tests__/NotificationBell.test.tsx +302 -0
  27. package/src/app/components/__tests__/QueryInfo.test.jsx +183 -0
  28. package/src/app/components/__tests__/Search.test.jsx +307 -0
  29. package/src/app/components/__tests__/Tab.test.jsx +27 -0
  30. package/src/app/components/__tests__/ToggleSwitch.test.jsx +43 -0
  31. package/src/app/components/__tests__/UserMenu.test.tsx +241 -0
  32. package/src/app/components/__tests__/__snapshots__/ListGroupItem.test.tsx.snap +8 -3
  33. package/src/app/components/__tests__/__snapshots__/NamespaceHeader.test.jsx.snap +2 -18
  34. package/src/app/components/djgraph/Collapse.jsx +47 -0
  35. package/src/app/components/djgraph/DJNode.jsx +61 -83
  36. package/src/app/components/djgraph/DJNodeColumns.jsx +75 -0
  37. package/src/app/components/djgraph/DJNodeDimensions.jsx +75 -0
  38. package/src/app/components/djgraph/LayoutFlow.jsx +106 -0
  39. package/src/app/components/djgraph/__tests__/Collapse.test.jsx +51 -0
  40. package/src/app/components/djgraph/__tests__/DJNodeColumns.test.jsx +83 -0
  41. package/src/app/components/djgraph/__tests__/DJNodeDimensions.test.jsx +118 -0
  42. package/src/app/components/djgraph/__tests__/__snapshots__/DJNode.test.tsx.snap +84 -40
  43. package/src/app/components/forms/Action.jsx +8 -0
  44. package/src/app/components/forms/NodeNameField.jsx +64 -0
  45. package/src/app/components/search.css +17 -0
  46. package/src/app/constants.js +2 -0
  47. package/src/app/icons/AddItemIcon.jsx +16 -0
  48. package/src/app/icons/AlertIcon.jsx +33 -0
  49. package/src/app/icons/CollapsedIcon.jsx +15 -0
  50. package/src/app/icons/CommitIcon.jsx +45 -0
  51. package/src/app/icons/DJLogo.jsx +36 -0
  52. package/src/app/icons/DeleteIcon.jsx +21 -0
  53. package/src/app/icons/DiffIcon.jsx +63 -0
  54. package/src/app/icons/EditIcon.jsx +18 -0
  55. package/src/app/icons/ExpandedIcon.jsx +15 -0
  56. package/src/app/icons/EyeIcon.jsx +20 -0
  57. package/src/app/icons/FilterIcon.jsx +7 -0
  58. package/src/app/icons/HorizontalHierarchyIcon.jsx +15 -0
  59. package/src/app/icons/InvalidIcon.jsx +16 -0
  60. package/src/app/icons/JupyterExportIcon.jsx +25 -0
  61. package/src/app/icons/LoadingIcon.jsx +14 -0
  62. package/src/app/icons/NodeIcon.jsx +49 -0
  63. package/src/app/icons/NotificationIcon.jsx +27 -0
  64. package/src/app/icons/PythonIcon.jsx +14 -0
  65. package/src/app/icons/SettingsIcon.jsx +28 -0
  66. package/src/app/icons/TableIcon.jsx +14 -0
  67. package/src/app/icons/ValidIcon.jsx +16 -0
  68. package/src/app/icons/WrenchIcon.jsx +36 -0
  69. package/src/app/index.tsx +130 -37
  70. package/src/app/pages/AddEditNodePage/AlertMessage.jsx +10 -0
  71. package/src/app/pages/AddEditNodePage/ColumnMetadata.jsx +61 -0
  72. package/src/app/pages/AddEditNodePage/ColumnsMetadataInput.jsx +72 -0
  73. package/src/app/pages/AddEditNodePage/ColumnsSelect.jsx +84 -0
  74. package/src/app/pages/AddEditNodePage/CustomMetadataField.jsx +144 -0
  75. package/src/app/pages/AddEditNodePage/DescriptionField.jsx +17 -0
  76. package/src/app/pages/AddEditNodePage/DisplayNameField.jsx +16 -0
  77. package/src/app/pages/AddEditNodePage/ExperimentationExtension.jsx +338 -0
  78. package/src/app/pages/AddEditNodePage/FormikSelect.jsx +64 -0
  79. package/src/app/pages/AddEditNodePage/FullNameField.jsx +38 -0
  80. package/src/app/pages/AddEditNodePage/Loadable.jsx +20 -0
  81. package/src/app/pages/AddEditNodePage/MetricMetadataFields.jsx +75 -0
  82. package/src/app/pages/AddEditNodePage/MetricQueryField.jsx +71 -0
  83. package/src/app/pages/AddEditNodePage/NamespaceField.jsx +40 -0
  84. package/src/app/pages/AddEditNodePage/NodeModeField.jsx +14 -0
  85. package/src/app/pages/AddEditNodePage/NodeQueryField.jsx +94 -0
  86. package/src/app/pages/AddEditNodePage/OwnersField.jsx +54 -0
  87. package/src/app/pages/AddEditNodePage/RequiredDimensionsSelect.jsx +54 -0
  88. package/src/app/pages/AddEditNodePage/TagsField.jsx +47 -0
  89. package/src/app/pages/AddEditNodePage/UpstreamNodeField.jsx +49 -0
  90. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormFailed.test.jsx +110 -0
  91. package/src/app/pages/AddEditNodePage/__tests__/AddEditNodePageFormSuccess.test.jsx +291 -0
  92. package/src/app/pages/AddEditNodePage/__tests__/FormikSelect.test.jsx +75 -0
  93. package/src/app/pages/AddEditNodePage/__tests__/FullNameField.test.jsx +31 -0
  94. package/src/app/pages/AddEditNodePage/__tests__/NodeQueryField.test.jsx +30 -0
  95. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormFailed.test.jsx.snap +54 -0
  96. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/AddEditNodePageFormSuccess.test.jsx.snap +3 -0
  97. package/src/app/pages/AddEditNodePage/__tests__/__snapshots__/index.test.jsx.snap +3 -0
  98. package/src/app/pages/AddEditNodePage/__tests__/index.test.jsx +224 -0
  99. package/src/app/pages/AddEditNodePage/index.jsx +545 -0
  100. package/src/app/pages/AddEditTagPage/Loadable.jsx +16 -0
  101. package/src/app/pages/AddEditTagPage/__tests__/AddEditTagPage.test.jsx +107 -0
  102. package/src/app/pages/AddEditTagPage/index.jsx +132 -0
  103. package/src/app/pages/CubeBuilderPage/DimensionsSelect.jsx +152 -0
  104. package/src/app/pages/CubeBuilderPage/Loadable.jsx +16 -0
  105. package/src/app/pages/CubeBuilderPage/MetricsSelect.jsx +75 -0
  106. package/src/app/pages/CubeBuilderPage/__tests__/index.test.jsx +373 -0
  107. package/src/app/pages/CubeBuilderPage/index.jsx +291 -0
  108. package/src/app/pages/LoginPage/LoginForm.jsx +124 -0
  109. package/src/app/pages/LoginPage/SignupForm.jsx +156 -0
  110. package/src/app/pages/LoginPage/__tests__/index.test.jsx +97 -0
  111. package/src/app/pages/LoginPage/assets/sign-in-with-github.png +0 -0
  112. package/src/app/pages/LoginPage/assets/sign-in-with-google.png +0 -0
  113. package/src/app/pages/LoginPage/index.jsx +17 -0
  114. package/src/app/pages/NamespacePage/AddNamespacePopover.jsx +85 -0
  115. package/src/app/pages/NamespacePage/Explorer.jsx +232 -0
  116. package/src/app/pages/NamespacePage/FieldControl.jsx +21 -0
  117. package/src/app/pages/NamespacePage/NodeModeSelect.jsx +27 -0
  118. package/src/app/pages/NamespacePage/NodeTypeSelect.jsx +30 -0
  119. package/src/app/pages/NamespacePage/TagSelect.jsx +44 -0
  120. package/src/app/pages/NamespacePage/UserSelect.jsx +47 -0
  121. package/src/app/pages/NamespacePage/__tests__/AddNamespacePopover.test.jsx +283 -0
  122. package/src/app/pages/NamespacePage/__tests__/index.test.jsx +331 -0
  123. package/src/app/pages/NamespacePage/index.jsx +356 -42
  124. package/src/app/pages/NodePage/AddBackfillPopover.jsx +165 -0
  125. package/src/app/pages/NodePage/AddComplexDimensionLinkPopover.jsx +367 -0
  126. package/src/app/pages/NodePage/AddMaterializationPopover.jsx +222 -0
  127. package/src/app/pages/NodePage/AvailabilityStateBlock.jsx +67 -0
  128. package/src/app/pages/NodePage/ClientCodePopover.jsx +94 -0
  129. package/src/app/pages/NodePage/DimensionFilter.jsx +86 -0
  130. package/src/app/pages/NodePage/EditColumnDescriptionPopover.jsx +116 -0
  131. package/src/app/pages/NodePage/EditColumnPopover.jsx +116 -0
  132. package/src/app/pages/NodePage/LinkDimensionPopover.jsx +164 -0
  133. package/src/app/pages/NodePage/ManageDimensionLinksDialog.jsx +526 -0
  134. package/src/app/pages/NodePage/MaterializationConfigField.jsx +60 -0
  135. package/src/app/pages/NodePage/NodeColumnTab.jsx +421 -30
  136. package/src/app/pages/NodePage/NodeDependenciesTab.jsx +153 -0
  137. package/src/app/pages/NodePage/NodeGraphTab.jsx +119 -148
  138. package/src/app/pages/NodePage/NodeHistory.jsx +236 -0
  139. package/src/app/pages/NodePage/NodeInfoTab.jsx +346 -49
  140. package/src/app/pages/NodePage/NodeLineageTab.jsx +84 -0
  141. package/src/app/pages/NodePage/NodeMaterializationTab.jsx +585 -0
  142. package/src/app/pages/NodePage/NodeRevisionMaterializationTab.jsx +58 -0
  143. package/src/app/pages/NodePage/NodeStatus.jsx +100 -31
  144. package/src/app/pages/NodePage/NodeValidateTab.jsx +367 -0
  145. package/src/app/pages/NodePage/NodesWithDimension.jsx +42 -0
  146. package/src/app/pages/NodePage/NotebookDownload.jsx +36 -0
  147. package/src/app/pages/NodePage/PartitionColumnPopover.jsx +151 -0
  148. package/src/app/pages/NodePage/PartitionValueForm.jsx +60 -0
  149. package/src/app/pages/NodePage/RevisionDiff.jsx +209 -0
  150. package/src/app/pages/NodePage/WatchNodeButton.jsx +226 -0
  151. package/src/app/pages/NodePage/__tests__/AddBackfillPopover.test.jsx +56 -0
  152. package/src/app/pages/NodePage/__tests__/AddComplexDimensionLinkPopover.test.jsx +459 -0
  153. package/src/app/pages/NodePage/__tests__/AddMaterializationPopover.test.jsx +87 -0
  154. package/src/app/pages/NodePage/__tests__/DimensionFilter.test.jsx +74 -0
  155. package/src/app/pages/NodePage/__tests__/EditColumnDescriptionPopover.test.jsx +149 -0
  156. package/src/app/pages/NodePage/__tests__/EditColumnPopover.test.jsx +144 -0
  157. package/src/app/pages/NodePage/__tests__/LinkDimensionPopover.test.jsx +132 -0
  158. package/src/app/pages/NodePage/__tests__/ManageDimensionLinksDialog.test.jsx +390 -0
  159. package/src/app/pages/NodePage/__tests__/NodeColumnTab.test.jsx +166 -0
  160. package/src/app/pages/NodePage/__tests__/NodeDependenciesTab.test.jsx +151 -0
  161. package/src/app/pages/NodePage/__tests__/NodeGraphTab.test.jsx +595 -0
  162. package/src/app/pages/NodePage/__tests__/NodeLineageTab.test.jsx +58 -0
  163. package/src/app/pages/NodePage/__tests__/NodeMaterializationTab.test.jsx +190 -0
  164. package/src/app/pages/NodePage/__tests__/NodePage.test.jsx +882 -0
  165. package/src/app/pages/NodePage/__tests__/NodeWithDimension.test.jsx +175 -0
  166. package/src/app/pages/NodePage/__tests__/RevisionDiff.test.jsx +164 -0
  167. package/src/app/pages/NodePage/__tests__/__snapshots__/NodePage.test.jsx.snap +19 -0
  168. package/src/app/pages/NodePage/index.jsx +190 -44
  169. package/src/app/pages/NotFoundPage/__tests__/index.test.jsx +16 -0
  170. package/src/app/pages/NotificationsPage/Loadable.jsx +6 -0
  171. package/src/app/pages/NotificationsPage/__tests__/index.test.jsx +287 -0
  172. package/src/app/pages/NotificationsPage/index.jsx +136 -0
  173. package/src/app/pages/OverviewPage/ByStatusPanel.jsx +69 -0
  174. package/src/app/pages/OverviewPage/DimensionNodeUsagePanel.jsx +48 -0
  175. package/src/app/pages/OverviewPage/GovernanceWarningsPanel.jsx +107 -0
  176. package/src/app/pages/OverviewPage/Loadable.jsx +16 -0
  177. package/src/app/pages/OverviewPage/NodesByTypePanel.jsx +63 -0
  178. package/src/app/pages/OverviewPage/OverviewPanel.jsx +94 -0
  179. package/src/app/pages/OverviewPage/TrendsPanel.jsx +66 -0
  180. package/src/app/pages/OverviewPage/__tests__/ByStatusPanel.test.jsx +36 -0
  181. package/src/app/pages/OverviewPage/__tests__/DimensionNodeUsagePanel.test.jsx +76 -0
  182. package/src/app/pages/OverviewPage/__tests__/GovernanceWarningsPanel.test.jsx +77 -0
  183. package/src/app/pages/OverviewPage/__tests__/NodesByTypePanel.test.jsx +86 -0
  184. package/src/app/pages/OverviewPage/__tests__/OverviewPanel.test.jsx +78 -0
  185. package/src/app/pages/OverviewPage/__tests__/TrendsPanel.test.jsx +120 -0
  186. package/src/app/pages/OverviewPage/__tests__/index.test.jsx +54 -0
  187. package/src/app/pages/OverviewPage/index.jsx +22 -0
  188. package/src/app/pages/RegisterTablePage/Loadable.jsx +16 -0
  189. package/src/app/pages/RegisterTablePage/__tests__/RegisterTablePage.test.jsx +112 -0
  190. package/src/app/pages/RegisterTablePage/__tests__/__snapshots__/RegisterTablePage.test.jsx.snap +38 -0
  191. package/src/app/pages/RegisterTablePage/index.jsx +142 -0
  192. package/src/app/pages/Root/__tests__/index.test.jsx +44 -0
  193. package/src/app/pages/Root/index.tsx +92 -10
  194. package/src/app/pages/SQLBuilderPage/Loadable.jsx +16 -0
  195. package/src/app/pages/SQLBuilderPage/__tests__/index.test.jsx +173 -0
  196. package/src/app/pages/SQLBuilderPage/index.jsx +390 -0
  197. package/src/app/pages/SettingsPage/CreateServiceAccountModal.jsx +152 -0
  198. package/src/app/pages/SettingsPage/Loadable.jsx +16 -0
  199. package/src/app/pages/SettingsPage/NotificationSubscriptionsSection.jsx +189 -0
  200. package/src/app/pages/SettingsPage/ProfileSection.jsx +41 -0
  201. package/src/app/pages/SettingsPage/ServiceAccountsSection.jsx +95 -0
  202. package/src/app/pages/SettingsPage/__tests__/CreateServiceAccountModal.test.jsx +318 -0
  203. package/src/app/pages/SettingsPage/__tests__/NotificationSubscriptionsSection.test.jsx +233 -0
  204. package/src/app/pages/SettingsPage/__tests__/ProfileSection.test.jsx +65 -0
  205. package/src/app/pages/SettingsPage/__tests__/ServiceAccountsSection.test.jsx +150 -0
  206. package/src/app/pages/SettingsPage/__tests__/index.test.jsx +184 -0
  207. package/src/app/pages/SettingsPage/index.jsx +148 -0
  208. package/src/app/pages/TagPage/Loadable.jsx +16 -0
  209. package/src/app/pages/TagPage/__tests__/TagPage.test.jsx +70 -0
  210. package/src/app/pages/TagPage/index.jsx +79 -0
  211. package/src/app/services/DJService.js +1444 -21
  212. package/src/app/services/__tests__/DJService.test.jsx +2118 -0
  213. package/src/app/utils/__tests__/date.test.js +198 -0
  214. package/src/app/utils/date.js +65 -0
  215. package/src/index.tsx +1 -0
  216. package/src/mocks/mockNodes.jsx +1477 -0
  217. package/src/setupTests.ts +31 -1
  218. package/src/styles/dag.css +117 -5
  219. package/src/styles/index.css +1028 -31
  220. package/src/styles/loading.css +34 -0
  221. package/src/styles/login.css +81 -0
  222. package/src/styles/nav-bar.css +274 -0
  223. package/src/styles/node-creation.scss +276 -0
  224. package/src/styles/node-list.css +4 -0
  225. package/src/styles/overview.css +72 -0
  226. package/src/styles/settings.css +787 -0
  227. package/src/styles/sorted-table.css +15 -0
  228. package/src/styles/styles.scss +44 -0
  229. package/src/styles/styles.scss.d.ts +9 -0
  230. package/src/utils/form.jsx +23 -0
  231. package/webpack.config.js +17 -6
  232. package/.babelrc +0 -4
  233. package/.env.local +0 -4
  234. package/.env.production +0 -1
  235. package/.github/pull_request_template.md +0 -11
  236. package/.github/workflows/ci.yml +0 -33
  237. package/.vscode/extensions.json +0 -7
  238. package/.vscode/launch.json +0 -15
  239. package/.vscode/settings.json +0 -25
  240. package/Dockerfile +0 -7
  241. package/src/app/pages/ListNamespacesPage/Loadable.jsx +0 -14
  242. package/src/app/pages/ListNamespacesPage/index.jsx +0 -62
  243. package/src/app/pages/NamespacePage/__tests__/__snapshots__/index.test.tsx.snap +0 -45
  244. 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
+ });