@@ -12,12 +12,11 @@ import { startApiServer, ApiServer } from '../../src/api/init';
1212import { I32_MAX } from '../../src/helpers' ;
1313import { TestBlockBuilder , testMempoolTx } from '../utils/test-builders' ;
1414import { PgWriteStore } from '../../src/datastore/pg-write-store' ;
15- import { PgSqlClient , bufferToHex } from '@hirosystems/api-toolkit' ;
15+ import { bufferToHex } from '@hirosystems/api-toolkit' ;
1616import { migrate } from '../utils/test-helpers' ;
1717
1818describe ( 'cache-control tests' , ( ) => {
1919 let db : PgWriteStore ;
20- let client : PgSqlClient ;
2120 let api : ApiServer ;
2221
2322 beforeEach ( async ( ) => {
@@ -27,7 +26,6 @@ describe('cache-control tests', () => {
2726 withNotifier : false ,
2827 skipMigrations : true ,
2928 } ) ;
30- client = db . sql ;
3129 api = await startApiServer ( { datastore : db , chainId : ChainID . Testnet } ) ;
3230 } ) ;
3331
@@ -818,4 +816,104 @@ describe('cache-control tests', () => {
818816 expect ( request8 . status ) . toBe ( 304 ) ;
819817 expect ( request8 . text ) . toBe ( '' ) ;
820818 } ) ;
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+ } ) ;
821919} ) ;
0 commit comments