@@ -124,6 +124,60 @@ describe("TidesDB", () => {
124124 readTxn . free ( ) ;
125125 } ) ;
126126
127+ test ( "singleDelete makes prior put unreadable" , ( ) => {
128+ db . createColumnFamily ( "sd_cf" ) ;
129+ const cf = db . getColumnFamily ( "sd_cf" ) ;
130+
131+ const txn = db . beginTransaction ( ) ;
132+ txn . put ( cf , Buffer . from ( "sd_key" ) , Buffer . from ( "sd_value" ) , - 1 ) ;
133+ txn . commit ( ) ;
134+ txn . free ( ) ;
135+
136+ const sdTxn = db . beginTransaction ( ) ;
137+ sdTxn . singleDelete ( cf , Buffer . from ( "sd_key" ) ) ;
138+ sdTxn . commit ( ) ;
139+ sdTxn . free ( ) ;
140+
141+ const readTxn = db . beginTransaction ( ) ;
142+ expect ( ( ) => readTxn . get ( cf , Buffer . from ( "sd_key" ) ) ) . toThrow ( ) ;
143+ readTxn . free ( ) ;
144+ } ) ;
145+
146+ test ( "singleDelete on non-existent key is allowed" , ( ) => {
147+ db . createColumnFamily ( "sd_missing_cf" ) ;
148+ const cf = db . getColumnFamily ( "sd_missing_cf" ) ;
149+
150+ const txn = db . beginTransaction ( ) ;
151+ expect ( ( ) => txn . singleDelete ( cf , Buffer . from ( "missing" ) ) ) . not . toThrow ( ) ;
152+ txn . commit ( ) ;
153+ txn . free ( ) ;
154+ } ) ;
155+
156+ test ( "singleDelete works alongside puts in the same transaction" , ( ) => {
157+ db . createColumnFamily ( "sd_mixed_cf" ) ;
158+ const cf = db . getColumnFamily ( "sd_mixed_cf" ) ;
159+
160+ // Seed two keys
161+ const seed = db . beginTransaction ( ) ;
162+ seed . put ( cf , Buffer . from ( "keep" ) , Buffer . from ( "keep_v" ) , - 1 ) ;
163+ seed . put ( cf , Buffer . from ( "drop" ) , Buffer . from ( "drop_v" ) , - 1 ) ;
164+ seed . commit ( ) ;
165+ seed . free ( ) ;
166+
167+ // Mixed batch: insert a new key and single-delete an existing one
168+ const mix = db . beginTransaction ( ) ;
169+ mix . put ( cf , Buffer . from ( "fresh" ) , Buffer . from ( "fresh_v" ) , - 1 ) ;
170+ mix . singleDelete ( cf , Buffer . from ( "drop" ) ) ;
171+ mix . commit ( ) ;
172+ mix . free ( ) ;
173+
174+ const readTxn = db . beginTransaction ( ) ;
175+ expect ( readTxn . get ( cf , Buffer . from ( "keep" ) ) . toString ( ) ) . toBe ( "keep_v" ) ;
176+ expect ( readTxn . get ( cf , Buffer . from ( "fresh" ) ) . toString ( ) ) . toBe ( "fresh_v" ) ;
177+ expect ( ( ) => readTxn . get ( cf , Buffer . from ( "drop" ) ) ) . toThrow ( ) ;
178+ readTxn . free ( ) ;
179+ } ) ;
180+
127181 test ( "rollback" , ( ) => {
128182 db . createColumnFamily ( "test_cf" ) ;
129183 const cf = db . getColumnFamily ( "test_cf" ) ;
0 commit comments