Skip to content

Commit 46fc9ac

Browse files
committed
Add some hydration tests.
1 parent b3a5ec3 commit 46fc9ac

File tree

2 files changed

+161
-4
lines changed

2 files changed

+161
-4
lines changed

packages/sync-rules/test/src/parameter_queries.test.ts

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1-
import { describe, expect, test } from 'vitest';
2-
import { UnscopedParameterLookup, SqlParameterQuery, SourceTableInterface } from '../../src/index.js';
1+
import { beforeEach, describe, expect, test } from 'vitest';
2+
import {
3+
UnscopedParameterLookup,
4+
SqlParameterQuery,
5+
SourceTableInterface,
6+
debugHydratedMergedSource,
7+
BucketParameterQuerier,
8+
QuerierError,
9+
GetQuerierOptions,
10+
RequestParameters,
11+
ScopedParameterLookup,
12+
mergeParameterIndexLookupCreators
13+
} from '../../src/index.js';
314
import { StaticSqlParameterQuery } from '../../src/StaticSqlParameterQuery.js';
415
import { BASIC_SCHEMA, EMPTY_DATA_SOURCE, normalizeTokenParameters, PARSE_OPTIONS } from './util.js';
16+
import { HydrationState } from '../../src/HydrationState.js';
517

618
describe('parameter queries', () => {
719
const table = (name: string): SourceTableInterface => ({
@@ -855,6 +867,85 @@ describe('parameter queries', () => {
855867
expect(query.getLookups(requestParams)).toEqual([UnscopedParameterLookup.normalized(['user1'])]);
856868
});
857869

870+
describe('custom hydrationState', function () {
871+
const hydrationState: HydrationState = {
872+
getBucketSourceScope(source) {
873+
return { bucketPrefix: `${source.uniqueName}-test` };
874+
},
875+
getParameterIndexLookupScope(source) {
876+
return {
877+
lookupName: `${source.defaultLookupScope.lookupName}.test`,
878+
queryId: `${source.defaultLookupScope.queryId}.test`
879+
};
880+
}
881+
};
882+
883+
let query: SqlParameterQuery;
884+
885+
beforeEach(() => {
886+
const sql = 'SELECT id as group_id FROM groups WHERE token_parameters.user_id IN groups.user_ids';
887+
query = SqlParameterQuery.fromSql(
888+
'mybucket',
889+
sql,
890+
PARSE_OPTIONS,
891+
'myquery',
892+
EMPTY_DATA_SOURCE
893+
) as SqlParameterQuery;
894+
895+
expect(query.errors).toEqual([]);
896+
});
897+
898+
test('for lookups', function () {
899+
const merged = mergeParameterIndexLookupCreators(hydrationState, [query]);
900+
const result = merged.evaluateParameterRow(TABLE_GROUPS, {
901+
id: 'group1',
902+
user_ids: JSON.stringify(['test-user', 'other-user'])
903+
});
904+
expect(result).toEqual([
905+
{
906+
lookup: ScopedParameterLookup.direct({ lookupName: 'mybucket.test', queryId: 'myquery.test' }, ['test-user']),
907+
bucketParameters: [{ group_id: 'group1' }]
908+
},
909+
{
910+
lookup: ScopedParameterLookup.direct({ lookupName: 'mybucket.test', queryId: 'myquery.test' }, [
911+
'other-user'
912+
]),
913+
bucketParameters: [{ group_id: 'group1' }]
914+
}
915+
]);
916+
});
917+
918+
test('for queries', function () {
919+
const hydrated = query.createParameterQuerierSource({ hydrationState });
920+
921+
const queriers: BucketParameterQuerier[] = [];
922+
const errors: QuerierError[] = [];
923+
const pending = { queriers, errors };
924+
925+
const querierOptions: GetQuerierOptions = {
926+
hasDefaultStreams: true,
927+
globalParameters: new RequestParameters(
928+
{
929+
sub: 'test-user'
930+
},
931+
{}
932+
),
933+
streams: {}
934+
};
935+
936+
hydrated.pushBucketParameterQueriers(pending, querierOptions);
937+
938+
expect(errors).toEqual([]);
939+
expect(queriers.length).toBe(1);
940+
941+
const querier = queriers[0];
942+
943+
expect(querier.parameterQueryLookups).toEqual([
944+
ScopedParameterLookup.direct({ lookupName: 'mybucket.test', queryId: 'myquery.test' }, ['test-user'])
945+
]);
946+
});
947+
});
948+
858949
test('invalid OR in parameter queries', () => {
859950
// Supporting this case is more tricky. We can do this by effectively denormalizing the OR clause
860951
// into separate queries, but it's a significant change. For now, developers should do that manually.

packages/sync-rules/test/src/static_parameter_queries.test.ts

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { describe, expect, test } from 'vitest';
2-
import { BucketDataScope } from '../../src/HydrationState.js';
3-
import { RequestParameters, SqlParameterQuery } from '../../src/index.js';
2+
import { BucketDataScope, HydrationState } from '../../src/HydrationState.js';
3+
import {
4+
BucketParameterQuerier,
5+
GetQuerierOptions,
6+
QuerierError,
7+
RequestParameters,
8+
ScopedParameterLookup,
9+
SqlParameterQuery
10+
} from '../../src/index.js';
411
import { StaticSqlParameterQuery } from '../../src/StaticSqlParameterQuery.js';
512
import { EMPTY_DATA_SOURCE, normalizeTokenParameters, PARSE_OPTIONS } from './util.js';
613

@@ -365,4 +372,63 @@ describe('static parameter queries', () => {
365372
"select request.parameters() ->> 'project_id' as project_id where request.jwt() ->> 'role' = 'authenticated'"
366373
);
367374
});
375+
376+
test('custom hydrationState for buckets', function () {
377+
const sql = 'SELECT token_parameters.user_id';
378+
const query = SqlParameterQuery.fromSql(
379+
'mybucket',
380+
sql,
381+
PARSE_OPTIONS,
382+
'1',
383+
EMPTY_DATA_SOURCE
384+
) as StaticSqlParameterQuery;
385+
386+
expect(query.errors).toEqual([]);
387+
388+
const hydrationState: HydrationState = {
389+
getBucketSourceScope(source) {
390+
return { bucketPrefix: `${source.uniqueName}-test` };
391+
},
392+
getParameterIndexLookupScope(source) {
393+
return {
394+
lookupName: `${source.defaultLookupScope.lookupName}.test`,
395+
queryId: `${source.defaultLookupScope.queryId}.test`
396+
};
397+
}
398+
};
399+
400+
// Internal API
401+
const hydrated = query.createParameterQuerierSource({ hydrationState });
402+
403+
const queriers: BucketParameterQuerier[] = [];
404+
const errors: QuerierError[] = [];
405+
const pending = { queriers, errors };
406+
407+
const querierOptions: GetQuerierOptions = {
408+
hasDefaultStreams: true,
409+
globalParameters: new RequestParameters(
410+
{
411+
sub: 'test-user'
412+
},
413+
{}
414+
),
415+
streams: {}
416+
};
417+
418+
hydrated.pushBucketParameterQueriers(pending, querierOptions);
419+
420+
expect(errors).toEqual([]);
421+
expect(queriers).toMatchObject([
422+
{
423+
staticBuckets: [
424+
{
425+
bucket: 'mybucket-test["test-user"]',
426+
definition: 'mybucket',
427+
inclusion_reasons: ['default'],
428+
priority: 3
429+
}
430+
]
431+
}
432+
]);
433+
});
368434
});

0 commit comments

Comments
 (0)