@astroway/sdk 0.1.0-alpha.2 → 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.
- package/CHANGELOG.md +372 -0
- package/README.md +64 -32
- package/dist/cache.d.ts +101 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +198 -0
- package/dist/cache.js.map +1 -0
- package/dist/errors.d.ts +30 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +45 -14
- package/dist/errors.js.map +1 -1
- package/dist/helpers/birth-date-time.d.ts +76 -0
- package/dist/helpers/birth-date-time.d.ts.map +1 -0
- package/dist/helpers/birth-date-time.js +112 -0
- package/dist/helpers/birth-date-time.js.map +1 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +3 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/idempotency.d.ts +10 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +41 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +97 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +191 -3
- package/dist/index.js.map +1 -1
- package/dist/namespaces.generated.d.ts +1513 -0
- package/dist/namespaces.generated.d.ts.map +1 -0
- package/dist/namespaces.generated.js +865 -0
- package/dist/namespaces.generated.js.map +1 -0
- package/dist/runtime.d.ts +7 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +31 -0
- package/dist/runtime.js.map +1 -0
- package/dist/stream.d.ts +71 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +199 -0
- package/dist/stream.js.map +1 -0
- package/dist/testing.d.ts +133 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +132 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.generated.d.ts +784 -176
- package/dist/types.generated.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/with-response.d.ts +36 -0
- package/dist/with-response.d.ts.map +1 -0
- package/dist/with-response.js +38 -0
- package/dist/with-response.js.map +1 -0
- package/package.json +19 -4
package/dist/testing.js
ADDED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock client for testing — drop-in replacement for `Astroway` that records
|
|
3
|
+
* all calls and returns scripted fixtures with zero HTTP traffic.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { MockAstroway } from '@astroway/sdk/testing';
|
|
7
|
+
*
|
|
8
|
+
* const mock = new MockAstroway();
|
|
9
|
+
* mock.respond('POST', '/chart', { angles: { asc: 'Aries' } });
|
|
10
|
+
*
|
|
11
|
+
* const r = await mock.charts.natal({ date: '1990-07-14', ... });
|
|
12
|
+
* expect(r.angles.asc).toBe('Aries');
|
|
13
|
+
* expect(mock.calls).toHaveLength(1);
|
|
14
|
+
* expect(mock.calls[0]).toMatchObject({ method: 'POST', path: '/chart' });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Why this is its own subpath (`@astroway/sdk/testing`)? It pulls in zero
|
|
18
|
+
* test-framework deps but ships fixtures + bookkeeping that production code
|
|
19
|
+
* doesn't need. Tree-shakable — Vitest/Jest-only paths stay out of your
|
|
20
|
+
* production bundle if your bundler honours `exports`.
|
|
21
|
+
*/
|
|
22
|
+
import { ApiError, classifyHttpError } from './errors.js';
|
|
23
|
+
import { buildNamespaces } from './namespaces.generated.js';
|
|
24
|
+
/**
|
|
25
|
+
* Wrap an error code/status to make a fixture throw a classified ApiError —
|
|
26
|
+
* useful for testing user-facing error handling without spinning up a server.
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* mock.respond('POST', '/chart', mockApiError({ status: 401, code: 'INVALID_API_KEY' }));
|
|
30
|
+
* await expect(mock.charts.natal(body)).rejects.toThrow(AuthenticationError);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function mockApiError(opts) {
|
|
34
|
+
return () => {
|
|
35
|
+
throw classifyHttpError({
|
|
36
|
+
status: opts.status,
|
|
37
|
+
...(opts.code !== undefined ? { code: opts.code } : {}),
|
|
38
|
+
message: opts.message ?? `${opts.status} (mock)`,
|
|
39
|
+
...(opts.body !== undefined ? { body: opts.body } : {}),
|
|
40
|
+
...(opts.requestId !== undefined ? { requestId: opts.requestId } : {}),
|
|
41
|
+
...(opts.retryAfterSeconds !== undefined ? { retryAfterSeconds: opts.retryAfterSeconds } : {}),
|
|
42
|
+
...(opts.creditsRemaining !== undefined ? { creditsRemaining: opts.creditsRemaining } : {}),
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const NOT_FOUND = Symbol('mock-fixture-not-found');
|
|
47
|
+
export class MockAstroway {
|
|
48
|
+
/** All calls observed, in order. Cleared by {@link reset}. */
|
|
49
|
+
calls = [];
|
|
50
|
+
fixtures = [];
|
|
51
|
+
callCounter = 0;
|
|
52
|
+
/**
|
|
53
|
+
* The same `client` shape `Astroway` exposes — `client.POST(path, init)`,
|
|
54
|
+
* `client.GET(path, init)`, etc. Returns `{ data, error?, response }` so
|
|
55
|
+
* existing namespace code works unchanged.
|
|
56
|
+
*/
|
|
57
|
+
client;
|
|
58
|
+
constructor() {
|
|
59
|
+
const dispatch = async (method, path, init) => {
|
|
60
|
+
const body = init?.body ?? init?.params ?? null;
|
|
61
|
+
const headers = init?.headers ?? {};
|
|
62
|
+
const ctx = {
|
|
63
|
+
method,
|
|
64
|
+
path,
|
|
65
|
+
body,
|
|
66
|
+
callIndex: this.callCounter++,
|
|
67
|
+
};
|
|
68
|
+
const fixture = this.findFixture(method, path);
|
|
69
|
+
if (fixture === NOT_FOUND) {
|
|
70
|
+
throw new ApiError(`MockAstroway: no fixture for ${method} ${path}. Use mock.respond('${method}', '${path}', ...) before the call.`);
|
|
71
|
+
}
|
|
72
|
+
let resolved;
|
|
73
|
+
try {
|
|
74
|
+
resolved = typeof fixture === 'function'
|
|
75
|
+
? await fixture(ctx)
|
|
76
|
+
: fixture;
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
// Record the call before re-raising so users can still inspect what was attempted.
|
|
80
|
+
this.calls.push({ method, path, body, headers, resolved: e });
|
|
81
|
+
throw e;
|
|
82
|
+
}
|
|
83
|
+
this.calls.push({ method, path, body, headers, resolved });
|
|
84
|
+
// Wrap as `{ ok, data }` so namespace's envelope-unwrap returns the bare value.
|
|
85
|
+
return {
|
|
86
|
+
data: { ok: true, data: resolved },
|
|
87
|
+
response: new Response(null, { status: 200, headers: { 'x-astroway-mock': 'hit' } }),
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
this.client = {
|
|
91
|
+
POST: ((path, init) => dispatch('POST', path, init)),
|
|
92
|
+
GET: ((path, init) => dispatch('GET', path, init)),
|
|
93
|
+
PUT: ((path, init) => dispatch('PUT', path, init)),
|
|
94
|
+
DELETE: ((path, init) => dispatch('DELETE', path, init)),
|
|
95
|
+
};
|
|
96
|
+
Object.assign(this, buildNamespaces(this.client));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Register a fixture. The first un-consumed match wins per call. Repeated
|
|
100
|
+
* calls re-use the fixture by default — use a factory if you want different
|
|
101
|
+
* responses across calls.
|
|
102
|
+
*/
|
|
103
|
+
respond(method, path, fixture) {
|
|
104
|
+
this.fixtures.push({ method: method.toUpperCase(), path, fixture: fixture, matched: 0 });
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
/** Reset call log + fixture counters. Useful in `beforeEach`. */
|
|
108
|
+
reset() {
|
|
109
|
+
this.calls.length = 0;
|
|
110
|
+
this.fixtures.length = 0;
|
|
111
|
+
this.callCounter = 0;
|
|
112
|
+
}
|
|
113
|
+
/** Number of calls recorded so far. */
|
|
114
|
+
get callCount() {
|
|
115
|
+
return this.calls.length;
|
|
116
|
+
}
|
|
117
|
+
/** Find calls matching a path (and optionally method). Useful for assertions. */
|
|
118
|
+
callsFor(path, method) {
|
|
119
|
+
const m = method?.toUpperCase();
|
|
120
|
+
return this.calls.filter((c) => c.path === path && (m === undefined || c.method === m));
|
|
121
|
+
}
|
|
122
|
+
findFixture(method, path) {
|
|
123
|
+
for (const route of this.fixtures) {
|
|
124
|
+
if (route.method === method.toUpperCase() && route.path === path) {
|
|
125
|
+
route.matched += 1;
|
|
126
|
+
return route.fixture;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return NOT_FOUND;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|