@@ -95,6 +95,7 @@ import { routes } from "./routes.js";
95
95
return pass ( )
96
96
} ) ;
97
97
}
98
+
98
99
// KVStore put method
99
100
{
100
101
@@ -485,6 +486,158 @@ import { routes } from "./routes.js";
485
486
} ) ;
486
487
}
487
488
489
+ // KVStore delete method
490
+ {
491
+ routes . set ( "/kv-store/delete/called-as-constructor" , async ( ) => {
492
+ let error = assertThrows ( ( ) => {
493
+ new KVStore . prototype . delete ( '1' )
494
+ } , TypeError , `KVStore.prototype.delete is not a constructor` )
495
+ if ( error ) { return error }
496
+ return pass ( )
497
+ } ) ;
498
+ routes . set ( "/kv-store/delete/called-unbound" , async ( ) => {
499
+ let error = await assertRejects ( async ( ) => {
500
+ await KVStore . prototype . delete . call ( undefined , '1' )
501
+ } , TypeError , "Method delete called on receiver that's not an instance of KVStore" )
502
+ if ( error ) { return error }
503
+ return pass ( )
504
+ } ) ;
505
+ // https://tc39.es/ecma262/#sec-tostring
506
+ routes . set ( "/kv-store/delete/key-parameter-calls-7.1.17-ToString" , async ( ) => {
507
+ let sentinel ;
508
+ const test = async ( ) => {
509
+ sentinel = Symbol ( ) ;
510
+ const key = {
511
+ toString ( ) {
512
+ throw sentinel ;
513
+ }
514
+ }
515
+ const store = createValidStore ( )
516
+ await store . delete ( key )
517
+ }
518
+ let error = await assertRejects ( test )
519
+ if ( error ) { return error }
520
+ try {
521
+ await test ( )
522
+ } catch ( thrownError ) {
523
+ let error = assert ( thrownError , sentinel , 'thrownError === sentinel' )
524
+ if ( error ) { return error }
525
+ }
526
+ error = await assertRejects ( async ( ) => {
527
+ const store = createValidStore ( )
528
+ await store . delete ( Symbol ( ) )
529
+ } , TypeError , `can't convert symbol to string` )
530
+ if ( error ) { return error }
531
+ return pass ( )
532
+ } ) ;
533
+ routes . set ( "/kv-store/delete/key-parameter-not-supplied" , async ( ) => {
534
+ let error = await assertRejects ( async ( ) => {
535
+ const store = createValidStore ( )
536
+ await store . delete ( )
537
+ } , TypeError , `delete: At least 1 argument required, but only 0 passed` )
538
+ if ( error ) { return error }
539
+ return pass ( )
540
+ } ) ;
541
+ routes . set ( "/kv-store/delete/key-parameter-empty-string" , async ( ) => {
542
+ let error = await assertRejects ( async ( ) => {
543
+ const store = createValidStore ( )
544
+ await store . delete ( '' )
545
+ } , TypeError , `KVStore key can not be an empty string` )
546
+ if ( error ) { return error }
547
+ return pass ( )
548
+ } ) ;
549
+ routes . set ( "/kv-store/delete/key-parameter-1024-character-string" , async ( ) => {
550
+ let error = await assertResolves ( async ( ) => {
551
+ const store = createValidStore ( )
552
+ const key = 'a' . repeat ( 1024 )
553
+ await store . delete ( key )
554
+ } )
555
+ if ( error ) { return error }
556
+ return pass ( )
557
+ } ) ;
558
+ routes . set ( "/kv-store/delete/key-parameter-1025-character-string" , async ( ) => {
559
+ let error = await assertRejects ( async ( ) => {
560
+ const store = createValidStore ( )
561
+ const key = 'a' . repeat ( 1025 )
562
+ await store . delete ( key )
563
+ } , TypeError , `KVStore key can not be more than 1024 characters` )
564
+ if ( error ) { return error }
565
+ return pass ( )
566
+ } ) ;
567
+ routes . set ( "/kv-store/delete/key-parameter-containing-newline" , async ( ) => {
568
+ let error = await assertRejects ( async ( ) => {
569
+ let store = createValidStore ( )
570
+ await store . delete ( '\n' )
571
+ } , TypeError , `KVStore key can not contain newline character` )
572
+ if ( error ) { return error }
573
+ return pass ( )
574
+ } ) ;
575
+ routes . set ( "/kv-store/delete/key-parameter-containing-carriage-return" , async ( ) => {
576
+ let error = await assertRejects ( async ( ) => {
577
+ let store = createValidStore ( )
578
+ await store . delete ( '\r' )
579
+ } , TypeError , `KVStore key can not contain carriage return character` )
580
+ if ( error ) { return error }
581
+ return pass ( )
582
+ } ) ;
583
+ routes . set ( "/kv-store/delete/key-parameter-starting-with-well-known-acme-challenge" , async ( ) => {
584
+ let error = await assertRejects ( async ( ) => {
585
+ let store = createValidStore ( )
586
+ await store . delete ( '.well-known/acme-challenge/' )
587
+ } , TypeError , `KVStore key can not start with .well-known/acme-challenge/` )
588
+ if ( error ) { return error }
589
+ return pass ( )
590
+ } ) ;
591
+ routes . set ( "/kv-store/delete/key-parameter-single-dot" , async ( ) => {
592
+ let error = await assertRejects ( async ( ) => {
593
+ let store = createValidStore ( )
594
+ await store . delete ( '.' )
595
+ } , TypeError , `KVStore key can not be '.' or '..'` )
596
+ if ( error ) { return error }
597
+ return pass ( )
598
+ } ) ;
599
+ routes . set ( "/kv-store/delete/key-parameter-double-dot" , async ( ) => {
600
+ let error = await assertRejects ( async ( ) => {
601
+ let store = createValidStore ( )
602
+ await store . delete ( '..' )
603
+ } , TypeError , `KVStore key can not be '.' or '..'` )
604
+ if ( error ) { return error }
605
+ return pass ( )
606
+ } ) ;
607
+ routes . set ( "/kv-store/delete/key-parameter-containing-special-characters" , async ( ) => {
608
+ const specialCharacters = [ '[' , ']' , '*' , '?' , '#' ] ;
609
+ for ( const character of specialCharacters ) {
610
+ let error = await assertRejects ( async ( ) => {
611
+ let store = createValidStore ( )
612
+ await store . delete ( character )
613
+ } , TypeError , `KVStore key can not contain ${ character } character` )
614
+ if ( error ) { return error }
615
+ }
616
+ return pass ( )
617
+ } ) ;
618
+ routes . set ( "/kv-store/delete/key-does-not-exist-returns-undefined" , async ( ) => {
619
+ let store = createValidStore ( )
620
+ let result = store . delete ( Math . random ( ) )
621
+ let error = assert ( result instanceof Promise , true , `store.delete(Math.random()) instanceof Promise` )
622
+ if ( error ) { return error }
623
+ error = assert ( await result , undefined , `await store.delete(Math.random())` )
624
+ if ( error ) { return error }
625
+ return pass ( )
626
+ } ) ;
627
+ routes . set ( "/kv-store/delete/key-exists" , async ( ) => {
628
+ let store = createValidStore ( )
629
+ let key = `key-exists-${ Math . random ( ) } ` ;
630
+ await store . put ( key , 'hello' )
631
+ let result = store . delete ( key )
632
+ let error = assert ( result instanceof Promise , true , `store.delete(key) instanceof Promise` )
633
+ if ( error ) { return error }
634
+ result = await result
635
+ error = assert ( result , undefined , `(await store.delete(key) === undefined)` )
636
+ if ( error ) { return error }
637
+ return pass ( )
638
+ } ) ;
639
+ }
640
+
488
641
// KVStore get method
489
642
{
490
643
routes . set ( "/kv-store/get/called-as-constructor" , async ( ) => {
@@ -646,6 +799,7 @@ import { routes } from "./routes.js";
646
799
} ) ;
647
800
}
648
801
}
802
+
649
803
// KVStoreEntry
650
804
{
651
805
routes . set ( "/kv-store-entry/interface" , async ( ) => {
@@ -931,7 +1085,7 @@ async function kvStoreInterfaceTests() {
931
1085
if ( error ) { return error }
932
1086
933
1087
actual = Reflect . ownKeys ( KVStore . prototype )
934
- expected = [ "constructor" , "get" , "put" ]
1088
+ expected = [ "constructor" , "delete" , " get", "put" ]
935
1089
error = assert ( actual , expected , `Reflect.ownKeys(KVStore.prototype)` )
936
1090
if ( error ) { return error }
937
1091
@@ -940,6 +1094,11 @@ async function kvStoreInterfaceTests() {
940
1094
error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype, 'constructor')` )
941
1095
if ( error ) { return error }
942
1096
1097
+ actual = Reflect . getOwnPropertyDescriptor ( KVStore . prototype , 'delete' )
1098
+ expected = { "writable" : true , "enumerable" : true , "configurable" : true , value : KVStore . prototype . delete }
1099
+ error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype, 'delete')` )
1100
+ if ( error ) { return error }
1101
+
943
1102
actual = Reflect . getOwnPropertyDescriptor ( KVStore . prototype , 'get' )
944
1103
expected = { "writable" : true , "enumerable" : true , "configurable" : true , value : KVStore . prototype . get }
945
1104
error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype, 'get')` )
@@ -952,6 +1111,8 @@ async function kvStoreInterfaceTests() {
952
1111
953
1112
error = assert ( typeof KVStore . prototype . constructor , 'function' , `typeof KVStore.prototype.constructor` )
954
1113
if ( error ) { return error }
1114
+ error = assert ( typeof KVStore . prototype . delete , 'function' , `typeof KVStore.prototype.delete` )
1115
+ if ( error ) { return error }
955
1116
error = assert ( typeof KVStore . prototype . get , 'function' , `typeof KVStore.prototype.get` )
956
1117
if ( error ) { return error }
957
1118
error = assert ( typeof KVStore . prototype . put , 'function' , `typeof KVStore.prototype.put` )
@@ -977,6 +1138,26 @@ async function kvStoreInterfaceTests() {
977
1138
error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype.constructor, 'name')` )
978
1139
if ( error ) { return error }
979
1140
1141
+ actual = Reflect . getOwnPropertyDescriptor ( KVStore . prototype . delete , 'length' )
1142
+ expected = {
1143
+ "value" : 1 ,
1144
+ "writable" : false ,
1145
+ "enumerable" : false ,
1146
+ "configurable" : true
1147
+ }
1148
+ error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype.delete, 'length')` )
1149
+ if ( error ) { return error }
1150
+
1151
+ actual = Reflect . getOwnPropertyDescriptor ( KVStore . prototype . delete , 'name' )
1152
+ expected = {
1153
+ "value" : "delete" ,
1154
+ "writable" : false ,
1155
+ "enumerable" : false ,
1156
+ "configurable" : true
1157
+ }
1158
+ error = assert ( actual , expected , `Reflect.getOwnPropertyDescriptor(KVStore.prototype.delete, 'name')` )
1159
+ if ( error ) { return error }
1160
+
980
1161
actual = Reflect . getOwnPropertyDescriptor ( KVStore . prototype . get , 'length' )
981
1162
expected = {
982
1163
"value" : 1 ,
0 commit comments