@partylayer/conformance-runner 0.2.8 → 0.2.10
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/cip0103-tests.d.ts +9 -6
- package/dist/cip0103-tests.js +209 -256
- package/dist/cip0103-tests.js.map +1 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.js +573 -85
- package/dist/index.js.map +1 -1
- package/package.json +8 -5
- package/CHANGELOG.md +0 -168
- package/dist/cip0103-tests.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/loader.d.ts +0 -11
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -65
- package/dist/loader.js.map +0 -1
- package/dist/report.d.ts +0 -39
- package/dist/report.d.ts.map +0 -1
- package/dist/report.js +0 -72
- package/dist/report.js.map +0 -1
- package/dist/tests.d.ts +0 -50
- package/dist/tests.d.ts.map +0 -1
- package/dist/tests.js +0 -233
- package/dist/tests.js.map +0 -1
- package/src/cip0103-tests.ts +0 -340
- package/src/index.ts +0 -116
- package/src/loader.ts +0 -78
- package/src/report.ts +0 -107
- package/src/tests.test.ts +0 -74
- package/src/tests.ts +0 -277
- package/tsconfig.esm.json +0 -10
- package/tsconfig.esm.tsbuildinfo +0 -1
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
package/dist/cip0103-tests.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { CIP0103Provider } from '@partylayer/core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CIP-0103 Conformance Test Suite
|
|
3
5
|
*
|
|
@@ -12,20 +14,21 @@
|
|
|
12
14
|
* - createProviderBridge() (bridge path)
|
|
13
15
|
* - Any third-party CIP-0103 Provider
|
|
14
16
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
interface CIP0103TestResult {
|
|
17
19
|
name: string;
|
|
18
20
|
category: 'interface' | 'method' | 'event' | 'error' | 'lifecycle';
|
|
19
21
|
passed: boolean;
|
|
20
22
|
error?: string;
|
|
21
23
|
details?: Record<string, unknown>;
|
|
22
24
|
}
|
|
23
|
-
|
|
25
|
+
interface CIP0103ConformanceReport {
|
|
24
26
|
total: number;
|
|
25
27
|
passed: number;
|
|
26
28
|
failed: number;
|
|
27
29
|
results: CIP0103TestResult[];
|
|
28
30
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
declare function runCIP0103ConformanceTests(provider: CIP0103Provider): Promise<CIP0103ConformanceReport>;
|
|
32
|
+
declare function formatCIP0103Report(report: CIP0103ConformanceReport): string;
|
|
33
|
+
|
|
34
|
+
export { type CIP0103ConformanceReport, type CIP0103TestResult, formatCIP0103Report, runCIP0103ConformanceTests };
|
package/dist/cip0103-tests.js
CHANGED
|
@@ -1,279 +1,232 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CIP-0103 Conformance Test Suite
|
|
3
|
-
*
|
|
4
|
-
* Validates that a Provider implementation conforms to CIP-0103:
|
|
5
|
-
* - Interface shape (request, on, emit, removeListener)
|
|
6
|
-
* - All 10 mandatory methods are handled
|
|
7
|
-
* - Event subscription returns Provider for chaining
|
|
8
|
-
* - Error responses use ProviderRpcError with numeric codes
|
|
9
|
-
*
|
|
10
|
-
* This suite can be run against:
|
|
11
|
-
* - PartyLayerProvider (native path)
|
|
12
|
-
* - createProviderBridge() (bridge path)
|
|
13
|
-
* - Any third-party CIP-0103 Provider
|
|
14
|
-
*/
|
|
15
1
|
import { CIP0103_MANDATORY_METHODS, CIP0103_EVENTS } from '@partylayer/core';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
passed: isValidError,
|
|
58
|
-
error: isValidError
|
|
59
|
-
? undefined
|
|
60
|
-
: `Expected ProviderRpcError with numeric code, got: ${String(err)}`,
|
|
61
|
-
details: isValidError
|
|
62
|
-
? { code: err.code }
|
|
63
|
-
: undefined,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
2
|
+
|
|
3
|
+
// src/cip0103-tests.ts
|
|
4
|
+
async function runCIP0103ConformanceTests(provider) {
|
|
5
|
+
const results = [];
|
|
6
|
+
results.push({
|
|
7
|
+
name: "Provider has request() method",
|
|
8
|
+
category: "interface",
|
|
9
|
+
passed: typeof provider.request === "function"
|
|
10
|
+
});
|
|
11
|
+
results.push({
|
|
12
|
+
name: "Provider has on() method",
|
|
13
|
+
category: "interface",
|
|
14
|
+
passed: typeof provider.on === "function"
|
|
15
|
+
});
|
|
16
|
+
results.push({
|
|
17
|
+
name: "Provider has emit() method",
|
|
18
|
+
category: "interface",
|
|
19
|
+
passed: typeof provider.emit === "function"
|
|
20
|
+
});
|
|
21
|
+
results.push({
|
|
22
|
+
name: "Provider has removeListener() method",
|
|
23
|
+
category: "interface",
|
|
24
|
+
passed: typeof provider.removeListener === "function"
|
|
25
|
+
});
|
|
26
|
+
for (const method of CIP0103_MANDATORY_METHODS) {
|
|
27
|
+
try {
|
|
28
|
+
await provider.request({ method, params: {} });
|
|
29
|
+
results.push({
|
|
30
|
+
name: `Method "${method}" is handled`,
|
|
31
|
+
category: "method",
|
|
32
|
+
passed: true
|
|
33
|
+
});
|
|
34
|
+
} catch (err) {
|
|
35
|
+
const isValidError = isNumericCodeError(err);
|
|
36
|
+
results.push({
|
|
37
|
+
name: `Method "${method}" is handled`,
|
|
38
|
+
category: "method",
|
|
39
|
+
passed: isValidError,
|
|
40
|
+
error: isValidError ? void 0 : `Expected ProviderRpcError with numeric code, got: ${String(err)}`,
|
|
41
|
+
details: isValidError ? { code: err.code } : void 0
|
|
42
|
+
});
|
|
66
43
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
44
|
+
}
|
|
45
|
+
const noopHandler = () => {
|
|
46
|
+
};
|
|
47
|
+
const onResult = provider.on("statusChanged", noopHandler);
|
|
48
|
+
results.push({
|
|
49
|
+
name: "on() returns Provider for chaining",
|
|
50
|
+
category: "event",
|
|
51
|
+
passed: onResult === provider,
|
|
52
|
+
error: onResult === provider ? void 0 : "on() did not return the Provider instance"
|
|
53
|
+
});
|
|
54
|
+
const removeResult = provider.removeListener("statusChanged", noopHandler);
|
|
55
|
+
results.push({
|
|
56
|
+
name: "removeListener() returns Provider for chaining",
|
|
57
|
+
category: "event",
|
|
58
|
+
passed: removeResult === provider,
|
|
59
|
+
error: removeResult === provider ? void 0 : "removeListener() did not return the Provider instance"
|
|
60
|
+
});
|
|
61
|
+
try {
|
|
62
|
+
await provider.request({ method: "__cip0103_conformance_nonexistent__" });
|
|
70
63
|
results.push({
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
? undefined
|
|
76
|
-
: 'on() did not return the Provider instance',
|
|
64
|
+
name: "Unsupported method returns ProviderRpcError",
|
|
65
|
+
category: "error",
|
|
66
|
+
passed: false,
|
|
67
|
+
error: "Expected error for unsupported method, got success"
|
|
77
68
|
});
|
|
78
|
-
|
|
69
|
+
} catch (err) {
|
|
70
|
+
const hasNumericCode = isNumericCodeError(err);
|
|
79
71
|
results.push({
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
: 'removeListener() did not return the Provider instance',
|
|
72
|
+
name: "Unsupported method returns error with numeric code",
|
|
73
|
+
category: "error",
|
|
74
|
+
passed: hasNumericCode,
|
|
75
|
+
error: hasNumericCode ? void 0 : `Expected numeric code, got: ${String(err)}`,
|
|
76
|
+
details: hasNumericCode ? { code: err.code } : void 0
|
|
86
77
|
});
|
|
87
|
-
|
|
78
|
+
if (hasNumericCode) {
|
|
79
|
+
const code = err.code;
|
|
80
|
+
const isCorrectCode = code === 4200 || code === -32601;
|
|
81
|
+
results.push({
|
|
82
|
+
name: "Unsupported method uses code 4200 or -32601",
|
|
83
|
+
category: "error",
|
|
84
|
+
passed: isCorrectCode,
|
|
85
|
+
error: isCorrectCode ? void 0 : `Expected code 4200 or -32601, got ${code}`,
|
|
86
|
+
details: { code }
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const emitResult = provider.emit("__cip0103_conformance_test__");
|
|
91
|
+
results.push({
|
|
92
|
+
name: "emit() returns boolean",
|
|
93
|
+
category: "interface",
|
|
94
|
+
passed: typeof emitResult === "boolean",
|
|
95
|
+
error: typeof emitResult === "boolean" ? void 0 : `emit() returned ${typeof emitResult}`
|
|
96
|
+
});
|
|
97
|
+
{
|
|
98
|
+
const txEvents = [];
|
|
99
|
+
const txHandler = (...args) => txEvents.push(...args);
|
|
100
|
+
provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);
|
|
88
101
|
try {
|
|
89
|
-
|
|
102
|
+
await provider.request({
|
|
103
|
+
method: "prepareExecute",
|
|
104
|
+
params: { tx: { _conformance: true } }
|
|
105
|
+
});
|
|
106
|
+
results.push({
|
|
107
|
+
name: 'prepareExecute emits txChanged with "pending"',
|
|
108
|
+
category: "lifecycle",
|
|
109
|
+
passed: txEvents.some(
|
|
110
|
+
(e) => typeof e === "object" && e !== null && e.status === "pending"
|
|
111
|
+
),
|
|
112
|
+
error: txEvents.length === 0 ? "No txChanged events emitted" : void 0
|
|
113
|
+
});
|
|
114
|
+
const signedEvent = txEvents.find(
|
|
115
|
+
(e) => typeof e === "object" && e !== null && e.status === "signed"
|
|
116
|
+
);
|
|
117
|
+
results.push({
|
|
118
|
+
name: 'prepareExecute emits txChanged with "signed"',
|
|
119
|
+
category: "lifecycle",
|
|
120
|
+
passed: !!signedEvent
|
|
121
|
+
});
|
|
122
|
+
if (signedEvent) {
|
|
123
|
+
const payload = signedEvent.payload;
|
|
90
124
|
results.push({
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
error: 'Expected error for unsupported method, got success',
|
|
125
|
+
name: "signed event has payload.signature (string)",
|
|
126
|
+
category: "lifecycle",
|
|
127
|
+
passed: typeof payload?.signature === "string"
|
|
95
128
|
});
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
const hasNumericCode = isNumericCodeError(err);
|
|
99
129
|
results.push({
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
error: hasNumericCode
|
|
104
|
-
? undefined
|
|
105
|
-
: `Expected numeric code, got: ${String(err)}`,
|
|
106
|
-
details: hasNumericCode
|
|
107
|
-
? { code: err.code }
|
|
108
|
-
: undefined,
|
|
130
|
+
name: "signed event has payload.signedBy (string)",
|
|
131
|
+
category: "lifecycle",
|
|
132
|
+
passed: typeof payload?.signedBy === "string"
|
|
109
133
|
});
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
results.push({
|
|
115
|
-
name: 'Unsupported method uses code 4200 or -32601',
|
|
116
|
-
category: 'error',
|
|
117
|
-
passed: isCorrectCode,
|
|
118
|
-
error: isCorrectCode
|
|
119
|
-
? undefined
|
|
120
|
-
: `Expected code 4200 or -32601, got ${code}`,
|
|
121
|
-
details: { code },
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
// ── emit() returns boolean ────────────────────────────────────────────
|
|
126
|
-
const emitResult = provider.emit('__cip0103_conformance_test__');
|
|
127
|
-
results.push({
|
|
128
|
-
name: 'emit() returns boolean',
|
|
129
|
-
category: 'interface',
|
|
130
|
-
passed: typeof emitResult === 'boolean',
|
|
131
|
-
error: typeof emitResult === 'boolean'
|
|
132
|
-
? undefined
|
|
133
|
-
: `emit() returned ${typeof emitResult}`,
|
|
134
|
-
});
|
|
135
|
-
// ── Transaction lifecycle tests ─────────────────────────────────────
|
|
136
|
-
{
|
|
137
|
-
const txEvents = [];
|
|
138
|
-
const txHandler = (...args) => txEvents.push(...args);
|
|
139
|
-
provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);
|
|
140
|
-
try {
|
|
141
|
-
await provider.request({
|
|
142
|
-
method: 'prepareExecute',
|
|
143
|
-
params: { tx: { _conformance: true } },
|
|
144
|
-
});
|
|
145
|
-
// Check that 'pending' was emitted
|
|
146
|
-
results.push({
|
|
147
|
-
name: 'prepareExecute emits txChanged with "pending"',
|
|
148
|
-
category: 'lifecycle',
|
|
149
|
-
passed: txEvents.some((e) => typeof e === 'object' && e !== null && e.status === 'pending'),
|
|
150
|
-
error: txEvents.length === 0 ? 'No txChanged events emitted' : undefined,
|
|
151
|
-
});
|
|
152
|
-
// Check that 'signed' was emitted
|
|
153
|
-
const signedEvent = txEvents.find((e) => typeof e === 'object' && e !== null && e.status === 'signed');
|
|
154
|
-
results.push({
|
|
155
|
-
name: 'prepareExecute emits txChanged with "signed"',
|
|
156
|
-
category: 'lifecycle',
|
|
157
|
-
passed: !!signedEvent,
|
|
158
|
-
});
|
|
159
|
-
// Validate 'signed' payload shape
|
|
160
|
-
if (signedEvent) {
|
|
161
|
-
const payload = signedEvent.payload;
|
|
162
|
-
results.push({
|
|
163
|
-
name: 'signed event has payload.signature (string)',
|
|
164
|
-
category: 'lifecycle',
|
|
165
|
-
passed: typeof payload?.signature === 'string',
|
|
166
|
-
});
|
|
167
|
-
results.push({
|
|
168
|
-
name: 'signed event has payload.signedBy (string)',
|
|
169
|
-
category: 'lifecycle',
|
|
170
|
-
passed: typeof payload?.signedBy === 'string',
|
|
171
|
-
});
|
|
172
|
-
results.push({
|
|
173
|
-
name: 'signed event has payload.party (string)',
|
|
174
|
-
category: 'lifecycle',
|
|
175
|
-
passed: typeof payload?.party === 'string',
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
// Check that a terminal state was reached
|
|
179
|
-
const hasTerminal = txEvents.some((e) => typeof e === 'object' &&
|
|
180
|
-
e !== null &&
|
|
181
|
-
(e.status === 'executed' ||
|
|
182
|
-
e.status === 'failed'));
|
|
183
|
-
results.push({
|
|
184
|
-
name: 'prepareExecute reaches terminal tx state (executed or failed)',
|
|
185
|
-
category: 'lifecycle',
|
|
186
|
-
passed: hasTerminal,
|
|
187
|
-
});
|
|
188
|
-
// Validate 'executed' payload shape
|
|
189
|
-
const executedEvent = txEvents.find((e) => typeof e === 'object' && e !== null && e.status === 'executed');
|
|
190
|
-
if (executedEvent) {
|
|
191
|
-
const payload = executedEvent.payload;
|
|
192
|
-
results.push({
|
|
193
|
-
name: 'executed event has payload.updateId (string)',
|
|
194
|
-
category: 'lifecycle',
|
|
195
|
-
passed: typeof payload?.updateId === 'string',
|
|
196
|
-
});
|
|
197
|
-
results.push({
|
|
198
|
-
name: 'executed event has payload.completionOffset (number)',
|
|
199
|
-
category: 'lifecycle',
|
|
200
|
-
passed: typeof payload?.completionOffset === 'number',
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
catch {
|
|
205
|
-
// prepareExecute may throw — still check if events were emitted
|
|
206
|
-
results.push({
|
|
207
|
-
name: 'prepareExecute emits txChanged events (despite error)',
|
|
208
|
-
category: 'lifecycle',
|
|
209
|
-
passed: txEvents.length > 0,
|
|
210
|
-
error: txEvents.length === 0 ? 'No txChanged events emitted before error' : undefined,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
finally {
|
|
214
|
-
provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
// ── ledgerApi handling test ────────────────────────────────────────
|
|
218
|
-
try {
|
|
219
|
-
await provider.request({
|
|
220
|
-
method: 'ledgerApi',
|
|
221
|
-
params: { requestMethod: 'GET', resource: '/v1/state/acs' },
|
|
134
|
+
results.push({
|
|
135
|
+
name: "signed event has payload.party (string)",
|
|
136
|
+
category: "lifecycle",
|
|
137
|
+
passed: typeof payload?.party === "string"
|
|
222
138
|
});
|
|
139
|
+
}
|
|
140
|
+
const hasTerminal = txEvents.some(
|
|
141
|
+
(e) => typeof e === "object" && e !== null && (e.status === "executed" || e.status === "failed")
|
|
142
|
+
);
|
|
143
|
+
results.push({
|
|
144
|
+
name: "prepareExecute reaches terminal tx state (executed or failed)",
|
|
145
|
+
category: "lifecycle",
|
|
146
|
+
passed: hasTerminal
|
|
147
|
+
});
|
|
148
|
+
const executedEvent = txEvents.find(
|
|
149
|
+
(e) => typeof e === "object" && e !== null && e.status === "executed"
|
|
150
|
+
);
|
|
151
|
+
if (executedEvent) {
|
|
152
|
+
const payload = executedEvent.payload;
|
|
223
153
|
results.push({
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
154
|
+
name: "executed event has payload.updateId (string)",
|
|
155
|
+
category: "lifecycle",
|
|
156
|
+
passed: typeof payload?.updateId === "string"
|
|
227
157
|
});
|
|
228
|
-
}
|
|
229
|
-
catch (err) {
|
|
230
|
-
// ProviderRpcError with numeric code = method is recognized
|
|
231
|
-
const isHandled = isNumericCodeError(err);
|
|
232
158
|
results.push({
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
error: isHandled ? undefined : `Unexpected error type: ${String(err)}`,
|
|
159
|
+
name: "executed event has payload.completionOffset (number)",
|
|
160
|
+
category: "lifecycle",
|
|
161
|
+
passed: typeof payload?.completionOffset === "number"
|
|
237
162
|
});
|
|
163
|
+
}
|
|
164
|
+
} catch {
|
|
165
|
+
results.push({
|
|
166
|
+
name: "prepareExecute emits txChanged events (despite error)",
|
|
167
|
+
category: "lifecycle",
|
|
168
|
+
passed: txEvents.length > 0,
|
|
169
|
+
error: txEvents.length === 0 ? "No txChanged events emitted before error" : void 0
|
|
170
|
+
});
|
|
171
|
+
} finally {
|
|
172
|
+
provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);
|
|
238
173
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
await provider.request({
|
|
177
|
+
method: "ledgerApi",
|
|
178
|
+
params: { requestMethod: "GET", resource: "/v1/state/acs" }
|
|
179
|
+
});
|
|
180
|
+
results.push({
|
|
181
|
+
name: "ledgerApi returns result (supported)",
|
|
182
|
+
category: "method",
|
|
183
|
+
passed: true
|
|
184
|
+
});
|
|
185
|
+
} catch (err) {
|
|
186
|
+
const isHandled = isNumericCodeError(err);
|
|
187
|
+
results.push({
|
|
188
|
+
name: "ledgerApi is handled (returns result or ProviderRpcError)",
|
|
189
|
+
category: "method",
|
|
190
|
+
passed: isHandled,
|
|
191
|
+
error: isHandled ? void 0 : `Unexpected error type: ${String(err)}`
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
const passed = results.filter((r) => r.passed).length;
|
|
195
|
+
return {
|
|
196
|
+
total: results.length,
|
|
197
|
+
passed,
|
|
198
|
+
failed: results.length - passed,
|
|
199
|
+
results
|
|
200
|
+
};
|
|
247
201
|
}
|
|
248
|
-
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
249
202
|
function isNumericCodeError(err) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
return typeof err.code === 'number';
|
|
203
|
+
if (typeof err !== "object" || err === null) return false;
|
|
204
|
+
return typeof err.code === "number";
|
|
253
205
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
lines.push(` → ${r.error}`);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
lines.push('');
|
|
206
|
+
function formatCIP0103Report(report) {
|
|
207
|
+
const lines = [
|
|
208
|
+
"\u2550\u2550\u2550 CIP-0103 Conformance Report \u2550\u2550\u2550",
|
|
209
|
+
"",
|
|
210
|
+
`Total: ${report.total} Passed: ${report.passed} Failed: ${report.failed}`,
|
|
211
|
+
""
|
|
212
|
+
];
|
|
213
|
+
const categories = ["interface", "method", "event", "error", "lifecycle"];
|
|
214
|
+
for (const cat of categories) {
|
|
215
|
+
const catResults = report.results.filter((r) => r.category === cat);
|
|
216
|
+
if (catResults.length === 0) continue;
|
|
217
|
+
lines.push(`\u2500\u2500 ${cat.toUpperCase()} \u2500\u2500`);
|
|
218
|
+
for (const r of catResults) {
|
|
219
|
+
const icon = r.passed ? "\u2713" : "\u2717";
|
|
220
|
+
lines.push(` ${icon} ${r.name}`);
|
|
221
|
+
if (r.error) {
|
|
222
|
+
lines.push(` \u2192 ${r.error}`);
|
|
223
|
+
}
|
|
276
224
|
}
|
|
277
|
-
|
|
225
|
+
lines.push("");
|
|
226
|
+
}
|
|
227
|
+
return lines.join("\n");
|
|
278
228
|
}
|
|
229
|
+
|
|
230
|
+
export { formatCIP0103Report, runCIP0103ConformanceTests };
|
|
231
|
+
//# sourceMappingURL=cip0103-tests.js.map
|
|
279
232
|
//# sourceMappingURL=cip0103-tests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cip0103-tests.js","sourceRoot":"","sources":["../src/cip0103-tests.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/cip0103-tests.ts"],"names":[],"mappings":"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","file":"cip0103-tests.js","sourcesContent":["/**\n * CIP-0103 Conformance Test Suite\n *\n * Validates that a Provider implementation conforms to CIP-0103:\n * - Interface shape (request, on, emit, removeListener)\n * - All 10 mandatory methods are handled\n * - Event subscription returns Provider for chaining\n * - Error responses use ProviderRpcError with numeric codes\n *\n * This suite can be run against:\n * - PartyLayerProvider (native path)\n * - createProviderBridge() (bridge path)\n * - Any third-party CIP-0103 Provider\n */\n\nimport type { CIP0103Provider } from '@partylayer/core';\nimport { CIP0103_MANDATORY_METHODS, CIP0103_EVENTS } from '@partylayer/core';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface CIP0103TestResult {\n name: string;\n category: 'interface' | 'method' | 'event' | 'error' | 'lifecycle';\n passed: boolean;\n error?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface CIP0103ConformanceReport {\n total: number;\n passed: number;\n failed: number;\n results: CIP0103TestResult[];\n}\n\n// ─── Runner ─────────────────────────────────────────────────────────────────\n\nexport async function runCIP0103ConformanceTests(\n provider: CIP0103Provider,\n): Promise<CIP0103ConformanceReport> {\n const results: CIP0103TestResult[] = [];\n\n // ── Interface shape tests ─────────────────────────────────────────────\n\n results.push({\n name: 'Provider has request() method',\n category: 'interface',\n passed: typeof provider.request === 'function',\n });\n\n results.push({\n name: 'Provider has on() method',\n category: 'interface',\n passed: typeof provider.on === 'function',\n });\n\n results.push({\n name: 'Provider has emit() method',\n category: 'interface',\n passed: typeof provider.emit === 'function',\n });\n\n results.push({\n name: 'Provider has removeListener() method',\n category: 'interface',\n passed: typeof provider.removeListener === 'function',\n });\n\n // ── Method presence tests ─────────────────────────────────────────────\n\n for (const method of CIP0103_MANDATORY_METHODS) {\n try {\n await provider.request({ method, params: {} });\n results.push({\n name: `Method \"${method}\" is handled`,\n category: 'method',\n passed: true,\n });\n } catch (err: unknown) {\n // A valid ProviderRpcError means the method IS handled\n // (it just may not be authorized / connected yet)\n const isValidError = isNumericCodeError(err);\n results.push({\n name: `Method \"${method}\" is handled`,\n category: 'method',\n passed: isValidError,\n error: isValidError\n ? undefined\n : `Expected ProviderRpcError with numeric code, got: ${String(err)}`,\n details: isValidError\n ? { code: (err as { code: number }).code }\n : undefined,\n });\n }\n }\n\n // ── Event chaining tests ──────────────────────────────────────────────\n\n const noopHandler = () => {};\n\n const onResult = provider.on('statusChanged', noopHandler);\n results.push({\n name: 'on() returns Provider for chaining',\n category: 'event',\n passed: onResult === provider,\n error:\n onResult === provider\n ? undefined\n : 'on() did not return the Provider instance',\n });\n\n const removeResult = provider.removeListener('statusChanged', noopHandler);\n results.push({\n name: 'removeListener() returns Provider for chaining',\n category: 'event',\n passed: removeResult === provider,\n error:\n removeResult === provider\n ? undefined\n : 'removeListener() did not return the Provider instance',\n });\n\n // ── Error code validation ─────────────────────────────────────────────\n\n try {\n await provider.request({ method: '__cip0103_conformance_nonexistent__' });\n results.push({\n name: 'Unsupported method returns ProviderRpcError',\n category: 'error',\n passed: false,\n error: 'Expected error for unsupported method, got success',\n });\n } catch (err: unknown) {\n const hasNumericCode = isNumericCodeError(err);\n results.push({\n name: 'Unsupported method returns error with numeric code',\n category: 'error',\n passed: hasNumericCode,\n error: hasNumericCode\n ? undefined\n : `Expected numeric code, got: ${String(err)}`,\n details: hasNumericCode\n ? { code: (err as { code: number }).code }\n : undefined,\n });\n\n if (hasNumericCode) {\n const code = (err as { code: number }).code;\n // Should be 4200 (UNSUPPORTED_METHOD) or -32601 (METHOD_NOT_FOUND)\n const isCorrectCode = code === 4200 || code === -32601;\n results.push({\n name: 'Unsupported method uses code 4200 or -32601',\n category: 'error',\n passed: isCorrectCode,\n error: isCorrectCode\n ? undefined\n : `Expected code 4200 or -32601, got ${code}`,\n details: { code },\n });\n }\n }\n\n // ── emit() returns boolean ────────────────────────────────────────────\n\n const emitResult = provider.emit('__cip0103_conformance_test__');\n results.push({\n name: 'emit() returns boolean',\n category: 'interface',\n passed: typeof emitResult === 'boolean',\n error:\n typeof emitResult === 'boolean'\n ? undefined\n : `emit() returned ${typeof emitResult}`,\n });\n\n // ── Transaction lifecycle tests ─────────────────────────────────────\n\n {\n const txEvents: unknown[] = [];\n const txHandler = (...args: unknown[]) => txEvents.push(...args);\n provider.on(CIP0103_EVENTS.TX_CHANGED, txHandler);\n\n try {\n await provider.request({\n method: 'prepareExecute',\n params: { tx: { _conformance: true } },\n });\n\n // Check that 'pending' was emitted\n results.push({\n name: 'prepareExecute emits txChanged with \"pending\"',\n category: 'lifecycle',\n passed: txEvents.some(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'pending',\n ),\n error: txEvents.length === 0 ? 'No txChanged events emitted' : undefined,\n });\n\n // Check that 'signed' was emitted\n const signedEvent = txEvents.find(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'signed',\n ) as Record<string, unknown> | undefined;\n results.push({\n name: 'prepareExecute emits txChanged with \"signed\"',\n category: 'lifecycle',\n passed: !!signedEvent,\n });\n\n // Validate 'signed' payload shape\n if (signedEvent) {\n const payload = signedEvent.payload as Record<string, unknown> | undefined;\n results.push({\n name: 'signed event has payload.signature (string)',\n category: 'lifecycle',\n passed: typeof payload?.signature === 'string',\n });\n results.push({\n name: 'signed event has payload.signedBy (string)',\n category: 'lifecycle',\n passed: typeof payload?.signedBy === 'string',\n });\n results.push({\n name: 'signed event has payload.party (string)',\n category: 'lifecycle',\n passed: typeof payload?.party === 'string',\n });\n }\n\n // Check that a terminal state was reached\n const hasTerminal = txEvents.some(\n (e) =>\n typeof e === 'object' &&\n e !== null &&\n ((e as Record<string, unknown>).status === 'executed' ||\n (e as Record<string, unknown>).status === 'failed'),\n );\n results.push({\n name: 'prepareExecute reaches terminal tx state (executed or failed)',\n category: 'lifecycle',\n passed: hasTerminal,\n });\n\n // Validate 'executed' payload shape\n const executedEvent = txEvents.find(\n (e) => typeof e === 'object' && e !== null && (e as Record<string, unknown>).status === 'executed',\n ) as Record<string, unknown> | undefined;\n if (executedEvent) {\n const payload = executedEvent.payload as Record<string, unknown> | undefined;\n results.push({\n name: 'executed event has payload.updateId (string)',\n category: 'lifecycle',\n passed: typeof payload?.updateId === 'string',\n });\n results.push({\n name: 'executed event has payload.completionOffset (number)',\n category: 'lifecycle',\n passed: typeof payload?.completionOffset === 'number',\n });\n }\n } catch {\n // prepareExecute may throw — still check if events were emitted\n results.push({\n name: 'prepareExecute emits txChanged events (despite error)',\n category: 'lifecycle',\n passed: txEvents.length > 0,\n error: txEvents.length === 0 ? 'No txChanged events emitted before error' : undefined,\n });\n } finally {\n provider.removeListener(CIP0103_EVENTS.TX_CHANGED, txHandler);\n }\n }\n\n // ── ledgerApi handling test ────────────────────────────────────────\n\n try {\n await provider.request({\n method: 'ledgerApi',\n params: { requestMethod: 'GET', resource: '/v1/state/acs' },\n });\n results.push({\n name: 'ledgerApi returns result (supported)',\n category: 'method',\n passed: true,\n });\n } catch (err: unknown) {\n // ProviderRpcError with numeric code = method is recognized\n const isHandled = isNumericCodeError(err);\n results.push({\n name: 'ledgerApi is handled (returns result or ProviderRpcError)',\n category: 'method',\n passed: isHandled,\n error: isHandled ? undefined : `Unexpected error type: ${String(err)}`,\n });\n }\n\n // ── Summary ───────────────────────────────────────────────────────────\n\n const passed = results.filter((r) => r.passed).length;\n return {\n total: results.length,\n passed,\n failed: results.length - passed,\n results,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isNumericCodeError(err: unknown): boolean {\n if (typeof err !== 'object' || err === null) return false;\n return typeof (err as Record<string, unknown>).code === 'number';\n}\n\n// ─── Formatting ─────────────────────────────────────────────────────────────\n\nexport function formatCIP0103Report(report: CIP0103ConformanceReport): string {\n const lines: string[] = [\n '═══ CIP-0103 Conformance Report ═══',\n '',\n `Total: ${report.total} Passed: ${report.passed} Failed: ${report.failed}`,\n '',\n ];\n\n const categories = ['interface', 'method', 'event', 'error', 'lifecycle'] as const;\n for (const cat of categories) {\n const catResults = report.results.filter((r) => r.category === cat);\n if (catResults.length === 0) continue;\n lines.push(`── ${cat.toUpperCase()} ──`);\n for (const r of catResults) {\n const icon = r.passed ? '✓' : '✗';\n lines.push(` ${icon} ${r.name}`);\n if (r.error) {\n lines.push(` → ${r.error}`);\n }\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n"]}
|