@taprsvp/types
Version:
TypeScript types and interfaces for the Transaction Authorization Protocol (TAP)
963 lines • 56.6 kB
JavaScript
"use strict";
/**
* @fileoverview Tests for TAP Message Validation using Zod v4
*
* These tests verify that the Zod validation schemas correctly validate and reject
* TAP messages according to the protocol specifications.
* Now includes property-based tests using fast-check for comprehensive validation.
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const fast_check_1 = __importDefault(require("fast-check"));
const arbitraries_1 = require("./arbitraries");
const validator_1 = require("./validator");
(0, vitest_1.describe)('Fundamental Validators', () => {
(0, vitest_1.describe)('DIDSchema', () => {
(0, vitest_1.it)('should validate valid DIDs', () => {
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('did:web:example.com').success).toBe(true);
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK').success).toBe(true);
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('did:example:123456789abcdefg').success).toBe(true);
});
(0, vitest_1.it)('should validate generated DIDs', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.did(), (did) => {
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse(did).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid DIDs', () => {
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('not-a-did').success).toBe(false);
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('did:').success).toBe(false);
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('did:web:').success).toBe(false);
(0, vitest_1.expect)(validator_1.DIDSchema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('IRISchema', () => {
(0, vitest_1.it)('should validate valid IRIs', () => {
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('https://tap.rsvp/schema/1.0').success).toBe(true);
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('mailto:test@example.com').success).toBe(true);
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('urn:example:resource').success).toBe(true);
});
(0, vitest_1.it)('should validate generated IRIs', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.iri(), (iri) => {
(0, vitest_1.expect)(validator_1.IRISchema.safeParse(iri).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid IRIs', () => {
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('not-an-iri').success).toBe(false);
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('').success).toBe(false);
(0, vitest_1.expect)(validator_1.IRISchema.safeParse('123:invalid').success).toBe(false);
});
});
(0, vitest_1.describe)('UUIDSchema', () => {
(0, vitest_1.it)('should validate valid UUIDs', () => {
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse('123e4567-e89b-42d3-a456-426614174000').success).toBe(true);
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse('01234567-89ab-4def-a123-456789abcdef').success).toBe(true);
});
(0, vitest_1.it)('should validate generated UUIDs', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.uuid(), (uuid) => {
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse(uuid).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid UUIDs', () => {
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse('not-a-uuid').success).toBe(false);
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse('123456').success).toBe(false);
(0, vitest_1.expect)(validator_1.UUIDSchema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('CAIP10Schema', () => {
(0, vitest_1.it)('should validate valid CAIP-10 addresses', () => {
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('eip155:1:0x742d35Cc6234C4532BC44b7532C4524532BC44b7').success).toBe(true);
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('bip122:000000000019d6689c085ae165831e93:1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2').success).toBe(true);
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('cosmos:cosmoshub-3:cosmos1t2uflqwqe0fsj0shcfkrvpukewcw40yjj6hdc0').success).toBe(true);
});
(0, vitest_1.it)('should validate generated CAIP-10 addresses', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.caip10(), (address) => {
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse(address).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid CAIP-10 addresses', () => {
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('eip155:1').success).toBe(false);
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('invalid-address').success).toBe(false);
(0, vitest_1.expect)(validator_1.CAIP10Schema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('CAIP19Schema', () => {
(0, vitest_1.it)('should validate valid CAIP-19 asset IDs', () => {
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse('eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f').success).toBe(true);
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse('bip122:000000000019d6689c085ae165831e93/slip44:0').success).toBe(true);
});
(0, vitest_1.it)('should validate generated CAIP-19 asset IDs', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.caip19(), (assetId) => {
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse(assetId).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid CAIP-19 asset IDs', () => {
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse('eip155:1').success).toBe(false);
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse('invalid-asset').success).toBe(false);
(0, vitest_1.expect)(validator_1.CAIP19Schema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('PayToURISchema', () => {
(0, vitest_1.it)('should validate valid PayTo URIs', () => {
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('payto://iban/DE75512108001245126199').success).toBe(true);
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('payto://sepa/DE75512108001245126199').success).toBe(true);
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('payto://ach/123456789/987654321').success).toBe(true);
});
(0, vitest_1.it)('should reject invalid PayTo URIs', () => {
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('not-payto-uri').success).toBe(false);
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('payto://').success).toBe(false);
(0, vitest_1.expect)(validator_1.PayToURISchema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('AmountSchema', () => {
(0, vitest_1.it)('should validate valid amounts', () => {
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('100').success).toBe(true);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('100.50').success).toBe(true);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('0.01').success).toBe(true);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('1000000').success).toBe(true);
});
(0, vitest_1.it)('should validate generated amounts', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.fundamental.amount(), (amount) => {
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse(amount).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject invalid amounts', () => {
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('abc').success).toBe(false);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('100.').success).toBe(false);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('.50').success).toBe(false);
(0, vitest_1.expect)(validator_1.AmountSchema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('CurrencyCodeSchema', () => {
(0, vitest_1.it)('should validate valid ISO 4217 currency codes', () => {
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('USD').success).toBe(true);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('EUR').success).toBe(true);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('GBP').success).toBe(true);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('JPY').success).toBe(true);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('AED').success).toBe(true);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('ZWL').success).toBe(true);
});
(0, vitest_1.it)('should reject invalid currency codes', () => {
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('usd').success).toBe(false);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('US').success).toBe(false);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('USDT').success).toBe(false);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('FAKE').success).toBe(false);
(0, vitest_1.expect)(validator_1.CurrencyCodeSchema.safeParse('').success).toBe(false);
});
});
(0, vitest_1.describe)('PurposeCodeSchema', () => {
(0, vitest_1.it)('should validate valid ISO 20022 purpose codes', () => {
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('SALA').success).toBe(true); // Salary payment
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('TRAD').success).toBe(true); // Trade services
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('RENT').success).toBe(true); // Rent payment
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('INTC').success).toBe(true); // Intra-company payment
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('SUPP').success).toBe(true); // Supplier payment
});
(0, vitest_1.it)('should reject invalid purpose codes', () => {
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('sala').success).toBe(false); // lowercase
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('INVALID').success).toBe(false); // not in enum
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('TEST').success).toBe(false); // not in enum
(0, vitest_1.expect)(validator_1.PurposeCodeSchema.safeParse('').success).toBe(false); // empty
});
});
(0, vitest_1.describe)('CategoryPurposeCodeSchema', () => {
(0, vitest_1.it)('should validate valid ISO 20022 category purpose codes', () => {
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('SALA').success).toBe(true); // Salary
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('TRAD').success).toBe(true); // Trade
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('SUPP').success).toBe(true); // Supplier
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('TAXS').success).toBe(true); // Tax
});
(0, vitest_1.it)('should reject invalid category purpose codes', () => {
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('sala').success).toBe(false); // lowercase
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('INVALID').success).toBe(false); // not in enum
(0, vitest_1.expect)(validator_1.CategoryPurposeCodeSchema.safeParse('').success).toBe(false); // empty
});
});
});
(0, vitest_1.describe)('Participant Validators', () => {
(0, vitest_1.describe)('ParticipantSchema', () => {
(0, vitest_1.it)('should validate valid participants', () => {
const participant = {
"@id": "did:example:alice",
name: "Alice Smith",
email: "alice@example.com"
};
(0, vitest_1.expect)(validator_1.ParticipantSchema.safeParse(participant).success).toBe(true);
});
(0, vitest_1.it)('should validate generated participants', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.participants.participant(), (participant) => {
(0, vitest_1.expect)(validator_1.ParticipantSchema.safeParse(participant).success).toBe(true);
}));
});
(0, vitest_1.it)('should require @id and name', () => {
(0, vitest_1.expect)(validator_1.ParticipantSchema.safeParse({ name: "Alice" }).success).toBe(false);
(0, vitest_1.expect)(validator_1.ParticipantSchema.safeParse({ "@id": "did:example:alice" }).success).toBe(false);
});
});
(0, vitest_1.describe)('PersonSchema', () => {
(0, vitest_1.it)('should validate valid persons', () => {
const person = {
"@id": "did:example:alice",
"@type": "https://schema.org/Person",
name: "Alice Smith",
givenName: "Alice",
familyName: "Smith"
};
(0, vitest_1.expect)(validator_1.PersonSchema.safeParse(person).success).toBe(true);
});
(0, vitest_1.it)('should validate generated persons', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.participants.person(), (person) => {
(0, vitest_1.expect)(validator_1.PersonSchema.safeParse(person).success).toBe(true);
}));
});
});
(0, vitest_1.describe)('OrganizationSchema', () => {
(0, vitest_1.it)('should validate valid organizations', () => {
const organization = {
"@id": "did:web:example.com",
"@type": "https://schema.org/Organization",
name: "Example Corp",
legalName: "Example Corporation",
url: "https://example.com"
};
(0, vitest_1.expect)(validator_1.OrganizationSchema.safeParse(organization).success).toBe(true);
});
(0, vitest_1.it)('should validate generated organizations', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.participants.organization(), (organization) => {
(0, vitest_1.expect)(validator_1.OrganizationSchema.safeParse(organization).success).toBe(true);
}));
});
});
(0, vitest_1.describe)('AgentSchema', () => {
(0, vitest_1.it)('should validate valid agents', () => {
const agent = {
"@id": "did:example:agent",
for: "did:example:alice",
name: "Wallet Service",
role: "WalletProvider"
};
(0, vitest_1.expect)(validator_1.AgentSchema.safeParse(agent).success).toBe(true);
});
(0, vitest_1.it)('should validate generated agents', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.participants.agent(), (agent) => {
(0, vitest_1.expect)(validator_1.AgentSchema.safeParse(agent).success).toBe(true);
}));
});
(0, vitest_1.it)('should require @id and for fields', () => {
(0, vitest_1.expect)(validator_1.AgentSchema.safeParse({ name: "Agent" }).success).toBe(false);
(0, vitest_1.expect)(validator_1.AgentSchema.safeParse({ "@id": "did:example:agent" }).success).toBe(false);
});
});
});
(0, vitest_1.describe)('TAP Message Validators', () => {
const validAgent = {
"@id": "did:example:agent",
for: "did:example:alice",
name: "Test Agent"
};
const validPerson = {
"@id": "did:example:alice",
name: "Alice Smith"
};
(0, vitest_1.describe)('TransferSchema', () => {
(0, vitest_1.it)('should validate valid transfer messages', () => {
const transfer = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer",
asset: "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f",
amount: "100.00",
originator: validPerson,
beneficiary: validPerson,
agents: [validAgent],
purposeCode: "TRAD"
};
(0, vitest_1.expect)(validator_1.TransferSchema.safeParse(transfer).success).toBe(true);
});
(0, vitest_1.it)('should validate generated transfer messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messageBodies.transfer(), (transfer) => {
(0, vitest_1.expect)(validator_1.TransferSchema.safeParse(transfer).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject transfer with invalid purpose code', () => {
const transfer = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer",
asset: "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f",
amount: "100.00",
originator: validPerson,
beneficiary: validPerson,
agents: [validAgent],
purposeCode: "INVALID"
};
(0, vitest_1.expect)(validator_1.TransferSchema.safeParse(transfer).success).toBe(false);
});
(0, vitest_1.it)('should require required fields', () => {
const transfer = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer"
};
(0, vitest_1.expect)(validator_1.TransferSchema.safeParse(transfer).success).toBe(false);
});
});
(0, vitest_1.describe)('PaymentSchema', () => {
(0, vitest_1.it)('should validate payment with asset', () => {
const payment = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Payment",
amount: "50.00",
asset: "USD",
merchant: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.PaymentSchema.safeParse(payment).success).toBe(true);
});
(0, vitest_1.it)('should validate generated payment messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messageBodies.payment(), (payment) => {
(0, vitest_1.expect)(validator_1.PaymentSchema.safeParse(payment).success).toBe(true);
}));
});
(0, vitest_1.it)('should validate payment with currency', () => {
const payment = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Payment",
amount: "50.00",
currency: "USD",
merchant: validPerson,
agents: [validAgent],
purposeCode: "SALA"
};
(0, vitest_1.expect)(validator_1.PaymentSchema.safeParse(payment).success).toBe(true);
});
(0, vitest_1.it)('should reject payment with invalid purpose code', () => {
const payment = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Payment",
amount: "50.00",
currency: "USD",
payer: validPerson,
payee: validPerson,
agents: [validAgent],
purposeCode: "BADCODE"
};
(0, vitest_1.expect)(validator_1.PaymentSchema.safeParse(payment).success).toBe(false);
});
(0, vitest_1.it)('should require either asset or currency', () => {
const payment = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Payment",
amount: "50.00",
payer: validPerson,
payee: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.PaymentSchema.safeParse(payment).success).toBe(false);
});
});
(0, vitest_1.describe)('RFQSchema', () => {
(0, vitest_1.it)('should validate RFQ with fromAmount', () => {
const rfq = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD"],
toAssets: ["eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"],
fromAmount: "1000.00",
requester: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(true);
});
(0, vitest_1.it)('should validate generated RFQ messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messageBodies.rfq(), (rfq) => {
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(true);
}));
});
(0, vitest_1.it)('should validate RFQ with toAmount', () => {
const rfq = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD"],
toAssets: ["EUR"],
toAmount: "900.00",
requester: validPerson,
provider: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(true);
});
(0, vitest_1.it)('should validate RFQ with multiple assets', () => {
const rfq = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD", "EUR"],
toAssets: ["eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f"],
fromAmount: "1000.00",
requester: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(true);
});
(0, vitest_1.it)('should require either fromAmount or toAmount', () => {
const rfq = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD"],
toAssets: ["EUR"],
requester: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(false);
});
(0, vitest_1.it)('should require at least one fromAsset and toAsset', () => {
const rfq = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: [],
toAssets: ["EUR"],
fromAmount: "1000.00",
requester: validPerson,
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.RFQSchema.safeParse(rfq).success).toBe(false);
});
});
(0, vitest_1.describe)('QuoteSchema', () => {
(0, vitest_1.it)('should validate valid quote messages', () => {
const quote = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Quote",
fromAsset: "USD",
toAsset: "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
fromAmount: "1000.00",
toAmount: "996.00",
provider: validPerson,
agents: [validAgent],
expiresAt: "2025-07-21T00:00:00Z"
};
(0, vitest_1.expect)(validator_1.QuoteSchema.safeParse(quote).success).toBe(true);
});
(0, vitest_1.it)('should validate generated quote messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messageBodies.quote(), (quote) => {
(0, vitest_1.expect)(validator_1.QuoteSchema.safeParse(quote).success).toBe(true);
}));
});
(0, vitest_1.it)('should require all required fields', () => {
const quote = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Quote",
fromAsset: "USD",
toAsset: "EUR"
};
(0, vitest_1.expect)(validator_1.QuoteSchema.safeParse(quote).success).toBe(false);
});
});
(0, vitest_1.describe)('LockSchema', () => {
(0, vitest_1.it)('should validate lock with asset', () => {
const lock = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
asset: "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
amount: "1000.00",
originator: validPerson,
beneficiary: validPerson,
expiry: "2025-07-21T01:00:00Z",
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.LockSchema.safeParse(lock).success).toBe(true);
});
(0, vitest_1.it)('should validate generated lock messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messageBodies.lock(), (lock) => {
(0, vitest_1.expect)(validator_1.LockSchema.safeParse(lock).success).toBe(true);
}));
});
(0, vitest_1.it)('should validate lock with currency', () => {
const lock = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
currency: "USD",
amount: "1000.00",
originator: validPerson,
beneficiary: validPerson,
expiry: "2025-07-21T01:00:00Z",
agreement: "https://example.com/escrow-terms",
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.LockSchema.safeParse(lock).success).toBe(true);
});
(0, vitest_1.it)('should require either asset or currency', () => {
const lock = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
amount: "1000.00",
originator: validPerson,
beneficiary: validPerson,
expiry: "2025-07-21T01:00:00Z",
agents: [validAgent]
};
(0, vitest_1.expect)(validator_1.LockSchema.safeParse(lock).success).toBe(false);
});
(0, vitest_1.it)('should require all required fields', () => {
const lock = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
asset: "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
};
(0, vitest_1.expect)(validator_1.LockSchema.safeParse(lock).success).toBe(false);
});
});
(0, vitest_1.describe)('CaptureSchema', () => {
(0, vitest_1.it)('should validate capture with all optional fields', () => {
const capture = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Capture",
amount: "500.00",
settlementAddress: "eip155:1:0xabcdef0123456789abcdef0123456789abcdef01"
};
(0, vitest_1.expect)(validator_1.CaptureSchema.safeParse(capture).success).toBe(true);
});
(0, vitest_1.it)('should validate capture with no optional fields', () => {
const capture = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Capture"
};
(0, vitest_1.expect)(validator_1.CaptureSchema.safeParse(capture).success).toBe(true);
});
(0, vitest_1.it)('should validate capture with PayTo URI settlement address', () => {
const capture = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Capture",
amount: "500.00",
settlementAddress: "payto://iban/DE75512108001245126199"
};
(0, vitest_1.expect)(validator_1.CaptureSchema.safeParse(capture).success).toBe(true);
});
});
(0, vitest_1.describe)('AuthorizeSchema', () => {
(0, vitest_1.it)('should validate valid authorization', () => {
const authorize = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "approve"
};
(0, vitest_1.expect)(validator_1.AuthorizeSchema.safeParse(authorize).success).toBe(true);
});
(0, vitest_1.it)('should validate deny decision', () => {
const authorize = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "deny",
reason: "Compliance check failed"
};
(0, vitest_1.expect)(validator_1.AuthorizeSchema.safeParse(authorize).success).toBe(true);
});
(0, vitest_1.it)('should reject invalid decisions', () => {
const authorize = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "maybe"
};
(0, vitest_1.expect)(validator_1.AuthorizeSchema.safeParse(authorize).success).toBe(false);
});
});
(0, vitest_1.describe)('SettleSchema', () => {
(0, vitest_1.it)('should validate valid settlement', () => {
const settle = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Settle",
txHash: "0x1234567890abcdef1234567890abcdef12345678"
};
(0, vitest_1.expect)(validator_1.SettleSchema.safeParse(settle).success).toBe(true);
});
(0, vitest_1.it)('should require txHash', () => {
const settle = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Settle"
};
(0, vitest_1.expect)(validator_1.SettleSchema.safeParse(settle).success).toBe(false);
});
});
});
(0, vitest_1.describe)('DIDComm Message Validators', () => {
const validTransferBody = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer",
asset: "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f",
amount: "100.00",
originator: { "@id": "did:example:alice", name: "Alice" },
beneficiary: { "@id": "did:example:bob", name: "Bob" },
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
};
const validRFQBody = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD"],
toAssets: ["EUR"],
fromAmount: "1000.00",
requester: { "@id": "did:example:alice", name: "Alice" },
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
};
const validQuoteBody = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Quote",
fromAsset: "USD",
toAsset: "EUR",
fromAmount: "1000.00",
toAmount: "900.00",
provider: { "@id": "did:example:provider", name: "Provider" },
agents: [{ "@id": "did:example:agent", for: "did:example:provider", name: "Agent" }],
expiresAt: "2025-07-21T00:00:00Z"
};
const validLockBody = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
asset: "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
amount: "1000.00",
originator: { "@id": "did:example:alice", name: "Alice" },
beneficiary: { "@id": "did:example:bob", name: "Bob" },
expiry: "2025-07-21T01:00:00Z",
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
};
const validCaptureBody = {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Capture",
amount: "500.00",
settlementAddress: "eip155:1:0xabcdef0123456789abcdef0123456789abcdef01"
};
(0, vitest_1.describe)('TransferMessageSchema', () => {
(0, vitest_1.it)('should validate valid transfer messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Transfer",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validTransferBody
};
(0, vitest_1.expect)(validator_1.TransferMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should validate generated transfer messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messages.transferMessage(), (message) => {
(0, vitest_1.expect)(validator_1.TransferMessageSchema.safeParse(message).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject wrong message type', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Payment",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validTransferBody
};
(0, vitest_1.expect)(validator_1.TransferMessageSchema.safeParse(message).success).toBe(false);
});
});
(0, vitest_1.describe)('RFQMessageSchema', () => {
(0, vitest_1.it)('should validate valid RFQ messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#RFQ",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validRFQBody
};
(0, vitest_1.expect)(validator_1.RFQMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should validate generated RFQ messages', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messages.rfqMessage(), (message) => {
(0, vitest_1.expect)(validator_1.RFQMessageSchema.safeParse(message).success).toBe(true);
}));
});
(0, vitest_1.it)('should reject wrong message type', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Transfer",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validRFQBody
};
(0, vitest_1.expect)(validator_1.RFQMessageSchema.safeParse(message).success).toBe(false);
});
});
(0, vitest_1.describe)('QuoteMessageSchema', () => {
(0, vitest_1.it)('should validate quote replies with thid', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Quote",
from: "did:example:provider",
to: ["did:example:requester"],
thid: "12345678-9abc-4def-a123-456789abcdef",
created_time: Date.now(),
body: validQuoteBody
};
(0, vitest_1.expect)(validator_1.QuoteMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should require thid for quote reply messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Quote",
from: "did:example:provider",
to: ["did:example:requester"],
created_time: Date.now(),
body: validQuoteBody
};
(0, vitest_1.expect)(validator_1.QuoteMessageSchema.safeParse(message).success).toBe(false);
});
});
(0, vitest_1.describe)('LockMessageSchema', () => {
(0, vitest_1.it)('should validate valid lock messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Lock",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validLockBody
};
(0, vitest_1.expect)(validator_1.LockMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should reject wrong message type', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Transfer",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: validLockBody
};
(0, vitest_1.expect)(validator_1.LockMessageSchema.safeParse(message).success).toBe(false);
});
});
(0, vitest_1.describe)('CaptureMessageSchema', () => {
(0, vitest_1.it)('should validate capture replies with thid', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Capture",
from: "did:example:releaser",
to: ["did:example:originator"],
thid: "12345678-9abc-4def-a123-456789abcdef",
created_time: Date.now(),
body: validCaptureBody
};
(0, vitest_1.expect)(validator_1.CaptureMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should require thid for capture reply messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Capture",
from: "did:example:releaser",
to: ["did:example:originator"],
created_time: Date.now(),
body: validCaptureBody
};
(0, vitest_1.expect)(validator_1.CaptureMessageSchema.safeParse(message).success).toBe(false);
});
});
(0, vitest_1.describe)('AuthorizeMessageSchema', () => {
(0, vitest_1.it)('should validate authorization replies with thid', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Authorize",
from: "did:example:authorizer",
to: ["did:example:sender"],
thid: "12345678-9abc-4def-a123-456789abcdef",
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "approve"
}
};
(0, vitest_1.expect)(validator_1.AuthorizeMessageSchema.safeParse(message).success).toBe(true);
});
(0, vitest_1.it)('should require thid for reply messages', () => {
const message = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Authorize",
from: "did:example:authorizer",
to: ["did:example:sender"],
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "approve"
}
};
(0, vitest_1.expect)(validator_1.AuthorizeMessageSchema.safeParse(message).success).toBe(false);
});
});
});
(0, vitest_1.describe)('TAPMessageSchema (Discriminated Union)', () => {
(0, vitest_1.it)('should validate generated TAPMessage union types', () => {
fast_check_1.default.assert(fast_check_1.default.property(arbitraries_1.arbitraries.messages.tapMessage(), (message) => {
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(message).success).toBe(true);
}));
});
(0, vitest_1.it)('should validate different message types', () => {
const transferMessage = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Transfer",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer",
asset: "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f",
amount: "100.00",
originator: { "@id": "did:example:alice", name: "Alice" },
beneficiary: { "@id": "did:example:bob", name: "Bob" },
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
}
};
const rfqMessage = {
id: "12345678-9abc-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#RFQ",
from: "did:example:requester",
to: ["did:example:provider"],
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "RFQ",
fromAssets: ["USD"],
toAssets: ["EUR"],
fromAmount: "1000.00",
requester: { "@id": "did:example:alice", name: "Alice" },
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
}
};
const lockMessage = {
id: "23456789-abcd-4ef0-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Lock",
from: "did:example:originator",
to: ["did:example:beneficiary"],
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Lock",
asset: "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
amount: "1000.00",
originator: { "@id": "did:example:alice", name: "Alice" },
beneficiary: { "@id": "did:example:bob", name: "Bob" },
expiry: "2025-07-21T01:00:00Z",
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
}
};
const authorizeMessage = {
id: "34567890-bcde-4f01-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Authorize",
from: "did:example:authorizer",
to: ["did:example:sender"],
thid: "87654321-dcba-4fed-a321-fedcba987654",
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Authorize",
decision: "approve"
}
};
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(transferMessage).success).toBe(true);
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(rfqMessage).success).toBe(true);
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(lockMessage).success).toBe(true);
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(authorizeMessage).success).toBe(true);
});
(0, vitest_1.it)('should validate quote and capture reply messages', () => {
const quoteMessage = {
id: "45678901-cdef-4012-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Quote",
from: "did:example:provider",
to: ["did:example:requester"],
thid: "12345678-9abc-4def-a123-456789abcdef",
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Quote",
fromAsset: "USD",
toAsset: "EUR",
fromAmount: "1000.00",
toAmount: "900.00",
provider: { "@id": "did:example:provider", name: "Provider" },
agents: [{ "@id": "did:example:agent", for: "did:example:provider", name: "Agent" }],
expiresAt: "2025-07-21T00:00:00Z"
}
};
const captureMessage = {
id: "56789012-def0-4123-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Capture",
from: "did:example:releaser",
to: ["did:example:originator"],
thid: "23456789-abcd-4ef0-a123-456789abcdef",
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Capture",
amount: "500.00",
settlementAddress: "eip155:1:0xabcdef0123456789abcdef0123456789abcdef01"
}
};
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(quoteMessage).success).toBe(true);
(0, vitest_1.expect)(validator_1.TAPMessageSchema.safeParse(captureMessage).success).toBe(true);
});
});
(0, vitest_1.describe)('Validation Functions', () => {
const validMessage = {
id: "01234567-89ab-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#Transfer",
from: "did:example:sender",
to: ["did:example:receiver"],
created_time: Date.now(),
body: {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Transfer",
asset: "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f",
amount: "100.00",
originator: { "@id": "did:example:alice", name: "Alice" },
beneficiary: { "@id": "did:example:bob", name: "Bob" },
agents: [{ "@id": "did:example:agent", for: "did:example:alice", name: "Agent" }]
}
};
(0, vitest_1.describe)('validateTAPMessage', () => {
(0, vitest_1.it)('should return success for valid messages', () => {
const result = (0, validator_1.validateTAPMessage)(validMessage);
(0, vitest_1.expect)(result.success).toBe(true);
if (result.success) {
(0, vitest_1.expect)(result.data.type).toBe("https://tap.rsvp/schema/1.0#Transfer");
}
});
(0, vitest_1.it)('should return error for invalid messages', () => {
const result = (0, validator_1.validateTAPMessage)({ invalid: "message" });
(0, vitest_1.expect)(result.success).toBe(false);
if (!result.success) {
(0, vitest_1.expect)(result.error.issues.length).toBeGreaterThan(0);
}
});
});
(0, vitest_1.describe)('parseTAPMessage', () => {
(0, vitest_1.it)('should parse valid messages', () => {
const parsed = (0, validator_1.parseTAPMessage)(validMessage);
(0, vitest_1.expect)(parsed.type).toBe("https://tap.rsvp/schema/1.0#Transfer");
});
(0, vitest_1.it)('should throw for invalid messages', () => {
(0, vitest_1.expect)(() => (0, validator_1.parseTAPMessage)({ invalid: "message" })).toThrow();
});
});
(0, vitest_1.describe)('isTAPMessage', () => {
(0, vitest_1.it)('should return true for valid messages', () => {
(0, vitest_1.expect)((0, validator_1.isTAPMessage)(validMessage)).toBe(true);
});
(0, vitest_1.it)('should return false for invalid messages', () => {
(0, vitest_1.expect)((0, validator_1.isTAPMessage)({ invalid: "message" })).toBe(false);
(0, vitest_1.expect)((0, validator_1.isTAPMessage)(null)).toBe(false);
(0, vitest_1.expect)((0, validator_1.isTAPMessage)(undefined)).toBe(false);
});
});
(0, vitest_1.describe)('Message-specific validators', () => {
const validRFQMessage = {
id: "12345678-9abc-4def-a123-456789abcdef",
type: "https://tap.rsvp/schema/1.0#RFQ",
from: "did:example:requester",
to: ["did:example:provider"],
created_time: Date.now