mirror of
https://github.com/IRS-Public/direct-file.git
synced 2025-08-14 08:40:53 +00:00
Merge 5d754abe13
into e0d5c84451
This commit is contained in:
commit
95f0ae5ce4
111 changed files with 3088 additions and 3393 deletions
2
direct-file/.vscode/settings.json
vendored
2
direct-file/.vscode/settings.json
vendored
|
@ -7,4 +7,6 @@
|
||||||
"files.watcherExclude": {
|
"files.watcherExclude": {
|
||||||
"**/target": true
|
"**/target": true
|
||||||
},
|
},
|
||||||
|
"java.compile.nullAnalysis.mode": "automatic",
|
||||||
|
"java.configuration.updateBuildConfiguration": "interactive",
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
"react-router-dom": "^6.27.0",
|
"react-router-dom": "^6.27.0",
|
||||||
"ts-pattern": "^5.5.0",
|
"ts-pattern": "^5.5.0",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
"vite": "^5.4.15",
|
"vite": "^7.1.0",
|
||||||
"vite-tsconfig-paths": "^4.2.0",
|
"vite-tsconfig-paths": "^4.2.0",
|
||||||
"web-vitals": "^2.1.0"
|
"web-vitals": "^2.1.0"
|
||||||
},
|
},
|
||||||
|
@ -43,8 +43,6 @@
|
||||||
"coverage": "vitest --coverage",
|
"coverage": "vitest --coverage",
|
||||||
"export-locales": "vite-node src/scripts/exportLocales.ts",
|
"export-locales": "vite-node src/scripts/exportLocales.ts",
|
||||||
"export-ga-events": "vite-node src/scripts/exportGAEvents.ts",
|
"export-ga-events": "vite-node src/scripts/exportGAEvents.ts",
|
||||||
"format-write": "cd .. && npm run format-write",
|
|
||||||
"format": "cd .. && npm run format",
|
|
||||||
"generate-dependency-graph": "vite-node src/fact-dictionary/generateDependencyGraph.ts",
|
"generate-dependency-graph": "vite-node src/fact-dictionary/generateDependencyGraph.ts",
|
||||||
"generate-fact-dictionary": "vite-node src/fact-dictionary/generate-src/generate.ts",
|
"generate-fact-dictionary": "vite-node src/fact-dictionary/generate-src/generate.ts",
|
||||||
"generate-module-graph": "vite-node src/fact-dictionary/generateModuleGraph.ts",
|
"generate-module-graph": "vite-node src/fact-dictionary/generateModuleGraph.ts",
|
||||||
|
@ -57,7 +55,7 @@
|
||||||
"postimport-locales": "prettier -w src/locales",
|
"postimport-locales": "prettier -w src/locales",
|
||||||
"prebuild:ts": "npm run generate-fact-dictionary",
|
"prebuild:ts": "npm run generate-fact-dictionary",
|
||||||
"prelint:ts": "npm run build:ts",
|
"prelint:ts": "npm run build:ts",
|
||||||
"prestart": "npm install; npm run generate-fact-dictionary",
|
"prestart": "npm install && npm run generate-fact-dictionary",
|
||||||
"prestart:promisc": "npm run generate-fact-dictionary",
|
"prestart:promisc": "npm run generate-fact-dictionary",
|
||||||
"pretest:ci:3": "npm run generate-fact-dictionary",
|
"pretest:ci:3": "npm run generate-fact-dictionary",
|
||||||
"pretest:ci:2": "npm run generate-fact-dictionary",
|
"pretest:ci:2": "npm run generate-fact-dictionary",
|
||||||
|
@ -87,8 +85,8 @@
|
||||||
"@types/react-dom": "^18.3.1",
|
"@types/react-dom": "^18.3.1",
|
||||||
"@types/stringify-object": "^4.0.5",
|
"@types/stringify-object": "^4.0.5",
|
||||||
"@types/uuid": "^9.0.1",
|
"@types/uuid": "^9.0.1",
|
||||||
"@vitest/coverage-v8": "^1.4.0",
|
"@vitest/coverage-v8": "^3.2.4",
|
||||||
"@vitest/ui": "^1.4.0",
|
"@vitest/ui": "^3.2.4",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"browserslist-to-esbuild": "^1.2.0",
|
"browserslist-to-esbuild": "^1.2.0",
|
||||||
"eslint-plugin-df-rules": "^1.0.0",
|
"eslint-plugin-df-rules": "^1.0.0",
|
||||||
|
@ -101,9 +99,9 @@
|
||||||
"stringify-object": "^5.0.0",
|
"stringify-object": "^5.0.0",
|
||||||
"ts-node": "^10.9.1",
|
"ts-node": "^10.9.1",
|
||||||
"typescript": "5.6.3",
|
"typescript": "5.6.3",
|
||||||
"vite-node": "^2.1.8",
|
"vite-node": "^3.2.4",
|
||||||
"vite-plugin-singlefile": "^0.13.5",
|
"vite-plugin-singlefile": "^0.13.5",
|
||||||
"vitest": "^1.6.1",
|
"vitest": "^3.2.4",
|
||||||
"zod": "^3.23.8"
|
"zod": "^3.23.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
module.exports = {
|
export default {
|
||||||
plugins: {
|
plugins: {
|
||||||
autoprefixer: {},
|
autoprefixer: {},
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import { mockUseTranslation } from './test/mocks/mockFunctions.js';
|
import { mockUseTranslation } from './test/mocks/mockFunctions.js';
|
||||||
import App from './App.js';
|
import App from './App.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`react-i18next`, () => ({
|
vi.mock(`react-i18next`, () => ({
|
||||||
useTranslation: mockUseTranslation,
|
useTranslation: mockUseTranslation,
|
||||||
|
|
|
@ -36,7 +36,7 @@ import { isFlowEnabled } from './constants/pageConstants.js';
|
||||||
import { store } from './redux/store.js';
|
import { store } from './redux/store.js';
|
||||||
|
|
||||||
// These styles are global so we make sure it is imported at the root
|
// These styles are global so we make sure it is imported at the root
|
||||||
import '@trussworks/react-uswds/lib/index.css';
|
import '../node_modules/@trussworks/react-uswds/lib/index.css'
|
||||||
import FileYourStateTaxesDetails from './components/FileYourStateTaxesDetails/FileYourStateTaxesDetails.js';
|
import FileYourStateTaxesDetails from './components/FileYourStateTaxesDetails/FileYourStateTaxesDetails.js';
|
||||||
import { FactGraphTranslationContext } from './context/FactGraphTranslationContext.js';
|
import { FactGraphTranslationContext } from './context/FactGraphTranslationContext.js';
|
||||||
import { DataImportMagicScreen } from './components/DataImportMagicScreen/DataImportMagicScreen.js';
|
import { DataImportMagicScreen } from './components/DataImportMagicScreen/DataImportMagicScreen.js';
|
||||||
|
|
|
@ -208,28 +208,28 @@ const AllScreensMenu: FC<AllScreensMenuProps> = ({
|
||||||
id='check-show-conditionals'
|
id='check-show-conditionals'
|
||||||
name='conditionals'
|
name='conditionals'
|
||||||
label='Show conditional screen logic'
|
label='Show conditional screen logic'
|
||||||
onChange={(e) => onConditionalScreenLogicToggle(e.target.checked)}
|
onChange={(e: any) => onConditionalScreenLogicToggle(e.target.checked)}
|
||||||
checked={showConditionalScreenLogic}
|
checked={showConditionalScreenLogic}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
id='check-show-modals'
|
id='check-show-modals'
|
||||||
name='show-modals'
|
name='show-modals'
|
||||||
label='Show modals'
|
label='Show modals'
|
||||||
onChange={(e) => setShowModals(e.target.checked)}
|
onChange={(e: any) => setShowModals(e.target.checked)}
|
||||||
checked={showModals}
|
checked={showModals}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
id='check-show-dataviews'
|
id='check-show-dataviews'
|
||||||
name='show-dataviews'
|
name='show-dataviews'
|
||||||
label='Show dataviews'
|
label='Show dataviews'
|
||||||
onChange={(e) => setShowDataviews(e.target.checked)}
|
onChange={(e: any) => setShowDataviews(e.target.checked)}
|
||||||
checked={showDataviews}
|
checked={showDataviews}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
id='check-hide-alerts'
|
id='check-hide-alerts'
|
||||||
name='hide-alerts'
|
name='hide-alerts'
|
||||||
label='Hide alerts'
|
label='Hide alerts'
|
||||||
onChange={(e) => setHideAlerts(e.target.checked)}
|
onChange={(e: any) => setHideAlerts(e.target.checked)}
|
||||||
checked={hideAlerts}
|
checked={hideAlerts}
|
||||||
/>
|
/>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { FC } from 'react';
|
import { FC } from 'react';
|
||||||
import { Accordion, Tag } from '@trussworks/react-uswds';
|
import { Accordion, Tag } from '@trussworks/react-uswds';
|
||||||
import { AccordionItemProps } from '@trussworks/react-uswds/lib/components/Accordion/Accordion.js';
|
import { CommonAccordionItemProps } from '@irs/df-common';
|
||||||
import { dependenciesPerTaxTest } from './AllScreensContext.js';
|
import { dependenciesPerTaxTest } from './AllScreensContext.js';
|
||||||
import { BatchDetails, CONTENT_BATCHES, calculateScreenStatus } from '../flow/batches.js';
|
import { BatchDetails, CONTENT_BATCHES, calculateScreenStatus } from '../flow/batches.js';
|
||||||
import { ScreenConfig } from '../flow/ScreenConfig.js';
|
import { ScreenConfig } from '../flow/ScreenConfig.js';
|
||||||
|
@ -85,7 +85,7 @@ const AllScreensScreenHeader: FC<AllScreensScreenHeaderProps> = ({ screen }) =>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
if (taxTestsAffectedByScreen.length > 0) {
|
if (taxTestsAffectedByScreen.length > 0) {
|
||||||
const taxTestsItems: AccordionItemProps[] = [
|
const taxTestsItems: CommonAccordionItemProps[] = [
|
||||||
{
|
{
|
||||||
title: `Tax tests affected (${taxTestsAffectedByScreen.length})`,
|
title: `Tax tests affected (${taxTestsAffectedByScreen.length})`,
|
||||||
content: (
|
content: (
|
||||||
|
@ -106,7 +106,7 @@ const AllScreensScreenHeader: FC<AllScreensScreenHeaderProps> = ({ screen }) =>
|
||||||
|
|
||||||
if (screen.batches.length > 0) {
|
if (screen.batches.length > 0) {
|
||||||
const batchDetailsContent = getBatchDetailsContent(screen);
|
const batchDetailsContent = getBatchDetailsContent(screen);
|
||||||
const batchDetailsItems: AccordionItemProps[] = [
|
const batchDetailsItems: CommonAccordionItemProps[] = [
|
||||||
{
|
{
|
||||||
title: `Batch Details`,
|
title: `Batch Details`,
|
||||||
content: batchDetailsContent,
|
content: batchDetailsContent,
|
||||||
|
@ -135,7 +135,7 @@ const AllScreensScreenHeader: FC<AllScreensScreenHeaderProps> = ({ screen }) =>
|
||||||
screenHeaderTitle.push(<Tag background='#783cb9'>{taxTestsAffectedByScreen.length} tests</Tag>);
|
screenHeaderTitle.push(<Tag background='#783cb9'>{taxTestsAffectedByScreen.length} tests</Tag>);
|
||||||
}
|
}
|
||||||
|
|
||||||
const screenHeaderItems: AccordionItemProps[] = [
|
const screenHeaderItems: CommonAccordionItemProps[] = [
|
||||||
{
|
{
|
||||||
title: screenHeaderTitle,
|
title: screenHeaderTitle,
|
||||||
content: screenHeaderContent,
|
content: screenHeaderContent,
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { v4 as uuidv4 } from 'uuid';
|
||||||
import { SubmissionStatusContextType } from '../../context/SubmissionStatusContext/SubmissionStatusContext.js';
|
import { SubmissionStatusContextType } from '../../context/SubmissionStatusContext/SubmissionStatusContext.js';
|
||||||
import { TaxReturnSubmissionStatus } from '../../types/core.js';
|
import { TaxReturnSubmissionStatus } from '../../types/core.js';
|
||||||
import { InterceptingFactGraph } from '../../factgraph/InterceptingFactGraph.js';
|
import { InterceptingFactGraph } from '../../factgraph/InterceptingFactGraph.js';
|
||||||
import scenarioJson from '../../test/scenarioTests/jsonScenarios/mfj-all-income-types-withholding.json';
|
import scenarioJson from '../../../../../backend/src/test/resources/scenarios/mfj-all-income-types-withholding.json'
|
||||||
import { TaxReturnsSliceStateData } from '../../redux/slices/tax-return/taxReturnSlice.js';
|
import { TaxReturnsSliceStateData } from '../../redux/slices/tax-return/taxReturnSlice.js';
|
||||||
|
|
||||||
const noop = () => {
|
const noop = () => {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { sessionStorageMock } from '../test/mocks/mockFunctions.js';
|
import { sessionStorageMock } from '../test/mocks/mockFunctions.js';
|
||||||
import { SessionClock } from './session.js';
|
import { SessionClock } from './session.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const SessionManagerMock = {
|
const SessionManagerMock = {
|
||||||
closeAlert: vi.fn(),
|
closeAlert: vi.fn(),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import MefAlert, { MefAlertProps } from './MefAlert.js';
|
import MefAlert, { MefAlertProps } from './MefAlert.js';
|
||||||
import { render, screen, within } from '@testing-library/react';
|
import { render, screen, within } from '@testing-library/react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockT, mockI18n } = vi.hoisted(() => {
|
const { mockT, mockI18n } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { i18n, renderWithTranslationProvider as render } from '../../test/test-utils.js';
|
import { i18n, renderWithTranslationProvider as render } from '../../test/test-utils.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
import CertifyCheckbox from './CertifyCheckbox.js';
|
import CertifyCheckbox from './CertifyCheckbox.js';
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { Mock } from 'vitest';
|
||||||
import mockEnYaml from '../../locales/en.yaml';
|
import mockEnYaml from '../../locales/en.yaml';
|
||||||
import { mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
import { mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
||||||
import ClosingSoonBanner from './index.js';
|
import ClosingSoonBanner from './index.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`react-i18next`, () => ({
|
vi.mock(`react-i18next`, () => ({
|
||||||
useTranslation: mockUseTranslation,
|
useTranslation: mockUseTranslation,
|
||||||
|
|
|
@ -5,13 +5,14 @@ import CollectionDataPreview from './CollectionDataPreview.js';
|
||||||
import { Path } from '../../flow/Path.js';
|
import { Path } from '../../flow/Path.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { store } from '../../redux/store.js';
|
import { store } from '../../redux/store.js';
|
||||||
import marge from '../../redux/slices/data-import/mocks/marge.json';
|
import marge from '../../../../../backend/src/main/resources/dataimportservice/mocks/marge.json'
|
||||||
import { processPopulateResult } from '../../redux/slices/data-import/processPopulateResult.js';
|
import { processPopulateResult } from '../../redux/slices/data-import/processPopulateResult.js';
|
||||||
import { DataImportRootResponseSchema } from '../../redux/slices/data-import/schema/DataImportServiceResponse.js';
|
import { DataImportRootResponseSchema } from '../../redux/slices/data-import/schema/DataImportServiceResponse.js';
|
||||||
import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
||||||
import mockEnYaml from '../../locales/en.yaml';
|
import mockEnYaml from '../../locales/en.yaml';
|
||||||
import { getEmptySystemAlertsMap, SystemAlertContext } from '../../context/SystemAlertContext/SystemAlertContext.js';
|
import { getEmptySystemAlertsMap, SystemAlertContext } from '../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import * as useApiHook from '../../hooks/useApiHook.js';
|
import * as useApiHook from '../../hooks/useApiHook.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`react-i18next`, () => ({
|
vi.mock(`react-i18next`, () => ({
|
||||||
useTranslation: mockUseTranslation,
|
useTranslation: mockUseTranslation,
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
import ConfirmationModal from './ConfirmationModal.js';
|
import ConfirmationModal from './ConfirmationModal.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const i18next = await initI18n();
|
const i18next = await initI18n();
|
||||||
i18next.addResourceBundle(`test`, `translation`, {
|
i18next.addResourceBundle(`test`, `translation`, {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
||||||
import { NetworkConnectionContext } from '../../context/networkConnectionContext.js';
|
import { NetworkConnectionContext } from '../../context/networkConnectionContext.js';
|
||||||
import ConnectivityBanner from './index.js';
|
import ConnectivityBanner from './index.js';
|
||||||
import { NetworkStatus } from '../../hooks/useNetworkConnectionStatus.js';
|
import { NetworkStatus } from '../../hooks/useNetworkConnectionStatus.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`react-i18next`, () => ({
|
vi.mock(`react-i18next`, () => ({
|
||||||
useTranslation: mockUseTranslation,
|
useTranslation: mockUseTranslation,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { render, screen } from '@testing-library/react';
|
||||||
|
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
import ContentDisplay from './ContentDisplay.js';
|
import ContentDisplay from './ContentDisplay.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {
|
||||||
} from '../../constants/taxConstants.js';
|
} from '../../constants/taxConstants.js';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { expect } from 'vitest';
|
import { expect } from 'vitest';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { v4 as uuidv4 } from 'uuid';
|
||||||
import { beforeAll, afterAll } from 'vitest';
|
import { beforeAll, afterAll } from 'vitest';
|
||||||
import { MEF_REJECTION_ERROR_CODES } from '../../constants/rejectionConstants.js';
|
import { MEF_REJECTION_ERROR_CODES } from '../../constants/rejectionConstants.js';
|
||||||
import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { t } = vi.hoisted(() => {
|
const { t } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { ComplexFormControl } from './ComplexFormControl.js';
|
||||||
import { PAGE_HEADING_ID } from '../PageTitle/index.js';
|
import { PAGE_HEADING_ID } from '../PageTitle/index.js';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { Path } from '../../fact-dictionary/Path.js';
|
import { Path } from '../../fact-dictionary/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React, { forwardRef, useEffect, useState } from 'react';
|
import React, { forwardRef, useEffect, useState } from 'react';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import type { TextInputProps } from '@trussworks/react-uswds/lib/components/forms/TextInput/TextInput.js';
|
import type { TextInputProps } from './DFTextInput.js';
|
||||||
import { DFTextInput } from './DFTextInput.js';
|
import { DFTextInput } from './DFTextInput.js';
|
||||||
|
|
||||||
export type AllProps = TextInputProps & {
|
export type AllProps = TextInputProps & {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { userEvent } from '@testing-library/user-event';
|
||||||
import { TextFormControl } from './TextFormControl.js';
|
import { TextFormControl } from './TextFormControl.js';
|
||||||
import { ConcretePath, JSEitherL, JSEitherR, JSeither } from '@irs/js-factgraph-scala';
|
import { ConcretePath, JSEitherL, JSEitherR, JSeither } from '@irs/js-factgraph-scala';
|
||||||
import { Path } from '../../fact-dictionary/Path.js';
|
import { Path } from '../../fact-dictionary/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Dispatch, SetStateAction, useId } from 'react';
|
import { Dispatch, SetStateAction, useId } from 'react';
|
||||||
import { ConcretePath, JSeither } from '@irs/js-factgraph-scala';
|
import { ConcretePath, JSeither } from '@irs/js-factgraph-scala';
|
||||||
import { FormGroup, InputGroup, InputPrefix, TextInput, InputSuffix } from '@trussworks/react-uswds';
|
import { FormGroup, InputGroup, InputPrefix, TextInput, InputSuffix } from '@trussworks/react-uswds';
|
||||||
import type { TextInputProps } from '@trussworks/react-uswds/lib/components/forms/TextInput/TextInput.js';
|
import type { TextInputProps } from './DFTextInput.js';
|
||||||
import { useFactControl } from '../../hooks/useFactControl.js';
|
import { useFactControl } from '../../hooks/useFactControl.js';
|
||||||
import { buildControlErrorId, buildFormControlId, buildHintId, buildHintKey, sanitizeString } from './helpers.js';
|
import { buildControlErrorId, buildFormControlId, buildHintId, buildHintKey, sanitizeString } from './helpers.js';
|
||||||
import Translation from '../Translation/index.js';
|
import Translation from '../Translation/index.js';
|
||||||
|
@ -191,7 +191,7 @@ export function TextFormControl<FactValue, FactError>({
|
||||||
<SimpleTextFormControl
|
<SimpleTextFormControl
|
||||||
errorMessage={errorMessage}
|
errorMessage={errorMessage}
|
||||||
required={required}
|
required={required}
|
||||||
onChange={(event) => onChange(event.target.value)}
|
onChange={(event: any) => onChange(event.target.value)}
|
||||||
{...formControlProps}
|
{...formControlProps}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
||||||
import Head from './Head.js';
|
import Head from './Head.js';
|
||||||
import { NetworkConnectionContext } from '../../context/networkConnectionContext.js';
|
import { NetworkConnectionContext } from '../../context/networkConnectionContext.js';
|
||||||
import { Helmet, HelmetProvider } from 'react-helmet-async';
|
import { Helmet, HelmetProvider } from 'react-helmet-async';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`react-i18next`, () => ({
|
vi.mock(`react-i18next`, () => ({
|
||||||
useTranslation: mockUseTranslation,
|
useTranslation: mockUseTranslation,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { BrowserRouter } from 'react-router-dom';
|
||||||
import mockEnYaml from '../../locales/en.yaml';
|
import mockEnYaml from '../../locales/en.yaml';
|
||||||
import { sessionStorageMock, mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
import { sessionStorageMock, mockUseTranslation } from '../../test/mocks/mockFunctions.js';
|
||||||
import { authKeys } from '../../auth/constants.js';
|
import { authKeys } from '../../auth/constants.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
import Header from './Header.js';
|
import Header from './Header.js';
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@ import { FC, PropsWithChildren } from 'react';
|
||||||
import { Icon } from '@trussworks/react-uswds';
|
import { Icon } from '@trussworks/react-uswds';
|
||||||
// mysterious linter error, but the build is fine
|
// mysterious linter error, but the build is fine
|
||||||
// eslint-disable-next-line import/no-unresolved
|
// eslint-disable-next-line import/no-unresolved
|
||||||
import { IconProps } from '@trussworks/react-uswds/lib/components/Icon/Icon.js';
|
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import styles from './IconDisplay.module.scss';
|
import styles from './IconDisplay.module.scss';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
@ -18,7 +17,7 @@ export type IconDisplayProps = PropsWithChildren<
|
||||||
style?: React.CSSProperties;
|
style?: React.CSSProperties;
|
||||||
i18nKey?: string;
|
i18nKey?: string;
|
||||||
isCentered?: boolean;
|
isCentered?: boolean;
|
||||||
} & Omit<IconProps, `path`>
|
} & any
|
||||||
>;
|
>;
|
||||||
|
|
||||||
/* we can pass in className and bare style props, which will be merged with the styles from the module,
|
/* we can pass in className and bare style props, which will be merged with the styles from the module,
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
||||||
import { setupStore } from '../../redux/store.js';
|
import { setupStore } from '../../redux/store.js';
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import { BrowserRouter } from 'react-router-dom';
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
import IconList from './IconList.js';
|
import IconList from './IconList.js';
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { PropsWithoutRef, ComponentProps } from 'react';
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import IntroContent from './IntroContent.js';
|
import IntroContent from './IntroContent.js';
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
import type { ErrorMessage } from '@trussworks/react-uswds';
|
import type { ErrorMessage } from '@trussworks/react-uswds';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stylistically identical to trusswork's ErrorMessage component, but without the alert role
|
* Stylistically identical to trusswork's ErrorMessage component, but without the alert role
|
||||||
*/
|
*/
|
||||||
export const QuietErrorMessage: typeof ErrorMessage = ({ children, className, id }) => {
|
type Props = {
|
||||||
|
children: React.ReactNode;
|
||||||
|
className: string;
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
export const QuietErrorMessage: typeof ErrorMessage = ({ children, className, id }: Props) => {
|
||||||
const classes = classnames(`usa-error-message`, className);
|
const classes = classnames(`usa-error-message`, className);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -28,8 +28,6 @@ function parseAlertsByType<AlertConfig extends AggregatedAlertConfig>(alerts: Al
|
||||||
case `error`:
|
case `error`:
|
||||||
errors.push(alert);
|
errors.push(alert);
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
assertNever(alert.props.type);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -94,7 +92,7 @@ const ScreenAlertAggregator = ({
|
||||||
// Mef errors
|
// Mef errors
|
||||||
mefErrors.map((mefError) => (
|
mefErrors.map((mefError) => (
|
||||||
<MefAlert
|
<MefAlert
|
||||||
{...mefError.props}
|
{...mefError.props as any}
|
||||||
collectionId={collectionId}
|
collectionId={collectionId}
|
||||||
key={`${buildAlertKey(mefError)}-${mefError.props.mefErrorCode}`}
|
key={`${buildAlertKey(mefError)}-${mefError.props.mefErrorCode}`}
|
||||||
/>
|
/>
|
||||||
|
@ -103,7 +101,7 @@ const ScreenAlertAggregator = ({
|
||||||
{
|
{
|
||||||
// Tax return errors
|
// Tax return errors
|
||||||
taxReturnErrors.map((taxReturnError) => (
|
taxReturnErrors.map((taxReturnError) => (
|
||||||
<TaxReturnAlert {...taxReturnError.props} collectionId={collectionId} key={buildAlertKey(taxReturnError)} />
|
<TaxReturnAlert {...taxReturnError.props as any} collectionId={collectionId} key={buildAlertKey(taxReturnError)} />
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -114,7 +112,7 @@ const ScreenAlertAggregator = ({
|
||||||
// MeF warnings
|
// MeF warnings
|
||||||
mefWarnings.map((mefWarning) => (
|
mefWarnings.map((mefWarning) => (
|
||||||
<MefAlert
|
<MefAlert
|
||||||
{...mefWarning.props}
|
{...mefWarning.props as any}
|
||||||
collectionId={collectionId}
|
collectionId={collectionId}
|
||||||
key={`${buildAlertKey(mefWarning)}-${mefWarning.props.mefErrorCode}`}
|
key={`${buildAlertKey(mefWarning)}-${mefWarning.props.mefErrorCode}`}
|
||||||
/>
|
/>
|
||||||
|
@ -126,7 +124,7 @@ const ScreenAlertAggregator = ({
|
||||||
const { childConfigs, ...props } = taxReturnWarning.props;
|
const { childConfigs, ...props } = taxReturnWarning.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TaxReturnAlert {...props} collectionId={collectionId} key={buildAlertKey(taxReturnWarning)}>
|
<TaxReturnAlert {...props as any} collectionId={collectionId} key={buildAlertKey(taxReturnWarning)}>
|
||||||
{childConfigs?.map((childConfig) => {
|
{childConfigs?.map((childConfig) => {
|
||||||
return (
|
return (
|
||||||
<RenderedScreenContent
|
<RenderedScreenContent
|
||||||
|
|
|
@ -17,6 +17,7 @@ import {
|
||||||
SystemAlertKey,
|
SystemAlertKey,
|
||||||
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import { TaxReturnsContext, TaxReturnsContextType } from '../../context/TaxReturnsContext.js';
|
import { TaxReturnsContext, TaxReturnsContextType } from '../../context/TaxReturnsContext.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { useFact, getIsKnockedOut } = vi.hoisted(() => {
|
const { useFact, getIsKnockedOut } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
||||||
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
||||||
import { wrapComponent } from '../../test/helpers.js';
|
import { wrapComponent } from '../../test/helpers.js';
|
||||||
import { setupStore } from '../../redux/store.js';
|
import { setupStore } from '../../redux/store.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { t } = vi.hoisted(() => {
|
const { t } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -13,6 +13,7 @@ import {
|
||||||
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
||||||
import { userEvent } from '@testing-library/user-event';
|
import { userEvent } from '@testing-library/user-event';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
const submit = vi.fn(() => ({ hasSubmitError: false, isRetryDisabled: false }));
|
const submit = vi.fn(() => ({ hasSubmitError: false, isRetryDisabled: false }));
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import AggregateSummaryAlert, { AggregateSummaryAlertProps } from './AggregateSummaryAlert.js';
|
import AggregateSummaryAlert, { AggregateSummaryAlertProps } from './AggregateSummaryAlert.js';
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
import { MutableRefObject } from 'react';
|
import { MutableRefObject } from 'react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockT, mockI18n } = vi.hoisted(() => {
|
const { mockT, mockI18n } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { FactGraphContextProvider } from '../../factgraph/FactGraphContext.js';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { MutableRefObject } from 'react';
|
import { MutableRefObject } from 'react';
|
||||||
import { setupStore } from '../../redux/store.js';
|
import { setupStore } from '../../redux/store.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { initI18n } from '../../i18n.js';
|
||||||
import mockEnYaml from '../../locales/en.yaml';
|
import mockEnYaml from '../../locales/en.yaml';
|
||||||
import { SummaryTable } from './SummaryTable.js';
|
import { SummaryTable } from './SummaryTable.js';
|
||||||
import { getByTextWithTags } from '../../utils/test-utils.js';
|
import { getByTextWithTags } from '../../utils/test-utils.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const i18next = await initI18n();
|
const i18next = await initI18n();
|
||||||
i18next.addResourceBundle(`test`, `translation`, mockEnYaml);
|
i18next.addResourceBundle(`test`, `translation`, mockEnYaml);
|
||||||
|
|
|
@ -122,7 +122,7 @@ const SurveyModal = ({ modalRef, toggleModal, openSurveyConfirmationModal }: Sur
|
||||||
checked={isChecked}
|
checked={isChecked}
|
||||||
required
|
required
|
||||||
className='full-width-checkbox'
|
className='full-width-checkbox'
|
||||||
onChange={(e) => setIsChecked(e.target.checked ? true : false)}
|
onChange={(e: any) => setIsChecked(e.target.checked ? true : false)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<ModalFooter>
|
<ModalFooter>
|
||||||
|
|
|
@ -6,6 +6,7 @@ import {
|
||||||
SystemAlertKey,
|
SystemAlertKey,
|
||||||
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
} from '../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockT, mockI18n } = vi.hoisted(() => {
|
const { mockT, mockI18n } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { Provider } from 'react-redux';
|
||||||
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
import { TaxReturnsContext } from '../../context/TaxReturnsContext.js';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { getCurrentTaxYearReturn } from '../../utils/taxReturnUtils.js';
|
import { getCurrentTaxYearReturn } from '../../utils/taxReturnUtils.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const currentTaxYear = parseInt(CURRENT_TAX_YEAR);
|
const currentTaxYear = parseInt(CURRENT_TAX_YEAR);
|
||||||
const previousTaxYear = Number.parseInt(CURRENT_TAX_YEAR) - 1;
|
const previousTaxYear = Number.parseInt(CURRENT_TAX_YEAR) - 1;
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { CreateTaxReturnCard } from './CreateTaxReturnCard.js';
|
||||||
import en from '../../locales/en.yaml';
|
import en from '../../locales/en.yaml';
|
||||||
import { store } from '../../redux/store.js';
|
import { store } from '../../redux/store.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockIsFlowEnabled } = vi.hoisted(() => {
|
const { mockIsFlowEnabled } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { render, screen } from '@testing-library/react';
|
||||||
|
|
||||||
import Translation from './Translation.js';
|
import Translation from './Translation.js';
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
vi.mock(`../../hooks/useTranslationContextFromFacts`, () => ({
|
||||||
default: () => {
|
default: () => {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { screen } from '@testing-library/react';
|
||||||
import { HelmetProvider } from 'react-helmet-async';
|
import { HelmetProvider } from 'react-helmet-async';
|
||||||
import { FactGraphContextProvider } from '../../../factgraph/FactGraphContext.js';
|
import { FactGraphContextProvider } from '../../../factgraph/FactGraphContext.js';
|
||||||
import { setupStore } from '../../../redux/store.js';
|
import { setupStore } from '../../../redux/store.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const sharedProps = {
|
const sharedProps = {
|
||||||
isNext: true,
|
isNext: true,
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { setupStore } from '../../../redux/store.js';
|
||||||
import { createRef } from 'react';
|
import { createRef } from 'react';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { setupStore } from '../../../redux/store.js';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
import type { useFactControl } from '../../../hooks/useFactControl.js';
|
import type { useFactControl } from '../../../hooks/useFactControl.js';
|
||||||
import type { BankAccount as SFGBankAccount, BankAccountValidationFailure } from '@irs/js-factgraph-scala';
|
import type { BankAccount as SFGBankAccount, BankAccountValidationFailure } from '@irs/js-factgraph-scala';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mockUseFactControl = await vi.hoisted(async () => {
|
const mockUseFactControl = await vi.hoisted(async () => {
|
||||||
type UseFactControl = typeof useFactControl<SFGBankAccount, BankAccountValidationFailure, SFGBankAccount>;
|
type UseFactControl = typeof useFactControl<SFGBankAccount, BankAccountValidationFailure, SFGBankAccount>;
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { setupStore } from '../../../redux/store.js';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { test, expect } from 'vitest';
|
import { test, expect } from 'vitest';
|
||||||
import { AbsolutePath } from '../../../fact-dictionary/Path.js';
|
import { AbsolutePath } from '../../../fact-dictionary/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
// useFact related hooks
|
// useFact related hooks
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { Path } from '../../../flow/Path.js';
|
||||||
import { mockUseTranslation } from '../../../test/mocks/mockFunctions.js';
|
import { mockUseTranslation } from '../../../test/mocks/mockFunctions.js';
|
||||||
|
|
||||||
import CollectionItemReference from './CollectionItemReference.js';
|
import CollectionItemReference from './CollectionItemReference.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
const getCollectionPath = vi.fn((path: FgPath) => path);
|
const getCollectionPath = vi.fn((path: FgPath) => path);
|
||||||
|
|
|
@ -62,7 +62,7 @@ const CollectionItemReference = forwardRef<HTMLInputElement, FactProps>(
|
||||||
name={path}
|
name={path}
|
||||||
label={<Translation i18nKey={translationKey} collectionId={value} />}
|
label={<Translation i18nKey={translationKey} collectionId={value} />}
|
||||||
value={value}
|
value={value}
|
||||||
onChange={(event) => onChange(event.target.value)}
|
onChange={(event: any) => onChange(event.target.value)}
|
||||||
defaultChecked={defaultChecked}
|
defaultChecked={defaultChecked}
|
||||||
required
|
required
|
||||||
key={fullPath}
|
key={fullPath}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { Path } from '../../../flow/Path.js';
|
||||||
import { i18n, renderWithTranslationProvider as render, fireEvent } from '../../../test/test-utils.js';
|
import { i18n, renderWithTranslationProvider as render, fireEvent } from '../../../test/test-utils.js';
|
||||||
import { DatePicker, validateDate } from './DatePicker.js';
|
import { DatePicker, validateDate } from './DatePicker.js';
|
||||||
import { ConcretePath, Day } from '@irs/js-factgraph-scala';
|
import { ConcretePath, Day } from '@irs/js-factgraph-scala';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
// useFact related hooks
|
// useFact related hooks
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { createRef } from 'react';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
import { customRender } from '../../../utils/test-utils.js';
|
import { customRender } from '../../../utils/test-utils.js';
|
||||||
import Ein from './Ein.js';
|
import Ein from './Ein.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -6,6 +6,7 @@ import { Path as FgPath } from '../../../fact-dictionary/Path.js';
|
||||||
import { FactGraphContextProvider } from '../../../factgraph/FactGraphContext.js';
|
import { FactGraphContextProvider } from '../../../factgraph/FactGraphContext.js';
|
||||||
import { setupStore } from '../../../redux/store.js';
|
import { setupStore } from '../../../redux/store.js';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
import Enum from './Enum.js';
|
import Enum from './Enum.js';
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ const Enum = forwardRef<HTMLInputElement, EnumFactProps>(
|
||||||
id={path}
|
id={path}
|
||||||
name={path}
|
name={path}
|
||||||
validationStatus={showError ? `error` : undefined}
|
validationStatus={showError ? `error` : undefined}
|
||||||
onChange={(event) => handleValueChange(event.target.value)}
|
onChange={(event: any) => handleValueChange(event.target.value)}
|
||||||
value={selectedValue}
|
value={selectedValue}
|
||||||
aria-describedby={errorId}
|
aria-describedby={errorId}
|
||||||
required={required}
|
required={required}
|
||||||
|
@ -125,7 +125,7 @@ const Enum = forwardRef<HTMLInputElement, EnumFactProps>(
|
||||||
name={path}
|
name={path}
|
||||||
label={<Translation i18nKey={[maybeCustomTranslationKey, translationKey]} collectionId={collectionId} />}
|
label={<Translation i18nKey={[maybeCustomTranslationKey, translationKey]} collectionId={collectionId} />}
|
||||||
value={value}
|
value={value}
|
||||||
onChange={(event) => handleValueChange(event.target.value)}
|
onChange={(event: any) => handleValueChange(event.target.value)}
|
||||||
defaultChecked={value === fact?.getValue()}
|
defaultChecked={value === fact?.getValue()}
|
||||||
key={fullPath}
|
key={fullPath}
|
||||||
required
|
required
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { FactGraphContextProvider } from '../../../factgraph/FactGraphContext.js
|
||||||
import { setupStore } from '../../../redux/store.js';
|
import { setupStore } from '../../../redux/store.js';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { render } from '@testing-library/react';
|
||||||
import MultiEnum from './MultiEnum.js';
|
import MultiEnum from './MultiEnum.js';
|
||||||
import { Path as FgPath } from '../../../fact-dictionary/Path.js';
|
import { Path as FgPath } from '../../../fact-dictionary/Path.js';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
const getOptionsPath = vi.fn((path: FgPath) => {
|
const getOptionsPath = vi.fn((path: FgPath) => {
|
||||||
|
|
|
@ -104,7 +104,7 @@ const MultiEnum = forwardRef<HTMLInputElement, MultiEnumProps>(
|
||||||
name={path}
|
name={path}
|
||||||
value={value}
|
value={value}
|
||||||
checked={selectedValues.has(value)}
|
checked={selectedValues.has(value)}
|
||||||
onChange={(event) => handleValueChange(event.target.value)}
|
onChange={(event: any) => handleValueChange(event.target.value)}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</ComplexFormControl>
|
</ComplexFormControl>
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { setupStore } from '../../../redux/store.js';
|
||||||
import { createRef } from 'react';
|
import { createRef } from 'react';
|
||||||
import { ConcretePath } from '@irs/js-factgraph-scala';
|
import { ConcretePath } from '@irs/js-factgraph-scala';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { createRef } from 'react';
|
||||||
import { Path } from '../../../flow/Path.js';
|
import { Path } from '../../../flow/Path.js';
|
||||||
import { customRender } from '../../../utils/test-utils.js';
|
import { customRender } from '../../../utils/test-utils.js';
|
||||||
import Tin from './Tin.js';
|
import Tin from './Tin.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// This mock allows for testing of any component that is rendered using the
|
// This mock allows for testing of any component that is rendered using the
|
||||||
// useTranslation hook from react-i18next.
|
// useTranslation hook from react-i18next.
|
||||||
|
|
|
@ -53,7 +53,7 @@ export function conditionsAsKeySuffix({ props: { condition, conditions } }: Scre
|
||||||
const normalizedConditions = condition === undefined ? conditions ?? [] : [condition];
|
const normalizedConditions = condition === undefined ? conditions ?? [] : [condition];
|
||||||
|
|
||||||
return normalizedConditions
|
return normalizedConditions
|
||||||
.map((condition) =>
|
.map((condition: any) =>
|
||||||
typeof condition === `string` ? condition : `${condition.operator ?? `isTrue`}:${condition.condition}`
|
typeof condition === `string` ? condition : `${condition.operator ?? `isTrue`}:${condition.condition}`
|
||||||
)
|
)
|
||||||
.join(`-`);
|
.join(`-`);
|
||||||
|
|
|
@ -52,7 +52,7 @@ const getTinMismatchCustomConfig: CustomSystemAlertConfigBuilder = (options = {}
|
||||||
: {
|
: {
|
||||||
primaryFilerSsnOrItinLink: <CommonLinkRenderer url={primarySsnUrl} />,
|
primaryFilerSsnOrItinLink: <CommonLinkRenderer url={primarySsnUrl} />,
|
||||||
},
|
},
|
||||||
};
|
} as any;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { XMLParser, XMLValidator, X2jOptions } from 'fast-xml-parser';
|
import { XMLParser, XMLValidator, X2jOptions } from 'fast-xml-parser';
|
||||||
import { RawFact } from '../FactTypes.js';
|
import { RawFact } from '../FactTypes.js';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
export default function readRawFacts(): RawFact[] {
|
export default function readRawFacts(): RawFact[] {
|
||||||
const FACT_DICTIONARY_FOLDER = `./src/fact-dictionary/generate-src/xml-src/`;
|
const FACT_DICTIONARY_FOLDER = `../../backend/src/main/resources/tax/`;
|
||||||
|
|
||||||
const XML_PARSER_OPTIONS: X2jOptions = {
|
const XML_PARSER_OPTIONS: X2jOptions = {
|
||||||
ignoreAttributes: false,
|
ignoreAttributes: false,
|
||||||
|
@ -22,7 +23,10 @@ export default function readRawFacts(): RawFact[] {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Reading file ${dictionaryFile}`);
|
console.log(`Reading file ${dictionaryFile}`);
|
||||||
// nosemgrep: eslint.detect-non-literal-fs-filename
|
// nosemgrep: eslint.detect-non-literal-fs-filename
|
||||||
const rawXmlString = fs.readFileSync(FACT_DICTIONARY_FOLDER + dictionaryFile, `utf-8`);
|
const rawXmlString = fs.readFileSync(
|
||||||
|
path.join(FACT_DICTIONARY_FOLDER, dictionaryFile),
|
||||||
|
`utf-8`
|
||||||
|
);
|
||||||
|
|
||||||
const xmlValidationResult = XMLValidator.validate(rawXmlString, {
|
const xmlValidationResult = XMLValidator.validate(rawXmlString, {
|
||||||
allowBooleanAttributes: true,
|
allowBooleanAttributes: true,
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
../../../../../backend/src/main/resources/tax
|
|
|
@ -1 +0,0 @@
|
||||||
../../../../../backend/src/main/resources/factgraphservice/xmlFactPaths
|
|
|
@ -9,6 +9,7 @@ import { initialState as initialTelemetryState } from '../redux/slices/telemetry
|
||||||
import { initialState as initialESigState } from '../redux/slices/electronic-signature/electronicSignatureSlice.js';
|
import { initialState as initialESigState } from '../redux/slices/electronic-signature/electronicSignatureSlice.js';
|
||||||
|
|
||||||
import { initialSystemAlertState } from '../redux/slices/system-alert/systemAlertSlice.js';
|
import { initialSystemAlertState } from '../redux/slices/system-alert/systemAlertSlice.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../redux/store.js`);
|
vi.mock(`../redux/store.js`);
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ import { taxReturnFetch } from '../redux/slices/tax-return/taxReturnFetch.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { store } from '../redux/store.js';
|
import { store } from '../redux/store.js';
|
||||||
import { fetchTaxReturns } from '../redux/slices/tax-return/taxReturnSlice.js';
|
import { fetchTaxReturns } from '../redux/slices/tax-return/taxReturnSlice.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
vi.mock(`../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
||||||
taxReturnFetch: vi.fn(), // Mock the function
|
taxReturnFetch: vi.fn(), // Mock the function
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { Path } from '../fact-dictionary/Path.js';
|
import { Path } from '../fact-dictionary/Path.js';
|
||||||
import { useEnumOptions } from './useEnumOptions.js';
|
import { useEnumOptions } from './useEnumOptions.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mockFactGraph = vi.hoisted(() => {
|
const mockFactGraph = vi.hoisted(() => {
|
||||||
const getOptionsPathForEnum = vi.fn();
|
const getOptionsPathForEnum = vi.fn();
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { useFactControl, UseFactControlParameters } from './useFactControl.js';
|
||||||
import { EitherL, EitherR } from '@irs/js-factgraph-scala/src/typings/utils/JSEither.js';
|
import { EitherL, EitherR } from '@irs/js-factgraph-scala/src/typings/utils/JSEither.js';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction } from 'react';
|
||||||
import { renderHook } from '@testing-library/react';
|
import { renderHook } from '@testing-library/react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
type TestError = string;
|
type TestError = string;
|
||||||
type TestRawValue = { isValid: true } | { isValid: false; error: TestError };
|
type TestRawValue = { isValid: true } | { isValid: false; error: TestError };
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { useGetTranslationValues } from './useGetTranslationValues.js';
|
import { useGetTranslationValues } from './useGetTranslationValues.js';
|
||||||
import { renderHook } from '@testing-library/react';
|
import { renderHook } from '@testing-library/react';
|
||||||
import { getTranslationValuesRecursive } from '../utils/i18nUtils.js';
|
import { getTranslationValuesRecursive } from '../utils/i18nUtils.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockT, mockI18n } = vi.hoisted(() => {
|
const { mockT, mockI18n } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { renderHook, act } from '@testing-library/react';
|
||||||
import useNetworkConnectionStatus from './useNetworkConnectionStatus.js';
|
import useNetworkConnectionStatus from './useNetworkConnectionStatus.js';
|
||||||
import App from '../App.js';
|
import App from '../App.js';
|
||||||
import { renderWithTranslationProvider } from '../test/test-utils.js';
|
import { renderWithTranslationProvider } from '../test/test-utils.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const intervalTime = 50;
|
const intervalTime = 50;
|
||||||
const initialStatus = { online: true, prevOnlineStatus: true };
|
const initialStatus = { online: true, prevOnlineStatus: true };
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { getCurrentTaxYearReturn, getLatestSubmission } from '../utils/taxReturn
|
||||||
import { TaxReturnsContext } from '../context/TaxReturnsContext.js';
|
import { TaxReturnsContext } from '../context/TaxReturnsContext.js';
|
||||||
import { store } from '../redux/store.js';
|
import { store } from '../redux/store.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mockFetchTaxReturnsApiRequest = vi.fn();
|
const mockFetchTaxReturnsApiRequest = vi.fn();
|
||||||
const mockFetchSubmissionStatusApiRequest = vi.fn();
|
const mockFetchSubmissionStatusApiRequest = vi.fn();
|
||||||
|
|
|
@ -15,6 +15,7 @@ import {
|
||||||
SystemAlertContext,
|
SystemAlertContext,
|
||||||
SystemAlertKey,
|
SystemAlertKey,
|
||||||
} from '../context/SystemAlertContext/SystemAlertContext.js';
|
} from '../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Path } from '../fact-dictionary/Path.js';
|
import { Path } from '../fact-dictionary/Path.js';
|
||||||
import useTranslationContextFromFacts from './useTranslationContextFromFacts.js';
|
import useTranslationContextFromFacts from './useTranslationContextFromFacts.js';
|
||||||
import { Day, FactGraph } from '@irs/js-factgraph-scala';
|
import { Day, FactGraph } from '@irs/js-factgraph-scala';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
// translation
|
// translation
|
||||||
|
|
|
@ -2,6 +2,7 @@ import useUrlTranslator from './useUrlTranslator.js';
|
||||||
import { renderHook } from '@testing-library/react';
|
import { renderHook } from '@testing-library/react';
|
||||||
import { LANGUAGE_CODE_PLACEHOLDER } from '../utils/urlUtils.js';
|
import { LANGUAGE_CODE_PLACEHOLDER } from '../utils/urlUtils.js';
|
||||||
import { StateProfile } from '../types/StateProfile.js';
|
import { StateProfile } from '../types/StateProfile.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockUseTranslation } = vi.hoisted(() => {
|
const { mockUseTranslation } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { formatAndAppendHeaders, SM_UNIVERSALID, XFF_HEADER, TID_HEADER } from './apiHelpers.js';
|
import { formatAndAppendHeaders, SM_UNIVERSALID, XFF_HEADER, TID_HEADER } from './apiHelpers.js';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const {
|
const {
|
||||||
VITE_SADI_AUTH_ID,
|
VITE_SADI_AUTH_ID,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { v4 as uuidv4 } from 'uuid';
|
||||||
import { BrowserRouter } from 'react-router-dom';
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
import { TaxReturn } from '../../../types/core.js';
|
import { TaxReturn } from '../../../types/core.js';
|
||||||
import enLocale from '../../../locales/en.yaml';
|
import enLocale from '../../../locales/en.yaml';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockT, mockI18n } = vi.hoisted(() => {
|
const { mockT, mockI18n } = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -1,25 +1,25 @@
|
||||||
import homer from './mocks/homer.json';
|
import homer from '../../../../../../backend/src/main/resources/dataimportservice/mocks/homer.json';
|
||||||
import marge from './mocks/marge.json';
|
import marge from '../../../../../../backend/src/main/resources/dataimportservice/mocks/marge.json';
|
||||||
import lisa from './mocks/lisa.json';
|
import lisa from '../../../../../../backend/src/main/resources/dataimportservice/mocks/lisa.json';
|
||||||
import lisaKnockout from './mocks/lisa_knockout.json';
|
import lisaKnockout from '../../../../../../backend/src/main/resources/dataimportservice/mocks/lisa_knockout.json';
|
||||||
import bart from './mocks/bart.json';
|
import bart from '../../../../../../backend/src/main/resources/dataimportservice/mocks/bart.json';
|
||||||
import sean from './mocks/sean.json';
|
import sean from '../../../../../../backend/src/main/resources/dataimportservice/mocks/sean.json';
|
||||||
import abe from './mocks/abe.json';
|
import abe from '../../../../../../backend/src/main/resources/dataimportservice/mocks/abe.json';
|
||||||
import grandma from './mocks/grandma.json';
|
import grandma from '../../../../../../backend/src/main/resources/dataimportservice/mocks/grandma.json';
|
||||||
import milhouse from './mocks/milhouse.json';
|
import milhouse from '../../../../../../backend/src/main/resources/dataimportservice/mocks/milhouse.json';
|
||||||
import sideshowbob from './mocks/sideshowbob.json';
|
import sideshowbob from '../../../../../../backend/src/main/resources/dataimportservice/mocks/sideshowbob.json';
|
||||||
import krusty from './mocks/krusty.json';
|
import krusty from '../../../../../../backend/src/main/resources/dataimportservice/mocks/krusty.json';
|
||||||
import margeWithOnlySadiSuccess from './mocks/marge_with_only_sadi_success.json';
|
import margeWithOnlySadiSuccess from '../../../../../../backend/src/main/resources/dataimportservice/mocks/marge_with_only_sadi_success.json';
|
||||||
import ned from './mocks/ned.json';
|
import ned from '../../../../../../backend/src/main/resources/dataimportservice/mocks/ned.json';
|
||||||
import december27 from './mocks/december27.json';
|
import december27 from '../../../../../../backend/src/main/resources/dataimportservice/mocks/december27.json';
|
||||||
import kent from './mocks/kent.json';
|
import kent from '../../../../../../backend/src/main/resources/dataimportservice/mocks/kent.json';
|
||||||
import jon from './mocks/jon.json';
|
import jon from '../../../../../../backend/src/main/resources/dataimportservice/mocks/jon.json';
|
||||||
import margeWithSpaces from './mocks/marge__simpson.json';
|
import margeWithSpaces from '../../../../../../backend/src/main/resources/dataimportservice/mocks/marge__simpson.json';
|
||||||
import w2ParseError from './mocks/w2_parse_error.json';
|
import w2ParseError from '../../../../../../backend/src/main/resources/dataimportservice/mocks/w2_parse_error.json';
|
||||||
import carly from './mocks/carly.json';
|
import carly from '../../../../../../backend/src/main/resources/dataimportservice/mocks/carly.json';
|
||||||
import w2_with_decimal_values from './mocks/w2_with_decimal_values.json';
|
import w2_with_decimal_values from '../../../../../../backend/src/main/resources/dataimportservice/mocks/w2_with_decimal_values.json';
|
||||||
import maude from './mocks/maude.json';
|
import maude from '../../../../../../backend/src/main/resources/dataimportservice/mocks/maude.json';
|
||||||
import rod from './mocks/rod.json';
|
import rod from '../../../../../../backend/src/main/resources/dataimportservice/mocks/rod.json';
|
||||||
|
|
||||||
import { DataImportProfile } from './dataImportProfileTypes.js';
|
import { DataImportProfile } from './dataImportProfileTypes.js';
|
||||||
import { DataImportRootResponseSchema } from './schema/DataImportServiceResponse.js';
|
import { DataImportRootResponseSchema } from './schema/DataImportServiceResponse.js';
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { describe, expect, it } from 'vitest';
|
import { describe, expect, it } from 'vitest';
|
||||||
import { processPopulateResult } from '../processPopulateResult.js';
|
import { processPopulateResult } from '../processPopulateResult.js';
|
||||||
import { DataImportRootResponseSchema } from '../schema/DataImportServiceResponse.js';
|
import { DataImportRootResponseSchema } from '../schema/DataImportServiceResponse.js';
|
||||||
import marge from '../mocks/marge.json';
|
import marge from '../../../../../../../backend/src/main/resources/dataimportservice/mocks/marge.json'
|
||||||
|
|
||||||
const copy = (data: unknown) => JSON.parse(JSON.stringify(data));
|
const copy = (data: unknown) => JSON.parse(JSON.stringify(data));
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { store } from '../../../store.js';
|
||||||
import { fetchProfile } from '../dataImportProfileSlice.js';
|
import { fetchProfile } from '../dataImportProfileSlice.js';
|
||||||
import { fetchDataImportProfile } from '../fetchDataImportProfile.js';
|
import { fetchDataImportProfile } from '../fetchDataImportProfile.js';
|
||||||
import { Mock, describe, expect, it, vi } from 'vitest';
|
import { Mock, describe, expect, it, vi } from 'vitest';
|
||||||
import marge from '../mocks/marge.json';
|
import marge from '../../../../../../../backend/src/main/resources/dataimportservice/mocks/marge.json'
|
||||||
|
|
||||||
vi.mock(`../fetchDataImportProfile.js`, () => ({
|
vi.mock(`../fetchDataImportProfile.js`, () => ({
|
||||||
fetchDataImportProfile: vi.fn(), // Mock the function
|
fetchDataImportProfile: vi.fn(), // Mock the function
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { SystemAlertContextProvider } from '../../../context/SystemAlertContext/
|
||||||
import { store } from '../../../redux/store.js';
|
import { store } from '../../../redux/store.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { wrapComponent } from '../../../test/helpers.js';
|
import { wrapComponent } from '../../../test/helpers.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const handleGoBack = vi.fn();
|
const handleGoBack = vi.fn();
|
||||||
const errorMessage = `Details about an error!`;
|
const errorMessage = `Details about an error!`;
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { render, screen, within } from '@testing-library/react';
|
||||||
import { CURRENT_TAX_YEAR, FEDERAL_RETURN_STATUS } from '../../../constants/taxConstants.js';
|
import { CURRENT_TAX_YEAR, FEDERAL_RETURN_STATUS } from '../../../constants/taxConstants.js';
|
||||||
import { userEvent } from '@testing-library/user-event';
|
import { userEvent } from '@testing-library/user-event';
|
||||||
import { wrapComponent } from '../../../test/helpers.js';
|
import { wrapComponent } from '../../../test/helpers.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mockHandleGoBack = vi.fn();
|
const mockHandleGoBack = vi.fn();
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import TransferInfoModal, { TransferInfoModalProps } from './TransferInfoModal.j
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { userEvent } from '@testing-library/user-event';
|
import { userEvent } from '@testing-library/user-event';
|
||||||
import { InterceptingFactGraph } from '../../../factgraph/InterceptingFactGraph.js';
|
import { InterceptingFactGraph } from '../../../factgraph/InterceptingFactGraph.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mockFetchPdf = vi.fn();
|
const mockFetchPdf = vi.fn();
|
||||||
const { mockUseFetchPdf, mockI18n, mockUseFactGraph } = vi.hoisted(() => ({
|
const { mockUseFetchPdf, mockI18n, mockUseFactGraph } = vi.hoisted(() => ({
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { InterceptingFactGraph } from '../../../factgraph/InterceptingFactGraph.
|
||||||
import { SystemAlertConfigs, SystemAlertContext } from '../../../context/SystemAlertContext/SystemAlertContext.js';
|
import { SystemAlertConfigs, SystemAlertContext } from '../../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import { initI18n } from '../../../i18n.js';
|
import { initI18n } from '../../../i18n.js';
|
||||||
import { StateApiErrorCode } from '../../../constants/stateApiConstants.js';
|
import { StateApiErrorCode } from '../../../constants/stateApiConstants.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const { mockUseFactGraph } = vi.hoisted(() => ({
|
const { mockUseFactGraph } = vi.hoisted(() => ({
|
||||||
mockUseFactGraph: vi.fn(() => ({
|
mockUseFactGraph: vi.fn(() => ({
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { TaxReturnSubmissionStatus } from '../../../types/core.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { store } from '../../../redux/store.js';
|
import { store } from '../../../redux/store.js';
|
||||||
import { getEmptySystemAlertsMap, SystemAlertContext } from '../../../context/SystemAlertContext/SystemAlertContext.js';
|
import { getEmptySystemAlertsMap, SystemAlertContext } from '../../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const NOW = new Date();
|
const NOW = new Date();
|
||||||
const BEFORE_LOCKOUT = new Date(new Date().setSeconds(NOW.getSeconds() - (STATUS_FETCH_LOCKOUT_SECONDS + 1)));
|
const BEFORE_LOCKOUT = new Date(new Date().setSeconds(NOW.getSeconds() - (STATUS_FETCH_LOCKOUT_SECONDS + 1)));
|
||||||
|
|
|
@ -33,6 +33,7 @@ import { ReactNode } from 'react';
|
||||||
import { getEmptySystemAlertsMap, SystemAlertContext } from '../context/SystemAlertContext/SystemAlertContext.js';
|
import { getEmptySystemAlertsMap, SystemAlertContext } from '../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import * as pageConstants from '../constants/pageConstants.js';
|
import * as pageConstants from '../constants/pageConstants.js';
|
||||||
import CollectionItemDataView from './data-view/CollectionItemDataView.js';
|
import CollectionItemDataView from './data-view/CollectionItemDataView.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -16,7 +16,7 @@ export const BackButton = () => {
|
||||||
type='button'
|
type='button'
|
||||||
className='screen__back-button'
|
className='screen__back-button'
|
||||||
unstyled
|
unstyled
|
||||||
onClick={(evt) => {
|
onChange={(evt: any) => {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
// @ts-expect-error react navigation type is not defined correctly
|
// @ts-expect-error react navigation type is not defined correctly
|
||||||
navigate(-1, { preventScrollReset: true });
|
navigate(-1, { preventScrollReset: true });
|
||||||
|
|
|
@ -23,6 +23,7 @@ import { baseFilerData, primaryFilerId, makeInterestReportData } from '../../tes
|
||||||
import CollectionHubDataView from './CollectionHubDataView.js';
|
import CollectionHubDataView from './CollectionHubDataView.js';
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
import { setupStore } from '../../redux/store.js';
|
import { setupStore } from '../../redux/store.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const intReportId1 = `9d164507-0c5a-469d-8d36-49d2f7af0b7a`;
|
const intReportId1 = `9d164507-0c5a-469d-8d36-49d2f7af0b7a`;
|
||||||
const intReportId2 = `24aa5dee-e381-4927-a0d9-07658287086c`;
|
const intReportId2 = `24aa5dee-e381-4927-a0d9-07658287086c`;
|
||||||
|
|
|
@ -20,6 +20,7 @@ import en from '../../locales/en.yaml';
|
||||||
import { baseFilerData, primaryFilerId, makeSocialSecurityReport } from '../../test/testData.js';
|
import { baseFilerData, primaryFilerId, makeSocialSecurityReport } from '../../test/testData.js';
|
||||||
import CollectionHubDataView from './CollectionHubDataView.js';
|
import CollectionHubDataView from './CollectionHubDataView.js';
|
||||||
import { initI18n } from '../../i18n.js';
|
import { initI18n } from '../../i18n.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const ssReportId1 = `423bef54-e524-463c-829f-0948df47a4bd`;
|
const ssReportId1 = `423bef54-e524-463c-829f-0948df47a4bd`;
|
||||||
const ssReportId2 = `08eea4dd-c0ee-4128-9afc-2b74dca27101`;
|
const ssReportId2 = `08eea4dd-c0ee-4128-9afc-2b74dca27101`;
|
||||||
|
|
|
@ -24,6 +24,7 @@ import CollectionItemDataView from './CollectionItemDataView.js';
|
||||||
import { SystemAlertContext, getEmptySystemAlertsMap } from '../../context/SystemAlertContext/SystemAlertContext.js';
|
import { SystemAlertContext, getEmptySystemAlertsMap } from '../../context/SystemAlertContext/SystemAlertContext.js';
|
||||||
import { setupStore } from '../../redux/store.js';
|
import { setupStore } from '../../redux/store.js';
|
||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -25,6 +25,7 @@ import {
|
||||||
makeW2Data,
|
makeW2Data,
|
||||||
primaryFilerId,
|
primaryFilerId,
|
||||||
} from '../../test/testData.js';
|
} from '../../test/testData.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const mocks = vi.hoisted(() => {
|
const mocks = vi.hoisted(() => {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -21,6 +21,7 @@ import {
|
||||||
createTinWrapper,
|
createTinWrapper,
|
||||||
} from '../../test/persistenceWrappers.js';
|
} from '../../test/persistenceWrappers.js';
|
||||||
import { setupFactGraph } from '../../test/setupFactGraph.js';
|
import { setupFactGraph } from '../../test/setupFactGraph.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// Test data for rendering subsubcategories
|
// Test data for rendering subsubcategories
|
||||||
const w2Id = `0b1e355e-3d19-415d-8470-fbafd9f58361`;
|
const w2Id = `0b1e355e-3d19-415d-8470-fbafd9f58361`;
|
||||||
|
|
|
@ -533,10 +533,13 @@ export function SubSubCategory({
|
||||||
|
|
||||||
const allAssertions = availableScreens
|
const allAssertions = availableScreens
|
||||||
.flatMap((sc) =>
|
.flatMap((sc) =>
|
||||||
sc.content.filter(
|
sc.content.filter((c) =>
|
||||||
(c) =>
|
{
|
||||||
conditionsPass(c.props, factGraph, collectionId) &&
|
return (
|
||||||
(c.componentName === `FactAssertion` || c.componentName === `FactResultAssertion`)
|
conditionsPass(c.props, factGraph, collectionId) &&
|
||||||
|
(c.componentName === `FactAssertion` || c.componentName === `FactResultAssertion`)
|
||||||
|
)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.filter((result) => result);
|
.filter((result) => result);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import { store } from '../redux/store.js';
|
||||||
import { taxReturnFetch } from '../redux/slices/tax-return/taxReturnFetch.js';
|
import { taxReturnFetch } from '../redux/slices/tax-return/taxReturnFetch.js';
|
||||||
import { Mock } from 'vitest';
|
import { Mock } from 'vitest';
|
||||||
import { taxReturnCreate } from '../redux/slices/tax-return/taxReturnCreate.js';
|
import { taxReturnCreate } from '../redux/slices/tax-return/taxReturnCreate.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
vi.mock(`../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
||||||
taxReturnFetch: vi.fn(), // Mock the function
|
taxReturnFetch: vi.fn(), // Mock the function
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { createBooleanWrapper, createDayWrapper } from '../persistenceWrappers.j
|
||||||
import { baseFilerData, filerWithPaymentDueData } from '../testData.js';
|
import { baseFilerData, filerWithPaymentDueData } from '../testData.js';
|
||||||
import { setupFactGraph } from '../setupFactGraph.js';
|
import { setupFactGraph } from '../setupFactGraph.js';
|
||||||
import { CURRENT_TAX_YEAR } from '../../constants/taxConstants.js';
|
import { CURRENT_TAX_YEAR } from '../../constants/taxConstants.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
describe(`Payment method`, () => {
|
describe(`Payment method`, () => {
|
||||||
const basePaymentMethodData = {
|
const basePaymentMethodData = {
|
||||||
|
|
|
@ -22,6 +22,7 @@ import { CURRENT_TAX_YEAR } from '../../constants/taxConstants.js';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { fetchTaxReturns } from '../../redux/slices/tax-return/taxReturnSlice.js';
|
import { fetchTaxReturns } from '../../redux/slices/tax-return/taxReturnSlice.js';
|
||||||
import { fetchProfile } from '../../redux/slices/data-import/dataImportProfileSlice.js';
|
import { fetchProfile } from '../../redux/slices/data-import/dataImportProfileSlice.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
vi.mock(`../../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
vi.mock(`../../redux/slices/tax-return/taxReturnFetch.js`, () => ({
|
||||||
taxReturnFetch: vi.fn(), // Mock the function
|
taxReturnFetch: vi.fn(), // Mock the function
|
||||||
|
|
|
@ -12,6 +12,7 @@ import flowNodes from '../../flow/flow.js';
|
||||||
import makeGivenFacts from './functionalFlowUtils.js';
|
import makeGivenFacts from './functionalFlowUtils.js';
|
||||||
import { CollectionItemReferenceFactory } from '@irs/js-factgraph-scala';
|
import { CollectionItemReferenceFactory } from '@irs/js-factgraph-scala';
|
||||||
import { setupFactGraph } from '../setupFactGraph.js';
|
import { setupFactGraph } from '../setupFactGraph.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const flow = createFlowConfig(flowNodes);
|
const flow = createFlowConfig(flowNodes);
|
||||||
const givenFacts = makeGivenFacts(flow);
|
const givenFacts = makeGivenFacts(flow);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import flowNodes from '../../flow/flow.js';
|
||||||
import { TAX_YEAR_2023 } from '../../constants/taxConstants.js';
|
import { TAX_YEAR_2023 } from '../../constants/taxConstants.js';
|
||||||
import makeGivenFacts from './functionalFlowUtils.js';
|
import makeGivenFacts from './functionalFlowUtils.js';
|
||||||
import { setupFactGraph } from '../setupFactGraph.js';
|
import { setupFactGraph } from '../setupFactGraph.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const flow = createFlowConfig(flowNodes);
|
const flow = createFlowConfig(flowNodes);
|
||||||
const givenFacts = makeGivenFacts(flow);
|
const givenFacts = makeGivenFacts(flow);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import {
|
||||||
} from '../testData.js';
|
} from '../testData.js';
|
||||||
import makeGivenFacts from './functionalFlowUtils.js';
|
import makeGivenFacts from './functionalFlowUtils.js';
|
||||||
import { setupFactGraph } from '../setupFactGraph.js';
|
import { setupFactGraph } from '../setupFactGraph.js';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
const flow = createFlowConfig(flowNodes);
|
const flow = createFlowConfig(flowNodes);
|
||||||
const givenFacts = makeGivenFacts(flow);
|
const givenFacts = makeGivenFacts(flow);
|
||||||
|
|
|
@ -11,7 +11,8 @@ import { fetchDataImportProfile } from '../../redux/slices/data-import/fetchData
|
||||||
import { fetchProfile } from '../../redux/slices/data-import/dataImportProfileSlice.js';
|
import { fetchProfile } from '../../redux/slices/data-import/dataImportProfileSlice.js';
|
||||||
import { store } from '../../redux/store.js';
|
import { store } from '../../redux/store.js';
|
||||||
import { TaxReturn } from '../../types/core.js';
|
import { TaxReturn } from '../../types/core.js';
|
||||||
import marge from '../../redux/slices/data-import/mocks/marge.json';
|
import { vi } from 'vitest';
|
||||||
|
import marge from '../../../../../backend/src/main/resources/dataimportservice/mocks/marge.json'
|
||||||
|
|
||||||
vi.mock(`../../redux/slices/data-import/fetchDataImportProfile.js`, () => ({
|
vi.mock(`../../redux/slices/data-import/fetchDataImportProfile.js`, () => ({
|
||||||
fetchDataImportProfile: vi.fn(), // Mock the function
|
fetchDataImportProfile: vi.fn(), // Mock the function
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
../../../../../backend/src/test/resources/scenarios
|
|
|
@ -1,5 +1,6 @@
|
||||||
// eslint-disable-next-line max-len
|
// eslint-disable-next-line max-len
|
||||||
import scenarioO1Json from './jsonScenarios/ats-1.json';
|
// import scenarioO1Json from './jsonScenarios/ats-1.json';
|
||||||
|
import scenarioO1Json from '../../../../../backend/src/test/resources/scenarios/ats-1.json'
|
||||||
import { ConcretePath, FactGraph, ScalaList } from '@irs/js-factgraph-scala';
|
import { ConcretePath, FactGraph, ScalaList } from '@irs/js-factgraph-scala';
|
||||||
import { singleNoDependentsWithTwoW2s01 as snapshotScenario01 } from './goldenScenarios.js';
|
import { singleNoDependentsWithTwoW2s01 as snapshotScenario01 } from './goldenScenarios.js';
|
||||||
import { FactValue } from '../../types/core.js';
|
import { FactValue } from '../../types/core.js';
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
import { FactGraph } from '@irs/js-factgraph-scala';
|
import { FactGraph } from '@irs/js-factgraph-scala';
|
||||||
import { Condition, RawCondition } from '../flow/Condition.js';
|
import { Condition, RawCondition } from '../flow/Condition.js';
|
||||||
type HasConditions = { condition?: RawCondition; conditions?: RawCondition[] };
|
import { ConfigProps, FlowComponentName, FlowNodeType } from '../flow/ContentDeclarations.js';
|
||||||
|
import { ComponentProps } from 'react';
|
||||||
|
|
||||||
export const conditionsPass = (props: HasConditions, fg: FactGraph, collectionId: string | null) => {
|
export const conditionsPass = (props: ConfigProps<ComponentProps<FlowNodeType<FlowComponentName>>>, fg: FactGraph, collectionId: string | null) => {
|
||||||
if (props && props.condition) {
|
if (props && props.condition) {
|
||||||
return new Condition(props.condition).evaluate(fg, collectionId);
|
return new Condition(props.condition).evaluate(fg, collectionId);
|
||||||
// eslint-disable-next-line eqeqeq
|
// eslint-disable-next-line eqeqeq
|
||||||
} else if (props.conditions != undefined) {
|
} else if (props.conditions != undefined) {
|
||||||
return props.conditions.every((c) => {
|
return props.conditions.every((c: RawCondition) => {
|
||||||
const result = new Condition(c).evaluate(fg, collectionId);
|
const result = new Condition(c).evaluate(fg, collectionId);
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
|
|
@ -4,7 +4,8 @@ import ErrorBoundary from './errorBoundary.js';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import { store } from '../redux/store.js';
|
import { store } from '../redux/store.js';
|
||||||
import { isTelemetryEnabled } from '../constants/pageConstants.js';
|
import { isTelemetryEnabled } from '../constants/pageConstants.js';
|
||||||
import { Mock } from 'vitest';
|
import { Mock, vi } from 'vitest';
|
||||||
|
|
||||||
vi.useFakeTimers();
|
vi.useFakeTimers();
|
||||||
|
|
||||||
vi.mock(`../constants/pageConstants.js`, () => ({
|
vi.mock(`../constants/pageConstants.js`, () => ({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { UserConfig, defineConfig } from 'vitest/config';
|
import { defineConfig } from 'vitest/config';
|
||||||
import react from '@vitejs/plugin-react';
|
import react from '@vitejs/plugin-react';
|
||||||
import browserslistToEsbuild from 'browserslist-to-esbuild';
|
import browserslistToEsbuild from 'browserslist-to-esbuild';
|
||||||
import { JSON_SCHEMA } from 'js-yaml';
|
import { JSON_SCHEMA } from 'js-yaml';
|
||||||
|
@ -7,7 +7,7 @@ import viteTsconfigPaths from 'vite-tsconfig-paths';
|
||||||
import autoprefixer from 'autoprefixer';
|
import autoprefixer from 'autoprefixer';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
export const configOptions: UserConfig = {
|
export default defineConfig({
|
||||||
base: process.env.DF_CLIENT_PUBLIC_PATH || '/df/file',
|
base: process.env.DF_CLIENT_PUBLIC_PATH || '/df/file',
|
||||||
assetsInclude: ['**/*.svg'],
|
assetsInclude: ['**/*.svg'],
|
||||||
plugins: [react(), viteTsconfigPaths(), ViteYaml({ schema: JSON_SCHEMA })],
|
plugins: [react(), viteTsconfigPaths(), ViteYaml({ schema: JSON_SCHEMA })],
|
||||||
|
@ -17,11 +17,11 @@ export const configOptions: UserConfig = {
|
||||||
localsConvention: 'camelCaseOnly',
|
localsConvention: 'camelCaseOnly',
|
||||||
},
|
},
|
||||||
postcss: {
|
postcss: {
|
||||||
plugins: [autoprefixer()],
|
plugins: [autoprefixer() as any],
|
||||||
},
|
},
|
||||||
preprocessorOptions: {
|
preprocessorOptions: {
|
||||||
scss: {
|
scss: {
|
||||||
includePaths: ['../node_modules/@uswds', '../node_modules/@uswds/uswds/packages'],
|
loadPaths: ['../node_modules/@uswds', '../node_modules/@uswds/uswds/packages'],
|
||||||
silenceDeprecations: ['legacy-js-api'],
|
silenceDeprecations: ['legacy-js-api'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -38,7 +38,7 @@ export const configOptions: UserConfig = {
|
||||||
// Mock OLA
|
// Mock OLA
|
||||||
'/ola/rest/taxpayer/taxRecord': {
|
'/ola/rest/taxpayer/taxRecord': {
|
||||||
bypass: (_req, res, _options) => {
|
bypass: (_req, res, _options) => {
|
||||||
res.write(
|
res!.write(
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
transcriptSummary: {
|
transcriptSummary: {
|
||||||
panelShowing: true,
|
panelShowing: true,
|
||||||
|
@ -58,7 +58,7 @@ export const configOptions: UserConfig = {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
res.end();
|
res!.end();
|
||||||
return 'Bypassed'; // string return value prevents this from going to the original req.target
|
return 'Bypassed'; // string return value prevents this from going to the original req.target
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -97,7 +97,4 @@ export const configOptions: UserConfig = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
});
|
||||||
|
|
||||||
// https://vitejs.dev/config/
|
|
||||||
export default defineConfig(configOptions);
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue