Skip to content

Commit 8637c6c

Browse files
committed
[params] More listener tests
1 parent 9ade183 commit 8637c6c

1 file changed

Lines changed: 194 additions & 0 deletions

File tree

test/unit/core/other/queries.test.ts

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5177,5 +5177,199 @@ describe('Parameterized', () => {
51775177
{q1: {r1: {c: 'a_2'}}},
51785178
);
51795179
});
5180+
5181+
test('addParamValuesListener for specific query', () => {
5182+
store.setTable('t1', {
5183+
r1: {c1: 'a', c2: 'b'},
5184+
r2: {c1: 'c', c2: 'd'},
5185+
r3: {c1: 'e', c2: 'f'},
5186+
});
5187+
queries.setQueryDefinition(
5188+
'q1',
5189+
't1',
5190+
({select, where, param}) => {
5191+
select('c1');
5192+
where('c2', param('p1') as Cell);
5193+
},
5194+
{p1: 'b'},
5195+
);
5196+
5197+
const listener = vi.fn();
5198+
const listenerId = queries.addParamValuesListener('q1', listener);
5199+
5200+
queries.setParamValues('q1', {p1: 'd'});
5201+
expect(listener).toHaveBeenCalledWith(queries, 'q1', {p1: 'd'});
5202+
5203+
queries.setParamValues('q1', {p1: 'f'});
5204+
expect(listener).toHaveBeenCalledWith(queries, 'q1', {p1: 'f'});
5205+
5206+
queries.delListener(listenerId);
5207+
queries.setParamValues('q1', {p1: 'b'});
5208+
expect(listener).toHaveBeenCalledTimes(2);
5209+
});
5210+
5211+
test('addParamValuesListener with wildcard', () => {
5212+
store.setTable('t1', {
5213+
r1: {c1: 'a', c2: 'b'},
5214+
r2: {c1: 'c', c2: 'd'},
5215+
});
5216+
queries
5217+
.setQueryDefinition(
5218+
'q1',
5219+
't1',
5220+
({select, where, param}) => {
5221+
select('c1');
5222+
where('c2', param('p1') as Cell);
5223+
},
5224+
{p1: 'b'},
5225+
)
5226+
.setQueryDefinition(
5227+
'q2',
5228+
't1',
5229+
({select, where, param}) => {
5230+
select('c2');
5231+
where('c1', param('p2') as Cell);
5232+
},
5233+
{p2: 'a'},
5234+
);
5235+
5236+
const listener = vi.fn();
5237+
queries.addParamValuesListener(null, listener);
5238+
5239+
queries.setParamValues('q1', {p1: 'd'});
5240+
expect(listener).toHaveBeenCalledWith(queries, 'q1', {p1: 'd'});
5241+
5242+
queries.setParamValues('q2', {p2: 'c'});
5243+
expect(listener).toHaveBeenCalledWith(queries, 'q2', {p2: 'c'});
5244+
5245+
expect(listener).toHaveBeenCalledTimes(2);
5246+
});
5247+
5248+
test('addParamValuesListener only fires when values change', () => {
5249+
store.setTable('t1', {r1: {c1: 'a', c2: 'b'}});
5250+
queries.setQueryDefinition(
5251+
'q1',
5252+
't1',
5253+
({select, where, param}) => {
5254+
select('c1');
5255+
where('c2', param('p1') as Cell);
5256+
},
5257+
{p1: 'b'},
5258+
);
5259+
5260+
const listener = vi.fn();
5261+
queries.addParamValuesListener('q1', listener);
5262+
queries.setParamValues('q1', {p1: 'b'}); // Same value
5263+
expect(listener).toHaveBeenCalledTimes(0);
5264+
5265+
queries.setParamValues('q1', {p1: 'd'}); // Different value
5266+
expect(listener).toHaveBeenCalledTimes(1);
5267+
5268+
queries.setParamValues('q1', {p1: 'd'}); // Same value again
5269+
expect(listener).toHaveBeenCalledTimes(1);
5270+
});
5271+
5272+
test('addParamValueListener for specific query and param', () => {
5273+
store.setTable('t1', {
5274+
r1: {c1: 'a', c2: 'b', c3: 5},
5275+
r2: {c1: 'c', c2: 'd', c3: 3},
5276+
});
5277+
queries.setQueryDefinition(
5278+
'q1',
5279+
't1',
5280+
({select, where, param}) => {
5281+
select('c1');
5282+
where(
5283+
(getTableCell) =>
5284+
getTableCell('c2') === param('p1') &&
5285+
(getTableCell('c3') as number) >= (param('p2') as number),
5286+
);
5287+
},
5288+
{p1: 'b', p2: 3},
5289+
);
5290+
5291+
const listener = vi.fn();
5292+
const listenerId = queries.addParamValueListener('q1', 'p1', listener);
5293+
5294+
queries.setParamValue('q1', 'p1', 'd');
5295+
expect(listener).toHaveBeenCalledWith(queries, 'q1', 'p1', 'd');
5296+
expect(listener).toHaveBeenCalledTimes(1);
5297+
5298+
queries.setParamValue('q1', 'p2', 5);
5299+
expect(listener).toHaveBeenCalledTimes(1);
5300+
5301+
queries.setParamValue('q1', 'p1', 'e');
5302+
expect(listener).toHaveBeenCalledWith(queries, 'q1', 'p1', 'e');
5303+
expect(listener).toHaveBeenCalledTimes(2);
5304+
5305+
queries.delListener(listenerId);
5306+
queries.setParamValue('q1', 'p1', 'b');
5307+
expect(listener).toHaveBeenCalledTimes(2);
5308+
});
5309+
5310+
test('addParamValueListener with wildcards', () => {
5311+
store.setTable('t1', {
5312+
r1: {c1: 'a', c2: 'b', c3: 5},
5313+
r2: {c1: 'c', c2: 'd', c3: 3},
5314+
});
5315+
queries
5316+
.setQueryDefinition(
5317+
'q1',
5318+
't1',
5319+
({select, where, param}) => {
5320+
select('c1');
5321+
where('c2', param('p1') as Cell);
5322+
},
5323+
{p1: 'b'},
5324+
)
5325+
.setQueryDefinition(
5326+
'q2',
5327+
't1',
5328+
({select, where, param}) => {
5329+
select('c2');
5330+
where(
5331+
(getTableCell) =>
5332+
(getTableCell('c3') as number) >= (param('p2') as number),
5333+
);
5334+
},
5335+
{p2: 3},
5336+
);
5337+
5338+
const listener = vi.fn();
5339+
queries.addParamValueListener(null, null, listener);
5340+
5341+
queries.setParamValue('q1', 'p1', 'd');
5342+
expect(listener).toHaveBeenCalledWith(queries, 'q1', 'p1', 'd');
5343+
5344+
queries.setParamValue('q2', 'p2', 5);
5345+
expect(listener).toHaveBeenCalledWith(queries, 'q2', 'p2', 5);
5346+
5347+
expect(listener).toHaveBeenCalledTimes(2);
5348+
});
5349+
5350+
test('addParamValueListener only fires when value actually changes', () => {
5351+
store.setTable('t1', {r1: {c1: 'a', c2: 'b'}});
5352+
queries.setQueryDefinition(
5353+
'q1',
5354+
't1',
5355+
({select, where, param}) => {
5356+
select('c1');
5357+
where('c2', param('p1') as Cell);
5358+
},
5359+
{p1: 'b'},
5360+
);
5361+
5362+
const listener = vi.fn();
5363+
queries.addParamValueListener('q1', 'p1', listener);
5364+
5365+
queries.setParamValue('q1', 'p1', 'b'); // Same value
5366+
expect(listener).toHaveBeenCalledTimes(0);
5367+
5368+
queries.setParamValue('q1', 'p1', 'd'); // Different value
5369+
expect(listener).toHaveBeenCalledTimes(1);
5370+
5371+
queries.setParamValue('q1', 'p1', 'd'); // Same value again
5372+
expect(listener).toHaveBeenCalledTimes(1);
5373+
});
51805374
});
51815375
});

0 commit comments

Comments
 (0)