@@ -225,3 +225,49 @@ fn schema_query_error(context: &str, error: libsql::Error) -> PersistenceError {
225225 "Turso schema introspection failed while attempting to {context}: {error} ({error:?})"
226226 ) )
227227}
228+
229+ #[ cfg( test) ]
230+ mod tests {
231+ use std:: collections:: BTreeMap ;
232+
233+ use libsql:: Builder ;
234+
235+ use super :: { SchemaSnapshot , verify_index_extensions} ;
236+
237+ #[ tokio:: test]
238+ async fn case_folded_index_owner_is_inventoried ( ) {
239+ let directory = tempfile:: tempdir ( ) . expect ( "temporary database directory" ) ;
240+ let database = Builder :: new_local ( directory. path ( ) . join ( "case-folded-index-owner.db" ) )
241+ . build ( )
242+ . await
243+ . expect ( "build temporary database" ) ;
244+ let connection = database. connect ( ) . expect ( "connect temporary database" ) ;
245+ connection
246+ . execute ( "CREATE TABLE EVENTS(payload TEXT NOT NULL)" , ( ) )
247+ . await
248+ . expect ( "create differently cased table owner" ) ;
249+ connection
250+ . execute (
251+ "CREATE INDEX events_case_folded_expression
252+ ON EVENTS(json_extract(payload, 'invalid-path'))" ,
253+ ( ) ,
254+ )
255+ . await
256+ . expect ( "create expression index with differently cased owner" ) ;
257+ let expected = SchemaSnapshot {
258+ tables : BTreeMap :: new ( ) ,
259+ indexes : BTreeMap :: new ( ) ,
260+ triggers : BTreeMap :: new ( ) ,
261+ } ;
262+
263+ let error = verify_index_extensions ( & connection, "events" , & expected)
264+ . await
265+ . expect_err ( "SQLite-equivalent index owners must be inventoried" ) ;
266+ assert ! (
267+ error
268+ . to_string( )
269+ . contains( "events_case_folded_expression" ) ,
270+ "{error}"
271+ ) ;
272+ }
273+ }
0 commit comments