@@ -12,12 +12,11 @@ import { startApiServer, ApiServer } from '../../src/api/init';
12
12
import { I32_MAX } from '../../src/helpers' ;
13
13
import { TestBlockBuilder , testMempoolTx } from '../utils/test-builders' ;
14
14
import { PgWriteStore } from '../../src/datastore/pg-write-store' ;
15
- import { PgSqlClient , bufferToHex } from '@hirosystems/api-toolkit' ;
15
+ import { bufferToHex } from '@hirosystems/api-toolkit' ;
16
16
import { migrate } from '../utils/test-helpers' ;
17
17
18
18
describe ( 'cache-control tests' , ( ) => {
19
19
let db : PgWriteStore ;
20
- let client : PgSqlClient ;
21
20
let api : ApiServer ;
22
21
23
22
beforeEach ( async ( ) => {
@@ -27,7 +26,6 @@ describe('cache-control tests', () => {
27
26
withNotifier : false ,
28
27
skipMigrations : true ,
29
28
} ) ;
30
- client = db . sql ;
31
29
api = await startApiServer ( { datastore : db , chainId : ChainID . Testnet } ) ;
32
30
} ) ;
33
31
@@ -818,4 +816,104 @@ describe('cache-control tests', () => {
818
816
expect ( request8 . status ) . toBe ( 304 ) ;
819
817
expect ( request8 . text ) . toBe ( '' ) ;
820
818
} ) ;
819
+
820
+ test ( 'block cache control' , async ( ) => {
821
+ await db . update (
822
+ new TestBlockBuilder ( {
823
+ block_height : 1 ,
824
+ index_block_hash : '0x01' ,
825
+ parent_index_block_hash : '0x00' ,
826
+ } ) . build ( )
827
+ ) ;
828
+ await db . update (
829
+ new TestBlockBuilder ( {
830
+ block_height : 2 ,
831
+ index_block_hash : '0x8f652ee1f26bfbffe3cf111994ade25286687b76e6a2f64c33b4632a1f4545ac' ,
832
+ parent_index_block_hash : '0x01' ,
833
+ } ) . build ( )
834
+ ) ;
835
+
836
+ // Valid latest Etag.
837
+ const request1 = await supertest ( api . server ) . get ( `/extended/v2/blocks/latest` ) ;
838
+ expect ( request1 . status ) . toBe ( 200 ) ;
839
+ expect ( request1 . type ) . toBe ( 'application/json' ) ;
840
+ const etag0 = request1 . headers [ 'etag' ] ;
841
+
842
+ // Same block hash Etag.
843
+ const request2 = await supertest ( api . server ) . get (
844
+ `/extended/v2/blocks/0x8f652ee1f26bfbffe3cf111994ade25286687b76e6a2f64c33b4632a1f4545ac`
845
+ ) ;
846
+ expect ( request2 . status ) . toBe ( 200 ) ;
847
+ expect ( request2 . type ) . toBe ( 'application/json' ) ;
848
+ expect ( request2 . headers [ 'etag' ] ) . toEqual ( etag0 ) ;
849
+
850
+ // Same block height Etag.
851
+ const request3 = await supertest ( api . server ) . get ( `/extended/v2/blocks/2` ) ;
852
+ expect ( request3 . status ) . toBe ( 200 ) ;
853
+ expect ( request3 . type ) . toBe ( 'application/json' ) ;
854
+ expect ( request3 . headers [ 'etag' ] ) . toEqual ( etag0 ) ;
855
+
856
+ // Cache works with valid ETag.
857
+ const request4 = await supertest ( api . server )
858
+ . get ( `/extended/v2/blocks/2` )
859
+ . set ( 'If-None-Match' , etag0 ) ;
860
+ expect ( request4 . status ) . toBe ( 304 ) ;
861
+ expect ( request4 . text ) . toBe ( '' ) ;
862
+
863
+ // Add new block.
864
+ await db . update (
865
+ new TestBlockBuilder ( {
866
+ block_height : 3 ,
867
+ index_block_hash : '0x03' ,
868
+ parent_index_block_hash :
869
+ '0x8f652ee1f26bfbffe3cf111994ade25286687b76e6a2f64c33b4632a1f4545ac' ,
870
+ } ) . build ( )
871
+ ) ;
872
+
873
+ // Cache still works with same ETag.
874
+ const request5 = await supertest ( api . server )
875
+ . get ( `/extended/v2/blocks/2` )
876
+ . set ( 'If-None-Match' , etag0 ) ;
877
+ expect ( request5 . status ) . toBe ( 304 ) ;
878
+ expect ( request5 . text ) . toBe ( '' ) ;
879
+
880
+ // Re-org block 2
881
+ await db . update (
882
+ new TestBlockBuilder ( {
883
+ block_height : 2 ,
884
+ index_block_hash : '0x02bb' ,
885
+ parent_index_block_hash : '0x01' ,
886
+ } ) . build ( )
887
+ ) ;
888
+ await db . update (
889
+ new TestBlockBuilder ( {
890
+ block_height : 3 ,
891
+ index_block_hash : '0x03bb' ,
892
+ parent_index_block_hash : '0x02bb' ,
893
+ } ) . build ( )
894
+ ) ;
895
+ await db . update (
896
+ new TestBlockBuilder ( {
897
+ block_height : 4 ,
898
+ index_block_hash : '0x04bb' ,
899
+ parent_index_block_hash : '0x03bb' ,
900
+ } ) . build ( )
901
+ ) ;
902
+
903
+ // Cache is now a miss.
904
+ const request6 = await supertest ( api . server )
905
+ . get ( `/extended/v2/blocks/2` )
906
+ . set ( 'If-None-Match' , etag0 ) ;
907
+ expect ( request6 . status ) . toBe ( 200 ) ;
908
+ expect ( request6 . type ) . toBe ( 'application/json' ) ;
909
+ expect ( request6 . headers [ 'etag' ] ) . not . toEqual ( etag0 ) ;
910
+ const etag1 = request6 . headers [ 'etag' ] ;
911
+
912
+ // Cache works with new ETag.
913
+ const request7 = await supertest ( api . server )
914
+ . get ( `/extended/v2/blocks/2` )
915
+ . set ( 'If-None-Match' , etag1 ) ;
916
+ expect ( request7 . status ) . toBe ( 304 ) ;
917
+ expect ( request7 . text ) . toBe ( '' ) ;
918
+ } ) ;
821
919
} ) ;
0 commit comments