@cedarjs/testing 9.0.0-canary.1784 → 9.0.0-canary.3124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/checkTestDatabase.d.ts +23 -0
- package/dist/api/checkTestDatabase.d.ts.map +1 -0
- package/dist/api/checkTestDatabase.js +44 -0
- package/dist/api/index.d.ts +0 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +0 -1
- package/dist/api/vitest/CedarApiVitestEnv.d.ts.map +1 -1
- package/dist/api/vitest/CedarApiVitestEnv.js +22 -17
- package/dist/api/vitest/teardown.d.ts +18 -0
- package/dist/api/vitest/teardown.d.ts.map +1 -0
- package/dist/api/vitest/teardown.js +43 -0
- package/dist/api/vitest/vite-plugin-cedar-vitest-api-config.d.ts.map +1 -1
- package/dist/api/vitest/vite-plugin-cedar-vitest-api-config.js +13 -8
- package/dist/api/vitest/vitest-api.setup.d.ts.map +1 -1
- package/dist/api/vitest/vitest-api.setup.js +18 -33
- package/dist/cache/index.js +1 -1
- package/dist/web/MockParamsProvider.d.ts.map +1 -1
- package/dist/web/MockParamsProvider.js +10 -1
- package/dist/web/MockProviders.js +12 -6
- package/dist/web/MockRouter.d.ts.map +1 -1
- package/dist/web/mockRequests.d.ts +74 -18
- package/dist/web/mockRequests.d.ts.map +1 -1
- package/dist/web/mockRequests.js +118 -39
- package/dist/web/vitest/index.d.ts +1 -0
- package/dist/web/vitest/index.d.ts.map +1 -1
- package/dist/web/vitest/index.js +2 -0
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts +12 -0
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.d.ts.map +1 -0
- package/dist/web/vitest/vite-plugin-cedar-vitest-web-config.js +16 -0
- package/dist/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts.map +1 -1
- package/dist/web/vitest/vite-plugin-create-auth-import-transform.d.ts.map +1 -1
- package/dist/web/vitest/vitest-web.setup.d.ts +2 -0
- package/dist/web/vitest/vitest-web.setup.d.ts.map +1 -0
- package/dist/web/vitest/vitest-web.setup.js +18 -0
- package/package.json +41 -106
- package/LICENSE +0 -21
- package/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
- package/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
- package/config/jest/api/RedwoodApiJestEnv.js +0 -48
- package/config/jest/api/apiBabelConfig.d.ts +0 -5
- package/config/jest/api/apiBabelConfig.d.ts.map +0 -1
- package/config/jest/api/apiBabelConfig.js +0 -34
- package/config/jest/api/globalSetup.d.ts +0 -3
- package/config/jest/api/globalSetup.d.ts.map +0 -1
- package/config/jest/api/globalSetup.js +0 -63
- package/config/jest/api/index.d.ts +0 -3
- package/config/jest/api/index.d.ts.map +0 -1
- package/config/jest/api/index.js +0 -25
- package/config/jest/api/jest-preset.d.ts +0 -4
- package/config/jest/api/jest-preset.d.ts.map +0 -1
- package/config/jest/api/jest-preset.js +0 -99
- package/config/jest/api/jest.setup.d.ts +0 -2
- package/config/jest/api/jest.setup.d.ts.map +0 -1
- package/config/jest/api/jest.setup.js +0 -271
- package/config/jest/api/package.json +0 -8
- package/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
- package/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
- package/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -121
- package/config/jest/jest-serial-runner.d.ts +0 -8
- package/config/jest/jest-serial-runner.d.ts.map +0 -1
- package/config/jest/jest-serial-runner.js +0 -37
- package/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
- package/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
- package/config/jest/web/RedwoodWebJestEnv.js +0 -38
- package/config/jest/web/index.d.ts +0 -3
- package/config/jest/web/index.d.ts.map +0 -1
- package/config/jest/web/index.js +0 -25
- package/config/jest/web/jest-preset.d.ts +0 -4
- package/config/jest/web/jest-preset.d.ts.map +0 -1
- package/config/jest/web/jest-preset.js +0 -119
- package/config/jest/web/jest.setup.d.ts +0 -8
- package/config/jest/web/jest.setup.d.ts.map +0 -1
- package/config/jest/web/jest.setup.js +0 -22
- package/config/jest/web/package.json +0 -8
- package/config/jest/web/resolver.d.ts +0 -4
- package/config/jest/web/resolver.d.ts.map +0 -1
- package/config/jest/web/resolver.js +0 -30
- package/config/jest/web/webBabelConfig.d.ts +0 -10
- package/config/jest/web/webBabelConfig.d.ts.map +0 -1
- package/config/jest/web/webBabelConfig.js +0 -48
- package/config/package.json +0 -1
- package/dist/api/directUrlHelpers.d.ts +0 -3
- package/dist/api/directUrlHelpers.d.ts.map +0 -1
- package/dist/api/directUrlHelpers.js +0 -25
- package/dist/cjs/api/apiFunction.d.ts +0 -37
- package/dist/cjs/api/apiFunction.d.ts.map +0 -1
- package/dist/cjs/api/apiFunction.js +0 -89
- package/dist/cjs/api/directUrlHelpers.d.ts +0 -3
- package/dist/cjs/api/directUrlHelpers.d.ts.map +0 -1
- package/dist/cjs/api/directUrlHelpers.js +0 -60
- package/dist/cjs/api/directive.d.ts +0 -51
- package/dist/cjs/api/directive.d.ts.map +0 -1
- package/dist/cjs/api/directive.js +0 -77
- package/dist/cjs/api/index.d.ts +0 -5
- package/dist/cjs/api/index.d.ts.map +0 -1
- package/dist/cjs/api/index.js +0 -28
- package/dist/cjs/api/mockContext.d.ts +0 -5
- package/dist/cjs/api/mockContext.d.ts.map +0 -1
- package/dist/cjs/api/mockContext.js +0 -58
- package/dist/cjs/api/scenario.d.ts +0 -108
- package/dist/cjs/api/scenario.d.ts.map +0 -1
- package/dist/cjs/api/scenario.js +0 -30
- package/dist/cjs/api/vitest/CedarApiVitestEnv.js +0 -73
- package/dist/cjs/api/vitest/index.js +0 -34
- package/dist/cjs/api/vitest/vite-plugin-auto-import.js +0 -71
- package/dist/cjs/api/vitest/vite-plugin-cedar-vitest-api-config.js +0 -69
- package/dist/cjs/api/vitest/vite-plugin-track-db-imports.js +0 -47
- package/dist/cjs/api/vitest/vitest-api.setup.js +0 -272
- package/dist/cjs/cache/index.d.ts +0 -50
- package/dist/cjs/cache/index.d.ts.map +0 -1
- package/dist/cjs/cache/index.js +0 -104
- package/dist/cjs/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
- package/dist/cjs/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/RedwoodApiJestEnv.js +0 -48
- package/dist/cjs/config/jest/api/apiBabelConfig.d.ts +0 -5
- package/dist/cjs/config/jest/api/apiBabelConfig.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/apiBabelConfig.js +0 -34
- package/dist/cjs/config/jest/api/globalSetup.d.ts +0 -3
- package/dist/cjs/config/jest/api/globalSetup.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/globalSetup.js +0 -63
- package/dist/cjs/config/jest/api/index.d.ts +0 -3
- package/dist/cjs/config/jest/api/index.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/index.js +0 -25
- package/dist/cjs/config/jest/api/jest-preset.d.ts +0 -4
- package/dist/cjs/config/jest/api/jest-preset.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/jest-preset.js +0 -99
- package/dist/cjs/config/jest/api/jest.setup.d.ts +0 -2
- package/dist/cjs/config/jest/api/jest.setup.d.ts.map +0 -1
- package/dist/cjs/config/jest/api/jest.setup.js +0 -271
- package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
- package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
- package/dist/cjs/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -121
- package/dist/cjs/config/jest/jest-serial-runner.d.ts +0 -8
- package/dist/cjs/config/jest/jest-serial-runner.d.ts.map +0 -1
- package/dist/cjs/config/jest/jest-serial-runner.js +0 -37
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/RedwoodWebJestEnv.js +0 -38
- package/dist/cjs/config/jest/web/index.d.ts +0 -3
- package/dist/cjs/config/jest/web/index.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/index.js +0 -25
- package/dist/cjs/config/jest/web/jest-preset.d.ts +0 -4
- package/dist/cjs/config/jest/web/jest-preset.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/jest-preset.js +0 -119
- package/dist/cjs/config/jest/web/jest.setup.d.ts +0 -8
- package/dist/cjs/config/jest/web/jest.setup.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/jest.setup.js +0 -22
- package/dist/cjs/config/jest/web/resolver.d.ts +0 -4
- package/dist/cjs/config/jest/web/resolver.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/resolver.js +0 -30
- package/dist/cjs/config/jest/web/webBabelConfig.d.ts +0 -10
- package/dist/cjs/config/jest/web/webBabelConfig.d.ts.map +0 -1
- package/dist/cjs/config/jest/web/webBabelConfig.js +0 -48
- package/dist/cjs/package.json +0 -1
- package/dist/cjs/web/MockParamsProvider.d.ts +0 -7
- package/dist/cjs/web/MockParamsProvider.d.ts.map +0 -1
- package/dist/cjs/web/MockParamsProvider.js +0 -44
- package/dist/cjs/web/MockProviders.d.ts +0 -5
- package/dist/cjs/web/MockProviders.d.ts.map +0 -1
- package/dist/cjs/web/MockProviders.js +0 -60
- package/dist/cjs/web/MockRouter.d.ts +0 -11
- package/dist/cjs/web/MockRouter.d.ts.map +0 -1
- package/dist/cjs/web/MockRouter.js +0 -48
- package/dist/cjs/web/customRender.d.ts +0 -6
- package/dist/cjs/web/customRender.d.ts.map +0 -1
- package/dist/cjs/web/customRender.js +0 -54
- package/dist/cjs/web/fileMock.d.ts +0 -9
- package/dist/cjs/web/fileMock.d.ts.map +0 -1
- package/dist/cjs/web/fileMock.js +0 -24
- package/dist/cjs/web/findCellMocks.d.ts +0 -2
- package/dist/cjs/web/findCellMocks.d.ts.map +0 -1
- package/dist/cjs/web/findCellMocks.js +0 -45
- package/dist/cjs/web/globRoutesImporter.d.ts +0 -13
- package/dist/cjs/web/globRoutesImporter.d.ts.map +0 -1
- package/dist/cjs/web/globRoutesImporter.js +0 -46
- package/dist/cjs/web/global.d.ts +0 -6
- package/dist/cjs/web/global.d.ts.map +0 -1
- package/dist/cjs/web/global.js +0 -1
- package/dist/cjs/web/index.d.ts +0 -6
- package/dist/cjs/web/index.d.ts.map +0 -1
- package/dist/cjs/web/index.js +0 -41
- package/dist/cjs/web/mockAuth.d.ts +0 -29
- package/dist/cjs/web/mockAuth.d.ts.map +0 -1
- package/dist/cjs/web/mockAuth.js +0 -89
- package/dist/cjs/web/mockRequests.d.ts +0 -30
- package/dist/cjs/web/mockRequests.d.ts.map +0 -1
- package/dist/cjs/web/mockRequests.js +0 -139
- package/dist/cjs/web/vitest/index.d.ts +0 -4
- package/dist/cjs/web/vitest/index.d.ts.map +0 -1
- package/dist/cjs/web/vitest/index.js +0 -34
- package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts +0 -2
- package/dist/cjs/web/vitest/vite-plugin-auto-import.d.ts.map +0 -1
- package/dist/cjs/web/vitest/vite-plugin-auto-import.js +0 -60
- package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts +0 -7
- package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.d.ts.map +0 -1
- package/dist/cjs/web/vitest/vite-plugin-cedarjs-router-import-transform.js +0 -42
- package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts +0 -3
- package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.d.ts.map +0 -1
- package/dist/cjs/web/vitest/vite-plugin-create-auth-import-transform.js +0 -43
- package/dist/config/jest/api/RedwoodApiJestEnv.d.ts +0 -11
- package/dist/config/jest/api/RedwoodApiJestEnv.d.ts.map +0 -1
- package/dist/config/jest/api/RedwoodApiJestEnv.js +0 -28
- package/dist/config/jest/api/apiBabelConfig.d.ts +0 -5
- package/dist/config/jest/api/apiBabelConfig.d.ts.map +0 -1
- package/dist/config/jest/api/apiBabelConfig.js +0 -18
- package/dist/config/jest/api/globalSetup.d.ts +0 -3
- package/dist/config/jest/api/globalSetup.d.ts.map +0 -1
- package/dist/config/jest/api/globalSetup.js +0 -36
- package/dist/config/jest/api/index.d.ts +0 -3
- package/dist/config/jest/api/index.d.ts.map +0 -1
- package/dist/config/jest/api/index.js +0 -11
- package/dist/config/jest/api/jest-preset.d.ts +0 -4
- package/dist/config/jest/api/jest-preset.d.ts.map +0 -1
- package/dist/config/jest/api/jest-preset.js +0 -69
- package/dist/config/jest/api/jest.setup.d.ts +0 -2
- package/dist/config/jest/api/jest.setup.d.ts.map +0 -1
- package/dist/config/jest/api/jest.setup.js +0 -248
- package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts +0 -11
- package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.d.ts.map +0 -1
- package/dist/config/jest/babelPlugins/babel-plugin-redwood-cell.js +0 -101
- package/dist/config/jest/jest-serial-runner.d.ts +0 -8
- package/dist/config/jest/jest-serial-runner.d.ts.map +0 -1
- package/dist/config/jest/jest-serial-runner.js +0 -23
- package/dist/config/jest/web/RedwoodWebJestEnv.d.ts +0 -6
- package/dist/config/jest/web/RedwoodWebJestEnv.d.ts.map +0 -1
- package/dist/config/jest/web/RedwoodWebJestEnv.js +0 -18
- package/dist/config/jest/web/index.d.ts +0 -3
- package/dist/config/jest/web/index.d.ts.map +0 -1
- package/dist/config/jest/web/index.js +0 -11
- package/dist/config/jest/web/jest-preset.d.ts +0 -4
- package/dist/config/jest/web/jest-preset.d.ts.map +0 -1
- package/dist/config/jest/web/jest-preset.js +0 -89
- package/dist/config/jest/web/jest.setup.d.ts +0 -8
- package/dist/config/jest/web/jest.setup.d.ts.map +0 -1
- package/dist/config/jest/web/jest.setup.js +0 -28
- package/dist/config/jest/web/resolver.d.ts +0 -4
- package/dist/config/jest/web/resolver.d.ts.map +0 -1
- package/dist/config/jest/web/resolver.js +0 -38
- package/dist/config/jest/web/webBabelConfig.d.ts +0 -10
- package/dist/config/jest/web/webBabelConfig.d.ts.map +0 -1
- package/dist/config/jest/web/webBabelConfig.js +0 -18
- package/dist/web/fileMock.d.ts +0 -9
- package/dist/web/fileMock.d.ts.map +0 -1
- package/dist/web/fileMock.js +0 -4
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redacts credentials from a database connection string so it's safe to
|
|
3
|
+
* print. Handles both URI-style authority credentials, e.g.
|
|
4
|
+
* `postgres://user:pass@host/db` -> `postgres://user:***@host/db`, and
|
|
5
|
+
* semicolon-delimited key/value credentials used by SQL Server connection
|
|
6
|
+
* strings, e.g. `Server=host;Password=secret;` -> `Server=host;Password=***;`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function redactDatabaseUrl(url: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Checks that the `DATABASE_URL` about to be used for tests matches the
|
|
11
|
+
* datasource provider configured in `schema.prisma`, and throws an
|
|
12
|
+
* actionable error if they don't match.
|
|
13
|
+
*
|
|
14
|
+
* Without this check, running `prisma db push`/`migrate reset` against a
|
|
15
|
+
* mismatched provider/URL combination (e.g. a leftover sqlite fallback URL
|
|
16
|
+
* with a `postgresql` schema) can hang indefinitely with no output, instead
|
|
17
|
+
* of failing fast. See https://github.com/cedarjs/cedar/issues/2284.
|
|
18
|
+
*
|
|
19
|
+
* If the provider can't be determined (e.g. `schema.prisma` doesn't exist
|
|
20
|
+
* yet), this is a no-op — Prisma itself will surface the problem.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkTestDatabaseUrlMatchesProvider(databaseUrl: string, usedFallback: boolean): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=checkTestDatabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkTestDatabase.d.ts","sourceRoot":"","sources":["../../src/api/checkTestDatabase.ts"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mCAAmC,CACvD,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,OAAO,iBAmCtB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getPrismaDatasourceProvider } from "@cedarjs/project-config";
|
|
2
|
+
const PROVIDER_URL_SCHEMES = {
|
|
3
|
+
sqlite: ["file:"],
|
|
4
|
+
postgresql: ["postgres:", "postgresql:"],
|
|
5
|
+
postgres: ["postgres:", "postgresql:"],
|
|
6
|
+
cockroachdb: ["postgres:", "postgresql:"],
|
|
7
|
+
mysql: ["mysql:"],
|
|
8
|
+
sqlserver: ["sqlserver:"],
|
|
9
|
+
mongodb: ["mongodb:", "mongodb+srv:"]
|
|
10
|
+
};
|
|
11
|
+
function getUrlScheme(url) {
|
|
12
|
+
const match = url.match(/^([a-z][a-z0-9+.-]*:)/i);
|
|
13
|
+
return match?.[1]?.toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
function redactDatabaseUrl(url) {
|
|
16
|
+
return url.replace(/:\/\/([^:/?#]+):([^@/?#]+)@/, "://$1:***@").replace(/((?:^|;)\s*password\s*=)[^;]*/gi, "$1***");
|
|
17
|
+
}
|
|
18
|
+
async function checkTestDatabaseUrlMatchesProvider(databaseUrl, usedFallback) {
|
|
19
|
+
let provider;
|
|
20
|
+
try {
|
|
21
|
+
provider = await getPrismaDatasourceProvider();
|
|
22
|
+
} catch {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const expectedSchemes = PROVIDER_URL_SCHEMES[provider];
|
|
26
|
+
if (!expectedSchemes) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const actualScheme = getUrlScheme(databaseUrl);
|
|
30
|
+
if (actualScheme && expectedSchemes.includes(actualScheme)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const redactedUrl = redactDatabaseUrl(databaseUrl);
|
|
34
|
+
const reason = usedFallback ? `TEST_DATABASE_URL is not set, so the default sqlite test database was used (${redactedUrl}), but your schema.prisma is configured for "${provider}". Set TEST_DATABASE_URL to a "${provider}" connection string to run tests.` : `TEST_DATABASE_URL (${redactedUrl}) does not match the "${provider}" provider configured in schema.prisma. Update TEST_DATABASE_URL to a "${provider}" connection string.`;
|
|
35
|
+
throw new Error(
|
|
36
|
+
`Test database URL does not match your Prisma schema's provider.
|
|
37
|
+
|
|
38
|
+
${reason}`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
checkTestDatabaseUrlMatchesProvider,
|
|
43
|
+
redactDatabaseUrl
|
|
44
|
+
};
|
package/dist/api/index.d.ts
CHANGED
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA"}
|
package/dist/api/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CedarApiVitestEnv.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/CedarApiVitestEnv.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CedarApiVitestEnv.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/CedarApiVitestEnv.ts"],"names":[],"mappings":"AAEA,OAAO,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAUtD,QAAA,MAAM,yBAAyB,EAAE,WAgDhC,CAAA;AAED,eAAe,yBAAyB,CAAA"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import path from "node:path";
|
|
2
2
|
import "dotenv-defaults/config.js";
|
|
3
3
|
import execa from "execa";
|
|
4
|
-
import { getPaths
|
|
5
|
-
import {
|
|
6
|
-
|
|
4
|
+
import { getPaths } from "@cedarjs/project-config";
|
|
5
|
+
import { getPackageManager } from "@cedarjs/project-config/packageManager";
|
|
6
|
+
import {
|
|
7
|
+
checkTestDatabaseUrlMatchesProvider,
|
|
8
|
+
redactDatabaseUrl
|
|
9
|
+
} from "../checkTestDatabase.js";
|
|
7
10
|
const CedarApiVitestEnvironment = {
|
|
8
11
|
name: "cedar-api",
|
|
9
|
-
|
|
12
|
+
viteEnvironment: "ssr",
|
|
10
13
|
async setup() {
|
|
11
14
|
if (process.env.SKIP_DB_PUSH === "1") {
|
|
12
15
|
return {
|
|
@@ -15,21 +18,23 @@ const CedarApiVitestEnvironment = {
|
|
|
15
18
|
};
|
|
16
19
|
}
|
|
17
20
|
const cedarPaths = getPaths();
|
|
18
|
-
const defaultDb =
|
|
21
|
+
const defaultDb = `file:${path.join(cedarPaths.generated.base, "test.db")}`;
|
|
22
|
+
const usedFallback = !process.env.TEST_DATABASE_URL;
|
|
19
23
|
process.env.DATABASE_URL = process.env.TEST_DATABASE_URL || defaultDb;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
await checkTestDatabaseUrlMatchesProvider(
|
|
25
|
+
process.env.DATABASE_URL,
|
|
26
|
+
usedFallback
|
|
27
|
+
);
|
|
28
|
+
console.log(
|
|
29
|
+
`Setting up test database: ${redactDatabaseUrl(process.env.DATABASE_URL)}`
|
|
30
|
+
);
|
|
31
|
+
const command = process.env.TEST_DATABASE_STRATEGY === "reset" ? ["prisma", "migrate", "reset", "--force"] : ["prisma", "db", "push", "--force-reset", "--accept-data-loss"];
|
|
32
|
+
const pm = getPackageManager();
|
|
33
|
+
const pmExec = pm === "pnpm" ? pm : "npx";
|
|
34
|
+
execa.sync(pmExec, ["cedar", ...command], {
|
|
27
35
|
cwd: cedarPaths.api.base,
|
|
28
36
|
stdio: "inherit",
|
|
29
|
-
env:
|
|
30
|
-
DATABASE_URL: process.env.DATABASE_URL,
|
|
31
|
-
...directUrlDefinition
|
|
32
|
-
}
|
|
37
|
+
env: process.env
|
|
33
38
|
});
|
|
34
39
|
return {
|
|
35
40
|
teardown() {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether `e` is a constraint violation that scenario teardown recovers from
|
|
3
|
+
* by emptying the table later, rather than an error worth raising.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isHandledTeardownError(e: unknown): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Empties every table in `order`, deferring a table to the end of the order
|
|
8
|
+
* when a foreign key says another table has to be emptied first, and
|
|
9
|
+
* returning the order that worked so the next run can start with it.
|
|
10
|
+
*
|
|
11
|
+
* A table that cannot be emptied in any order (a trigger that aborts the
|
|
12
|
+
* delete, or a foreign key no ordering satisfies) would otherwise be deferred
|
|
13
|
+
* forever, since deferring appends to the order being walked. Deferring every
|
|
14
|
+
* table still waiting without emptying one means no order works, so the
|
|
15
|
+
* driver's error is raised instead.
|
|
16
|
+
*/
|
|
17
|
+
export declare function emptyTablesInWorkingOrder(order: string[], emptyTable: (modelName: string) => Promise<unknown>): Promise<string[]>;
|
|
18
|
+
//# sourceMappingURL=teardown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/teardown.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAQ1D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAClD,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const RETRYABLE_ERROR_KINDS = [
|
|
2
|
+
"ForeignKeyConstraintViolation",
|
|
3
|
+
"RestrictViolation"
|
|
4
|
+
];
|
|
5
|
+
function property(value, key) {
|
|
6
|
+
return typeof value === "object" && value !== null ? value[key] : void 0;
|
|
7
|
+
}
|
|
8
|
+
function isHandledTeardownError(e) {
|
|
9
|
+
const cause = property(
|
|
10
|
+
property(property(e, "meta"), "driverAdapterError"),
|
|
11
|
+
"cause"
|
|
12
|
+
);
|
|
13
|
+
const kind = property(cause, "kind");
|
|
14
|
+
return typeof kind === "string" && RETRYABLE_ERROR_KINDS.includes(kind);
|
|
15
|
+
}
|
|
16
|
+
async function emptyTablesInWorkingOrder(order, emptyTable) {
|
|
17
|
+
const remaining = [...order];
|
|
18
|
+
let pendingCount = remaining.length;
|
|
19
|
+
let deferralsSinceLastEmptied = 0;
|
|
20
|
+
for (const modelName of remaining) {
|
|
21
|
+
if (modelName === null) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
await emptyTable(modelName);
|
|
26
|
+
pendingCount--;
|
|
27
|
+
deferralsSinceLastEmptied = 0;
|
|
28
|
+
} catch (e) {
|
|
29
|
+
console.error("teardown error\n", e);
|
|
30
|
+
if (!isHandledTeardownError(e) || deferralsSinceLastEmptied >= pendingCount) {
|
|
31
|
+
throw e;
|
|
32
|
+
}
|
|
33
|
+
deferralsSinceLastEmptied++;
|
|
34
|
+
remaining[remaining.indexOf(modelName)] = null;
|
|
35
|
+
remaining.push(modelName);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return remaining.filter((name) => name !== null);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
emptyTablesInWorkingOrder,
|
|
42
|
+
isHandledTeardownError
|
|
43
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-cedar-vitest-api-config.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vite-plugin-cedar-vitest-api-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,wBAAgB,0BAA0B,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"vite-plugin-cedar-vitest-api-config.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vite-plugin-cedar-vitest-api-config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAIlC,wBAAgB,0BAA0B,IAAI,MAAM,CAiCnD"}
|
|
@@ -7,7 +7,12 @@ function cedarVitestApiConfigPlugin() {
|
|
|
7
7
|
return {
|
|
8
8
|
define: getEnvVarDefinitions(),
|
|
9
9
|
ssr: {
|
|
10
|
-
|
|
10
|
+
// `@cedarjs/tenancy` reads and writes the request context, which
|
|
11
|
+
// the api test setup replaces with a mock. The mock only reaches
|
|
12
|
+
// code Vite processes, so the tenancy runtime has to be bundled
|
|
13
|
+
// rather than loaded as an external dependency, or a service under
|
|
14
|
+
// test and its Prisma extension would see different contexts.
|
|
15
|
+
noExternal: ["@cedarjs/testing", "@cedarjs/tenancy"]
|
|
11
16
|
},
|
|
12
17
|
resolve: {
|
|
13
18
|
alias: {
|
|
@@ -16,13 +21,13 @@ function cedarVitestApiConfigPlugin() {
|
|
|
16
21
|
},
|
|
17
22
|
test: {
|
|
18
23
|
environment: path.join(import.meta.dirname, "CedarApiVitestEnv.js"),
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
|
|
24
|
+
// All api test files share a single test database, so they can't
|
|
25
|
+
// run in parallel. In Vitest 3 project-level fileParallelism didn't
|
|
26
|
+
// work (https://github.com/vitest-dev/vitest/discussions/7416) and
|
|
27
|
+
// we used the now-removed `poolOptions: { forks: { singleFork:
|
|
28
|
+
// true } }` as a workaround. Vitest 4 removed `poolOptions` and
|
|
29
|
+
// supports `fileParallelism` in project configs.
|
|
30
|
+
fileParallelism: false,
|
|
26
31
|
setupFiles: [path.join(import.meta.dirname, "vitest-api.setup.js")]
|
|
27
32
|
}
|
|
28
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest-api.setup.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vitest-api.setup.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"vitest-api.setup.d.ts","sourceRoot":"","sources":["../../../src/api/vitest/vitest-api.setup.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AA4C1D,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3E;AAUD,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,cAAc,EAAE,cAAc,CAAA;IAElC,IAAI,uBAAuB,EAAE,OAAO,CAAA;CACrC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { afterAll, beforeEach, it, describe, vi, beforeAll } from "vitest";
|
|
4
|
-
import { getPaths,
|
|
4
|
+
import { getPaths, getPrismaSchemas } from "@cedarjs/project-config";
|
|
5
5
|
import { defineScenario } from "@cedarjs/testing/api";
|
|
6
|
+
import { emptyTablesInWorkingOrder } from "./teardown.js";
|
|
6
7
|
const mockContextStore = vi.hoisted(() => /* @__PURE__ */ new Map());
|
|
7
8
|
const mockContext = vi.hoisted(
|
|
8
9
|
() => new Proxy(
|
|
@@ -38,7 +39,6 @@ globalThis.mockCurrentUser = (currentUser) => {
|
|
|
38
39
|
};
|
|
39
40
|
globalThis.defineScenario = defineScenario;
|
|
40
41
|
const cedarPaths = getPaths();
|
|
41
|
-
const FOREIGN_KEY_ERRORS = [1451, 1811, 23503];
|
|
42
42
|
const TEARDOWN_CACHE_PATH = path.join(
|
|
43
43
|
cedarPaths.generated.base,
|
|
44
44
|
"scenarioTeardown.json"
|
|
@@ -60,8 +60,8 @@ function buildScenario(itFunc) {
|
|
|
60
60
|
} else {
|
|
61
61
|
throw new Error("scenario() requires 2 or 3 arguments");
|
|
62
62
|
}
|
|
63
|
-
return itFunc(testName, async (
|
|
64
|
-
const testPath =
|
|
63
|
+
return itFunc(testName, async ({ task }) => {
|
|
64
|
+
const testPath = task.file.filepath;
|
|
65
65
|
const { scenario } = await loadScenarios(testPath, scenarioName);
|
|
66
66
|
const scenarioData = await seedScenario(scenario);
|
|
67
67
|
try {
|
|
@@ -89,8 +89,8 @@ function buildDescribeScenario(describeFunc) {
|
|
|
89
89
|
}
|
|
90
90
|
return describeFunc(describeBlockName, () => {
|
|
91
91
|
let scenarioData;
|
|
92
|
-
beforeAll(async (
|
|
93
|
-
const testPath =
|
|
92
|
+
beforeAll(async ({}, suite) => {
|
|
93
|
+
const testPath = suite.file.filepath;
|
|
94
94
|
const { scenario } = await loadScenarios(testPath, scenarioName);
|
|
95
95
|
scenarioData = await seedScenario(scenario);
|
|
96
96
|
});
|
|
@@ -106,9 +106,8 @@ async function configureTeardown() {
|
|
|
106
106
|
if (!wasDbImported()) {
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
|
-
const { getDMMF
|
|
110
|
-
const
|
|
111
|
-
const result = await getSchemaWithPath(schemaPath);
|
|
109
|
+
const { getDMMF } = await import("@prisma/internals");
|
|
110
|
+
const result = await getPrismaSchemas();
|
|
112
111
|
const schema = await getDMMF({ datamodel: result.schemas });
|
|
113
112
|
const schemaModels = schema.datamodel.models.map((m) => {
|
|
114
113
|
return m.dbName || m.name;
|
|
@@ -133,23 +132,12 @@ async function teardown() {
|
|
|
133
132
|
}
|
|
134
133
|
const quoteStyle2 = await getQuoteStyle();
|
|
135
134
|
const projectDb = await getProjectDb();
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const match = isErrorWithMessage(e) && e.message.match(/Code: `(\d+)`/);
|
|
143
|
-
if (match && FOREIGN_KEY_ERRORS.includes(parseInt(match[1]))) {
|
|
144
|
-
const index = teardownOrder.indexOf(modelName);
|
|
145
|
-
teardownOrder[index] = null;
|
|
146
|
-
teardownOrder.push(modelName);
|
|
147
|
-
} else {
|
|
148
|
-
throw e;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
teardownOrder = teardownOrder.filter((val) => val);
|
|
135
|
+
teardownOrder = await emptyTablesInWorkingOrder(
|
|
136
|
+
teardownOrder,
|
|
137
|
+
(modelName) => projectDb.$executeRawUnsafe(
|
|
138
|
+
`DELETE FROM ${quoteStyle2}${modelName}${quoteStyle2}`
|
|
139
|
+
)
|
|
140
|
+
);
|
|
153
141
|
if (!isIdenticalArray(teardownOrder, originalTeardownOrder)) {
|
|
154
142
|
originalTeardownOrder = deepCopy(teardownOrder);
|
|
155
143
|
fs.writeFileSync(TEARDOWN_CACHE_PATH, JSON.stringify(teardownOrder));
|
|
@@ -210,9 +198,8 @@ const wasDbImported = () => {
|
|
|
210
198
|
};
|
|
211
199
|
let quoteStyle;
|
|
212
200
|
async function getQuoteStyle() {
|
|
213
|
-
const { getConfig: getPrismaConfig
|
|
214
|
-
const
|
|
215
|
-
const result = await getSchemaWithPath(schemaPath);
|
|
201
|
+
const { getConfig: getPrismaConfig } = await import("@prisma/internals");
|
|
202
|
+
const result = await getPrismaSchemas();
|
|
216
203
|
if (!quoteStyle) {
|
|
217
204
|
const config = await getPrismaConfig({
|
|
218
205
|
datamodel: result.schemas
|
|
@@ -229,7 +216,8 @@ async function getQuoteStyle() {
|
|
|
229
216
|
}
|
|
230
217
|
async function getProjectDb() {
|
|
231
218
|
const libDb = await import(`${cedarPaths.api.lib}/db`);
|
|
232
|
-
|
|
219
|
+
const db = libDb.db;
|
|
220
|
+
return typeof db?.$withoutTenant === "function" ? db.$withoutTenant() : db;
|
|
233
221
|
}
|
|
234
222
|
function isIdenticalArray(a, b) {
|
|
235
223
|
return JSON.stringify(a) === JSON.stringify(b);
|
|
@@ -237,9 +225,6 @@ function isIdenticalArray(a, b) {
|
|
|
237
225
|
function deepCopy(obj) {
|
|
238
226
|
return JSON.parse(JSON.stringify(obj));
|
|
239
227
|
}
|
|
240
|
-
function isErrorWithMessage(e) {
|
|
241
|
-
return !!e && typeof e === "object" && "message" in e && typeof e.message === "string";
|
|
242
|
-
}
|
|
243
228
|
function isErrorWithCode(e) {
|
|
244
229
|
return !!e && typeof e === "object" && "code" in e && typeof e.code === "string";
|
|
245
230
|
}
|
package/dist/cache/index.js
CHANGED
|
@@ -57,7 +57,7 @@ const _isKVPair = (keyOrCachedValue, cachedValue) => {
|
|
|
57
57
|
const _checkValueForKey = (cacheClient, cacheKey, expectedValue) => {
|
|
58
58
|
try {
|
|
59
59
|
const cachedStringValue = cacheClient.storage[cacheKey]?.value;
|
|
60
|
-
const expectedValueOrMatcher = expectedValue?.$$typeof === Symbol.for("jest.asymmetricMatcher") ? expectedValue : JSON.parse(JSON.stringify(expectedValue));
|
|
60
|
+
const expectedValueOrMatcher = expectedValue?.$$typeof === /* @__PURE__ */ Symbol.for("jest.asymmetricMatcher") ? expectedValue : JSON.parse(JSON.stringify(expectedValue));
|
|
61
61
|
expect(
|
|
62
62
|
cachedStringValue ? JSON.parse(cachedStringValue) : void 0
|
|
63
63
|
).toEqual(expectedValueOrMatcher);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockParamsProvider.d.ts","sourceRoot":"","sources":["../../src/web/MockParamsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"MockParamsProvider.d.ts","sourceRoot":"","sources":["../../src/web/MockParamsProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAMzB,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAgB9C,CAAA"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { useLocation, ParamsContext, parseSearch } from "@cedarjs/router";
|
|
3
|
+
import { mockedRouteParamsMeta } from "./mockRequests.js";
|
|
3
4
|
const MockParamsProvider = ({ children }) => {
|
|
4
5
|
const location = useLocation();
|
|
5
6
|
const searchParams = parseSearch(location.search);
|
|
6
|
-
return /* @__PURE__ */ React.createElement(
|
|
7
|
+
return /* @__PURE__ */ React.createElement(
|
|
8
|
+
ParamsContext.Provider,
|
|
9
|
+
{
|
|
10
|
+
value: {
|
|
11
|
+
params: { ...searchParams, ...mockedRouteParamsMeta.params }
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
children
|
|
15
|
+
);
|
|
7
16
|
};
|
|
8
17
|
export {
|
|
9
18
|
MockParamsProvider
|
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { LocationProvider } from "@cedarjs/router";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { CedarProvider } from "@cedarjs/web";
|
|
4
|
+
import { CedarApolloProvider } from "@cedarjs/web/apollo/CedarApolloProvider";
|
|
5
5
|
import { UserRoutes as VitestUserRoutes } from "./globRoutesImporter.js";
|
|
6
6
|
import { useAuth } from "./mockAuth.js";
|
|
7
7
|
import { MockParamsProvider } from "./MockParamsProvider.js";
|
|
8
8
|
let UserRoutes;
|
|
9
9
|
try {
|
|
10
|
-
const userRoutesModule = require("~
|
|
10
|
+
const userRoutesModule = require("~__CEDAR__USER_ROUTES_FOR_MOCK");
|
|
11
11
|
UserRoutes = userRoutesModule.default;
|
|
12
12
|
} catch (error) {
|
|
13
|
-
if (!isModuleNotFoundError(error, "~
|
|
13
|
+
if (!isModuleNotFoundError(error, "~__CEDAR__USER_ROUTES_FOR_MOCK")) {
|
|
14
14
|
console.warn(error);
|
|
15
15
|
}
|
|
16
16
|
UserRoutes = () => /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
17
17
|
}
|
|
18
18
|
const MockProviders = ({ children }) => {
|
|
19
|
-
return /* @__PURE__ */ React.createElement(
|
|
19
|
+
return /* @__PURE__ */ React.createElement(CedarProvider, { titleTemplate: "%PageTitle | %AppTitle" }, /* @__PURE__ */ React.createElement(CedarApolloProvider, { useAuth }, /* @__PURE__ */ React.createElement(UserRoutes, null), /* @__PURE__ */ React.createElement(VitestUserRoutes, null), /* @__PURE__ */ React.createElement(LocationProvider, null, /* @__PURE__ */ React.createElement(MockParamsProvider, null, children))));
|
|
20
20
|
};
|
|
21
21
|
function isModuleNotFoundError(error, module) {
|
|
22
|
-
|
|
22
|
+
if (!error || typeof error !== "object" || !("code" in error) || error.code !== "MODULE_NOT_FOUND") {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if ("moduleName" in error) {
|
|
26
|
+
return error.moduleName === module;
|
|
27
|
+
}
|
|
28
|
+
return "message" in error && typeof error.message === "string" && (error.message.includes(`'${module}'`) || error.message.includes(`"${module}"`));
|
|
23
29
|
}
|
|
24
30
|
export {
|
|
25
31
|
MockProviders
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockRouter.d.ts","sourceRoot":"","sources":["../../src/web/MockRouter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MockRouter.d.ts","sourceRoot":"","sources":["../../src/web/MockRouter.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D,cAAc,4BAA4B,CAAA;AAE1C,eAAO,MAAM,MAAM,EAAE;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,MAAM,CAAA;CAAO,CAAA;AAE/D;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAcxC,CAAA"}
|
|
@@ -1,30 +1,86 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import type { RequestHandler, SharedOptions } from 'msw';
|
|
2
|
+
import type { StartOptions as StartMSWWorkerOptions } from 'msw/browser';
|
|
3
|
+
interface MockServerCommonApi {
|
|
4
|
+
use(...handlers: any[]): void;
|
|
5
|
+
resetHandlers(): void;
|
|
6
|
+
}
|
|
7
|
+
type MockWorkerInstance = MockServerCommonApi & {
|
|
8
|
+
stop(): void;
|
|
9
|
+
};
|
|
10
|
+
type MockServerInstance = MockServerCommonApi & {
|
|
11
|
+
listen(options?: Partial<SharedOptions>): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
};
|
|
14
|
+
type StartOptions<Target> = Target extends 'browsers' ? StartMSWWorkerOptions : Partial<SharedOptions>;
|
|
15
|
+
export declare const startMSW: <Target extends "node" | "browsers">(target: Target, options?: StartOptions<Target>) => Promise<MockWorkerInstance | MockServerInstance>;
|
|
10
16
|
export declare const setupRequestHandlers: () => void;
|
|
11
17
|
export declare const closeServer: () => void;
|
|
12
18
|
export declare const registerHandler: (handler: RequestHandler) => void;
|
|
19
|
+
/**
|
|
20
|
+
* The `ctx` object passed to mock-data functions. It mirrors the API of MSW
|
|
21
|
+
* v1's GraphQL context so that existing Cedar mocks keep working with MSW v2,
|
|
22
|
+
* where the `(req, res, ctx)` resolver signature no longer exists.
|
|
23
|
+
*/
|
|
24
|
+
export interface MockGraphQLContext {
|
|
25
|
+
/** Set the http response status code (and optionally status text) */
|
|
26
|
+
status(code: number, text?: string): void;
|
|
27
|
+
/** Delay the response by the given number of milliseconds */
|
|
28
|
+
delay(durationMs: number): void;
|
|
29
|
+
/** Return GraphQL errors in the response */
|
|
30
|
+
errors(errorList: Record<string, unknown>[]): void;
|
|
31
|
+
/** Set a response header. Accepts a name/value pair or an object */
|
|
32
|
+
set(name: string | Record<string, string>, value?: string): void;
|
|
33
|
+
/** Set a response cookie */
|
|
34
|
+
cookie(name: string, value: string): void;
|
|
35
|
+
/** Set the `extensions` field of the GraphQL response */
|
|
36
|
+
extensions(extensions: Record<string, unknown>): void;
|
|
37
|
+
/** Set an arbitrary field on the GraphQL response body */
|
|
38
|
+
field(fieldName: string, value: unknown): void;
|
|
39
|
+
/** Set the `data` field of the response. Overrides the returned mock-data */
|
|
40
|
+
data(data: Record<string, unknown>): void;
|
|
41
|
+
/** Perform a request that bypasses any mock handlers */
|
|
42
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Information about the intercepted GraphQL request, passed to mock-data
|
|
46
|
+
* functions as `req`
|
|
47
|
+
*/
|
|
48
|
+
export interface MockGraphQLRequest {
|
|
49
|
+
/** The intercepted Fetch API `Request` */
|
|
50
|
+
request: Request;
|
|
51
|
+
/** The GraphQL query document string */
|
|
52
|
+
query: string;
|
|
53
|
+
operationName: string;
|
|
54
|
+
variables: Record<string, any>;
|
|
55
|
+
cookies: Record<string, string>;
|
|
56
|
+
url: URL;
|
|
57
|
+
headers: Headers;
|
|
58
|
+
method: string;
|
|
59
|
+
}
|
|
13
60
|
export type DataFunction<Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>> = (variables: QueryVariables, { req, ctx, }: {
|
|
14
|
-
req:
|
|
15
|
-
ctx:
|
|
16
|
-
}) => Query | void
|
|
17
|
-
type
|
|
18
|
-
type ResponseEnhancers = {
|
|
19
|
-
once: ResponseFunction<any>;
|
|
20
|
-
networkError: (message: string) => void;
|
|
21
|
-
};
|
|
22
|
-
type ResponseEnhancer = keyof ResponseEnhancers;
|
|
61
|
+
req: MockGraphQLRequest;
|
|
62
|
+
ctx: MockGraphQLContext;
|
|
63
|
+
}) => Query | void | Promise<Query | void>;
|
|
64
|
+
type ResponseEnhancer = 'once' | 'networkError';
|
|
23
65
|
export declare const mockGraphQLQuery: <Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>>(operation: string, data: DataFunction<Query, QueryVariables> | Query, responseEnhancer?: ResponseEnhancer) => Record<string, any> | DataFunction<Record<string, unknown>, Record<string, any>>;
|
|
24
66
|
export declare const mockGraphQLMutation: <Query extends Record<string, unknown> = Record<string, unknown>, QueryVariables = Record<string, any>>(operation: string, data: DataFunction<Query, QueryVariables> | Query, responseEnhancer?: ResponseEnhancer) => Record<string, any> | DataFunction<Record<string, unknown>, Record<string, any>>;
|
|
25
67
|
export declare const mockedUserMeta: {
|
|
26
68
|
currentUser: Record<string, unknown> | null;
|
|
27
69
|
};
|
|
28
70
|
export declare const mockCurrentUser: (user: Record<string, unknown> | null) => void;
|
|
71
|
+
export declare const mockedRouteParamsMeta: {
|
|
72
|
+
params: Record<string, string>;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Sets the route params `useParams()` (and generated `routes.*()` calls, via
|
|
76
|
+
* `MockRouter`) see in a rendered-in-isolation test -- a cell test, for
|
|
77
|
+
* example, has no matched route to read `{orgSlug}` or similar path params
|
|
78
|
+
* from. Mirrors `mockCurrentUser`'s effect on `useAuth().currentUser`.
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* mockRouteParams({ orgSlug: 'acme' })
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare const mockRouteParams: (params: Record<string, string>) => void;
|
|
29
85
|
export {};
|
|
30
86
|
//# sourceMappingURL=mockRequests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mockRequests.d.ts","sourceRoot":"","sources":["../../src/web/mockRequests.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mockRequests.d.ts","sourceRoot":"","sources":["../../src/web/mockRequests.ts"],"names":[],"mappings":"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"}
|