()
| 2048 | |
| 2049 | #[test] |
| 2050 | fn test_jsonb_delete_function() { |
| 2051 | let conn = Connection::open_in_memory().unwrap(); |
| 2052 | register_json_functions(&conn).unwrap(); |
| 2053 | |
| 2054 | // Test deleting from object |
| 2055 | let test_json = r#"{"name": "John", "age": 30, "email": "john@example.com"}"#; |
| 2056 | let result: Option<String> = conn.query_row( |
| 2057 | "SELECT jsonb_delete(?, ?)", |
| 2058 | [test_json, "{email}"], |
| 2059 | |row| row.get(0) |
| 2060 | ).unwrap(); |
| 2061 | |
| 2062 | assert!(result.is_some()); |
| 2063 | let parsed: JsonValue = serde_json::from_str(&result.unwrap()).unwrap(); |
| 2064 | match parsed { |
| 2065 | JsonValue::Object(map) => { |
| 2066 | assert_eq!(map.get("name"), Some(&JsonValue::String("John".to_string()))); |
| 2067 | assert_eq!(map.get("age"), Some(&JsonValue::Number(serde_json::Number::from(30)))); |
| 2068 | assert_eq!(map.get("email"), None); // Should be deleted |
| 2069 | assert_eq!(map.len(), 2); // Only 2 keys remaining |
| 2070 | } |
| 2071 | _ => panic!("Expected JSON object"), |
| 2072 | } |
| 2073 | |
| 2074 | // Test deleting from nested object |
| 2075 | let nested_json = r#"{"user": {"name": "Alice", "email": "alice@example.com"}, "active": true}"#; |
| 2076 | let result: Option<String> = conn.query_row( |
| 2077 | "SELECT jsonb_delete(?, ?)", |
| 2078 | [nested_json, "{user,email}"], |
| 2079 | |row| row.get(0) |
| 2080 | ).unwrap(); |
| 2081 | |
| 2082 | assert!(result.is_some()); |
| 2083 | let parsed: JsonValue = serde_json::from_str(&result.unwrap()).unwrap(); |
| 2084 | match parsed { |
| 2085 | JsonValue::Object(map) => { |
| 2086 | if let Some(JsonValue::Object(user_map)) = map.get("user") { |
| 2087 | assert_eq!(user_map.get("name"), Some(&JsonValue::String("Alice".to_string()))); |
| 2088 | assert_eq!(user_map.get("email"), None); // Should be deleted |
| 2089 | assert_eq!(user_map.len(), 1); // Only name remaining |
| 2090 | } else { |
| 2091 | panic!("Expected nested user object"); |
| 2092 | } |
| 2093 | } |
| 2094 | _ => panic!("Expected JSON object"), |
| 2095 | } |
| 2096 | |
| 2097 | // Test deleting from array |
| 2098 | let array_json = r#"["apple", "banana", "cherry", "date"]"#; |
| 2099 | let result: Option<String> = conn.query_row( |
| 2100 | "SELECT jsonb_delete(?, ?)", |
| 2101 | [array_json, "{1}"], |
| 2102 | |row| row.get(0) |
| 2103 | ).unwrap(); |
| 2104 | |
| 2105 | assert!(result.is_some()); |
| 2106 | let parsed: JsonValue = serde_json::from_str(&result.unwrap()).unwrap(); |
| 2107 | match parsed { |
nothing calls this directly
no test coverage detected