Added auth and request storage

This commit is contained in:
2026-08-31 12:28:18 +00:00
parent 6febaf327a
commit 1ca9648c09
21 changed files with 634 additions and 117 deletions
+51 -11
View File
@@ -7,6 +7,8 @@ import { ApplicationRouteStream } from '../../source/services/route-stream.ts';
import type { Database } from '../../source/services/storage/database.ts';
import { TestConnection } from '../helpers/test-connection.ts';
import { HTTP_STATUS_CODE_NOT_ACCEPTED } from '../../source/constants.ts';
import type { AuthSecp256k1 } from '../../source/auth/auth.ts';
import { Accounts } from '../../source/auth/accounts.ts';
const createBroadcasterStub = (): BaseBroadcaster => {
return {
@@ -17,6 +19,31 @@ const createBroadcasterStub = (): BaseBroadcaster => {
} as unknown as BaseBroadcaster;
};
const createAuthStub = (): AuthSecp256k1 => {
return {
verifySignature: vi.fn().mockImplementation(() => {
return true;
}),
} as unknown as AuthSecp256k1;
};
const createAccountsStub = (): Accounts => {
return {
getBalance: vi.fn().mockImplementation(() => {
return 0;
}),
setBalance: vi.fn().mockImplementation(() => {
return;
}),
deductBalance: vi.fn().mockImplementation(() => {
return;
}),
hasSufficientBalance: vi.fn().mockImplementation(() => {
return true;
}),
} as unknown as Accounts;
};
describe('DataRoute subscriptions', (): void => {
it('subscribes to future resource changes until removal', async (): Promise<void> => {
let resolveRemoved: () => void = () => undefined;
@@ -31,10 +58,14 @@ describe('DataRoute subscriptions', (): void => {
const broadcaster = createBroadcasterStub();
vi.mocked(broadcaster.subscribe).mockReturnValue(removed);
const connection = new TestConnection(true, false);
const stream = new ApplicationRouteStream(connection, {
resourceId: [ 'a', 'b' ],
});
const route = new DataRoute(storage, broadcaster, 0);
const stream = new ApplicationRouteStream(
connection,
{
resourceId: [ 'a', 'b' ],
},
'/data/subscribe',
);
const route = new DataRoute(storage, broadcaster, createAuthStub(), createAccountsStub(), 0);
const execution = route.subscribeData(stream);
@@ -55,8 +86,8 @@ describe('DataRoute subscriptions', (): void => {
} as unknown as Database;
const broadcaster = createBroadcasterStub();
const connection = new TestConnection(true, true);
const stream = new ApplicationRouteStream(connection, { resourceId: [ 'a' ] }, 'unsubscribe-1');
const route = new DataRoute(storage, broadcaster, 0);
const stream = new ApplicationRouteStream(connection, { resourceId: [ 'a' ] }, '/data/unsubscribe', 'unsubscribe-1');
const route = new DataRoute(storage, broadcaster, createAuthStub(), createAccountsStub(), 0);
await route.unsubscribeData(stream);
@@ -78,10 +109,14 @@ describe('DataRoute subscriptions', (): void => {
},
} as unknown as Database;
const broadcaster = createBroadcasterStub();
const stream = new ApplicationRouteStream(new TestConnection(true, false), {
resourceId: [ 'a' ],
});
const route = new DataRoute(storage, broadcaster, 0);
const stream = new ApplicationRouteStream(
new TestConnection(true, false),
{
resourceId: [ 'a' ],
},
'/data/unsubscribe',
);
const route = new DataRoute(storage, broadcaster, createAuthStub(), createAccountsStub(), 0);
await expect(route.unsubscribeData(stream)).rejects.toMatchObject({ statusCode: HTTP_STATUS_CODE_NOT_ACCEPTED });
expect(broadcaster.unsubscribe).not.toHaveBeenCalled();
@@ -97,7 +132,7 @@ describe('DataRoute resource write auth', (): void => {
} as unknown as Database;
const broadcaster = createBroadcasterStub();
const route = new DataRoute(storage, broadcaster, 0);
const route = new DataRoute(storage, broadcaster, createAuthStub(), createAccountsStub(), 0);
await expect(route.writeData({
connection: new TestConnection(true, true),
@@ -115,6 +150,11 @@ describe('DataRoute resource write auth', (): void => {
},
],
},
headers: {
publicKey: 'public-key',
signature: 'signature',
timestamp: Date.now(),
},
} as unknown as ApplicationRouteStream)).rejects.toBeInstanceOf(UnauthorizedError);
expect(storage.db.transaction).not.toHaveBeenCalled();