@danceroutine/tango-testing 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +85 -0
  3. package/dist/aDBClient-W6eXsK3X.js +21 -0
  4. package/dist/aDBClient-W6eXsK3X.js.map +1 -0
  5. package/dist/assertions/index.js +1 -1
  6. package/dist/{assertions-CN6KxXhH.js → assertions-CCFZ53Y-.js} +1 -1
  7. package/dist/assertions-CCFZ53Y-.js.map +1 -0
  8. package/dist/express/anExpressRequest.d.ts +24 -0
  9. package/dist/express/anExpressResponse.d.ts +9 -0
  10. package/dist/express/index.d.ts +3 -0
  11. package/dist/express/index.js +3 -0
  12. package/dist/express-Czpfz_Ay.js +68 -0
  13. package/dist/express-Czpfz_Ay.js.map +1 -0
  14. package/dist/factories/ModelDataFactory.d.ts +16 -1
  15. package/dist/factories/index.js +1 -1
  16. package/dist/{factories-CCAZ6E-g.js → factories-Cl_CAzbj.js} +19 -4
  17. package/dist/factories-Cl_CAzbj.js.map +1 -0
  18. package/dist/index.d.ts +5 -3
  19. package/dist/index.js +8 -11
  20. package/dist/integration/HarnessStrategyRegistry.d.ts +15 -0
  21. package/dist/integration/TestHarness.d.ts +23 -2
  22. package/dist/integration/anIntegrationHarness.d.ts +5 -0
  23. package/dist/integration/config.d.ts +4 -0
  24. package/dist/integration/conformance/index.d.ts +1 -0
  25. package/dist/integration/conformance/runDialectConformanceSuite.d.ts +11 -0
  26. package/dist/integration/domain/Dialect.d.ts +5 -4
  27. package/dist/integration/domain/ResetMode.d.ts +6 -5
  28. package/dist/integration/index.d.ts +8 -1
  29. package/dist/integration/index.js +3 -2
  30. package/dist/integration/migrations/ApplyAndVerifyMigrations.d.ts +3 -0
  31. package/dist/integration/migrations/AssertMigrationPlan.d.ts +3 -0
  32. package/dist/integration/migrations/IntrospectSchema.d.ts +3 -0
  33. package/dist/integration/orm/createQuerySetFixture.d.ts +10 -0
  34. package/dist/integration/orm/expectQueryResult.d.ts +4 -0
  35. package/dist/integration/orm/index.d.ts +6 -0
  36. package/dist/integration/orm/seedTable.d.ts +5 -0
  37. package/dist/integration/runtime/aTangoConfig.d.ts +8 -0
  38. package/dist/integration/runtime/index.d.ts +6 -0
  39. package/dist/integration/runtime/setupTestTangoRuntime.d.ts +6 -0
  40. package/dist/integration/smoke/AppProcessHarness.d.ts +83 -0
  41. package/dist/integration/smoke/index.d.ts +4 -0
  42. package/dist/integration/strategies/PostgresHarnessStrategy.d.ts +9 -0
  43. package/dist/integration/strategies/SqliteHarnessStrategy.d.ts +9 -0
  44. package/dist/integration-BrJw6NzG.js +747 -0
  45. package/dist/integration-BrJw6NzG.js.map +1 -0
  46. package/dist/mocks/DBClient.d.ts +1 -9
  47. package/dist/mocks/MockQuerySetResult.d.ts +5 -12
  48. package/dist/mocks/aDBClient.d.ts +21 -0
  49. package/dist/mocks/aManager.d.ts +17 -0
  50. package/dist/mocks/aQueryExecutor.d.ts +14 -0
  51. package/dist/mocks/aQueryResult.d.ts +5 -0
  52. package/dist/mocks/aQuerySet.d.ts +8 -0
  53. package/dist/mocks/aRequestContext.d.ts +22 -0
  54. package/dist/mocks/index.d.ts +9 -4
  55. package/dist/mocks/index.js +4 -6
  56. package/dist/mocks-BkwkXQQt.js +136 -0
  57. package/dist/mocks-BkwkXQQt.js.map +1 -0
  58. package/dist/vitest/index.js +3 -2
  59. package/dist/vitest/registerVitestTango.d.ts +3 -3
  60. package/dist/{vitest-PxMJue7R.js → vitest-37qN8D93.js} +4 -4
  61. package/dist/vitest-37qN8D93.js.map +1 -0
  62. package/package.json +81 -68
  63. package/dist/assertions/assertions.js +0 -8
  64. package/dist/assertions-CN6KxXhH.js.map +0 -1
  65. package/dist/factories/ModelDataFactory.js +0 -33
  66. package/dist/factories-CCAZ6E-g.js.map +0 -1
  67. package/dist/index.js.map +0 -1
  68. package/dist/integration/orm.d.ts +0 -9
  69. package/dist/integration/orm.js +0 -39
  70. package/dist/integration/strategies/PostgresHarnessStrategy.js +0 -95
  71. package/dist/integration-CDdpboYz.js +0 -378
  72. package/dist/integration-CDdpboYz.js.map +0 -1
  73. package/dist/mocks/DBClient.js +0 -1
  74. package/dist/mocks/MockQuerySetResult.js +0 -1
  75. package/dist/mocks/RepositoryLike.d.ts +0 -12
  76. package/dist/mocks/RepositoryLike.js +0 -1
  77. package/dist/mocks/aMockDBClient.d.ts +0 -2
  78. package/dist/mocks/aMockDBClient.js +0 -13
  79. package/dist/mocks/aMockQuerySet.d.ts +0 -2
  80. package/dist/mocks/aMockQuerySet.js +0 -15
  81. package/dist/mocks/aMockRepository.d.ts +0 -2
  82. package/dist/mocks/aMockRepository.js +0 -20
  83. package/dist/mocks/types.d.ts +0 -33
  84. package/dist/mocks-qo-1vCez.js +0 -72
  85. package/dist/mocks-qo-1vCez.js.map +0 -1
  86. package/dist/version.d.ts +0 -1
  87. package/dist/vitest/registerVitestTango.js +0 -90
  88. package/dist/vitest-PxMJue7R.js.map +0 -1
@@ -1,90 +0,0 @@
1
- /**
2
- * Vitest custom matchers and helpers for Tango.
3
- *
4
- * Import this module in your Vitest setup file:
5
- *
6
- * ```typescript
7
- * import '@danceroutine/tango-testing/vitest';
8
- * ```
9
- */
10
- import { expect, vi } from 'vitest';
11
- import { TestHarness, applyAndVerifyMigrations as applyAndVerifyMigrationsFn, assertMigrationPlan as assertMigrationPlanFn, createRepositoryFixture as createRepositoryFixtureFn, expectQueryResult as expectQueryResultFn, introspectSchema as introspectSchemaFn, seedTable as seedTableFn, } from '../integration';
12
- function isError(value) {
13
- return (typeof value === 'object' &&
14
- value !== null &&
15
- typeof value.name === 'string' &&
16
- typeof value.message === 'string');
17
- }
18
- let activeHarness = null;
19
- async function resolveHarness(input) {
20
- if (typeof input === 'function') {
21
- return input();
22
- }
23
- return input;
24
- }
25
- const tangoHelpers = {
26
- async useHarness(input) {
27
- const harness = await resolveHarness(input);
28
- await harness.setup();
29
- activeHarness = harness;
30
- return harness;
31
- },
32
- getTestHarness() {
33
- if (!activeHarness) {
34
- throw new Error('No active test harness. Call vi.tango.useHarness(...) in beforeAll first.');
35
- }
36
- return activeHarness;
37
- },
38
- getRegistry() {
39
- return TestHarness.getRegistry();
40
- },
41
- async assertMigrationPlan(options) {
42
- const harness = options.harness ?? tangoHelpers.getTestHarness();
43
- return assertMigrationPlanFn(harness, {
44
- migrationsDir: options.migrationsDir,
45
- expectSqlContains: options.expectSqlContains,
46
- });
47
- },
48
- async applyAndVerifyMigrations(options) {
49
- const harness = options.harness ?? tangoHelpers.getTestHarness();
50
- return applyAndVerifyMigrationsFn(harness, {
51
- migrationsDir: options.migrationsDir,
52
- toId: options.toId,
53
- expectedAppliedIds: options.expectedAppliedIds,
54
- });
55
- },
56
- async introspectSchema(harness) {
57
- return introspectSchemaFn(harness ?? tangoHelpers.getTestHarness());
58
- },
59
- async seedTable(table, rows, harness) {
60
- await seedTableFn(harness ?? tangoHelpers.getTestHarness(), table, rows);
61
- },
62
- createRepositoryFixture(options) {
63
- return createRepositoryFixtureFn({
64
- harness: options.harness ?? tangoHelpers.getTestHarness(),
65
- meta: options.meta,
66
- });
67
- },
68
- async expectQueryResult(actual, expected) {
69
- await expectQueryResultFn(actual, expected);
70
- },
71
- };
72
- expect.extend({
73
- toMatchSchema(received, schema) {
74
- try {
75
- schema.parse(received);
76
- return {
77
- pass: true,
78
- message: () => 'expected data not to match schema',
79
- };
80
- }
81
- catch (error) {
82
- const detail = isError(error) ? error.message : String(error);
83
- return {
84
- pass: false,
85
- message: () => `expected data to match schema\n\n${detail}`,
86
- };
87
- }
88
- },
89
- });
90
- vi.tango = tangoHelpers;
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitest-PxMJue7R.js","names":["value: unknown","activeHarness: IntegrationHarness | null","input: IntegrationHarness | (() => IntegrationHarness | Promise<IntegrationHarness>)","tangoHelpers: TangoVitestHelpers","harness?: IntegrationHarness","table: string","rows: T[]","options: {\n meta: import('@danceroutine/tango-orm/query').RepoMeta;\n harness?: IntegrationHarness;\n }","actual: Promise<T> | T","expected: T","received: unknown","schema: Parseable"],"sources":["../src/vitest/registerVitestTango.ts","../src/vitest/index.ts"],"sourcesContent":["/**\n * Vitest custom matchers and helpers for Tango.\n *\n * Import this module in your Vitest setup file:\n *\n * ```typescript\n * import '@danceroutine/tango-testing/vitest';\n * ```\n */\nimport { expect, vi } from 'vitest';\nimport {\n TestHarness,\n applyAndVerifyMigrations as applyAndVerifyMigrationsFn,\n assertMigrationPlan as assertMigrationPlanFn,\n createRepositoryFixture as createRepositoryFixtureFn,\n expectQueryResult as expectQueryResultFn,\n introspectSchema as introspectSchemaFn,\n seedTable as seedTableFn,\n type ApplyAndVerifyMigrationsOptions,\n type AssertMigrationPlanOptions,\n type HarnessStrategyRegistry,\n type IntegrationHarness,\n} from '../integration';\n\ninterface Parseable {\n parse(data: unknown): unknown;\n}\n\nfunction isError(value: unknown): value is Error {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { name?: unknown }).name === 'string' &&\n typeof (value as { message?: unknown }).message === 'string'\n );\n}\n\nlet activeHarness: IntegrationHarness | null = null;\n\nasync function resolveHarness(\n input: IntegrationHarness | (() => IntegrationHarness | Promise<IntegrationHarness>)\n): Promise<IntegrationHarness> {\n if (typeof input === 'function') {\n return input();\n }\n return input;\n}\n\nexport interface TangoVitestHelpers {\n useHarness(\n input: IntegrationHarness | (() => IntegrationHarness | Promise<IntegrationHarness>)\n ): Promise<IntegrationHarness>;\n getTestHarness(): IntegrationHarness;\n getRegistry(): HarnessStrategyRegistry;\n assertMigrationPlan(options: AssertMigrationPlanOptions & { harness?: IntegrationHarness }): Promise<string>;\n applyAndVerifyMigrations(\n options: ApplyAndVerifyMigrationsOptions & { harness?: IntegrationHarness }\n ): Promise<{ statuses: { id: string; applied: boolean }[] }>;\n introspectSchema(harness?: IntegrationHarness): Promise<unknown>;\n seedTable<T extends Record<string, unknown>>(table: string, rows: T[], harness?: IntegrationHarness): Promise<void>;\n createRepositoryFixture<TModel extends Record<string, any>>(options: {\n meta: import('@danceroutine/tango-orm/query').RepoMeta;\n harness?: IntegrationHarness;\n }): import('@danceroutine/tango-orm').Repository<TModel>;\n expectQueryResult<T>(actual: Promise<T> | T, expected: T): Promise<void>;\n}\n\nconst tangoHelpers: TangoVitestHelpers = {\n async useHarness(input): Promise<IntegrationHarness> {\n const harness = await resolveHarness(input);\n await harness.setup();\n activeHarness = harness;\n return harness;\n },\n getTestHarness(): IntegrationHarness {\n if (!activeHarness) {\n throw new Error('No active test harness. Call vi.tango.useHarness(...) in beforeAll first.');\n }\n return activeHarness;\n },\n getRegistry(): HarnessStrategyRegistry {\n return TestHarness.getRegistry();\n },\n async assertMigrationPlan(options): Promise<string> {\n const harness = options.harness ?? tangoHelpers.getTestHarness();\n return assertMigrationPlanFn(harness, {\n migrationsDir: options.migrationsDir,\n expectSqlContains: options.expectSqlContains,\n });\n },\n async applyAndVerifyMigrations(options): Promise<{ statuses: { id: string; applied: boolean }[] }> {\n const harness = options.harness ?? tangoHelpers.getTestHarness();\n return applyAndVerifyMigrationsFn(harness, {\n migrationsDir: options.migrationsDir,\n toId: options.toId,\n expectedAppliedIds: options.expectedAppliedIds,\n });\n },\n async introspectSchema(harness?: IntegrationHarness): Promise<unknown> {\n return introspectSchemaFn(harness ?? tangoHelpers.getTestHarness());\n },\n async seedTable<T extends Record<string, unknown>>(\n table: string,\n rows: T[],\n harness?: IntegrationHarness\n ): Promise<void> {\n await seedTableFn(harness ?? tangoHelpers.getTestHarness(), table, rows);\n },\n createRepositoryFixture<TModel extends Record<string, any>>(options: {\n meta: import('@danceroutine/tango-orm/query').RepoMeta;\n harness?: IntegrationHarness;\n }): import('@danceroutine/tango-orm').Repository<TModel> {\n return createRepositoryFixtureFn<TModel>({\n harness: options.harness ?? tangoHelpers.getTestHarness(),\n meta: options.meta,\n });\n },\n async expectQueryResult<T>(actual: Promise<T> | T, expected: T): Promise<void> {\n await expectQueryResultFn(actual, expected);\n },\n};\n\nexpect.extend({\n toMatchSchema(received: unknown, schema: Parseable) {\n try {\n schema.parse(received);\n return {\n pass: true,\n message: () => 'expected data not to match schema',\n };\n } catch (error) {\n const detail = isError(error) ? error.message : String(error);\n return {\n pass: false,\n message: () => `expected data to match schema\\n\\n${detail}`,\n };\n }\n },\n});\n\n(vi as unknown as { tango?: TangoVitestHelpers }).tango = tangoHelpers;\n\ndeclare module 'vitest' {\n interface Assertion<T> {\n toMatchSchema(schema: Parseable): void;\n }\n\n interface AsymmetricMatchersContaining {\n toMatchSchema(schema: Parseable): void;\n }\n\n interface VitestUtils {\n tango: TangoVitestHelpers;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport * from './registerVitestTango';\n"],"mappings":";;;;AA4BA,SAAS,QAAQA,OAAgC;AAC7C,eACW,UAAU,YACjB,UAAU,eACF,MAA6B,SAAS,mBACtC,MAAgC,YAAY;AAE3D;AAED,IAAIC,gBAA2C;AAE/C,eAAe,eACXC,OAC2B;AAC3B,YAAW,UAAU,WACjB,QAAO,OAAO;AAElB,QAAO;AACV;AAqBD,MAAMC,eAAmC;CACrC,MAAM,WAAW,OAAoC;EACjD,MAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,QAAM,QAAQ,OAAO;AACrB,kBAAgB;AAChB,SAAO;CACV;CACD,iBAAqC;AACjC,OAAK,cACD,OAAM,IAAI,MAAM;AAEpB,SAAO;CACV;CACD,cAAuC;AACnC,SAAO,YAAY,aAAa;CACnC;CACD,MAAM,oBAAoB,SAA0B;EAChD,MAAM,UAAU,QAAQ,WAAW,aAAa,gBAAgB;AAChE,SAAO,oBAAsB,SAAS;GAClC,eAAe,QAAQ;GACvB,mBAAmB,QAAQ;EAC9B,EAAC;CACL;CACD,MAAM,yBAAyB,SAAoE;EAC/F,MAAM,UAAU,QAAQ,WAAW,aAAa,gBAAgB;AAChE,SAAO,yBAA2B,SAAS;GACvC,eAAe,QAAQ;GACvB,MAAM,QAAQ;GACd,oBAAoB,QAAQ;EAC/B,EAAC;CACL;CACD,MAAM,iBAAiBC,SAAgD;AACnE,SAAO,iBAAmB,WAAW,aAAa,gBAAgB,CAAC;CACtE;CACD,MAAM,UACFC,OACAC,MACAF,SACa;AACb,QAAM,UAAY,WAAW,aAAa,gBAAgB,EAAE,OAAO,KAAK;CAC3E;CACD,wBAA4DG,SAGH;AACrD,SAAO,wBAAkC;GACrC,SAAS,QAAQ,WAAW,aAAa,gBAAgB;GACzD,MAAM,QAAQ;EACjB,EAAC;CACL;CACD,MAAM,kBAAqBC,QAAwBC,UAA4B;AAC3E,QAAM,kBAAoB,QAAQ,SAAS;CAC9C;AACJ;AAED,OAAO,OAAO,EACV,cAAcC,UAAmBC,QAAmB;AAChD,KAAI;AACA,SAAO,MAAM,SAAS;AACtB,SAAO;GACH,MAAM;GACN,SAAS,MAAM;EAClB;CACJ,SAAQ,OAAO;EACZ,MAAM,SAAS,QAAQ,MAAM,GAAG,MAAM,UAAU,OAAO,MAAM;AAC7D,SAAO;GACH,MAAM;GACN,SAAS,OAAO,mCAAmC,OAAO;EAC7D;CACJ;AACJ,EACJ,EAAC;AAEF,GAAkD,QAAQ"}