diff --git a/.bazelignore b/.bazelignore index a780bc494d6..ba65fba9bd6 100644 --- a/.bazelignore +++ b/.bazelignore @@ -17,6 +17,7 @@ client/search-ui/node_modules client/shared/node_modules client/storybook/node_modules client/template-parser/node_modules +client/testing/node_modules client/web/node_modules client/wildcard/node_modules client/vscode/node_modules diff --git a/client/search-ui/src/input/SearchContextDropdown.test.tsx b/client/search-ui/src/input/SearchContextDropdown.test.tsx index 31d65798327..147302c276f 100644 --- a/client/search-ui/src/input/SearchContextDropdown.test.tsx +++ b/client/search-ui/src/input/SearchContextDropdown.test.tsx @@ -3,7 +3,6 @@ import userEvent from '@testing-library/user-event' import { act } from 'react-dom/test-utils' import { spy, assert, useFakeTimers } from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { NOOP_TELEMETRY_SERVICE } from '@sourcegraph/shared/src/telemetry/telemetryService' import { MockIntersectionObserver } from '@sourcegraph/shared/src/testing/MockIntersectionObserver' import { @@ -11,6 +10,7 @@ import { mockGetUserSearchContextNamespaces, } from '@sourcegraph/shared/src/testing/searchContexts/testHelpers' import { NOOP_PLATFORM_CONTEXT } from '@sourcegraph/shared/src/testing/searchTestHelpers' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { SearchContextDropdown, SearchContextDropdownProps } from './SearchContextDropdown' diff --git a/client/search-ui/src/results/progress/StreamingProgressSkippedPopover.test.tsx b/client/search-ui/src/results/progress/StreamingProgressSkippedPopover.test.tsx index beab11a590a..e1058611700 100644 --- a/client/search-ui/src/results/progress/StreamingProgressSkippedPopover.test.tsx +++ b/client/search-ui/src/results/progress/StreamingProgressSkippedPopover.test.tsx @@ -2,8 +2,8 @@ import { screen, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { Progress } from '@sourcegraph/shared/src/search/stream' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { renderWithBrandedContext } from '@sourcegraph/wildcard/src/testing' import { StreamingProgressSkippedPopover } from './StreamingProgressSkippedPopover' diff --git a/client/shared/src/actions/ActionItem.test.tsx b/client/shared/src/actions/ActionItem.test.tsx index 8f9e36f386f..39430a09870 100644 --- a/client/shared/src/actions/ActionItem.test.tsx +++ b/client/shared/src/actions/ActionItem.test.tsx @@ -3,9 +3,9 @@ import userEvent from '@testing-library/user-event' import * as H from 'history' import { NEVER } from 'rxjs' +import { assertAriaEnabled } from '@sourcegraph/testing' import { renderWithBrandedContext } from '@sourcegraph/wildcard/src/testing' -import { assertAriaEnabled } from '../../dev/aria-asserts' import { createBarrier } from '../api/integration-test/testHelpers' import { NOOP_TELEMETRY_SERVICE } from '../telemetry/telemetryService' diff --git a/client/testing/.eslintignore b/client/testing/.eslintignore new file mode 100644 index 00000000000..466e24805a9 --- /dev/null +++ b/client/testing/.eslintignore @@ -0,0 +1 @@ +out/ \ No newline at end of file diff --git a/client/testing/.eslintrc.js b/client/testing/.eslintrc.js new file mode 100644 index 00000000000..23c93898412 --- /dev/null +++ b/client/testing/.eslintrc.js @@ -0,0 +1,12 @@ +// @ts-check + +const baseConfig = require('../../.eslintrc.js') + +module.exports = { + extends: '../../.eslintrc.js', + parserOptions: { + ...baseConfig.parserOptions, + project: [__dirname + '/tsconfig.json'], + }, + overrides: baseConfig.overrides, +} diff --git a/client/testing/README.md b/client/testing/README.md new file mode 100644 index 00000000000..45b58d5833d --- /dev/null +++ b/client/testing/README.md @@ -0,0 +1,4 @@ +# Tools for writing tests + +Package-agnostic utilities for unit and integration tests. +App or package-specific utilities should live in `client/{packageName}/src/testing`. diff --git a/client/testing/babel.config.js b/client/testing/babel.config.js new file mode 100644 index 00000000000..73a95d310cd --- /dev/null +++ b/client/testing/babel.config.js @@ -0,0 +1,5 @@ +// @ts-check + +module.exports = { + extends: '../../babel.config.js', +} diff --git a/client/testing/jest.config.js b/client/testing/jest.config.js new file mode 100644 index 00000000000..e1cb108cbe1 --- /dev/null +++ b/client/testing/jest.config.js @@ -0,0 +1,13 @@ +// @ts-check + +const config = require('../../jest.config.base') + +const exportedConfig = { + ...config, + displayName: 'testing', + rootDir: __dirname, + roots: [''], + verbose: true, +} + +module.exports = exportedConfig diff --git a/client/testing/package.json b/client/testing/package.json new file mode 100644 index 00000000000..689a6de405c --- /dev/null +++ b/client/testing/package.json @@ -0,0 +1,13 @@ +{ + "private": true, + "name": "@sourcegraph/testing", + "version": "0.0.1", + "description": "Sourcegraph testing API", + "main": "./src/index.ts", + "sideEffects": false, + "license": "Apache-2.0", + "scripts": { + "lint:js": "yarn run -T eslint --cache 'src/**/*.[jt]s?(x)'", + "test": "yarn run -T jest" + } +} diff --git a/client/shared/dev/aria-asserts.ts b/client/testing/src/aria-asserts.ts similarity index 100% rename from client/shared/dev/aria-asserts.ts rename to client/testing/src/aria-asserts.ts diff --git a/client/testing/src/index.ts b/client/testing/src/index.ts new file mode 100644 index 00000000000..22dad0ea609 --- /dev/null +++ b/client/testing/src/index.ts @@ -0,0 +1 @@ +export * from './aria-asserts' diff --git a/client/testing/tsconfig.json b/client/testing/tsconfig.json new file mode 100644 index 00000000000..ab44a74f4ad --- /dev/null +++ b/client/testing/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "references": [{ "path": "../common" }], + "compilerOptions": { + "jsx": "react-jsx", + "module": "commonjs", + "sourceRoot": "src", + "rootDir": ".", + "outDir": "./out", + "baseUrl": "./src", + }, + "include": ["./src/**/*", "./*.ts"], +} diff --git a/client/web/src/enterprise/code-monitoring/CreateCodeMonitorPage.test.tsx b/client/web/src/enterprise/code-monitoring/CreateCodeMonitorPage.test.tsx index 8bac23404ff..658a569db74 100644 --- a/client/web/src/enterprise/code-monitoring/CreateCodeMonitorPage.test.tsx +++ b/client/web/src/enterprise/code-monitoring/CreateCodeMonitorPage.test.tsx @@ -4,8 +4,8 @@ import * as H from 'history' import { NEVER, of } from 'rxjs' import sinon from 'sinon' -import { assertAriaDisabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled } from '@sourcegraph/testing' import { renderWithBrandedContext } from '@sourcegraph/wildcard/src/testing' import { AuthenticatedUser } from '../../auth' diff --git a/client/web/src/enterprise/code-monitoring/ManageCodeMonitorPage.test.tsx b/client/web/src/enterprise/code-monitoring/ManageCodeMonitorPage.test.tsx index 4af1143fd05..07658057292 100644 --- a/client/web/src/enterprise/code-monitoring/ManageCodeMonitorPage.test.tsx +++ b/client/web/src/enterprise/code-monitoring/ManageCodeMonitorPage.test.tsx @@ -4,8 +4,8 @@ import * as H from 'history' import { NEVER, of } from 'rxjs' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { renderWithBrandedContext } from '@sourcegraph/wildcard/src/testing' import { diff --git a/client/web/src/enterprise/code-monitoring/components/CodeMonitorForm.test.tsx b/client/web/src/enterprise/code-monitoring/components/CodeMonitorForm.test.tsx index 635e6e4e40d..912092ec180 100644 --- a/client/web/src/enterprise/code-monitoring/components/CodeMonitorForm.test.tsx +++ b/client/web/src/enterprise/code-monitoring/components/CodeMonitorForm.test.tsx @@ -2,8 +2,8 @@ import { fireEvent, getByRole, screen } from '@testing-library/react' import { createMemoryHistory, createLocation } from 'history' import { NEVER } from 'rxjs' -import { assertAriaDisabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled } from '@sourcegraph/testing' import { renderWithBrandedContext } from '@sourcegraph/wildcard/src/testing' import { mockAuthenticatedUser, mockCodeMonitorFields } from '../testing/util' diff --git a/client/web/src/enterprise/code-monitoring/components/actions/ActionEditor.test.tsx b/client/web/src/enterprise/code-monitoring/components/actions/ActionEditor.test.tsx index 9b70f148a78..3e8f1886145 100644 --- a/client/web/src/enterprise/code-monitoring/components/actions/ActionEditor.test.tsx +++ b/client/web/src/enterprise/code-monitoring/components/actions/ActionEditor.test.tsx @@ -2,7 +2,7 @@ import { render } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled } from '@sourcegraph/shared/dev/aria-asserts' +import { assertAriaDisabled } from '@sourcegraph/testing' import { ActionEditor, ActionEditorProps } from './ActionEditor' diff --git a/client/web/src/enterprise/code-monitoring/components/actions/EmailAction.test.tsx b/client/web/src/enterprise/code-monitoring/components/actions/EmailAction.test.tsx index d9bb9ddfdbc..914fa245128 100644 --- a/client/web/src/enterprise/code-monitoring/components/actions/EmailAction.test.tsx +++ b/client/web/src/enterprise/code-monitoring/components/actions/EmailAction.test.tsx @@ -3,8 +3,8 @@ import { render } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider, waitForNextApolloResponse } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { MonitorEmailPriority, SendTestEmailResult, SendTestEmailVariables } from '../../../../graphql-operations' import { mockAuthenticatedUser } from '../../testing/util' diff --git a/client/web/src/enterprise/code-monitoring/components/actions/SlackWebhookAction.test.tsx b/client/web/src/enterprise/code-monitoring/components/actions/SlackWebhookAction.test.tsx index ba736f43a13..dffb5f58a36 100644 --- a/client/web/src/enterprise/code-monitoring/components/actions/SlackWebhookAction.test.tsx +++ b/client/web/src/enterprise/code-monitoring/components/actions/SlackWebhookAction.test.tsx @@ -3,8 +3,8 @@ import { render } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider, waitForNextApolloResponse } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { SendTestSlackWebhookResult, SendTestSlackWebhookVariables } from '../../../../graphql-operations' import { mockAuthenticatedUser } from '../../testing/util' diff --git a/client/web/src/enterprise/code-monitoring/components/actions/WebhookAction.test.tsx b/client/web/src/enterprise/code-monitoring/components/actions/WebhookAction.test.tsx index cc871ddb1db..250e9666835 100644 --- a/client/web/src/enterprise/code-monitoring/components/actions/WebhookAction.test.tsx +++ b/client/web/src/enterprise/code-monitoring/components/actions/WebhookAction.test.tsx @@ -3,8 +3,8 @@ import { render } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' import { MockedTestProvider, waitForNextApolloResponse } from '@sourcegraph/shared/src/testing/apollo' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { SendTestWebhookResult, SendTestWebhookVariables } from '../../../../graphql-operations' import { mockAuthenticatedUser } from '../../testing/util' diff --git a/client/wildcard/src/components/Feedback/FeedbackPrompt/FeedbackPrompt.test.tsx b/client/wildcard/src/components/Feedback/FeedbackPrompt/FeedbackPrompt.test.tsx index 11f89fc3f81..bc09e2a90fa 100644 --- a/client/wildcard/src/components/Feedback/FeedbackPrompt/FeedbackPrompt.test.tsx +++ b/client/wildcard/src/components/Feedback/FeedbackPrompt/FeedbackPrompt.test.tsx @@ -2,7 +2,7 @@ import { cleanup, fireEvent, render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { Button } from '../../Button' import { PopoverTrigger } from '../../Popover' diff --git a/client/wildcard/src/components/PageSwitcher/PageSwitcher.test.tsx b/client/wildcard/src/components/PageSwitcher/PageSwitcher.test.tsx index a7010fb4349..1e79d83c672 100644 --- a/client/wildcard/src/components/PageSwitcher/PageSwitcher.test.tsx +++ b/client/wildcard/src/components/PageSwitcher/PageSwitcher.test.tsx @@ -1,7 +1,7 @@ import { render, RenderResult, cleanup, fireEvent } from '@testing-library/react' import sinon from 'sinon' -import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/shared/dev/aria-asserts' +import { assertAriaDisabled, assertAriaEnabled } from '@sourcegraph/testing' import { PageSwitcher, PageSwitcherProps } from './PageSwitcher' diff --git a/client/wildcard/tsconfig.json b/client/wildcard/tsconfig.json index 5ff1c29e6b2..1d1ebaec61b 100644 --- a/client/wildcard/tsconfig.json +++ b/client/wildcard/tsconfig.json @@ -8,12 +8,7 @@ "baseUrl": "./src", "jsx": "react-jsx", }, - "references": [ - { "path": "../shared" }, - { "path": "../branded" }, - { "path": "../../schema" }, - { "path": "../common" }, - ], + "references": [{ "path": "../branded" }, { "path": "../common" }, { "path": "../testing" }], "include": ["**/*", ".*"], "exclude": ["../../node_modules", "./node_modules", "./out"], } diff --git a/dev/foreach-ts-project.sh b/dev/foreach-ts-project.sh index e05f58b9195..04c23a91b4b 100755 --- a/dev/foreach-ts-project.sh +++ b/dev/foreach-ts-project.sh @@ -29,6 +29,7 @@ DIRS=( client/shared client/storybook client/template-parser + client/testing client/vscode client/web client/wildcard diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb22a01ab60..d5870847320 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -848,6 +848,9 @@ importers: client/template-parser: specifiers: {} + client/testing: + specifiers: {} + client/vscode: specifiers: vsce: ^2.7.0 diff --git a/tsconfig.all.json b/tsconfig.all.json index f6629f7d1fd..2b689ac63cc 100644 --- a/tsconfig.all.json +++ b/tsconfig.all.json @@ -20,6 +20,7 @@ { "path": "client/storybook" }, { "path": "client/search" }, { "path": "client/search-ui" }, + { "path": "client/testing" }, { "path": "dev/release" }, { "path": "schema" }, { "path": "client/codeintellify" }, diff --git a/yarn.lock b/yarn.lock index a7b69290b1d..67f954fc730 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5519,6 +5519,12 @@ __metadata: languageName: unknown linkType: soft +"@sourcegraph/testing@workspace:client/testing": + version: 0.0.0-use.local + resolution: "@sourcegraph/testing@workspace:client/testing" + languageName: unknown + linkType: soft + "@sourcegraph/tsconfig@npm:^4.0.1": version: 4.0.1 resolution: "@sourcegraph/tsconfig@npm:4.0.1"