@@ -1273,6 +1273,112 @@ describe('willDelValue', () => {
12731273 } ) ;
12741274} ) ;
12751275
1276+ describe ( 'willDelValues' , ( ) => {
1277+ describe ( 'allow' , ( ) => {
1278+ test ( 'returning true allows delete' , ( ) => {
1279+ middleware . addWillDelValuesCallback ( ( ) => true ) ;
1280+ store . setValues ( { v1 : 'a' , v2 : 'b' } ) ;
1281+ store . delValues ( ) ;
1282+ expect ( store . getValues ( ) ) . toEqual ( { } ) ;
1283+ } ) ;
1284+ } ) ;
1285+
1286+ describe ( 'block' , ( ) => {
1287+ test ( 'returning false blocks delete' , ( ) => {
1288+ middleware . addWillDelValuesCallback ( ( ) => false ) ;
1289+ store . setValues ( { v1 : 'a' , v2 : 'b' } ) ;
1290+ store . delValues ( ) ;
1291+ expect ( store . getValues ( ) ) . toEqual ( { v1 : 'a' , v2 : 'b' } ) ;
1292+ } ) ;
1293+ } ) ;
1294+
1295+ describe ( 'chaining' , ( ) => {
1296+ test ( 'all must return true to allow' , ( ) => {
1297+ middleware
1298+ . addWillDelValuesCallback ( ( ) => true )
1299+ . addWillDelValuesCallback ( ( ) => true ) ;
1300+ store . setValues ( { v1 : 'a' } ) ;
1301+ store . delValues ( ) ;
1302+ expect ( store . getValues ( ) ) . toEqual ( { } ) ;
1303+ } ) ;
1304+
1305+ test ( 'any returning false blocks' , ( ) => {
1306+ middleware
1307+ . addWillDelValuesCallback ( ( ) => true )
1308+ . addWillDelValuesCallback ( ( ) => false ) ;
1309+ store . setValues ( { v1 : 'a' } ) ;
1310+ store . delValues ( ) ;
1311+ expect ( store . getValues ( ) ) . toEqual ( { v1 : 'a' } ) ;
1312+ } ) ;
1313+
1314+ test ( 'first blocks, second never called' , ( ) => {
1315+ const secondCalled = vi . fn ( ) ;
1316+ middleware
1317+ . addWillDelValuesCallback ( ( ) => false )
1318+ . addWillDelValuesCallback ( ( ) => {
1319+ secondCalled ( ) ;
1320+ return true ;
1321+ } ) ;
1322+ store . setValues ( { v1 : 'a' } ) ;
1323+ store . delValues ( ) ;
1324+ expect ( secondCalled ) . not . toHaveBeenCalled ( ) ;
1325+ expect ( store . getValues ( ) ) . toEqual ( { v1 : 'a' } ) ;
1326+ } ) ;
1327+ } ) ;
1328+
1329+ describe ( 'entry points' , ( ) => {
1330+ test ( 'called from delValues' , ( ) => {
1331+ const calls : number [ ] = [ ] ;
1332+ middleware . addWillDelValuesCallback ( ( ) => {
1333+ calls . push ( 1 ) ;
1334+ return true ;
1335+ } ) ;
1336+ store . setValues ( { v1 : 'a' } ) ;
1337+ store . delValues ( ) ;
1338+ expect ( calls ) . toEqual ( [ 1 ] ) ;
1339+ } ) ;
1340+
1341+ test ( 'not called from delValue' , ( ) => {
1342+ const calls : number [ ] = [ ] ;
1343+ middleware . addWillDelValuesCallback ( ( ) => {
1344+ calls . push ( 1 ) ;
1345+ return true ;
1346+ } ) ;
1347+ store . setValues ( { v1 : 'a' , v2 : 'b' } ) ;
1348+ store . delValue ( 'v1' ) ;
1349+ expect ( calls ) . toEqual ( [ ] ) ;
1350+ expect ( store . getValues ( ) ) . toEqual ( { v2 : 'b' } ) ;
1351+ } ) ;
1352+ } ) ;
1353+
1354+ describe ( 'interaction with willDelValue' , ( ) => {
1355+ test ( 'willDelValues blocks before willDelValue is called' , ( ) => {
1356+ const valueCalls = vi . fn ( ) ;
1357+ middleware . addWillDelValuesCallback ( ( ) => false ) ;
1358+ middleware . addWillDelValueCallback ( ( ...args ) => {
1359+ valueCalls ( ...args ) ;
1360+ return true ;
1361+ } ) ;
1362+ store . setValues ( { v1 : 'a' , v2 : 'b' } ) ;
1363+ store . delValues ( ) ;
1364+ expect ( valueCalls ) . not . toHaveBeenCalled ( ) ;
1365+ expect ( store . getValues ( ) ) . toEqual ( { v1 : 'a' , v2 : 'b' } ) ;
1366+ } ) ;
1367+
1368+ test ( 'willDelValues allows, willDelValue still checked' , ( ) => {
1369+ const valueCalls : string [ ] = [ ] ;
1370+ middleware . addWillDelValuesCallback ( ( ) => true ) ;
1371+ middleware . addWillDelValueCallback ( ( valueId ) => {
1372+ valueCalls . push ( valueId ) ;
1373+ return true ;
1374+ } ) ;
1375+ store . setValues ( { v1 : 'a' , v2 : 'b' } ) ;
1376+ store . delValues ( ) ;
1377+ expect ( valueCalls ) . toEqual ( [ 'v1' , 'v2' ] ) ;
1378+ } ) ;
1379+ } ) ;
1380+ } ) ;
1381+
12761382describe ( 'schema interaction' , ( ) => {
12771383 describe ( 'willSetCell not called for schema-rejected cells' , ( ) => {
12781384 test ( 'invalid cell type rejected before callback' , ( ) => {
@@ -1464,6 +1570,11 @@ describe('fluent API', () => {
14641570 expect ( result ) . toBe ( middleware ) ;
14651571 } ) ;
14661572
1573+ test ( 'addWillDelValuesCallback returns middleware' , ( ) => {
1574+ const result = middleware . addWillDelValuesCallback ( ( ) => true ) ;
1575+ expect ( result ) . toBe ( middleware ) ;
1576+ } ) ;
1577+
14671578 test ( 'full chained setup' , ( ) => {
14681579 const result = middleware
14691580 . addWillSetCellCallback ( ( _tableId , _rowId , _cellId , cell ) => cell )
@@ -1472,7 +1583,8 @@ describe('fluent API', () => {
14721583 . addWillSetValuesCallback ( ( values ) => values )
14731584 . addWillDelCellCallback ( ( ) => true )
14741585 . addWillDelRowCallback ( ( ) => true )
1475- . addWillDelValueCallback ( ( ) => true ) ;
1586+ . addWillDelValueCallback ( ( ) => true )
1587+ . addWillDelValuesCallback ( ( ) => true ) ;
14761588 expect ( result ) . toBe ( middleware ) ;
14771589 } ) ;
14781590} ) ;
0 commit comments