Wait-via-NATS returns completed or pending+jobId (GATE 9). Mock SHA256
idempotent register + GET /hashes/{sha256}. Zappier commercial edge has
POST /v1/timestamp and hash-lookup. GATE 12 smoke (signup + wait) passes.
NS1 NATS is 127.0.0.1:4222 on 70.88.205.138; SSH tunnel :14222. Local
nats-server -js used for isolated tests. Activate app adds Echo Text.
Learned: JetStream on NS1 is loopback-only; do not bind 4222 public.
94 lines
3.4 KiB
JavaScript
94 lines
3.4 KiB
JavaScript
/**
|
|
* GATE 11 — Zapier package shape tests (no live Zapier CLI required)
|
|
*/
|
|
|
|
const { describe, it } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
const App = require('../index');
|
|
const authentication = require('../authentication');
|
|
const timestampAndWait = require('../creates/timestamp_and_wait');
|
|
const createTimestamp = require('../creates/create_timestamp');
|
|
const verifyTimestamp = require('../creates/verify_timestamp');
|
|
const batchTimestamp = require('../creates/batch_timestamp');
|
|
const jobStatus = require('../searches/job_status');
|
|
const timestampCompleted = require('../triggers/timestamp_completed');
|
|
|
|
describe('verae-zapier app definition', () => {
|
|
it('exports authentication with api_key field', () => {
|
|
assert.equal(authentication.type, 'custom');
|
|
assert.ok(authentication.fields.some((f) => f.key === 'api_key'));
|
|
});
|
|
|
|
it('wires creates, searches, triggers', () => {
|
|
assert.ok(App.creates.add_numbers);
|
|
assert.ok(App.creates.timestamp_and_wait);
|
|
assert.ok(App.creates.create_timestamp);
|
|
assert.ok(App.creates.verify_timestamp);
|
|
assert.ok(App.creates.batch_timestamp);
|
|
assert.ok(App.searches.job_status);
|
|
assert.ok(App.searches.hash_lookup);
|
|
assert.ok(App.triggers.timestamp_completed);
|
|
});
|
|
|
|
it('create actions target middleware paths', () => {
|
|
process.env.MIDDLEWARE_BASE_URL = 'https://mw.example.com';
|
|
const urls = [];
|
|
const z = {
|
|
request: async (opts) => {
|
|
urls.push(opts.url);
|
|
return { data: { ok: true } };
|
|
},
|
|
};
|
|
const bundle = {
|
|
authData: { api_key: 'zmw_test' },
|
|
inputData: { data: 'x', certificate: 'c', items: 'a\nb', jobId: 'j1' },
|
|
};
|
|
|
|
return Promise.all([
|
|
timestampAndWait.operation.perform(z, bundle),
|
|
createTimestamp.operation.perform(z, bundle),
|
|
verifyTimestamp.operation.perform(z, bundle),
|
|
batchTimestamp.operation.perform(z, bundle),
|
|
jobStatus.operation.perform(z, bundle),
|
|
]).then(() => {
|
|
assert.ok(urls.some((u) => u.endsWith('/zapier/v1/timestamp/wait')));
|
|
assert.ok(urls.some((u) => u.endsWith('/zapier/v1/timestamp')));
|
|
assert.ok(urls.some((u) => u.endsWith('/zapier/v1/verify')));
|
|
assert.ok(urls.some((u) => u.endsWith('/zapier/v1/timestamp/batch')));
|
|
assert.ok(urls.some((u) => u.includes('/zapier/v1/status/')));
|
|
});
|
|
});
|
|
|
|
it('trigger subscribe/unsubscribe shapes', async () => {
|
|
process.env.MIDDLEWARE_BASE_URL = 'https://mw.example.com';
|
|
const calls = [];
|
|
const z = {
|
|
request: async (opts) => {
|
|
calls.push(opts);
|
|
return { data: { id: 'hook-1' } };
|
|
},
|
|
};
|
|
|
|
const id = await timestampCompleted.operation.performSubscribe(z, {
|
|
targetUrl: 'https://hooks.zapier.com/x',
|
|
authData: { api_key: 'k' },
|
|
});
|
|
assert.equal(id, 'hook-1');
|
|
assert.equal(calls[0].method, 'POST');
|
|
assert.match(calls[0].url, /webhooks\/subscribe$/);
|
|
assert.equal(calls[0].body.event, 'timestamp.completed');
|
|
|
|
await timestampCompleted.operation.performUnsubscribe(z, {
|
|
subscribeData: 'hook-1',
|
|
authData: { api_key: 'k' },
|
|
});
|
|
assert.equal(calls[1].method, 'DELETE');
|
|
assert.match(calls[1].url, /webhooks\/unsubscribe$/);
|
|
});
|
|
|
|
it('beforeRequest adds Authorization bearer', () => {
|
|
const req = App.beforeRequest[0]({}, null, { authData: { api_key: 'zmw_abc' } });
|
|
assert.equal(req.headers.Authorization, 'Bearer zmw_abc');
|
|
});
|
|
});
|