Mirror: The highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: Add tests for dedupe behaviour

+101
+101
packages/core/src/client.test.ts
··· 557 557 }); 558 558 }); 559 559 560 + describe('deduplication behavior', () => { 561 + beforeEach(() => { 562 + vi.useFakeTimers(); 563 + }); 564 + 565 + afterEach(() => { 566 + vi.useRealTimers(); 567 + }); 568 + 569 + it('deduplicates operations when no result has been sent yet', () => { 570 + const onOperation = vi.fn(); 571 + 572 + const exchange: Exchange = () => ops$ => { 573 + let i = 0; 574 + return pipe( 575 + ops$, 576 + onPush(onOperation), 577 + map(op => ({ 578 + hasNext: false, 579 + stale: false, 580 + data: ++i, 581 + operation: op, 582 + })), 583 + delay(1) 584 + ); 585 + }; 586 + 587 + const client = createClient({ 588 + url: 'test', 589 + exchanges: [exchange], 590 + }); 591 + 592 + const resultOne = vi.fn(); 593 + const resultTwo = vi.fn(); 594 + const operationOne = makeOperation('query', queryOperation, { 595 + ...queryOperation.context, 596 + requestPolicy: 'cache-first', 597 + }); 598 + const operationTwo = makeOperation('query', queryOperation, { 599 + ...queryOperation.context, 600 + requestPolicy: 'network-only', 601 + }); 602 + 603 + pipe(client.executeRequestOperation(operationOne), subscribe(resultOne)); 604 + pipe(client.executeRequestOperation(operationTwo), subscribe(resultTwo)); 605 + expect(resultOne).toHaveBeenCalledTimes(0); 606 + expect(resultTwo).toHaveBeenCalledTimes(0); 607 + 608 + vi.advanceTimersByTime(1); 609 + 610 + expect(resultOne).toHaveBeenCalledTimes(1); 611 + expect(resultTwo).toHaveBeenCalledTimes(1); 612 + expect(onOperation).toHaveBeenCalledTimes(1); 613 + }); 614 + 615 + it('deduplicates operations when hasNext: true is set', () => { 616 + const onOperation = vi.fn(); 617 + 618 + const exchange: Exchange = () => ops$ => { 619 + let i = 0; 620 + return pipe( 621 + ops$, 622 + onPush(onOperation), 623 + map(op => ({ 624 + hasNext: true, 625 + stale: false, 626 + data: ++i, 627 + operation: op, 628 + })) 629 + ); 630 + }; 631 + 632 + const client = createClient({ 633 + url: 'test', 634 + exchanges: [exchange], 635 + }); 636 + 637 + const resultOne = vi.fn(); 638 + const resultTwo = vi.fn(); 639 + const operationOne = makeOperation('query', queryOperation, { 640 + ...queryOperation.context, 641 + requestPolicy: 'cache-first', 642 + }); 643 + const operationTwo = makeOperation('query', queryOperation, { 644 + ...queryOperation.context, 645 + requestPolicy: 'network-only', 646 + }); 647 + 648 + pipe(client.executeRequestOperation(operationOne), subscribe(resultOne)); 649 + pipe(client.executeRequestOperation(operationTwo), subscribe(resultTwo)); 650 + expect(resultOne).toHaveBeenCalledTimes(1); 651 + expect(resultTwo).toHaveBeenCalledTimes(1); 652 + 653 + vi.advanceTimersByTime(1); 654 + 655 + expect(resultOne).toHaveBeenCalledTimes(1); 656 + expect(resultTwo).toHaveBeenCalledTimes(1); 657 + expect(onOperation).toHaveBeenCalledTimes(1); 658 + }); 659 + }); 660 + 560 661 describe('shared sources behavior', () => { 561 662 beforeEach(() => { 562 663 vi.useFakeTimers();