@datarecce/ui 0.1.30 → 0.1.31
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/dist/api.d.mts +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/components.d.mts +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/{index-BNUP2V_N.d.ts → index-B9lSPJTi.d.ts} +184 -2
- package/dist/index-B9lSPJTi.d.ts.map +1 -0
- package/dist/{index-DOPZuhD8.d.mts → index-IIXVIoOL.d.mts} +253 -71
- package/dist/index-IIXVIoOL.d.mts.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +4 -0
- package/dist/theme.d.mts +2 -185
- package/dist/theme.d.ts +2 -185
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +4 -2
- package/recce-source/.editorconfig +26 -0
- package/recce-source/.flake8 +37 -0
- package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
- package/recce-source/.github/ISSUE_TEMPLATE/custom.md +10 -0
- package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
- package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +21 -0
- package/recce-source/.github/copilot-instructions.md +331 -0
- package/recce-source/.github/instructions/backend-instructions.md +541 -0
- package/recce-source/.github/instructions/frontend-instructions.md +317 -0
- package/recce-source/.github/workflows/build-statics.yaml +72 -0
- package/recce-source/.github/workflows/bump.yaml +48 -0
- package/recce-source/.github/workflows/integration-tests-cloud.yaml +92 -0
- package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +33 -0
- package/recce-source/.github/workflows/integration-tests.yaml +52 -0
- package/recce-source/.github/workflows/nightly.yaml +246 -0
- package/recce-source/.github/workflows/release.yaml +196 -0
- package/recce-source/.github/workflows/tests-js.yaml +58 -0
- package/recce-source/.github/workflows/tests-python.yaml +128 -0
- package/recce-source/.pre-commit-config.yaml +26 -0
- package/recce-source/CLAUDE.md +483 -0
- package/recce-source/CODE_OF_CONDUCT.md +128 -0
- package/recce-source/CONTRIBUTING.md +107 -0
- package/recce-source/LICENSE +201 -0
- package/recce-source/Makefile +126 -0
- package/recce-source/README.md +182 -0
- package/recce-source/RECCE_CLOUD.md +81 -0
- package/recce-source/SECURITY.md +25 -0
- package/recce-source/docs/PACKAGING.md +340 -0
- package/recce-source/docs/README.md +1 -0
- package/recce-source/integration_tests/dbt/dbt_project.yml +26 -0
- package/recce-source/integration_tests/dbt/models/customers.sql +69 -0
- package/recce-source/integration_tests/dbt/models/docs.md +14 -0
- package/recce-source/integration_tests/dbt/models/orders.sql +56 -0
- package/recce-source/integration_tests/dbt/models/schema.yml +82 -0
- package/recce-source/integration_tests/dbt/models/staging/schema.yml +31 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +22 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +23 -0
- package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +25 -0
- package/recce-source/integration_tests/dbt/packages.yml +7 -0
- package/recce-source/integration_tests/dbt/profiles.yml +8 -0
- package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +101 -0
- package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +100 -0
- package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +114 -0
- package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +5 -0
- package/recce-source/integration_tests/dbt/smoke_test.sh +72 -0
- package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +71 -0
- package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +9 -0
- package/recce-source/integration_tests/sqlmesh/audits/items.sql +7 -0
- package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +7 -0
- package/recce-source/integration_tests/sqlmesh/config.py +171 -0
- package/recce-source/integration_tests/sqlmesh/helper.py +20 -0
- package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
- package/recce-source/integration_tests/sqlmesh/macros/macros.py +8 -0
- package/recce-source/integration_tests/sqlmesh/macros/macros.sql +8 -0
- package/recce-source/integration_tests/sqlmesh/macros/utils.py +11 -0
- package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +25 -0
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +41 -0
- package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +60 -0
- package/recce-source/integration_tests/sqlmesh/models/customers.sql +32 -0
- package/recce-source/integration_tests/sqlmesh/models/items.py +95 -0
- package/recce-source/integration_tests/sqlmesh/models/marketing.sql +15 -0
- package/recce-source/integration_tests/sqlmesh/models/order_items.py +95 -0
- package/recce-source/integration_tests/sqlmesh/models/orders.py +70 -0
- package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +62 -0
- package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +23 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +29 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +10 -0
- package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +29 -0
- package/recce-source/integration_tests/sqlmesh/models/waiters.py +62 -0
- package/recce-source/integration_tests/sqlmesh/prep_env.sh +16 -0
- package/recce-source/integration_tests/sqlmesh/schema.yaml +5 -0
- package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +11 -0
- package/recce-source/integration_tests/sqlmesh/test_server.sh +29 -0
- package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +63 -0
- package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +72 -0
- package/recce-source/js/.editorconfig +27 -0
- package/recce-source/js/.env.development +5 -0
- package/recce-source/js/.husky/pre-commit +29 -0
- package/recce-source/js/.nvmrc +1 -0
- package/recce-source/js/README.md +39 -0
- package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +65 -0
- package/recce-source/js/app/(mainComponents)/NavBar.tsx +228 -0
- package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +107 -0
- package/recce-source/js/app/(mainComponents)/TopBar.tsx +252 -0
- package/recce-source/js/app/@lineage/default.tsx +20 -0
- package/recce-source/js/app/@lineage/page.tsx +14 -0
- package/recce-source/js/app/MainLayout.tsx +170 -0
- package/recce-source/js/app/Providers.tsx +49 -0
- package/recce-source/js/app/checks/page.tsx +296 -0
- package/recce-source/js/app/error.tsx +93 -0
- package/recce-source/js/app/favicon.ico +0 -0
- package/recce-source/js/app/global-error.tsx +115 -0
- package/recce-source/js/app/global.css +82 -0
- package/recce-source/js/app/layout.tsx +48 -0
- package/recce-source/js/app/lineage/page.tsx +15 -0
- package/recce-source/js/app/page.tsx +12 -0
- package/recce-source/js/app/query/page.tsx +8 -0
- package/recce-source/js/biome.json +313 -0
- package/recce-source/js/jest.config.js +34 -0
- package/recce-source/js/jest.globals.d.ts +32 -0
- package/recce-source/js/jest.setup.js +91 -0
- package/recce-source/js/next.config.js +16 -0
- package/recce-source/js/package-lock.json +13843 -0
- package/recce-source/js/package.json +123 -0
- package/recce-source/js/pnpm-lock.yaml +9235 -0
- package/recce-source/js/pnpm-workspace.yaml +6 -0
- package/recce-source/js/postcss.config.js +5 -0
- package/recce-source/js/public/auth_callback.html +68 -0
- package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
- package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
- package/recce-source/js/public/imgs/reload-image.svg +4 -0
- package/recce-source/js/public/logo/recce-logo-white.png +0 -0
- package/recce-source/js/src/components/AuthModal/AuthModal.tsx +202 -0
- package/recce-source/js/src/components/app/AvatarDropdown.tsx +159 -0
- package/recce-source/js/src/components/app/EnvInfo.tsx +357 -0
- package/recce-source/js/src/components/app/Filename.tsx +388 -0
- package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +91 -0
- package/recce-source/js/src/components/app/StateExporter.tsx +57 -0
- package/recce-source/js/src/components/app/StateImporter.tsx +198 -0
- package/recce-source/js/src/components/app/StateSharing.tsx +145 -0
- package/recce-source/js/src/components/app/StateSynchronizer.tsx +205 -0
- package/recce-source/js/src/components/charts/HistogramChart.tsx +291 -0
- package/recce-source/js/src/components/charts/SquareIcon.tsx +51 -0
- package/recce-source/js/src/components/charts/TopKSummaryList.tsx +457 -0
- package/recce-source/js/src/components/charts/chartTheme.ts +74 -0
- package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +97 -0
- package/recce-source/js/src/components/check/CheckDescription.tsx +134 -0
- package/recce-source/js/src/components/check/CheckDetail.tsx +797 -0
- package/recce-source/js/src/components/check/CheckEmptyState.tsx +84 -0
- package/recce-source/js/src/components/check/CheckList.tsx +320 -0
- package/recce-source/js/src/components/check/LineageDiffView.tsx +32 -0
- package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +48 -0
- package/recce-source/js/src/components/check/SchemaDiffView.tsx +290 -0
- package/recce-source/js/src/components/check/check.ts +25 -0
- package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +163 -0
- package/recce-source/js/src/components/check/timeline/CommentInput.tsx +84 -0
- package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +468 -0
- package/recce-source/js/src/components/check/timeline/index.ts +12 -0
- package/recce-source/js/src/components/check/utils.ts +12 -0
- package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +333 -0
- package/recce-source/js/src/components/data-grid/agGridStyles.css +55 -0
- package/recce-source/js/src/components/data-grid/agGridTheme.ts +43 -0
- package/recce-source/js/src/components/editor/CodeEditor.tsx +107 -0
- package/recce-source/js/src/components/editor/DiffEditor.tsx +162 -0
- package/recce-source/js/src/components/editor/index.ts +12 -0
- package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +87 -0
- package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +147 -0
- package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +63 -0
- package/recce-source/js/src/components/icons/index.tsx +142 -0
- package/recce-source/js/src/components/lineage/ActionControl.tsx +63 -0
- package/recce-source/js/src/components/lineage/ActionTag.tsx +141 -0
- package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +46 -0
- package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +327 -0
- package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +57 -0
- package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +199 -0
- package/recce-source/js/src/components/lineage/GraphEdge.tsx +59 -0
- package/recce-source/js/src/components/lineage/GraphNode.tsx +555 -0
- package/recce-source/js/src/components/lineage/LineagePage.tsx +10 -0
- package/recce-source/js/src/components/lineage/LineageView.tsx +1384 -0
- package/recce-source/js/src/components/lineage/LineageViewContext.tsx +86 -0
- package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +637 -0
- package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +64 -0
- package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +596 -0
- package/recce-source/js/src/components/lineage/NodeSqlView.tsx +136 -0
- package/recce-source/js/src/components/lineage/NodeTag.tsx +278 -0
- package/recce-source/js/src/components/lineage/NodeView.tsx +642 -0
- package/recce-source/js/src/components/lineage/SandboxView.tsx +436 -0
- package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +105 -0
- package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +52 -0
- package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +152 -0
- package/recce-source/js/src/components/lineage/graph.test.ts +31 -0
- package/recce-source/js/src/components/lineage/graph.ts +58 -0
- package/recce-source/js/src/components/lineage/lineage.test.ts +169 -0
- package/recce-source/js/src/components/lineage/lineage.ts +521 -0
- package/recce-source/js/src/components/lineage/styles.css +42 -0
- package/recce-source/js/src/components/lineage/styles.tsx +165 -0
- package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +352 -0
- package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +108 -0
- package/recce-source/js/src/components/onboarding-guide/Notification.tsx +62 -0
- package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +134 -0
- package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +245 -0
- package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +29 -0
- package/recce-source/js/src/components/query/DiffText.tsx +120 -0
- package/recce-source/js/src/components/query/QueryDiffResultView.tsx +470 -0
- package/recce-source/js/src/components/query/QueryForm.tsx +80 -0
- package/recce-source/js/src/components/query/QueryPage.tsx +282 -0
- package/recce-source/js/src/components/query/QueryResultView.tsx +180 -0
- package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +57 -0
- package/recce-source/js/src/components/query/SqlEditor.tsx +245 -0
- package/recce-source/js/src/components/query/ToggleSwitch.tsx +84 -0
- package/recce-source/js/src/components/query/styles.css +21 -0
- package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +428 -0
- package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +311 -0
- package/recce-source/js/src/components/routing/Navigation.test.tsx +256 -0
- package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +109 -0
- package/recce-source/js/src/components/rowcount/delta.ts +11 -0
- package/recce-source/js/src/components/run/RunList.tsx +303 -0
- package/recce-source/js/src/components/run/RunModal.tsx +191 -0
- package/recce-source/js/src/components/run/RunPage.tsx +26 -0
- package/recce-source/js/src/components/run/RunResultPane.tsx +454 -0
- package/recce-source/js/src/components/run/RunStatusAndDate.tsx +106 -0
- package/recce-source/js/src/components/run/RunToolbar.tsx +70 -0
- package/recce-source/js/src/components/run/RunView.tsx +196 -0
- package/recce-source/js/src/components/run/registry.ts +214 -0
- package/recce-source/js/src/components/run/types.ts +14 -0
- package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +169 -0
- package/recce-source/js/src/components/schema/ColumnNameCell.tsx +198 -0
- package/recce-source/js/src/components/schema/SchemaView.tsx +337 -0
- package/recce-source/js/src/components/schema/schemaDiff.ts +32 -0
- package/recce-source/js/src/components/schema/style.css +134 -0
- package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +39 -0
- package/recce-source/js/src/components/shared/HistoryToggle.tsx +35 -0
- package/recce-source/js/src/components/split/Split.tsx +40 -0
- package/recce-source/js/src/components/split/styles.css +24 -0
- package/recce-source/js/src/components/summary/ChangeSummary.tsx +264 -0
- package/recce-source/js/src/components/summary/SchemaSummary.tsx +123 -0
- package/recce-source/js/src/components/summary/SummaryView.tsx +29 -0
- package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +48 -0
- package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +58 -0
- package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +73 -0
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +228 -0
- package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +113 -0
- package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +72 -0
- package/recce-source/js/src/components/ui/dataGrid/index.ts +23 -0
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +607 -0
- package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +211 -0
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +452 -0
- package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +142 -0
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +178 -0
- package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +275 -0
- package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +134 -0
- package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +364 -0
- package/recce-source/js/src/components/ui/mui/index.ts +13 -0
- package/recce-source/js/src/components/ui/mui-provider.tsx +67 -0
- package/recce-source/js/src/components/ui/mui-theme.ts +1039 -0
- package/recce-source/js/src/components/ui/mui-utils.ts +113 -0
- package/recce-source/js/src/components/ui/toaster.tsx +288 -0
- package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +217 -0
- package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +246 -0
- package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +82 -0
- package/recce-source/js/src/components/valuediff/shared.ts +33 -0
- package/recce-source/js/src/constants/tooltipMessage.ts +3 -0
- package/recce-source/js/src/constants/urls.ts +1 -0
- package/recce-source/js/src/lib/UrlHash.ts +12 -0
- package/recce-source/js/src/lib/api/adhocQuery.ts +70 -0
- package/recce-source/js/src/lib/api/axiosClient.ts +9 -0
- package/recce-source/js/src/lib/api/cacheKeys.ts +13 -0
- package/recce-source/js/src/lib/api/checkEvents.ts +252 -0
- package/recce-source/js/src/lib/api/checks.ts +129 -0
- package/recce-source/js/src/lib/api/cll.ts +53 -0
- package/recce-source/js/src/lib/api/connectToCloud.ts +13 -0
- package/recce-source/js/src/lib/api/flag.ts +37 -0
- package/recce-source/js/src/lib/api/info.ts +198 -0
- package/recce-source/js/src/lib/api/instanceInfo.ts +25 -0
- package/recce-source/js/src/lib/api/keepAlive.ts +108 -0
- package/recce-source/js/src/lib/api/lineagecheck.ts +35 -0
- package/recce-source/js/src/lib/api/localStorageKeys.ts +7 -0
- package/recce-source/js/src/lib/api/models.ts +59 -0
- package/recce-source/js/src/lib/api/profile.ts +65 -0
- package/recce-source/js/src/lib/api/rowcount.ts +19 -0
- package/recce-source/js/src/lib/api/runs.ts +174 -0
- package/recce-source/js/src/lib/api/schemacheck.ts +31 -0
- package/recce-source/js/src/lib/api/select.ts +25 -0
- package/recce-source/js/src/lib/api/sessionStorageKeys.ts +8 -0
- package/recce-source/js/src/lib/api/state.ts +117 -0
- package/recce-source/js/src/lib/api/track.ts +281 -0
- package/recce-source/js/src/lib/api/types.ts +284 -0
- package/recce-source/js/src/lib/api/user.ts +42 -0
- package/recce-source/js/src/lib/api/valuediff.ts +46 -0
- package/recce-source/js/src/lib/api/version.ts +40 -0
- package/recce-source/js/src/lib/const.ts +9 -0
- package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +626 -0
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +2140 -0
- package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +397 -0
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +132 -0
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +126 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +1627 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +140 -0
- package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +67 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +142 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +71 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +258 -0
- package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +153 -0
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +951 -0
- package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +221 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +395 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +184 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +884 -0
- package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +113 -0
- package/recce-source/js/src/lib/dataGrid/index.ts +51 -0
- package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +858 -0
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +482 -0
- package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +345 -0
- package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +698 -0
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +820 -0
- package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +277 -0
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +785 -0
- package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +370 -0
- package/recce-source/js/src/lib/dataGrid/shared/index.ts +81 -0
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +909 -0
- package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +325 -0
- package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +240 -0
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +719 -0
- package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +231 -0
- package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +559 -0
- package/recce-source/js/src/lib/dataGrid/shared/validation.ts +367 -0
- package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +1117 -0
- package/recce-source/js/src/lib/formatSelect.ts +50 -0
- package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +181 -0
- package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +177 -0
- package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +512 -0
- package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +269 -0
- package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +33 -0
- package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +54 -0
- package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +129 -0
- package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +98 -0
- package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +59 -0
- package/recce-source/js/src/lib/hooks/ScreenShot.tsx +399 -0
- package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +211 -0
- package/recce-source/js/src/lib/hooks/useAppRouter.ts +200 -0
- package/recce-source/js/src/lib/hooks/useCheckEvents.ts +99 -0
- package/recce-source/js/src/lib/hooks/useCheckToast.tsx +14 -0
- package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +27 -0
- package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +102 -0
- package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +130 -0
- package/recce-source/js/src/lib/hooks/useGuideToast.tsx +45 -0
- package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +185 -0
- package/recce-source/js/src/lib/hooks/useModelColumns.tsx +113 -0
- package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +13 -0
- package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +13 -0
- package/recce-source/js/src/lib/hooks/useRun.tsx +89 -0
- package/recce-source/js/src/lib/hooks/useThemeColors.ts +115 -0
- package/recce-source/js/src/lib/mergeKeys.test.ts +89 -0
- package/recce-source/js/src/lib/mergeKeys.ts +86 -0
- package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +9 -0
- package/recce-source/js/src/lib/utils/formatTime.ts +84 -0
- package/recce-source/js/src/lib/utils/urls.ts +16 -0
- package/recce-source/js/src/utils/DropdownValuesInput.tsx +297 -0
- package/recce-source/js/src/utils/formatters.tsx +237 -0
- package/recce-source/js/src/utils/transforms.ts +81 -0
- package/recce-source/js/tsconfig.json +47 -0
- package/recce-source/macros/README.md +8 -0
- package/recce-source/macros/recce_athena.sql +73 -0
- package/recce-source/pyproject.toml +109 -0
- package/recce-source/recce/VERSION +1 -0
- package/recce-source/recce/__init__.py +84 -0
- package/recce-source/recce/adapter/__init__.py +0 -0
- package/recce-source/recce/adapter/base.py +109 -0
- package/recce-source/recce/adapter/dbt_adapter/__init__.py +1699 -0
- package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +42 -0
- package/recce-source/recce/adapter/sqlmesh_adapter.py +141 -0
- package/recce-source/recce/apis/__init__.py +0 -0
- package/recce-source/recce/apis/check_api.py +203 -0
- package/recce-source/recce/apis/check_events_api.py +353 -0
- package/recce-source/recce/apis/check_func.py +130 -0
- package/recce-source/recce/apis/run_api.py +130 -0
- package/recce-source/recce/apis/run_func.py +258 -0
- package/recce-source/recce/artifact.py +266 -0
- package/recce-source/recce/cli.py +1846 -0
- package/recce-source/recce/config.py +127 -0
- package/recce-source/recce/connect_to_cloud.py +138 -0
- package/recce-source/recce/core.py +334 -0
- package/recce-source/recce/diff.py +26 -0
- package/recce-source/recce/event/CONFIG +1 -0
- package/recce-source/recce/event/SENTRY_DNS +1 -0
- package/recce-source/recce/event/__init__.py +304 -0
- package/recce-source/recce/event/collector.py +184 -0
- package/recce-source/recce/event/track.py +158 -0
- package/recce-source/recce/exceptions.py +21 -0
- package/recce-source/recce/git.py +77 -0
- package/recce-source/recce/github.py +222 -0
- package/recce-source/recce/mcp_server.py +861 -0
- package/recce-source/recce/models/__init__.py +6 -0
- package/recce-source/recce/models/check.py +473 -0
- package/recce-source/recce/models/run.py +46 -0
- package/recce-source/recce/models/types.py +218 -0
- package/recce-source/recce/pull_request.py +124 -0
- package/recce-source/recce/run.py +390 -0
- package/recce-source/recce/server.py +877 -0
- package/recce-source/recce/state/__init__.py +31 -0
- package/recce-source/recce/state/cloud.py +644 -0
- package/recce-source/recce/state/const.py +26 -0
- package/recce-source/recce/state/local.py +56 -0
- package/recce-source/recce/state/state.py +119 -0
- package/recce-source/recce/state/state_loader.py +174 -0
- package/recce-source/recce/summary.py +575 -0
- package/recce-source/recce/tasks/__init__.py +23 -0
- package/recce-source/recce/tasks/core.py +134 -0
- package/recce-source/recce/tasks/dataframe.py +170 -0
- package/recce-source/recce/tasks/histogram.py +433 -0
- package/recce-source/recce/tasks/lineage.py +19 -0
- package/recce-source/recce/tasks/profile.py +298 -0
- package/recce-source/recce/tasks/query.py +450 -0
- package/recce-source/recce/tasks/rowcount.py +277 -0
- package/recce-source/recce/tasks/schema.py +65 -0
- package/recce-source/recce/tasks/top_k.py +172 -0
- package/recce-source/recce/tasks/utils.py +147 -0
- package/recce-source/recce/tasks/valuediff.py +497 -0
- package/recce-source/recce/util/__init__.py +4 -0
- package/recce-source/recce/util/api_token.py +80 -0
- package/recce-source/recce/util/breaking.py +330 -0
- package/recce-source/recce/util/cache.py +25 -0
- package/recce-source/recce/util/cll.py +355 -0
- package/recce-source/recce/util/cloud/__init__.py +15 -0
- package/recce-source/recce/util/cloud/base.py +115 -0
- package/recce-source/recce/util/cloud/check_events.py +190 -0
- package/recce-source/recce/util/cloud/checks.py +242 -0
- package/recce-source/recce/util/io.py +120 -0
- package/recce-source/recce/util/lineage.py +83 -0
- package/recce-source/recce/util/logger.py +25 -0
- package/recce-source/recce/util/onboarding_state.py +45 -0
- package/recce-source/recce/util/perf_tracking.py +85 -0
- package/recce-source/recce/util/pydantic_model.py +22 -0
- package/recce-source/recce/util/recce_cloud.py +454 -0
- package/recce-source/recce/util/singleton.py +18 -0
- package/recce-source/recce/util/startup_perf.py +121 -0
- package/recce-source/recce/yaml/__init__.py +58 -0
- package/recce-source/recce_cloud/README.md +780 -0
- package/recce-source/recce_cloud/VERSION +1 -0
- package/recce-source/recce_cloud/__init__.py +24 -0
- package/recce-source/recce_cloud/api/__init__.py +17 -0
- package/recce-source/recce_cloud/api/base.py +132 -0
- package/recce-source/recce_cloud/api/client.py +186 -0
- package/recce-source/recce_cloud/api/exceptions.py +26 -0
- package/recce-source/recce_cloud/api/factory.py +63 -0
- package/recce-source/recce_cloud/api/github.py +106 -0
- package/recce-source/recce_cloud/api/gitlab.py +111 -0
- package/recce-source/recce_cloud/artifact.py +57 -0
- package/recce-source/recce_cloud/ci_providers/__init__.py +9 -0
- package/recce-source/recce_cloud/ci_providers/base.py +82 -0
- package/recce-source/recce_cloud/ci_providers/detector.py +147 -0
- package/recce-source/recce_cloud/ci_providers/github_actions.py +136 -0
- package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +130 -0
- package/recce-source/recce_cloud/cli.py +434 -0
- package/recce-source/recce_cloud/download.py +230 -0
- package/recce-source/recce_cloud/hatch_build.py +20 -0
- package/recce-source/recce_cloud/pyproject.toml +49 -0
- package/recce-source/recce_cloud/upload.py +214 -0
- package/recce-source/test.py +0 -0
- package/recce-source/tests/__init__.py +0 -0
- package/recce-source/tests/adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
- package/recce-source/tests/adapter/dbt_adapter/conftest.py +17 -0
- package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +298 -0
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +25 -0
- package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +717 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +4 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +1 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +8 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +7 -0
- package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +6 -0
- package/recce-source/tests/adapter/dbt_adapter/test_selector.py +205 -0
- package/recce-source/tests/apis/__init__.py +0 -0
- package/recce-source/tests/apis/row_count_diff.json +59 -0
- package/recce-source/tests/apis/test_check_events_api.py +615 -0
- package/recce-source/tests/apis/test_run_func.py +433 -0
- package/recce-source/tests/catalog.json +527 -0
- package/recce-source/tests/data/manifest/base/catalog.json +1 -0
- package/recce-source/tests/data/manifest/base/manifest.json +1 -0
- package/recce-source/tests/data/manifest/pr2/catalog.json +1 -0
- package/recce-source/tests/data/manifest/pr2/manifest.json +1 -0
- package/recce-source/tests/manifest.json +10655 -0
- package/recce-source/tests/models/__init__.py +0 -0
- package/recce-source/tests/models/test_check.py +731 -0
- package/recce-source/tests/models/test_run_models.py +295 -0
- package/recce-source/tests/recce_cloud/__init__.py +0 -0
- package/recce-source/tests/recce_cloud/test_ci_providers.py +351 -0
- package/recce-source/tests/recce_cloud/test_cli.py +735 -0
- package/recce-source/tests/recce_cloud/test_client.py +379 -0
- package/recce-source/tests/recce_cloud/test_platform_clients.py +483 -0
- package/recce-source/tests/recce_state.json +1 -0
- package/recce-source/tests/state/test_cloud.py +719 -0
- package/recce-source/tests/state/test_local.py +164 -0
- package/recce-source/tests/state/test_state_loader.py +211 -0
- package/recce-source/tests/tasks/__init__.py +0 -0
- package/recce-source/tests/tasks/conftest.py +4 -0
- package/recce-source/tests/tasks/test_histogram.py +129 -0
- package/recce-source/tests/tasks/test_lineage.py +55 -0
- package/recce-source/tests/tasks/test_preset_checks.py +64 -0
- package/recce-source/tests/tasks/test_profile.py +397 -0
- package/recce-source/tests/tasks/test_query.py +528 -0
- package/recce-source/tests/tasks/test_row_count.py +133 -0
- package/recce-source/tests/tasks/test_schema.py +122 -0
- package/recce-source/tests/tasks/test_top_k.py +77 -0
- package/recce-source/tests/tasks/test_utils.py +439 -0
- package/recce-source/tests/tasks/test_valuediff.py +361 -0
- package/recce-source/tests/test_cli.py +236 -0
- package/recce-source/tests/test_cli_mcp_optional.py +45 -0
- package/recce-source/tests/test_cloud_listing_cli.py +324 -0
- package/recce-source/tests/test_config.py +43 -0
- package/recce-source/tests/test_connect_to_cloud.py +82 -0
- package/recce-source/tests/test_core.py +174 -0
- package/recce-source/tests/test_dbt.py +36 -0
- package/recce-source/tests/test_mcp_server.py +505 -0
- package/recce-source/tests/test_pull_request.py +130 -0
- package/recce-source/tests/test_server.py +202 -0
- package/recce-source/tests/test_server_lifespan.py +138 -0
- package/recce-source/tests/test_summary.py +73 -0
- package/recce-source/tests/util/__init__.py +0 -0
- package/recce-source/tests/util/cloud/__init__.py +0 -0
- package/recce-source/tests/util/cloud/test_check_events.py +255 -0
- package/recce-source/tests/util/cloud/test_checks.py +204 -0
- package/recce-source/tests/util/test_api_token.py +119 -0
- package/recce-source/tests/util/test_breaking.py +1427 -0
- package/recce-source/tests/util/test_cll.py +706 -0
- package/recce-source/tests/util/test_lineage.py +122 -0
- package/recce-source/tests/util/test_onboarding_state.py +84 -0
- package/recce-source/tests/util/test_recce_cloud.py +231 -0
- package/recce-source/tox.ini +40 -0
- package/recce-source/uv.lock +3928 -0
- package/src/api/index.ts +32 -0
- package/src/components/index.ts +154 -0
- package/src/global.d.ts +14 -0
- package/src/hooks/index.ts +56 -0
- package/src/index.ts +17 -0
- package/src/lib/hooks/RouteConfigContext.ts +139 -0
- package/src/lib/hooks/useAppRouter.ts +240 -0
- package/src/mui-augmentation.d.ts +139 -0
- package/src/theme/index.ts +13 -0
- package/src/theme.ts +23 -0
- package/src/types/index.ts +23 -0
- package/dist/index-BNUP2V_N.d.ts.map +0 -1
- package/dist/index-DOPZuhD8.d.mts.map +0 -1
- package/dist/theme.d.mts.map +0 -1
- package/dist/theme.d.ts.map +0 -1
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file toDiffColumn.test.tsx
|
|
3
|
+
* @description Tests for toDiffColumn shared column builder
|
|
4
|
+
*
|
|
5
|
+
* Tests cover:
|
|
6
|
+
* - createCellClassBase factory function
|
|
7
|
+
* - createCellClassCurrent factory function
|
|
8
|
+
* - toDiffColumn inline mode
|
|
9
|
+
* - toDiffColumn side_by_side mode
|
|
10
|
+
* - Column metadata preservation
|
|
11
|
+
* - Header cell class assignment
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { CellClassParams } from "ag-grid-community";
|
|
15
|
+
import React from "react";
|
|
16
|
+
import { ColumnRenderMode, ColumnType, RowObjectType } from "@/lib/api/types";
|
|
17
|
+
import {
|
|
18
|
+
createCellClassBase,
|
|
19
|
+
createCellClassCurrent,
|
|
20
|
+
DiffColumnConfig,
|
|
21
|
+
DiffColumnResult,
|
|
22
|
+
toDiffColumn,
|
|
23
|
+
} from "./toDiffColumn";
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Mocks
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
// Mock AG Grid modules
|
|
30
|
+
jest.mock("ag-grid-community", () => ({
|
|
31
|
+
ModuleRegistry: { registerModules: jest.fn() },
|
|
32
|
+
AllCommunityModule: {},
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
// Mock the UI components to avoid React rendering complexity
|
|
36
|
+
jest.mock("@/components/ui/dataGrid", () => ({
|
|
37
|
+
DataFrameColumnGroupHeader: () => null,
|
|
38
|
+
defaultRenderCell: jest.fn(),
|
|
39
|
+
inlineRenderCell: jest.fn(),
|
|
40
|
+
}));
|
|
41
|
+
|
|
42
|
+
jest.mock("./gridUtils", () => ({
|
|
43
|
+
getHeaderCellClass: (status: string | undefined) => {
|
|
44
|
+
if (status === "added") return "diff-header-added";
|
|
45
|
+
if (status === "removed") return "diff-header-removed";
|
|
46
|
+
return undefined;
|
|
47
|
+
},
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Types for testing (uses AG Grid types)
|
|
52
|
+
// ============================================================================
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Context for custom column metadata
|
|
56
|
+
*/
|
|
57
|
+
interface TestColumnContext {
|
|
58
|
+
columnType?: ColumnType;
|
|
59
|
+
columnRenderMode?: ColumnRenderMode;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Test-friendly Column type (based on AG Grid ColDef)
|
|
64
|
+
*/
|
|
65
|
+
interface TestColumn {
|
|
66
|
+
field: string;
|
|
67
|
+
headerName?: string;
|
|
68
|
+
headerComponent?: React.ComponentType;
|
|
69
|
+
headerClass?: string;
|
|
70
|
+
cellClass?:
|
|
71
|
+
| string
|
|
72
|
+
| ((params: CellClassParams<RowObjectType>) => string | undefined);
|
|
73
|
+
cellRenderer?: unknown;
|
|
74
|
+
context?: TestColumnContext;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Test-friendly ColumnGroup type (based on AG Grid ColGroupDef)
|
|
79
|
+
*/
|
|
80
|
+
interface TestColumnGroup {
|
|
81
|
+
headerName?: string;
|
|
82
|
+
headerClass?: string;
|
|
83
|
+
children: readonly TestColumn[];
|
|
84
|
+
context?: TestColumnContext;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ============================================================================
|
|
88
|
+
// Test Helpers
|
|
89
|
+
// ============================================================================
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Helper to create a valid RowObjectType with required __status
|
|
93
|
+
*/
|
|
94
|
+
const createRow = (
|
|
95
|
+
values: Record<string, number | string | boolean | null | undefined>,
|
|
96
|
+
status: "added" | "removed" | "modified" | undefined = undefined,
|
|
97
|
+
): RowObjectType => ({
|
|
98
|
+
...values,
|
|
99
|
+
__status: status,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Helper to create mock CellClassParams from a row
|
|
104
|
+
* This is needed because AG Grid cellClass functions expect CellClassParams
|
|
105
|
+
*/
|
|
106
|
+
const createCellClassParams = (
|
|
107
|
+
row: RowObjectType,
|
|
108
|
+
): CellClassParams<RowObjectType> =>
|
|
109
|
+
({
|
|
110
|
+
data: row,
|
|
111
|
+
value: undefined,
|
|
112
|
+
node: undefined,
|
|
113
|
+
colDef: {},
|
|
114
|
+
column: {},
|
|
115
|
+
api: {},
|
|
116
|
+
rowIndex: 0,
|
|
117
|
+
}) as unknown as CellClassParams<RowObjectType>;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Creates a minimal DiffColumnConfig for testing
|
|
121
|
+
*/
|
|
122
|
+
const createConfig = (
|
|
123
|
+
overrides: Partial<DiffColumnConfig> = {},
|
|
124
|
+
): DiffColumnConfig => ({
|
|
125
|
+
name: "test_column",
|
|
126
|
+
columnStatus: "",
|
|
127
|
+
columnType: "text",
|
|
128
|
+
displayMode: "inline",
|
|
129
|
+
...overrides,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Check if result is a Column (inline mode) - has 'field' property
|
|
134
|
+
* Returns boolean instead of type predicate to avoid ESM type compatibility issues
|
|
135
|
+
*/
|
|
136
|
+
function isColumn(result: DiffColumnResult): boolean {
|
|
137
|
+
return "field" in result && !("children" in result);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Check if result is a ColumnGroup (side_by_side mode) - has 'children' property
|
|
142
|
+
* Returns boolean instead of type predicate to avoid ESM type compatibility issues
|
|
143
|
+
*/
|
|
144
|
+
function isColumnGroup(result: DiffColumnResult): boolean {
|
|
145
|
+
return (
|
|
146
|
+
"children" in result &&
|
|
147
|
+
Array.isArray((result as unknown as TestColumnGroup).children)
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Cast result to TestColumn for accessing column properties
|
|
153
|
+
*/
|
|
154
|
+
function asColumn(result: DiffColumnResult): TestColumn {
|
|
155
|
+
return result as unknown as TestColumn;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Cast result to TestColumnGroup for accessing column group properties
|
|
160
|
+
*/
|
|
161
|
+
function asColumnGroup(result: DiffColumnResult): TestColumnGroup {
|
|
162
|
+
return result as unknown as TestColumnGroup;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Helper to get children from a column group as TestColumn array
|
|
167
|
+
*/
|
|
168
|
+
function getChildren(result: DiffColumnResult): TestColumn[] {
|
|
169
|
+
return asColumnGroup(result).children as TestColumn[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// createCellClassBase Tests
|
|
174
|
+
// ============================================================================
|
|
175
|
+
|
|
176
|
+
describe("createCellClassBase", () => {
|
|
177
|
+
test("returns a function", () => {
|
|
178
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
179
|
+
|
|
180
|
+
expect(typeof cellClassFn).toBe("function");
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("returns 'diff-cell-removed' for removed row status", () => {
|
|
184
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
185
|
+
const row = createRow({}, "removed");
|
|
186
|
+
|
|
187
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("returns 'diff-cell-added' for added row status", () => {
|
|
191
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
192
|
+
const row = createRow({}, "added");
|
|
193
|
+
|
|
194
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("returns undefined for added column status", () => {
|
|
198
|
+
const cellClassFn = createCellClassBase("value", "added");
|
|
199
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
200
|
+
|
|
201
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("returns undefined for removed column status", () => {
|
|
205
|
+
const cellClassFn = createCellClassBase("value", "removed");
|
|
206
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
207
|
+
|
|
208
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("returns 'diff-cell-removed' when base and current values differ", () => {
|
|
212
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
213
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
214
|
+
|
|
215
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test("returns undefined when base and current values are equal", () => {
|
|
219
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
220
|
+
const row = createRow({ base__value: 100, current__value: 100 });
|
|
221
|
+
|
|
222
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test("handles case-insensitive key lookup (lowercase)", () => {
|
|
226
|
+
const cellClassFn = createCellClassBase("Value", "");
|
|
227
|
+
// Keys are lowercased: base__value, current__value
|
|
228
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
229
|
+
|
|
230
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("handles null values", () => {
|
|
234
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
235
|
+
const row = createRow({ base__value: null, current__value: "test" });
|
|
236
|
+
|
|
237
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("handles undefined values (both undefined = equal)", () => {
|
|
241
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
242
|
+
const row = createRow({});
|
|
243
|
+
|
|
244
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test("handles modified row status with equal values", () => {
|
|
248
|
+
const cellClassFn = createCellClassBase("value", "");
|
|
249
|
+
const row = createRow(
|
|
250
|
+
{ base__value: 100, current__value: 100 },
|
|
251
|
+
"modified",
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
// Row status is modified, but this specific column has equal values
|
|
255
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
test("handles object value comparison with lodash isEqual", () => {
|
|
259
|
+
const cellClassFn = createCellClassBase("data", "");
|
|
260
|
+
// Objects with same content should be considered equal
|
|
261
|
+
const row = createRow({});
|
|
262
|
+
// Manually set object values (createRow doesn't support objects in its type)
|
|
263
|
+
(row as Record<string, unknown>).base__data = { a: 1 };
|
|
264
|
+
(row as Record<string, unknown>).current__data = { a: 1 };
|
|
265
|
+
|
|
266
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("detects different objects as modified", () => {
|
|
270
|
+
const cellClassFn = createCellClassBase("data", "");
|
|
271
|
+
const row = createRow({});
|
|
272
|
+
(row as Record<string, unknown>).base__data = { a: 1 };
|
|
273
|
+
(row as Record<string, unknown>).current__data = { a: 2 };
|
|
274
|
+
|
|
275
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// ============================================================================
|
|
280
|
+
// createCellClassCurrent Tests
|
|
281
|
+
// ============================================================================
|
|
282
|
+
|
|
283
|
+
describe("createCellClassCurrent", () => {
|
|
284
|
+
test("returns a function", () => {
|
|
285
|
+
const cellClassFn = createCellClassCurrent("value", "");
|
|
286
|
+
|
|
287
|
+
expect(typeof cellClassFn).toBe("function");
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
test("returns 'diff-cell-removed' for removed row status", () => {
|
|
291
|
+
const cellClassFn = createCellClassCurrent("value", "");
|
|
292
|
+
const row = createRow({}, "removed");
|
|
293
|
+
|
|
294
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("returns 'diff-cell-added' for added row status", () => {
|
|
298
|
+
const cellClassFn = createCellClassCurrent("value", "");
|
|
299
|
+
const row = createRow({}, "added");
|
|
300
|
+
|
|
301
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
test("returns undefined for added column status", () => {
|
|
305
|
+
const cellClassFn = createCellClassCurrent("value", "added");
|
|
306
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
307
|
+
|
|
308
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test("returns undefined for removed column status", () => {
|
|
312
|
+
const cellClassFn = createCellClassCurrent("value", "removed");
|
|
313
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
314
|
+
|
|
315
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
test("returns 'diff-cell-added' when base and current values differ", () => {
|
|
319
|
+
const cellClassFn = createCellClassCurrent("value", "");
|
|
320
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
321
|
+
|
|
322
|
+
// Current column shows "added" styling for modified cells
|
|
323
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
test("returns undefined when base and current values are equal", () => {
|
|
327
|
+
const cellClassFn = createCellClassCurrent("value", "");
|
|
328
|
+
const row = createRow({ base__value: 100, current__value: 100 });
|
|
329
|
+
|
|
330
|
+
expect(cellClassFn(createCellClassParams(row))).toBeUndefined();
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
test("handles case-insensitive key lookup (lowercase)", () => {
|
|
334
|
+
const cellClassFn = createCellClassCurrent("Value", "");
|
|
335
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
336
|
+
|
|
337
|
+
expect(cellClassFn(createCellClassParams(row))).toBe("diff-cell-added");
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// ============================================================================
|
|
342
|
+
// createCellClassBase vs createCellClassCurrent Comparison
|
|
343
|
+
// ============================================================================
|
|
344
|
+
|
|
345
|
+
describe("createCellClassBase vs createCellClassCurrent", () => {
|
|
346
|
+
test("base returns 'diff-cell-removed', current returns 'diff-cell-added' for same modified cell", () => {
|
|
347
|
+
const baseFn = createCellClassBase("value", "");
|
|
348
|
+
const currentFn = createCellClassCurrent("value", "");
|
|
349
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
350
|
+
|
|
351
|
+
expect(baseFn(createCellClassParams(row))).toBe("diff-cell-removed");
|
|
352
|
+
expect(currentFn(createCellClassParams(row))).toBe("diff-cell-added");
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
test("both return same class for row-level status (added/removed)", () => {
|
|
356
|
+
const baseFn = createCellClassBase("value", "");
|
|
357
|
+
const currentFn = createCellClassCurrent("value", "");
|
|
358
|
+
|
|
359
|
+
const addedRow = createRow({}, "added");
|
|
360
|
+
const removedRow = createRow({}, "removed");
|
|
361
|
+
|
|
362
|
+
expect(baseFn(createCellClassParams(addedRow))).toBe(
|
|
363
|
+
currentFn(createCellClassParams(addedRow)),
|
|
364
|
+
);
|
|
365
|
+
expect(baseFn(createCellClassParams(removedRow))).toBe(
|
|
366
|
+
currentFn(createCellClassParams(removedRow)),
|
|
367
|
+
);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
test("both return undefined for unchanged cells", () => {
|
|
371
|
+
const baseFn = createCellClassBase("value", "");
|
|
372
|
+
const currentFn = createCellClassCurrent("value", "");
|
|
373
|
+
const row = createRow({ base__value: 100, current__value: 100 });
|
|
374
|
+
|
|
375
|
+
expect(baseFn(createCellClassParams(row))).toBeUndefined();
|
|
376
|
+
expect(currentFn(createCellClassParams(row))).toBeUndefined();
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
// ============================================================================
|
|
381
|
+
// toDiffColumn - Inline Mode Tests
|
|
382
|
+
// ============================================================================
|
|
383
|
+
|
|
384
|
+
describe("toDiffColumn - inline mode", () => {
|
|
385
|
+
test("returns column with field matching column name", () => {
|
|
386
|
+
const result = toDiffColumn(createConfig({ name: "price" }));
|
|
387
|
+
|
|
388
|
+
expect(isColumn(result)).toBe(true);
|
|
389
|
+
const col = asColumn(result);
|
|
390
|
+
expect(col.field).toBe("price");
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
test("does not have children property", () => {
|
|
394
|
+
const result = toDiffColumn(createConfig({ displayMode: "inline" }));
|
|
395
|
+
|
|
396
|
+
expect(isColumnGroup(result)).toBe(false);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test("includes cellRenderer function (inlineRenderCell)", () => {
|
|
400
|
+
const result = toDiffColumn(createConfig({ displayMode: "inline" }));
|
|
401
|
+
|
|
402
|
+
expect(isColumn(result)).toBe(true);
|
|
403
|
+
const col = asColumn(result);
|
|
404
|
+
expect(col.cellRenderer).toBeDefined();
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
test("preserves columnType", () => {
|
|
408
|
+
const result = toDiffColumn(
|
|
409
|
+
createConfig({ columnType: "number", displayMode: "inline" }),
|
|
410
|
+
);
|
|
411
|
+
|
|
412
|
+
expect(result.context?.columnType).toBe("number");
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
test("preserves columnRenderMode", () => {
|
|
416
|
+
const result = toDiffColumn(
|
|
417
|
+
createConfig({ columnRenderMode: "percent", displayMode: "inline" }),
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
expect(result.context?.columnRenderMode).toBe("percent");
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
test("uses undefined as default columnRenderMode (triggers smart formatting)", () => {
|
|
424
|
+
const result = toDiffColumn(createConfig({ displayMode: "inline" }));
|
|
425
|
+
|
|
426
|
+
expect(result.context?.columnRenderMode).toBeUndefined();
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
test("sets headerClass for added column", () => {
|
|
430
|
+
const result = toDiffColumn(
|
|
431
|
+
createConfig({ columnStatus: "added", displayMode: "inline" }),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
expect(result.headerClass).toBe("diff-header-added");
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
test("sets headerClass for removed column", () => {
|
|
438
|
+
const result = toDiffColumn(
|
|
439
|
+
createConfig({ columnStatus: "removed", displayMode: "inline" }),
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
expect(result.headerClass).toBe("diff-header-removed");
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test("headerClass is undefined for empty status", () => {
|
|
446
|
+
const result = toDiffColumn(
|
|
447
|
+
createConfig({ columnStatus: "", displayMode: "inline" }),
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
expect(result.headerClass).toBeUndefined();
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
test("has headerComponent", () => {
|
|
454
|
+
const result = toDiffColumn(createConfig({ displayMode: "inline" }));
|
|
455
|
+
|
|
456
|
+
// biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
|
|
457
|
+
expect((result as any).headerComponent).toBeDefined();
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
// ============================================================================
|
|
462
|
+
// toDiffColumn - Side-by-Side Mode Tests
|
|
463
|
+
// ============================================================================
|
|
464
|
+
|
|
465
|
+
describe("toDiffColumn - side_by_side mode", () => {
|
|
466
|
+
test("returns column group with children", () => {
|
|
467
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
468
|
+
|
|
469
|
+
expect(isColumnGroup(result)).toBe(true);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
test("has exactly 2 children (base and current)", () => {
|
|
473
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
474
|
+
|
|
475
|
+
const children = getChildren(result);
|
|
476
|
+
expect(children).toHaveLength(2);
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
test("children have correct fields (base__name and current__name)", () => {
|
|
480
|
+
const result = toDiffColumn(
|
|
481
|
+
createConfig({ name: "value", displayMode: "side_by_side" }),
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
const children = getChildren(result);
|
|
485
|
+
const fields = children.map((child) => child.field);
|
|
486
|
+
expect(fields).toContain("base__value");
|
|
487
|
+
expect(fields).toContain("current__value");
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test("uses default titles 'Base' and 'Current'", () => {
|
|
491
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
492
|
+
|
|
493
|
+
const children = getChildren(result);
|
|
494
|
+
const names = children.map((child) => child.headerName);
|
|
495
|
+
expect(names).toContain("Base");
|
|
496
|
+
expect(names).toContain("Current");
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
test("uses custom baseTitle and currentTitle", () => {
|
|
500
|
+
const result = toDiffColumn(
|
|
501
|
+
createConfig({
|
|
502
|
+
displayMode: "side_by_side",
|
|
503
|
+
baseTitle: "Before",
|
|
504
|
+
currentTitle: "After",
|
|
505
|
+
}),
|
|
506
|
+
);
|
|
507
|
+
|
|
508
|
+
const children = getChildren(result);
|
|
509
|
+
const names = children.map((child) => child.headerName);
|
|
510
|
+
expect(names).toContain("Before");
|
|
511
|
+
expect(names).toContain("After");
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
test("children have cellClass functions", () => {
|
|
515
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
516
|
+
|
|
517
|
+
const children = getChildren(result);
|
|
518
|
+
children.forEach((child) => {
|
|
519
|
+
expect(typeof child.cellClass).toBe("function");
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
test("children have cellRenderer function (defaultRenderCell)", () => {
|
|
524
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
525
|
+
|
|
526
|
+
const children = getChildren(result);
|
|
527
|
+
children.forEach((child) => {
|
|
528
|
+
expect(child.cellRenderer).toBeDefined();
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
test("children inherit headerCellClass", () => {
|
|
533
|
+
const result = toDiffColumn(
|
|
534
|
+
createConfig({ columnStatus: "added", displayMode: "side_by_side" }),
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
const children = getChildren(result);
|
|
538
|
+
children.forEach((child) => {
|
|
539
|
+
expect(child.headerClass).toBe("diff-header-added");
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
|
|
543
|
+
test("children have columnType and columnRenderMode", () => {
|
|
544
|
+
const result = toDiffColumn(
|
|
545
|
+
createConfig({
|
|
546
|
+
displayMode: "side_by_side",
|
|
547
|
+
columnType: "number",
|
|
548
|
+
columnRenderMode: 2,
|
|
549
|
+
}),
|
|
550
|
+
);
|
|
551
|
+
|
|
552
|
+
const children = getChildren(result);
|
|
553
|
+
children.forEach((child) => {
|
|
554
|
+
expect(child.context?.columnType).toBe("number");
|
|
555
|
+
expect(child.context?.columnRenderMode).toBe(2);
|
|
556
|
+
});
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
test("has headerGroupComponent", () => {
|
|
560
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
561
|
+
|
|
562
|
+
// biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
|
|
563
|
+
expect((result as any).headerGroupComponent).toBeDefined();
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
test("does not have field property (column group)", () => {
|
|
567
|
+
const result = toDiffColumn(createConfig({ displayMode: "side_by_side" }));
|
|
568
|
+
|
|
569
|
+
// Column groups don't have a field at the top level
|
|
570
|
+
expect(isColumn(result)).toBe(false);
|
|
571
|
+
});
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// ============================================================================
|
|
575
|
+
// toDiffColumn - headerProps Tests
|
|
576
|
+
// ============================================================================
|
|
577
|
+
|
|
578
|
+
describe("toDiffColumn - headerProps", () => {
|
|
579
|
+
test("passes headerProps to DataFrameColumnGroupHeader", () => {
|
|
580
|
+
const headerProps = {
|
|
581
|
+
primaryKeys: ["id"],
|
|
582
|
+
pinnedColumns: ["name"],
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
const result = toDiffColumn(
|
|
586
|
+
createConfig({
|
|
587
|
+
headerProps,
|
|
588
|
+
displayMode: "inline",
|
|
589
|
+
}),
|
|
590
|
+
);
|
|
591
|
+
|
|
592
|
+
// The header is rendered via headerComponent
|
|
593
|
+
// biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
|
|
594
|
+
expect((result as any).headerComponent).toBeDefined();
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
test("uses empty object when headerProps is undefined", () => {
|
|
598
|
+
const result = toDiffColumn(
|
|
599
|
+
createConfig({
|
|
600
|
+
headerProps: undefined,
|
|
601
|
+
displayMode: "inline",
|
|
602
|
+
}),
|
|
603
|
+
);
|
|
604
|
+
|
|
605
|
+
// biome-ignore lint/suspicious/noExplicitAny: Accessing AG Grid internal property for testing
|
|
606
|
+
expect((result as any).headerComponent).toBeDefined();
|
|
607
|
+
});
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// ============================================================================
|
|
611
|
+
// toDiffColumn - Edge Cases
|
|
612
|
+
// ============================================================================
|
|
613
|
+
|
|
614
|
+
describe("toDiffColumn - edge cases", () => {
|
|
615
|
+
test("handles empty column name", () => {
|
|
616
|
+
const result = toDiffColumn(createConfig({ name: "" }));
|
|
617
|
+
|
|
618
|
+
const col = asColumn(result);
|
|
619
|
+
expect(col.field).toBe("");
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
test("handles column name with special characters", () => {
|
|
623
|
+
const result = toDiffColumn(createConfig({ name: "col-with-dashes" }));
|
|
624
|
+
|
|
625
|
+
const col = asColumn(result);
|
|
626
|
+
expect(col.field).toBe("col-with-dashes");
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
test("handles column name with spaces", () => {
|
|
630
|
+
const result = toDiffColumn(createConfig({ name: "Column Name" }));
|
|
631
|
+
|
|
632
|
+
const col = asColumn(result);
|
|
633
|
+
expect(col.field).toBe("Column Name");
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test("handles various columnType values", () => {
|
|
637
|
+
const types = [
|
|
638
|
+
"text",
|
|
639
|
+
"number",
|
|
640
|
+
"integer",
|
|
641
|
+
"boolean",
|
|
642
|
+
"date",
|
|
643
|
+
"datetime",
|
|
644
|
+
"unknown",
|
|
645
|
+
] as const;
|
|
646
|
+
|
|
647
|
+
types.forEach((type) => {
|
|
648
|
+
const result = toDiffColumn(createConfig({ columnType: type }));
|
|
649
|
+
expect(result.context?.columnType).toBe(type);
|
|
650
|
+
});
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
test("handles numeric columnRenderMode", () => {
|
|
654
|
+
const modes = [2] as const;
|
|
655
|
+
|
|
656
|
+
modes.forEach((mode) => {
|
|
657
|
+
const result = toDiffColumn(createConfig({ columnRenderMode: mode }));
|
|
658
|
+
expect(result.context?.columnRenderMode).toBe(mode);
|
|
659
|
+
});
|
|
660
|
+
});
|
|
661
|
+
|
|
662
|
+
test("handles modified columnStatus (no special header class)", () => {
|
|
663
|
+
const result = toDiffColumn(createConfig({ columnStatus: "modified" }));
|
|
664
|
+
|
|
665
|
+
// "modified" doesn't have a special header class in getHeaderCellClass
|
|
666
|
+
expect(result.headerClass).toBeUndefined();
|
|
667
|
+
});
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
// ============================================================================
|
|
671
|
+
// Integration: Cell Class Functions in Side-by-Side Mode
|
|
672
|
+
// ============================================================================
|
|
673
|
+
|
|
674
|
+
describe("toDiffColumn - side_by_side cell class integration", () => {
|
|
675
|
+
test("base child cellClass returns correct class for modified row", () => {
|
|
676
|
+
const result = toDiffColumn(
|
|
677
|
+
createConfig({ name: "value", displayMode: "side_by_side" }),
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
const children = getChildren(result);
|
|
681
|
+
const baseChild = children[0];
|
|
682
|
+
if (typeof baseChild.cellClass === "function") {
|
|
683
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
684
|
+
expect(baseChild.cellClass(createCellClassParams(row))).toBe(
|
|
685
|
+
"diff-cell-removed",
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
test("current child cellClass returns correct class for modified row", () => {
|
|
691
|
+
const result = toDiffColumn(
|
|
692
|
+
createConfig({ name: "value", displayMode: "side_by_side" }),
|
|
693
|
+
);
|
|
694
|
+
|
|
695
|
+
const children = getChildren(result);
|
|
696
|
+
const currentChild = children[1];
|
|
697
|
+
if (typeof currentChild.cellClass === "function") {
|
|
698
|
+
const row = createRow({ base__value: 100, current__value: 200 });
|
|
699
|
+
expect(currentChild.cellClass(createCellClassParams(row))).toBe(
|
|
700
|
+
"diff-cell-added",
|
|
701
|
+
);
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
test("both children return undefined for unchanged row", () => {
|
|
706
|
+
const result = toDiffColumn(
|
|
707
|
+
createConfig({ name: "value", displayMode: "side_by_side" }),
|
|
708
|
+
);
|
|
709
|
+
|
|
710
|
+
const children = getChildren(result);
|
|
711
|
+
const row = createRow({ base__value: 100, current__value: 100 });
|
|
712
|
+
|
|
713
|
+
children.forEach((child) => {
|
|
714
|
+
if (typeof child.cellClass === "function") {
|
|
715
|
+
expect(child.cellClass(createCellClassParams(row))).toBeUndefined();
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
});
|