import * as DepositAddress from '../../internal/funding/DepositAddress.js' import * as TestApp from '../../../test/App.js' import * as TestFunding from '../../../test/Funding.js' import * as FundingDepositRequestObservations from './fundingDepositRequestObservations.js' const db = TestApp.database() let addressCounter = 0 function seedAddress() { const index = addressCounter++ return DepositAddress.create(db, { apiKeyId: 'key_request_observations', deliveryStrategy: 'provider', environment: 'production', now: new Date(Date.UTC(2026, 0, 1, 0, 0, index)), orgId: 'org_request_observations', providerOutputToken: TestFunding.providerOutputToken(), snapshot: TestFunding.depositAddressSnapshot({ provider: { id: `relay_observation_${index}`, name: 'Relay' }, recipient: `0x${index.toString(16).padStart(40, '0')}`, }), }) } describe('get', () => { test('returns no observation before a request is seen', async () => { const address = await seedAddress() expect( await FundingDepositRequestObservations.get(db, { depositAddressId: address.id, providerRequestId: 'relay_unseen', }), ).toMatchInlineSnapshot(`undefined`) }) }) describe('observePoll', () => { test('retains the first poll timestamp for each request', async () => { const address = await seedAddress() await FundingDepositRequestObservations.observePoll(db, { depositAddressId: address.id, observedAt: '2026-01-01T00:00:10.000Z', providerRequestIds: ['relay_poll', 'relay_poll'], }) await FundingDepositRequestObservations.observePoll(db, { depositAddressId: address.id, observedAt: '2026-01-01T00:00:09.000Z', providerRequestIds: ['relay_poll'], }) expect( await FundingDepositRequestObservations.get(db, { depositAddressId: address.id, providerRequestId: 'relay_poll', }), ).toMatchInlineSnapshot( { depositAddressId: expect.any(String) }, ` { "depositAddressId": Any, "pollObservedAt": "2026-01-01T00:00:09.000Z", "providerRequestId": "relay_poll", "webhookReceivedAt": null, } `, ) }) }) describe('observeWebhook', () => { test('retains both first-observation timestamps regardless of arrival order', async () => { const address = await seedAddress() await FundingDepositRequestObservations.observeWebhook(db, { depositAddressId: address.id, providerRequestId: 'relay_webhook', receivedAt: '2026-01-01T00:00:08.000Z', }) await FundingDepositRequestObservations.observePoll(db, { depositAddressId: address.id, observedAt: '2026-01-01T00:00:07.000Z', providerRequestIds: ['relay_webhook'], }) await FundingDepositRequestObservations.observeWebhook(db, { depositAddressId: address.id, providerRequestId: 'relay_webhook', receivedAt: '2026-01-01T00:00:06.000Z', }) expect( await FundingDepositRequestObservations.get(db, { depositAddressId: address.id, providerRequestId: 'relay_webhook', }), ).toMatchInlineSnapshot( { depositAddressId: expect.any(String) }, ` { "depositAddressId": Any, "pollObservedAt": "2026-01-01T00:00:07.000Z", "providerRequestId": "relay_webhook", "webhookReceivedAt": "2026-01-01T00:00:06.000Z", } `, ) }) })