@simpleapps-com/augur-api 0.9.11 → 0.9.12
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/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/testing.d.ts +79 -0
- package/dist/cjs/testing.d.ts.map +1 -0
- package/dist/cjs/testing.js +171 -0
- package/dist/cjs/testing.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/testing.d.ts +79 -0
- package/dist/esm/testing.d.ts.map +1 -0
- package/dist/esm/testing.js +168 -0
- package/dist/esm/testing.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/testing.d.ts +79 -0
- package/dist/types/testing.d.ts.map +1 -0
- package/package.json +6 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VERSION = "0.9.
|
|
1
|
+
export declare const VERSION = "0.9.12";
|
|
2
2
|
export { AugurAPI } from './client';
|
|
3
3
|
export { authenticateUserForSite, createCrossSiteAuthenticator, type CrossSiteAuthParams, type CrossSiteAuthResult, } from './utils/cross-site-auth';
|
|
4
4
|
export { AugurAPIConfig, RequestConfig, type AugurContext, ContextCreationError, } from './core/config';
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Basecamp2Client = exports.UPSClient = exports.SmartyStreetsClient = exports.SlackClient = exports.ShippingClient = exports.P21ApisClient = exports.LogisticsClient = exports.GregorovichClient = exports.BrandFolderClient = exports.AvalaraClient = exports.AgrWorkClient = exports.AgrInfoClient = exports.P21SismClient = exports.PaymentsClient = exports.P21PimClient = exports.OrdersClient = exports.CustomersClient = exports.AgrSiteClient = exports.LegacyClient = exports.NexusClient = exports.ItemsClient = exports.OpenSearchClient = exports.VMIClient = exports.PricingClient = exports.CommerceClient = exports.JoomlaClient = exports.PaginationParamsSchema = exports.HealthCheckDataSchema = exports.BaseResponseSchema = exports.RateLimitError = exports.NotFoundError = exports.AuthenticationError = exports.ValidationError = exports.AugurError = exports.ContextCreationError = exports.createCrossSiteAuthenticator = exports.authenticateUserForSite = exports.AugurAPI = exports.VERSION = void 0;
|
|
4
|
-
exports.VERSION = '0.9.
|
|
4
|
+
exports.VERSION = '0.9.12';
|
|
5
5
|
// Main client
|
|
6
6
|
var client_1 = require("./client");
|
|
7
7
|
Object.defineProperty(exports, "AugurAPI", { enumerable: true, get: function () { return client_1.AugurAPI; } });
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for @simpleapps-com/augur-api
|
|
3
|
+
*
|
|
4
|
+
* Provides a Proxy-based deep mock factory that automatically creates
|
|
5
|
+
* mock functions at any depth, matching the AugurAPI client shape.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockClient } from '@simpleapps-com/augur-api/testing';
|
|
10
|
+
*
|
|
11
|
+
* const { client, mocks } = createMockClient();
|
|
12
|
+
* mocks.commerce.cartHeaders.lookup.mockResolvedValue({ data: [] });
|
|
13
|
+
*
|
|
14
|
+
* const result = await client.commerce.cartHeaders.lookup({ userId: 1 });
|
|
15
|
+
* expect(mocks.commerce.cartHeaders.lookup.mock.calls[0]).toEqual([{ userId: 1 }]);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { AugurAPI } from './client';
|
|
19
|
+
/** Recorded call arguments */
|
|
20
|
+
export interface MockCall {
|
|
21
|
+
args: unknown[];
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
/** Call tracking state */
|
|
25
|
+
export interface MockState {
|
|
26
|
+
calls: unknown[][];
|
|
27
|
+
results: Array<{
|
|
28
|
+
type: 'return' | 'throw';
|
|
29
|
+
value: unknown;
|
|
30
|
+
}>;
|
|
31
|
+
instances: unknown[];
|
|
32
|
+
lastCall: unknown[] | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** A mock function with call tracking and return-value control */
|
|
35
|
+
export interface MockFn {
|
|
36
|
+
(...args: unknown[]): unknown;
|
|
37
|
+
mock: MockState;
|
|
38
|
+
mockReturnValue(value: unknown): MockFn;
|
|
39
|
+
mockResolvedValue(value: unknown): MockFn;
|
|
40
|
+
mockRejectedValue(value: unknown): MockFn;
|
|
41
|
+
mockImplementation(fn: (...args: unknown[]) => unknown): MockFn;
|
|
42
|
+
mockReset(): MockFn;
|
|
43
|
+
mockClear(): MockFn;
|
|
44
|
+
}
|
|
45
|
+
/** Recursively maps AugurAPI to MockFn leaves */
|
|
46
|
+
export type DeepMockClient<T> = {
|
|
47
|
+
[K in keyof T]: T[K] extends Function ? MockFn : DeepMockClient<T[K]>;
|
|
48
|
+
};
|
|
49
|
+
/** Return type of createMockClient */
|
|
50
|
+
export interface MockClientResult {
|
|
51
|
+
client: AugurAPI;
|
|
52
|
+
mocks: DeepMockClient<AugurAPI>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a fully-mocked AugurAPI client.
|
|
56
|
+
*
|
|
57
|
+
* Every property chain resolves to either a nested namespace or a callable
|
|
58
|
+
* MockFn. The same object serves as both `client` (passed to production code)
|
|
59
|
+
* and `mocks` (used in assertions).
|
|
60
|
+
*
|
|
61
|
+
* @returns `{ client, mocks }` — same object, dual-typed for ergonomics
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const { client, mocks } = createMockClient();
|
|
66
|
+
*
|
|
67
|
+
* // Stub a return value
|
|
68
|
+
* mocks.items.products.get.mockResolvedValue({ data: { id: 1 } });
|
|
69
|
+
*
|
|
70
|
+
* // Call through the client
|
|
71
|
+
* const result = await client.items.products.get(1);
|
|
72
|
+
*
|
|
73
|
+
* // Assert
|
|
74
|
+
* expect(mocks.items.products.get.mock.calls).toHaveLength(1);
|
|
75
|
+
* expect(mocks.items.products.get.mock.calls[0]).toEqual([1]);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function createMockClient(): MockClientResult;
|
|
79
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM,CAAC;IAChE,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,IAAI,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAE7B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACjC;AAwID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAQnD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Testing utilities for @simpleapps-com/augur-api
|
|
4
|
+
*
|
|
5
|
+
* Provides a Proxy-based deep mock factory that automatically creates
|
|
6
|
+
* mock functions at any depth, matching the AugurAPI client shape.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createMockClient } from '@simpleapps-com/augur-api/testing';
|
|
11
|
+
*
|
|
12
|
+
* const { client, mocks } = createMockClient();
|
|
13
|
+
* mocks.commerce.cartHeaders.lookup.mockResolvedValue({ data: [] });
|
|
14
|
+
*
|
|
15
|
+
* const result = await client.commerce.cartHeaders.lookup({ userId: 1 });
|
|
16
|
+
* expect(mocks.commerce.cartHeaders.lookup.mock.calls[0]).toEqual([{ userId: 1 }]);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.createMockClient = createMockClient;
|
|
21
|
+
/** Create a stub function with full call-tracking */
|
|
22
|
+
function createStubFn() {
|
|
23
|
+
let implementation = null;
|
|
24
|
+
const state = {
|
|
25
|
+
calls: [],
|
|
26
|
+
results: [],
|
|
27
|
+
instances: [],
|
|
28
|
+
lastCall: undefined,
|
|
29
|
+
};
|
|
30
|
+
const fn = function mockFn(...args) {
|
|
31
|
+
state.calls.push(args);
|
|
32
|
+
state.lastCall = args;
|
|
33
|
+
state.instances.push(this);
|
|
34
|
+
try {
|
|
35
|
+
const result = implementation ? implementation(...args) : undefined;
|
|
36
|
+
state.results.push({ type: 'return', value: result });
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
state.results.push({ type: 'throw', value: error });
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
fn.mock = state;
|
|
45
|
+
fn.mockReturnValue = (value) => {
|
|
46
|
+
implementation = () => value;
|
|
47
|
+
return fn;
|
|
48
|
+
};
|
|
49
|
+
fn.mockResolvedValue = (value) => {
|
|
50
|
+
implementation = () => Promise.resolve(value);
|
|
51
|
+
return fn;
|
|
52
|
+
};
|
|
53
|
+
fn.mockRejectedValue = (value) => {
|
|
54
|
+
implementation = () => Promise.reject(value);
|
|
55
|
+
return fn;
|
|
56
|
+
};
|
|
57
|
+
fn.mockImplementation = (implFn) => {
|
|
58
|
+
implementation = implFn;
|
|
59
|
+
return fn;
|
|
60
|
+
};
|
|
61
|
+
fn.mockReset = () => {
|
|
62
|
+
state.calls = [];
|
|
63
|
+
state.results = [];
|
|
64
|
+
state.instances = [];
|
|
65
|
+
state.lastCall = undefined;
|
|
66
|
+
implementation = null;
|
|
67
|
+
return fn;
|
|
68
|
+
};
|
|
69
|
+
fn.mockClear = () => {
|
|
70
|
+
state.calls = [];
|
|
71
|
+
state.results = [];
|
|
72
|
+
state.instances = [];
|
|
73
|
+
state.lastCall = undefined;
|
|
74
|
+
return fn;
|
|
75
|
+
};
|
|
76
|
+
return fn;
|
|
77
|
+
}
|
|
78
|
+
/** Property names that belong to MockFn — triggers stub creation */
|
|
79
|
+
const MOCK_FN_PROPS = new Set([
|
|
80
|
+
'mock',
|
|
81
|
+
'mockReturnValue',
|
|
82
|
+
'mockResolvedValue',
|
|
83
|
+
'mockRejectedValue',
|
|
84
|
+
'mockImplementation',
|
|
85
|
+
'mockReset',
|
|
86
|
+
'mockClear',
|
|
87
|
+
]);
|
|
88
|
+
/**
|
|
89
|
+
* Get or create a stub for a given path key.
|
|
90
|
+
*/
|
|
91
|
+
function getOrCreateStub(pathMap, key) {
|
|
92
|
+
let stub = pathMap.get(key);
|
|
93
|
+
if (!stub) {
|
|
94
|
+
stub = createStubFn();
|
|
95
|
+
pathMap.set(key, stub);
|
|
96
|
+
}
|
|
97
|
+
return stub;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a recursive Proxy that lazily materializes MockFn stubs
|
|
101
|
+
* at any property access depth.
|
|
102
|
+
*/
|
|
103
|
+
function createDeepProxy(pathMap, path = []) {
|
|
104
|
+
const cache = new Map();
|
|
105
|
+
// istanbul ignore next -- Proxy target is never called directly
|
|
106
|
+
return new Proxy(function () { }, {
|
|
107
|
+
get(_target, prop) {
|
|
108
|
+
// Prevent spurious thenable detection (await/Promise.resolve)
|
|
109
|
+
if (prop === 'then')
|
|
110
|
+
return undefined;
|
|
111
|
+
// Support typeof checks
|
|
112
|
+
if (prop === Symbol.toPrimitive)
|
|
113
|
+
return undefined;
|
|
114
|
+
if (prop === Symbol.iterator)
|
|
115
|
+
return undefined;
|
|
116
|
+
if (prop === Symbol.toStringTag)
|
|
117
|
+
return 'MockProxy';
|
|
118
|
+
// MockFn property access — create stub eagerly and delegate
|
|
119
|
+
if (typeof prop === 'string' && MOCK_FN_PROPS.has(prop)) {
|
|
120
|
+
const stub = getOrCreateStub(pathMap, path.join('.'));
|
|
121
|
+
return stub[prop];
|
|
122
|
+
}
|
|
123
|
+
// Return cached child proxy
|
|
124
|
+
if (cache.has(prop)) {
|
|
125
|
+
return cache.get(prop);
|
|
126
|
+
}
|
|
127
|
+
// Create child proxy for the next level
|
|
128
|
+
const childPath = [...path, String(prop)];
|
|
129
|
+
const child = createDeepProxy(pathMap, childPath);
|
|
130
|
+
cache.set(prop, child);
|
|
131
|
+
return child;
|
|
132
|
+
},
|
|
133
|
+
apply(_target, thisArg, args) {
|
|
134
|
+
const stub = getOrCreateStub(pathMap, path.join('.'));
|
|
135
|
+
return stub.apply(thisArg, args);
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a fully-mocked AugurAPI client.
|
|
141
|
+
*
|
|
142
|
+
* Every property chain resolves to either a nested namespace or a callable
|
|
143
|
+
* MockFn. The same object serves as both `client` (passed to production code)
|
|
144
|
+
* and `mocks` (used in assertions).
|
|
145
|
+
*
|
|
146
|
+
* @returns `{ client, mocks }` — same object, dual-typed for ergonomics
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* const { client, mocks } = createMockClient();
|
|
151
|
+
*
|
|
152
|
+
* // Stub a return value
|
|
153
|
+
* mocks.items.products.get.mockResolvedValue({ data: { id: 1 } });
|
|
154
|
+
*
|
|
155
|
+
* // Call through the client
|
|
156
|
+
* const result = await client.items.products.get(1);
|
|
157
|
+
*
|
|
158
|
+
* // Assert
|
|
159
|
+
* expect(mocks.items.products.get.mock.calls).toHaveLength(1);
|
|
160
|
+
* expect(mocks.items.products.get.mock.calls[0]).toEqual([1]);
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
function createMockClient() {
|
|
164
|
+
const pathMap = new Map();
|
|
165
|
+
const proxy = createDeepProxy(pathMap);
|
|
166
|
+
return {
|
|
167
|
+
client: proxy,
|
|
168
|
+
mocks: proxy,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAwMH,4CAQC;AAtKD,qDAAqD;AACrD,SAAS,YAAY;IACnB,IAAI,cAAc,GAA6C,IAAI,CAAC;IAEpE,MAAM,KAAK,GAAc;QACvB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,SAAS;KACpB,CAAC;IAEF,MAAM,EAAE,GAAG,SAAS,MAAM,CAAgB,GAAG,IAAe;QAC1D,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAW,CAAC;IAEZ,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;IAEhB,EAAE,CAAC,eAAe,GAAG,CAAC,KAAc,EAAU,EAAE;QAC9C,cAAc,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,EAAE,CAAC,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;QAChD,cAAc,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,EAAE,CAAC,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;QAChD,cAAc,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,EAAE,CAAC,kBAAkB,GAAG,CAAC,MAAuC,EAAU,EAAE;QAC1E,cAAc,GAAG,MAAM,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,EAAE,CAAC,SAAS,GAAG,GAAW,EAAE;QAC1B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,cAAc,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,EAAE,CAAC,SAAS,GAAG,GAAW,EAAE;QAC1B,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oEAAoE;AACpE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,iBAAiB;IACjB,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;IACpB,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,eAAe,CAAC,OAA4B,EAAE,GAAW;IAChE,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,YAAY,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,OAA4B,EAAE,OAAiB,EAAE;IACxE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,gEAAgE;IAChE,OAAO,IAAI,KAAK,CAAC,cAAa,CAAsB,EAAE;QACpD,GAAG,CAAC,OAAe,EAAE,IAAqB;YACxC,8DAA8D;YAC9D,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,SAAS,CAAC;YAEtC,wBAAwB;YACxB,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW;gBAAE,OAAO,SAAS,CAAC;YAClD,IAAI,IAAI,KAAK,MAAM,CAAC,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC/C,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW;gBAAE,OAAO,WAAW,CAAC;YAEpD,4DAA4D;YAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtD,OAAQ,IAA2C,CAAC,IAAI,CAAC,CAAC;YAC5D,CAAC;YAED,4BAA4B;YAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,wCAAwC;YACxC,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAClD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,OAAe,EAAE,OAAgB,EAAE,IAAe;YACtD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,gBAAgB;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEvC,OAAO;QACL,MAAM,EAAE,KAA4B;QACpC,KAAK,EAAE,KAA4C;KACpD,CAAC;AACJ,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VERSION = "0.9.
|
|
1
|
+
export declare const VERSION = "0.9.12";
|
|
2
2
|
export { AugurAPI } from './client';
|
|
3
3
|
export { authenticateUserForSite, createCrossSiteAuthenticator, type CrossSiteAuthParams, type CrossSiteAuthResult, } from './utils/cross-site-auth';
|
|
4
4
|
export { AugurAPIConfig, RequestConfig, type AugurContext, ContextCreationError, } from './core/config';
|
package/dist/esm/index.js
CHANGED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for @simpleapps-com/augur-api
|
|
3
|
+
*
|
|
4
|
+
* Provides a Proxy-based deep mock factory that automatically creates
|
|
5
|
+
* mock functions at any depth, matching the AugurAPI client shape.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockClient } from '@simpleapps-com/augur-api/testing';
|
|
10
|
+
*
|
|
11
|
+
* const { client, mocks } = createMockClient();
|
|
12
|
+
* mocks.commerce.cartHeaders.lookup.mockResolvedValue({ data: [] });
|
|
13
|
+
*
|
|
14
|
+
* const result = await client.commerce.cartHeaders.lookup({ userId: 1 });
|
|
15
|
+
* expect(mocks.commerce.cartHeaders.lookup.mock.calls[0]).toEqual([{ userId: 1 }]);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { AugurAPI } from './client';
|
|
19
|
+
/** Recorded call arguments */
|
|
20
|
+
export interface MockCall {
|
|
21
|
+
args: unknown[];
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
/** Call tracking state */
|
|
25
|
+
export interface MockState {
|
|
26
|
+
calls: unknown[][];
|
|
27
|
+
results: Array<{
|
|
28
|
+
type: 'return' | 'throw';
|
|
29
|
+
value: unknown;
|
|
30
|
+
}>;
|
|
31
|
+
instances: unknown[];
|
|
32
|
+
lastCall: unknown[] | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** A mock function with call tracking and return-value control */
|
|
35
|
+
export interface MockFn {
|
|
36
|
+
(...args: unknown[]): unknown;
|
|
37
|
+
mock: MockState;
|
|
38
|
+
mockReturnValue(value: unknown): MockFn;
|
|
39
|
+
mockResolvedValue(value: unknown): MockFn;
|
|
40
|
+
mockRejectedValue(value: unknown): MockFn;
|
|
41
|
+
mockImplementation(fn: (...args: unknown[]) => unknown): MockFn;
|
|
42
|
+
mockReset(): MockFn;
|
|
43
|
+
mockClear(): MockFn;
|
|
44
|
+
}
|
|
45
|
+
/** Recursively maps AugurAPI to MockFn leaves */
|
|
46
|
+
export type DeepMockClient<T> = {
|
|
47
|
+
[K in keyof T]: T[K] extends Function ? MockFn : DeepMockClient<T[K]>;
|
|
48
|
+
};
|
|
49
|
+
/** Return type of createMockClient */
|
|
50
|
+
export interface MockClientResult {
|
|
51
|
+
client: AugurAPI;
|
|
52
|
+
mocks: DeepMockClient<AugurAPI>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a fully-mocked AugurAPI client.
|
|
56
|
+
*
|
|
57
|
+
* Every property chain resolves to either a nested namespace or a callable
|
|
58
|
+
* MockFn. The same object serves as both `client` (passed to production code)
|
|
59
|
+
* and `mocks` (used in assertions).
|
|
60
|
+
*
|
|
61
|
+
* @returns `{ client, mocks }` — same object, dual-typed for ergonomics
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const { client, mocks } = createMockClient();
|
|
66
|
+
*
|
|
67
|
+
* // Stub a return value
|
|
68
|
+
* mocks.items.products.get.mockResolvedValue({ data: { id: 1 } });
|
|
69
|
+
*
|
|
70
|
+
* // Call through the client
|
|
71
|
+
* const result = await client.items.products.get(1);
|
|
72
|
+
*
|
|
73
|
+
* // Assert
|
|
74
|
+
* expect(mocks.items.products.get.mock.calls).toHaveLength(1);
|
|
75
|
+
* expect(mocks.items.products.get.mock.calls[0]).toEqual([1]);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function createMockClient(): MockClientResult;
|
|
79
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM,CAAC;IAChE,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,IAAI,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAE7B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACjC;AAwID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAQnD"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for @simpleapps-com/augur-api
|
|
3
|
+
*
|
|
4
|
+
* Provides a Proxy-based deep mock factory that automatically creates
|
|
5
|
+
* mock functions at any depth, matching the AugurAPI client shape.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockClient } from '@simpleapps-com/augur-api/testing';
|
|
10
|
+
*
|
|
11
|
+
* const { client, mocks } = createMockClient();
|
|
12
|
+
* mocks.commerce.cartHeaders.lookup.mockResolvedValue({ data: [] });
|
|
13
|
+
*
|
|
14
|
+
* const result = await client.commerce.cartHeaders.lookup({ userId: 1 });
|
|
15
|
+
* expect(mocks.commerce.cartHeaders.lookup.mock.calls[0]).toEqual([{ userId: 1 }]);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/** Create a stub function with full call-tracking */
|
|
19
|
+
function createStubFn() {
|
|
20
|
+
let implementation = null;
|
|
21
|
+
const state = {
|
|
22
|
+
calls: [],
|
|
23
|
+
results: [],
|
|
24
|
+
instances: [],
|
|
25
|
+
lastCall: undefined,
|
|
26
|
+
};
|
|
27
|
+
const fn = function mockFn(...args) {
|
|
28
|
+
state.calls.push(args);
|
|
29
|
+
state.lastCall = args;
|
|
30
|
+
state.instances.push(this);
|
|
31
|
+
try {
|
|
32
|
+
const result = implementation ? implementation(...args) : undefined;
|
|
33
|
+
state.results.push({ type: 'return', value: result });
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
state.results.push({ type: 'throw', value: error });
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
fn.mock = state;
|
|
42
|
+
fn.mockReturnValue = (value) => {
|
|
43
|
+
implementation = () => value;
|
|
44
|
+
return fn;
|
|
45
|
+
};
|
|
46
|
+
fn.mockResolvedValue = (value) => {
|
|
47
|
+
implementation = () => Promise.resolve(value);
|
|
48
|
+
return fn;
|
|
49
|
+
};
|
|
50
|
+
fn.mockRejectedValue = (value) => {
|
|
51
|
+
implementation = () => Promise.reject(value);
|
|
52
|
+
return fn;
|
|
53
|
+
};
|
|
54
|
+
fn.mockImplementation = (implFn) => {
|
|
55
|
+
implementation = implFn;
|
|
56
|
+
return fn;
|
|
57
|
+
};
|
|
58
|
+
fn.mockReset = () => {
|
|
59
|
+
state.calls = [];
|
|
60
|
+
state.results = [];
|
|
61
|
+
state.instances = [];
|
|
62
|
+
state.lastCall = undefined;
|
|
63
|
+
implementation = null;
|
|
64
|
+
return fn;
|
|
65
|
+
};
|
|
66
|
+
fn.mockClear = () => {
|
|
67
|
+
state.calls = [];
|
|
68
|
+
state.results = [];
|
|
69
|
+
state.instances = [];
|
|
70
|
+
state.lastCall = undefined;
|
|
71
|
+
return fn;
|
|
72
|
+
};
|
|
73
|
+
return fn;
|
|
74
|
+
}
|
|
75
|
+
/** Property names that belong to MockFn — triggers stub creation */
|
|
76
|
+
const MOCK_FN_PROPS = new Set([
|
|
77
|
+
'mock',
|
|
78
|
+
'mockReturnValue',
|
|
79
|
+
'mockResolvedValue',
|
|
80
|
+
'mockRejectedValue',
|
|
81
|
+
'mockImplementation',
|
|
82
|
+
'mockReset',
|
|
83
|
+
'mockClear',
|
|
84
|
+
]);
|
|
85
|
+
/**
|
|
86
|
+
* Get or create a stub for a given path key.
|
|
87
|
+
*/
|
|
88
|
+
function getOrCreateStub(pathMap, key) {
|
|
89
|
+
let stub = pathMap.get(key);
|
|
90
|
+
if (!stub) {
|
|
91
|
+
stub = createStubFn();
|
|
92
|
+
pathMap.set(key, stub);
|
|
93
|
+
}
|
|
94
|
+
return stub;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create a recursive Proxy that lazily materializes MockFn stubs
|
|
98
|
+
* at any property access depth.
|
|
99
|
+
*/
|
|
100
|
+
function createDeepProxy(pathMap, path = []) {
|
|
101
|
+
const cache = new Map();
|
|
102
|
+
// istanbul ignore next -- Proxy target is never called directly
|
|
103
|
+
return new Proxy(function () { }, {
|
|
104
|
+
get(_target, prop) {
|
|
105
|
+
// Prevent spurious thenable detection (await/Promise.resolve)
|
|
106
|
+
if (prop === 'then')
|
|
107
|
+
return undefined;
|
|
108
|
+
// Support typeof checks
|
|
109
|
+
if (prop === Symbol.toPrimitive)
|
|
110
|
+
return undefined;
|
|
111
|
+
if (prop === Symbol.iterator)
|
|
112
|
+
return undefined;
|
|
113
|
+
if (prop === Symbol.toStringTag)
|
|
114
|
+
return 'MockProxy';
|
|
115
|
+
// MockFn property access — create stub eagerly and delegate
|
|
116
|
+
if (typeof prop === 'string' && MOCK_FN_PROPS.has(prop)) {
|
|
117
|
+
const stub = getOrCreateStub(pathMap, path.join('.'));
|
|
118
|
+
return stub[prop];
|
|
119
|
+
}
|
|
120
|
+
// Return cached child proxy
|
|
121
|
+
if (cache.has(prop)) {
|
|
122
|
+
return cache.get(prop);
|
|
123
|
+
}
|
|
124
|
+
// Create child proxy for the next level
|
|
125
|
+
const childPath = [...path, String(prop)];
|
|
126
|
+
const child = createDeepProxy(pathMap, childPath);
|
|
127
|
+
cache.set(prop, child);
|
|
128
|
+
return child;
|
|
129
|
+
},
|
|
130
|
+
apply(_target, thisArg, args) {
|
|
131
|
+
const stub = getOrCreateStub(pathMap, path.join('.'));
|
|
132
|
+
return stub.apply(thisArg, args);
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a fully-mocked AugurAPI client.
|
|
138
|
+
*
|
|
139
|
+
* Every property chain resolves to either a nested namespace or a callable
|
|
140
|
+
* MockFn. The same object serves as both `client` (passed to production code)
|
|
141
|
+
* and `mocks` (used in assertions).
|
|
142
|
+
*
|
|
143
|
+
* @returns `{ client, mocks }` — same object, dual-typed for ergonomics
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const { client, mocks } = createMockClient();
|
|
148
|
+
*
|
|
149
|
+
* // Stub a return value
|
|
150
|
+
* mocks.items.products.get.mockResolvedValue({ data: { id: 1 } });
|
|
151
|
+
*
|
|
152
|
+
* // Call through the client
|
|
153
|
+
* const result = await client.items.products.get(1);
|
|
154
|
+
*
|
|
155
|
+
* // Assert
|
|
156
|
+
* expect(mocks.items.products.get.mock.calls).toHaveLength(1);
|
|
157
|
+
* expect(mocks.items.products.get.mock.calls[0]).toEqual([1]);
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export function createMockClient() {
|
|
161
|
+
const pathMap = new Map();
|
|
162
|
+
const proxy = createDeepProxy(pathMap);
|
|
163
|
+
return {
|
|
164
|
+
client: proxy,
|
|
165
|
+
mocks: proxy,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const VERSION = "0.9.
|
|
1
|
+
export declare const VERSION = "0.9.12";
|
|
2
2
|
export { AugurAPI } from './client';
|
|
3
3
|
export { authenticateUserForSite, createCrossSiteAuthenticator, type CrossSiteAuthParams, type CrossSiteAuthResult, } from './utils/cross-site-auth';
|
|
4
4
|
export { AugurAPIConfig, RequestConfig, type AugurContext, ContextCreationError, } from './core/config';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for @simpleapps-com/augur-api
|
|
3
|
+
*
|
|
4
|
+
* Provides a Proxy-based deep mock factory that automatically creates
|
|
5
|
+
* mock functions at any depth, matching the AugurAPI client shape.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockClient } from '@simpleapps-com/augur-api/testing';
|
|
10
|
+
*
|
|
11
|
+
* const { client, mocks } = createMockClient();
|
|
12
|
+
* mocks.commerce.cartHeaders.lookup.mockResolvedValue({ data: [] });
|
|
13
|
+
*
|
|
14
|
+
* const result = await client.commerce.cartHeaders.lookup({ userId: 1 });
|
|
15
|
+
* expect(mocks.commerce.cartHeaders.lookup.mock.calls[0]).toEqual([{ userId: 1 }]);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { AugurAPI } from './client';
|
|
19
|
+
/** Recorded call arguments */
|
|
20
|
+
export interface MockCall {
|
|
21
|
+
args: unknown[];
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
/** Call tracking state */
|
|
25
|
+
export interface MockState {
|
|
26
|
+
calls: unknown[][];
|
|
27
|
+
results: Array<{
|
|
28
|
+
type: 'return' | 'throw';
|
|
29
|
+
value: unknown;
|
|
30
|
+
}>;
|
|
31
|
+
instances: unknown[];
|
|
32
|
+
lastCall: unknown[] | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** A mock function with call tracking and return-value control */
|
|
35
|
+
export interface MockFn {
|
|
36
|
+
(...args: unknown[]): unknown;
|
|
37
|
+
mock: MockState;
|
|
38
|
+
mockReturnValue(value: unknown): MockFn;
|
|
39
|
+
mockResolvedValue(value: unknown): MockFn;
|
|
40
|
+
mockRejectedValue(value: unknown): MockFn;
|
|
41
|
+
mockImplementation(fn: (...args: unknown[]) => unknown): MockFn;
|
|
42
|
+
mockReset(): MockFn;
|
|
43
|
+
mockClear(): MockFn;
|
|
44
|
+
}
|
|
45
|
+
/** Recursively maps AugurAPI to MockFn leaves */
|
|
46
|
+
export type DeepMockClient<T> = {
|
|
47
|
+
[K in keyof T]: T[K] extends Function ? MockFn : DeepMockClient<T[K]>;
|
|
48
|
+
};
|
|
49
|
+
/** Return type of createMockClient */
|
|
50
|
+
export interface MockClientResult {
|
|
51
|
+
client: AugurAPI;
|
|
52
|
+
mocks: DeepMockClient<AugurAPI>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a fully-mocked AugurAPI client.
|
|
56
|
+
*
|
|
57
|
+
* Every property chain resolves to either a nested namespace or a callable
|
|
58
|
+
* MockFn. The same object serves as both `client` (passed to production code)
|
|
59
|
+
* and `mocks` (used in assertions).
|
|
60
|
+
*
|
|
61
|
+
* @returns `{ client, mocks }` — same object, dual-typed for ergonomics
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const { client, mocks } = createMockClient();
|
|
66
|
+
*
|
|
67
|
+
* // Stub a return value
|
|
68
|
+
* mocks.items.products.get.mockResolvedValue({ data: { id: 1 } });
|
|
69
|
+
*
|
|
70
|
+
* // Call through the client
|
|
71
|
+
* const result = await client.items.products.get(1);
|
|
72
|
+
*
|
|
73
|
+
* // Assert
|
|
74
|
+
* expect(mocks.items.products.get.mock.calls).toHaveLength(1);
|
|
75
|
+
* expect(mocks.items.products.get.mock.calls[0]).toEqual([1]);
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function createMockClient(): MockClientResult;
|
|
79
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0BAA0B;AAC1B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;CACjC;AAED,kEAAkE;AAClE,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,MAAM,CAAC;IAChE,SAAS,IAAI,MAAM,CAAC;IACpB,SAAS,IAAI,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAE7B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC;AAEF,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACjC;AAwID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAQnD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simpleapps-com/augur-api",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.12",
|
|
4
4
|
"description": "TypeScript client library for Augur microservices API endpoints",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"augur",
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
17
|
"require": "./dist/cjs/index.js",
|
|
18
18
|
"import": "./dist/esm/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./testing": {
|
|
21
|
+
"types": "./dist/types/testing.d.ts",
|
|
22
|
+
"require": "./dist/cjs/testing.js",
|
|
23
|
+
"import": "./dist/esm/testing.js"
|
|
19
24
|
}
|
|
20
25
|
},
|
|
21
26
|
"main": "./dist/cjs/index.js",
|