@synoikia/create-plugin 0.5.0 → 0.6.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/dist/scaffold.js CHANGED
@@ -149,6 +149,16 @@ function fakeAuthModule(auth, header) {
149
149
  /** The connection the tests use, and how the fake upstream checks it. */
150
150
  ${AUTH[auth].fake(header)}`;
151
151
  }
152
+ /** The sign-in lines of test/compliance.yaml: the fake's credentials, and a wrong secret for the connection test. */
153
+ function complianceVars(spec) {
154
+ const fields = [...(spec.user ? ['username'] : []), ...(spec.secret ? [spec.secret.name] : [])];
155
+ return {
156
+ credentials: fields.map((f) => `\n ${f}: \${fake.${f}}`).join(''),
157
+ connectionTest: spec.secret
158
+ ? `\n# Credentials the upstream refuses: the connection test must fail with them.\nconnectionTest:\n wrong: { ${spec.secret.name}: wrong-${spec.secret.name} }`
159
+ : '',
160
+ };
161
+ }
152
162
  /** The generated manifest: connection form, secrets, network hosts and binding. */
153
163
  export function manifestFor(opts, namespace) {
154
164
  const spec = AUTH[opts.auth];
@@ -207,6 +217,9 @@ function packageFor(opts) {
207
217
  devDependencies: {
208
218
  '@synoikia/core': range('core', '@synoikia/core'),
209
219
  '@synoikia/create-plugin': range('cli', '@synoikia/create-plugin'),
220
+ // The compliance suite of @synoikia/core runs on these.
221
+ quickpickle: '1.11.2',
222
+ yaml: '^2.9.1',
210
223
  ...(ws ? { '@types/ws': '^8.18.1' } : {}),
211
224
  },
212
225
  };
@@ -242,6 +255,7 @@ export function newPlugin(opts) {
242
255
  description: opts.description ?? `${opts.name} for Synoikia.`,
243
256
  fn: opts.archetype === 'openapi-rest' ? 'request' : 'call',
244
257
  archetype: opts.archetype,
258
+ ...complianceVars(AUTH[opts.auth]),
245
259
  };
246
260
  const written = [];
247
261
  renderTemplate(path.join(TEMPLATES_DIR, 'plugin', 'common'), dir, vars, written);
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synoikia/create-plugin",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Create Synoikia plugin repositories and plugins, then build, check and publish them",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,7 +38,7 @@
38
38
  "@synoikia/plugin-sdk": "^0.6.0"
39
39
  },
40
40
  "peerDependencies": {
41
- "@synoikia/core": "^0.16.0"
41
+ "@synoikia/core": "^0.17.0"
42
42
  },
43
43
  "peerDependenciesMeta": {
44
44
  "@synoikia/core": {
@@ -49,7 +49,7 @@
49
49
  "@types/ws": "^8.18.1",
50
50
  "quickpickle": "1.11.2",
51
51
  "ws": "^8.22.0",
52
- "@synoikia/core": "^0.16.0"
52
+ "@synoikia/core": "^0.17.0"
53
53
  },
54
54
  "scripts": {
55
55
  "build": "tsc -p tsconfig.build.json",
@@ -1 +1,13 @@
1
- export { default } from '../../vitest.shared.ts';
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { complianceConfig } from '@synoikia/core/testing/compliance';
4
+ import { mergeConfig } from 'vitest/config';
5
+ import shared from '../../vitest.shared.ts';
6
+
7
+ // Core's compliance suite certifies the plugin once test/compliance.yaml describes it. test/unit holds unit tests.
8
+ const pluginDir = import.meta.dirname;
9
+ const unit = { extends: true, test: { name: 'unit', include: ['test/unit/**/*.test.ts'] } };
10
+
11
+ export default existsSync(path.join(pluginDir, 'test', 'compliance.yaml'))
12
+ ? mergeConfig(mergeConfig(shared, complianceConfig({ pluginDir })), { test: { projects: [unit] } })
13
+ : shared;
@@ -0,0 +1,17 @@
1
+ # What core's compliance suite needs to certify {{name}} against the fake: docs/plugin-authoring.md.
2
+ fake: test/fake.ts
3
+ connection:
4
+ baseUrl: ${fake.url}{{credentials}}
5
+ reads:
6
+ - { fn: request, args: [{ path: /items }], key: GET /items }
7
+ writes:
8
+ - { fn: request, args: [{ method: POST, path: /items, body: { name: Second item } }], key: POST /items }
9
+ rejects:
10
+ - { fn: request, args: [{ path: /nope }] }
11
+ # One case for each locked operation: the call, the literal an approver types and the target the approval names.
12
+ locks:
13
+ 'DELETE /items/{itemId}':
14
+ { fn: request, args: [{ method: DELETE, path: /items/1 }], confirm: First item, target: /items/1 }
15
+ # Reads whose upstream answer holds secrets that must never reach the agent.
16
+ secrets:
17
+ - { fn: request, args: [{ path: /settings }], key: GET /settings, values: ['${fake.secret}'] }{{connectionTest}}
@@ -0,0 +1,8 @@
1
+ import { CREDENTIALS } from './fake-auth.js';
2
+ import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
3
+
4
+ /** The fake that test/compliance.yaml names: its `url`, the connection's credentials and the upstream's secret. */
5
+ export async function start() {
6
+ const fake = await startFake{{Pascal}}();
7
+ return { ...CREDENTIALS, url: fake.url, secret: UPSTREAM_SECRET, close: () => fake.close() };
8
+ }
@@ -0,0 +1,16 @@
1
+ # What core's compliance suite needs to certify {{name}} against the fake: docs/plugin-authoring.md.
2
+ fake: test/fake.ts
3
+ connection:
4
+ baseUrl: ${fake.url}{{credentials}}
5
+ reads:
6
+ - { fn: call, args: [items.list], key: items.list }
7
+ writes:
8
+ - { fn: call, args: [items.create, { body: { name: Second item } }], key: items.create }
9
+ rejects:
10
+ - { fn: call, args: [items.nope] }
11
+ # One case for each locked operation: the call, the literal an approver types and the target the approval names.
12
+ locks:
13
+ items.delete: { fn: call, args: [items.delete, { path: { itemId: '1' } }], confirm: First item, target: /items/1 }
14
+ # Reads whose upstream answer holds secrets that must never reach the agent.
15
+ secrets:
16
+ - { fn: call, args: [settings.get], key: settings.get, values: ['${fake.secret}'] }{{connectionTest}}
@@ -0,0 +1,8 @@
1
+ import { CREDENTIALS } from './fake-auth.js';
2
+ import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
3
+
4
+ /** The fake that test/compliance.yaml names: its `url`, the connection's credentials and the upstream's secret. */
5
+ export async function start() {
6
+ const fake = await startFake{{Pascal}}();
7
+ return { ...CREDENTIALS, url: fake.url, secret: UPSTREAM_SECRET, close: () => fake.close() };
8
+ }
@@ -0,0 +1,16 @@
1
+ # What core's compliance suite needs to certify {{name}} against the fake: docs/plugin-authoring.md.
2
+ fake: test/fake.ts
3
+ connection:
4
+ baseUrl: ${fake.url}{{credentials}}
5
+ reads:
6
+ - { fn: call, args: [items.list], key: items.list }
7
+ writes:
8
+ - { fn: call, args: [items.create, { name: Second item }], key: items.create }
9
+ rejects:
10
+ - { fn: call, args: [items.nope] }
11
+ # One case for each locked operation: the call, the literal an approver types and the target the approval names.
12
+ locks:
13
+ items.delete: { fn: call, args: [items.delete, { id: 1 }], confirm: First item, target: '"id":1' }
14
+ # Reads whose upstream answer holds secrets that must never reach the agent.
15
+ secrets:
16
+ - { fn: call, args: [settings.get], key: settings.get, values: ['${fake.secret}'] }{{connectionTest}}
@@ -0,0 +1,8 @@
1
+ import { CREDENTIALS } from './fake-auth.js';
2
+ import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
3
+
4
+ /** The fake that test/compliance.yaml names: its `url`, the connection's credentials and the upstream's secret. */
5
+ export async function start() {
6
+ const fake = await startFake{{Pascal}}();
7
+ return { ...CREDENTIALS, url: fake.url, secret: UPSTREAM_SECRET, close: () => fake.close() };
8
+ }
@@ -29,7 +29,7 @@ This writes `plugins/<id>/` (manifest, `plugin.yaml`, `src/`, a fake upstream, u
29
29
 
30
30
  ## 4. Tests
31
31
 
32
- Extend `test/fake-upstream.ts` to answer what the plugin calls, including responses with secrets. Keep `checkPluginContract` in `test/e2e.test.ts` passing, and add unit tests for every rule that locks or masks something.
32
+ Extend `test/fake-upstream.ts` to answer what the plugin calls, including responses with secrets. Fill in `test/compliance.yaml`: a case for each locked operation, and each secret the fake returns. Core's compliance suite must print that the plugin is fit for production. Specify plugin-specific behavior in `features/*.feature` with the suite's steps (`docs/plugin-authoring.md`).
33
33
 
34
34
  ```sh
35
35
  pnpm --filter ./plugins/<id> test
@@ -1,46 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { checkPluginContract, startPluginHarness } from '@synoikia/core/testing';
4
- import type { PluginHarness } from '@synoikia/core/testing';
5
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
6
- import { CREDENTIALS } from './fake-auth.js';
7
- import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
8
- import type { Fake{{Pascal}} } from './fake-upstream.js';
9
-
10
- /** The real core running this plugin's built bundle against the fake {{name}}, via core's harness. */
11
-
12
- const PLUGIN_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
13
-
14
- let h: PluginHarness;
15
- let fake: Fake{{Pascal}};
16
-
17
- beforeAll(async () => {
18
- fake = await startFake{{Pascal}}();
19
- h = await startPluginHarness({ pluginDir: PLUGIN_DIR, connection: { baseUrl: fake.url, ...CREDENTIALS } });
20
- }, 60_000);
21
-
22
- afterAll(async () => {
23
- await h?.stop();
24
- await fake?.close();
25
- });
26
-
27
- describe('{{name}} end to end (fake {{name}})', () => {
28
- it('keeps the plugin contract', async () => {
29
- expect(
30
- await checkPluginContract(h, {
31
- read: { key: 'GET /items', code: `return await {{namespace}}.request({ path: '/items' });` },
32
- write: {
33
- key: 'POST /items',
34
- code: `return await {{namespace}}.request({ method: 'POST', path: '/items', body: { name: 'x' } });`,
35
- },
36
- locked: {
37
- key: 'DELETE /items/{itemId}',
38
- code: `return await {{namespace}}.request({ method: 'DELETE', path: '/items/1' });`,
39
- confirm: 'First item',
40
- },
41
- secrets: { code: `return await {{namespace}}.request({ path: '/settings' });`, values: [UPSTREAM_SECRET] },
42
- }),
43
- ).toEqual([]);
44
- expect(fake.items.has(1)).toBe(false);
45
- });
46
- });
@@ -1,66 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { checkConformance, ErrorCodes } from '@synoikia/plugin-sdk';
3
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
- import { create{{Pascal}}Plugin, settings } from '../src/plugin.js';
5
- import { CREDENTIALS } from './fake-auth.js';
6
- import { startFake{{Pascal}} } from './fake-upstream.js';
7
- import type { Fake{{Pascal}} } from './fake-upstream.js';
8
-
9
- const manifest: unknown = JSON.parse(readFileSync(new URL('../manifest.json', import.meta.url), 'utf8'));
10
-
11
- let fake: Fake{{Pascal}};
12
- const plugin = create{{Pascal}}Plugin();
13
-
14
- beforeAll(async () => {
15
- fake = await startFake{{Pascal}}();
16
- });
17
- afterAll(async () => {
18
- await plugin.shutdown?.();
19
- await fake?.close();
20
- });
21
-
22
- const connection = () => {
23
- const { username, ...secrets } = CREDENTIALS as Record<string, string>;
24
- return { instanceId: '{{id}}', config: { baseUrl: fake.url, ...(username ? { username } : {}) }, secrets };
25
- };
26
-
27
- describe('{{name}} plugin', () => {
28
- it('passes the SDK conformance checks against the fake', async () => {
29
- const issues = await checkConformance({
30
- manifest,
31
- settings,
32
- handlers: plugin,
33
- init: connection(),
34
- samples: [
35
- { fn: 'request', args: [{ path: '/items' }], expectKey: 'GET /items' },
36
- { fn: 'request', args: [{ method: 'DELETE', path: '/items/1' }], expectKey: 'DELETE /items/{itemId}' },
37
- ],
38
- rejects: [{ fn: 'request', args: [{ path: '/nope' }] }, { fn: 'other', args: [] }],
39
- });
40
- expect(issues).toEqual([]);
41
- });
42
-
43
- it('locks deletes and names the item in the confirmation', async () => {
44
- await plugin.init({ ...connection(), sdkVersion: '1' });
45
- const { operations } = await plugin.syncCatalog();
46
- expect(operations.find((o) => o.key === 'DELETE /items/{itemId}')).toMatchObject({ locked: true });
47
- expect(
48
- await plugin.summarize({ key: 'DELETE /items/{itemId}', params: { path: { itemId: '1' } }, targets: [] }),
49
- ).toEqual({ text: '{{name}} DELETE /items/1', confirmLiteral: 'First item' });
50
- });
51
-
52
- it('reports rejected credentials without throwing', async () => {
53
- const wrong = Object.fromEntries(Object.keys(connection().secrets).map((k) => [k, 'wrong']));
54
- if (!Object.keys(wrong).length) return; // nothing to reject without authentication
55
- const bad = create{{Pascal}}Plugin();
56
- await bad.init({ ...connection(), secrets: wrong, sdkVersion: '1' });
57
- expect(await bad.testConnection()).toMatchObject({ ok: false, message: expect.stringContaining('denied') });
58
- await bad.shutdown?.();
59
- });
60
-
61
- it('refuses a connection without a base URL', async () => {
62
- await expect(create{{Pascal}}Plugin().init({ ...connection(), config: {}, sdkVersion: '1' })).rejects.toMatchObject({
63
- code: ErrorCodes.InvalidParams,
64
- });
65
- });
66
- });
@@ -1,43 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { checkPluginContract, startPluginHarness } from '@synoikia/core/testing';
4
- import type { PluginHarness } from '@synoikia/core/testing';
5
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
6
- import { CREDENTIALS } from './fake-auth.js';
7
- import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
8
- import type { Fake{{Pascal}} } from './fake-upstream.js';
9
-
10
- /** The real core running this plugin's built bundle against the fake {{name}}, via core's harness. */
11
-
12
- const PLUGIN_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
13
-
14
- let h: PluginHarness;
15
- let fake: Fake{{Pascal}};
16
-
17
- beforeAll(async () => {
18
- fake = await startFake{{Pascal}}();
19
- h = await startPluginHarness({ pluginDir: PLUGIN_DIR, connection: { baseUrl: fake.url, ...CREDENTIALS } });
20
- }, 60_000);
21
-
22
- afterAll(async () => {
23
- await h?.stop();
24
- await fake?.close();
25
- });
26
-
27
- describe('{{name}} end to end (fake {{name}})', () => {
28
- it('keeps the plugin contract', async () => {
29
- expect(
30
- await checkPluginContract(h, {
31
- read: { key: 'items.list', code: `return await {{namespace}}.call('items.list');` },
32
- write: { key: 'items.create', code: `return await {{namespace}}.call('items.create', { body: { name: 'x' } });` },
33
- locked: {
34
- key: 'items.delete',
35
- code: `return await {{namespace}}.call('items.delete', { path: { itemId: '1' } });`,
36
- confirm: 'First item',
37
- },
38
- secrets: { code: `return await {{namespace}}.call('settings.get');`, values: [UPSTREAM_SECRET] },
39
- }),
40
- ).toEqual([]);
41
- expect(fake.items.has(1)).toBe(false);
42
- });
43
- });
@@ -1,67 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { checkConformance, ErrorCodes } from '@synoikia/plugin-sdk';
3
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
- import { create{{Pascal}}Plugin, settings } from '../src/plugin.js';
5
- import { CREDENTIALS } from './fake-auth.js';
6
- import { startFake{{Pascal}} } from './fake-upstream.js';
7
- import type { Fake{{Pascal}} } from './fake-upstream.js';
8
-
9
- const manifest: unknown = JSON.parse(readFileSync(new URL('../manifest.json', import.meta.url), 'utf8'));
10
-
11
- let fake: Fake{{Pascal}};
12
- const plugin = create{{Pascal}}Plugin();
13
-
14
- beforeAll(async () => {
15
- fake = await startFake{{Pascal}}();
16
- });
17
- afterAll(async () => {
18
- await plugin.shutdown?.();
19
- await fake?.close();
20
- });
21
-
22
- const connection = () => {
23
- const { username, ...secrets } = CREDENTIALS as Record<string, string>;
24
- return { instanceId: '{{id}}', config: { baseUrl: fake.url, ...(username ? { username } : {}) }, secrets };
25
- };
26
-
27
- describe('{{name}} plugin', () => {
28
- it('passes the SDK conformance checks against the fake', async () => {
29
- const issues = await checkConformance({
30
- manifest,
31
- settings,
32
- handlers: plugin,
33
- init: connection(),
34
- samples: [
35
- { fn: 'call', args: ['items.list'], expectKey: 'items.list' },
36
- { fn: 'call', args: ['items.delete', { path: { itemId: '1' } }], expectKey: 'items.delete' },
37
- ],
38
- rejects: [{ fn: 'call', args: ['items.nope'] }, { fn: 'other', args: [] }],
39
- });
40
- expect(issues).toEqual([]);
41
- });
42
-
43
- it('locks deletes and names the item in the confirmation', async () => {
44
- await plugin.init({ ...connection(), sdkVersion: '1' });
45
- const { operations } = await plugin.syncCatalog();
46
- expect(operations.find((o) => o.key === 'items.delete')).toMatchObject({ locked: true });
47
- expect(await plugin.summarize({ key: 'items.delete', params: { path: { itemId: '1' } }, targets: [] })).toEqual({
48
- text: '{{name}} items.delete: DELETE /items/1',
49
- confirmLiteral: 'First item',
50
- });
51
- });
52
-
53
- it('reports rejected credentials without throwing', async () => {
54
- const wrong = Object.fromEntries(Object.keys(connection().secrets).map((k) => [k, 'wrong']));
55
- if (!Object.keys(wrong).length) return; // nothing to reject without authentication
56
- const bad = create{{Pascal}}Plugin();
57
- await bad.init({ ...connection(), secrets: wrong, sdkVersion: '1' });
58
- expect(await bad.testConnection()).toMatchObject({ ok: false, message: expect.stringContaining('denied') });
59
- await bad.shutdown?.();
60
- });
61
-
62
- it('refuses a connection without a base URL', async () => {
63
- await expect(create{{Pascal}}Plugin().init({ ...connection(), config: {}, sdkVersion: '1' })).rejects.toMatchObject({
64
- code: ErrorCodes.InvalidParams,
65
- });
66
- });
67
- });
@@ -1,43 +0,0 @@
1
- import path from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { checkPluginContract, startPluginHarness } from '@synoikia/core/testing';
4
- import type { PluginHarness } from '@synoikia/core/testing';
5
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
6
- import { CREDENTIALS } from './fake-auth.js';
7
- import { startFake{{Pascal}}, UPSTREAM_SECRET } from './fake-upstream.js';
8
- import type { Fake{{Pascal}} } from './fake-upstream.js';
9
-
10
- /** The real core running this plugin's built bundle against the fake {{name}}, via core's harness. */
11
-
12
- const PLUGIN_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
13
-
14
- let h: PluginHarness;
15
- let fake: Fake{{Pascal}};
16
-
17
- beforeAll(async () => {
18
- fake = await startFake{{Pascal}}();
19
- h = await startPluginHarness({ pluginDir: PLUGIN_DIR, connection: { baseUrl: fake.url, ...CREDENTIALS } });
20
- }, 60_000);
21
-
22
- afterAll(async () => {
23
- await h?.stop();
24
- await fake?.close();
25
- });
26
-
27
- describe('{{name}} end to end (fake {{name}})', () => {
28
- it('keeps the plugin contract', async () => {
29
- expect(
30
- await checkPluginContract(h, {
31
- read: { key: 'items.list', code: `return await {{namespace}}.call('items.list');` },
32
- write: { key: 'items.create', code: `return await {{namespace}}.call('items.create', { name: 'x' });` },
33
- locked: {
34
- key: 'items.delete',
35
- code: `return await {{namespace}}.call('items.delete', { id: 1 });`,
36
- confirm: 'First item',
37
- },
38
- secrets: { code: `return await {{namespace}}.call('settings.get');`, values: [UPSTREAM_SECRET] },
39
- }),
40
- ).toEqual([]);
41
- expect(fake.items.has(1)).toBe(false);
42
- });
43
- });
@@ -1,67 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { checkConformance, ErrorCodes } from '@synoikia/plugin-sdk';
3
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
- import { create{{Pascal}}Plugin, settings } from '../src/plugin.js';
5
- import { CREDENTIALS } from './fake-auth.js';
6
- import { startFake{{Pascal}} } from './fake-upstream.js';
7
- import type { Fake{{Pascal}} } from './fake-upstream.js';
8
-
9
- const manifest: unknown = JSON.parse(readFileSync(new URL('../manifest.json', import.meta.url), 'utf8'));
10
-
11
- let fake: Fake{{Pascal}};
12
- const plugin = create{{Pascal}}Plugin();
13
-
14
- beforeAll(async () => {
15
- fake = await startFake{{Pascal}}();
16
- });
17
- afterAll(async () => {
18
- await plugin.shutdown?.();
19
- await fake?.close();
20
- });
21
-
22
- const connection = () => {
23
- const { username, ...secrets } = CREDENTIALS as Record<string, string>;
24
- return { instanceId: '{{id}}', config: { baseUrl: fake.url, ...(username ? { username } : {}) }, secrets };
25
- };
26
-
27
- describe('{{name}} plugin', () => {
28
- it('passes the SDK conformance checks against the fake', async () => {
29
- const issues = await checkConformance({
30
- manifest,
31
- settings,
32
- handlers: plugin,
33
- init: connection(),
34
- samples: [
35
- { fn: 'call', args: ['items.list'], expectKey: 'items.list' },
36
- { fn: 'call', args: ['items.delete', { id: 1 }], expectKey: 'items.delete' },
37
- ],
38
- rejects: [{ fn: 'call', args: ['items.nope'] }, { fn: 'other', args: [] }],
39
- });
40
- expect(issues).toEqual([]);
41
- });
42
-
43
- it('locks deletes and names the item in the confirmation', async () => {
44
- await plugin.init({ ...connection(), sdkVersion: '1' });
45
- const { operations } = await plugin.syncCatalog();
46
- expect(operations.find((o) => o.key === 'items.delete')).toMatchObject({ locked: true });
47
- expect(await plugin.summarize({ key: 'items.delete', params: { id: 1 }, targets: [] })).toEqual({
48
- text: '{{name}} items.delete({"id":1})',
49
- confirmLiteral: 'First item',
50
- });
51
- });
52
-
53
- it('reports rejected credentials without throwing', async () => {
54
- const wrong = Object.fromEntries(Object.keys(connection().secrets).map((k) => [k, 'wrong']));
55
- if (!Object.keys(wrong).length) return; // nothing to reject without authentication
56
- const bad = create{{Pascal}}Plugin();
57
- await bad.init({ ...connection(), secrets: wrong, sdkVersion: '1' });
58
- expect(await bad.testConnection()).toMatchObject({ ok: false, message: expect.stringContaining('denied') });
59
- await bad.shutdown?.();
60
- });
61
-
62
- it('refuses a connection without a base URL', async () => {
63
- await expect(create{{Pascal}}Plugin().init({ ...connection(), config: {}, sdkVersion: '1' })).rejects.toMatchObject({
64
- code: ErrorCodes.InvalidParams,
65
- });
66
- });
67
- });