···
+
describe('deduplication behavior', () => {
+
it('deduplicates operations when no result has been sent yet', () => {
+
const onOperation = vi.fn();
+
const exchange: Exchange = () => ops$ => {
+
const client = createClient({
+
const resultOne = vi.fn();
+
const resultTwo = vi.fn();
+
const operationOne = makeOperation('query', queryOperation, {
+
...queryOperation.context,
+
requestPolicy: 'cache-first',
+
const operationTwo = makeOperation('query', queryOperation, {
+
...queryOperation.context,
+
requestPolicy: 'network-only',
+
pipe(client.executeRequestOperation(operationOne), subscribe(resultOne));
+
pipe(client.executeRequestOperation(operationTwo), subscribe(resultTwo));
+
expect(resultOne).toHaveBeenCalledTimes(0);
+
expect(resultTwo).toHaveBeenCalledTimes(0);
+
vi.advanceTimersByTime(1);
+
expect(resultOne).toHaveBeenCalledTimes(1);
+
expect(resultTwo).toHaveBeenCalledTimes(1);
+
expect(onOperation).toHaveBeenCalledTimes(1);
+
it('deduplicates operations when hasNext: true is set', () => {
+
const onOperation = vi.fn();
+
const exchange: Exchange = () => ops$ => {
+
const client = createClient({
+
const resultOne = vi.fn();
+
const resultTwo = vi.fn();
+
const operationOne = makeOperation('query', queryOperation, {
+
...queryOperation.context,
+
requestPolicy: 'cache-first',
+
const operationTwo = makeOperation('query', queryOperation, {
+
...queryOperation.context,
+
requestPolicy: 'network-only',
+
pipe(client.executeRequestOperation(operationOne), subscribe(resultOne));
+
pipe(client.executeRequestOperation(operationTwo), subscribe(resultTwo));
+
expect(resultOne).toHaveBeenCalledTimes(1);
+
expect(resultTwo).toHaveBeenCalledTimes(1);
+
vi.advanceTimersByTime(1);
+
expect(resultOne).toHaveBeenCalledTimes(1);
+
expect(resultTwo).toHaveBeenCalledTimes(1);
+
expect(onOperation).toHaveBeenCalledTimes(1);
describe('shared sources behavior', () => {