|
| 1 | +use crate::{js_sys::{Object, Reflect}, wasm_bindgen}; |
1 | 2 | use crate::SomeSharedData;
|
2 | 3 | use serde::Deserialize;
|
3 |
| -use worker::*; |
| 4 | +use wasm_bindgen::JsValue; |
| 5 | +use wasm_bindgen_test::wasm_bindgen_test; |
| 6 | +use worker::{D1PreparedArgument, D1Type, Env, Error, Request, Response, Result}; |
4 | 7 |
|
5 | 8 | #[derive(Deserialize)]
|
6 | 9 | struct Person {
|
@@ -125,3 +128,209 @@ pub async fn error(_req: Request, env: Env, _data: SomeSharedData) -> Result<Res
|
125 | 128 |
|
126 | 129 | Response::ok("")
|
127 | 130 | }
|
| 131 | + |
| 132 | +#[derive(Debug, Deserialize)] |
| 133 | +struct NullablePerson { |
| 134 | + id: u32, |
| 135 | + name: Option<String>, |
| 136 | + age: Option<u32>, |
| 137 | +} |
| 138 | + |
| 139 | +#[wasm_bindgen_test] |
| 140 | +pub fn test_js_value_is_null() { |
| 141 | + assert!(JsValue::NULL.is_null()); |
| 142 | +} |
| 143 | + |
| 144 | +#[wasm_bindgen_test] |
| 145 | +pub fn test_serialize_option_none() { |
| 146 | + let serializer = serde_wasm_bindgen::Serializer::new().serialize_missing_as_null(true); |
| 147 | + |
| 148 | + let none_value: Option<String> = None; |
| 149 | + let js_value = ::serde::ser::Serialize::serialize(&none_value, &serializer).unwrap(); |
| 150 | + |
| 151 | + assert!(js_value.is_null(), "Expected null, got {:?}", js_value); |
| 152 | +} |
| 153 | + |
| 154 | +#[wasm_bindgen_test] |
| 155 | +pub fn test_deserialize_option_none() { |
| 156 | + let js_value = Object::new(); |
| 157 | + Reflect::set(&js_value, &JsValue::from_str("id"), &JsValue::from_f64(1.0)).unwrap(); |
| 158 | + Reflect::set(&js_value, &JsValue::from_str("name"), &JsValue::NULL).unwrap(); |
| 159 | + Reflect::set(&js_value, &JsValue::from_str("age"), &JsValue::NULL).unwrap(); |
| 160 | + |
| 161 | + let js_value: JsValue = js_value.into(); |
| 162 | + |
| 163 | + let value: NullablePerson = serde_wasm_bindgen::from_value(js_value).unwrap(); |
| 164 | + |
| 165 | + assert_eq!(value.id, 1); |
| 166 | + assert_eq!(value.name, None); |
| 167 | + assert_eq!(value.age, None); |
| 168 | +} |
| 169 | + |
| 170 | +#[worker::send] |
| 171 | +pub async fn jsvalue_null_is_null( |
| 172 | + _req: Request, |
| 173 | + _env: Env, |
| 174 | + _data: SomeSharedData, |
| 175 | +) -> Result<Response> { |
| 176 | + console_error_panic_hook::set_once(); |
| 177 | + |
| 178 | + assert!(wasm_bindgen::JsValue::NULL.is_null()); |
| 179 | + |
| 180 | + Response::ok("ok") |
| 181 | +} |
| 182 | + |
| 183 | +#[worker::send] |
| 184 | +pub async fn serialize_optional_none( |
| 185 | + _req: Request, |
| 186 | + _env: Env, |
| 187 | + _data: SomeSharedData, |
| 188 | +) -> Result<Response> { |
| 189 | + console_error_panic_hook::set_once(); |
| 190 | + let serializer = serde_wasm_bindgen::Serializer::new().serialize_missing_as_null(true); |
| 191 | + |
| 192 | + let none: Option<String> = None; |
| 193 | + let js_none = ::serde::ser::Serialize::serialize(&none, &serializer).unwrap(); |
| 194 | + assert!(js_none.is_null()); |
| 195 | + |
| 196 | + Response::ok("ok") |
| 197 | +} |
| 198 | + |
| 199 | +#[worker::send] |
| 200 | +pub async fn serialize_optional_some( |
| 201 | + _req: Request, |
| 202 | + _env: Env, |
| 203 | + _data: SomeSharedData, |
| 204 | +) -> Result<Response> { |
| 205 | + console_error_panic_hook::set_once(); |
| 206 | + let serializer = serde_wasm_bindgen::Serializer::new().serialize_missing_as_null(true); |
| 207 | + |
| 208 | + let some: Option<String> = Some("Hello".to_string()); |
| 209 | + let js_some = ::serde::ser::Serialize::serialize(&some, &serializer).unwrap(); |
| 210 | + assert!(js_some.is_string()); |
| 211 | + |
| 212 | + Response::ok("ok") |
| 213 | +} |
| 214 | + |
| 215 | +#[worker::send] |
| 216 | +pub async fn deserialize_optional_none( |
| 217 | + _req: Request, |
| 218 | + _env: Env, |
| 219 | + _data: SomeSharedData, |
| 220 | +) -> Result<Response> { |
| 221 | + console_error_panic_hook::set_once(); |
| 222 | + |
| 223 | + let js_value = Object::new(); |
| 224 | + Reflect::set(&js_value, &JsValue::from_str("id"), &JsValue::from_f64(1.0)).unwrap(); |
| 225 | + Reflect::set(&js_value, &JsValue::from_str("name"), &JsValue::NULL).unwrap(); |
| 226 | + Reflect::set(&js_value, &JsValue::from_str("age"), &JsValue::NULL).unwrap(); |
| 227 | + |
| 228 | + let js_value: JsValue = js_value.into(); |
| 229 | + |
| 230 | + let value: NullablePerson = serde_wasm_bindgen::from_value(js_value).unwrap(); |
| 231 | + |
| 232 | + assert_eq!(value.id, 1); |
| 233 | + assert_eq!(value.name, None); |
| 234 | + assert_eq!(value.age, None); |
| 235 | + |
| 236 | + Response::ok("ok") |
| 237 | +} |
| 238 | + |
| 239 | +#[worker::send] |
| 240 | +pub async fn insert_and_retrieve_optional_none( |
| 241 | + _req: Request, |
| 242 | + env: Env, |
| 243 | + _data: SomeSharedData, |
| 244 | +) -> Result<Response> { |
| 245 | + let db = env.d1("DB")?; |
| 246 | + |
| 247 | + let query = worker::query!( |
| 248 | + &db, |
| 249 | + "INSERT INTO nullable_people (id, name, age) VALUES (?1, ?2, ?3)", |
| 250 | + &3, |
| 251 | + &None::<String>, |
| 252 | + &None::<u32> |
| 253 | + )?; |
| 254 | + query.run().await?; |
| 255 | + |
| 256 | + let stmt = worker::query!(&db, "SELECT * FROM nullable_people WHERE id = 3"); |
| 257 | + let person = stmt.first::<NullablePerson>(None).await?.unwrap(); |
| 258 | + assert_eq!(person.id, 3); |
| 259 | + assert_eq!(person.name, None); |
| 260 | + assert_eq!(person.age, None); |
| 261 | + |
| 262 | + Response::ok("ok") |
| 263 | +} |
| 264 | + |
| 265 | +#[worker::send] |
| 266 | +pub async fn insert_and_retrieve_optional_some( |
| 267 | + _req: Request, |
| 268 | + env: Env, |
| 269 | + _data: SomeSharedData, |
| 270 | +) -> Result<Response> { |
| 271 | + let db = env.d1("DB")?; |
| 272 | + let query = worker::query!( |
| 273 | + &db, |
| 274 | + "INSERT INTO nullable_people (id, name, age) VALUES (?1, ?2, ?3)", |
| 275 | + &4, |
| 276 | + &"Dude", |
| 277 | + &12 |
| 278 | + )?; |
| 279 | + query.run().await?; |
| 280 | + |
| 281 | + let stmt = worker::query!(&db, "SELECT * FROM nullable_people WHERE id = 4"); |
| 282 | + let person = stmt.first::<NullablePerson>(None).await?.unwrap(); |
| 283 | + assert_eq!(person.id, 4); |
| 284 | + assert_eq!(person.name, Some("Dude".to_string())); |
| 285 | + assert_eq!(person.age, Some(12)); |
| 286 | + |
| 287 | + Response::ok("ok") |
| 288 | +} |
| 289 | + |
| 290 | +#[worker::send] |
| 291 | +pub async fn retrieve_optional_none( |
| 292 | + _req: Request, |
| 293 | + env: Env, |
| 294 | + _data: SomeSharedData, |
| 295 | +) -> Result<Response> { |
| 296 | + let db = env.d1("DB")?; |
| 297 | + |
| 298 | + let stmt = worker::query!(&db, "SELECT * FROM nullable_people WHERE id = 1"); |
| 299 | + let person = stmt.first::<NullablePerson>(None).await?.unwrap(); |
| 300 | + assert_eq!(person.id, 1); |
| 301 | + assert_eq!(person.name, None); |
| 302 | + assert_eq!(person.age, None); |
| 303 | + |
| 304 | + Response::ok("ok") |
| 305 | +} |
| 306 | + |
| 307 | +#[worker::send] |
| 308 | +pub async fn retrieve_optional_some( |
| 309 | + _req: Request, |
| 310 | + env: Env, |
| 311 | + _data: SomeSharedData, |
| 312 | +) -> Result<Response> { |
| 313 | + let db = env.d1("DB")?; |
| 314 | + |
| 315 | + let stmt = worker::query!(&db, "SELECT * FROM nullable_people WHERE id = 2"); |
| 316 | + let person = stmt.first::<NullablePerson>(None).await?.unwrap(); |
| 317 | + assert_eq!(person.id, 2); |
| 318 | + assert_eq!(person.name, Some("Wynne Ogley".to_string())); |
| 319 | + assert_eq!(person.age, Some(67)); |
| 320 | + |
| 321 | + Response::ok("ok") |
| 322 | +} |
| 323 | + |
| 324 | +#[worker::send] |
| 325 | +pub async fn retrive_first_none( |
| 326 | + _req: Request, |
| 327 | + env: Env, |
| 328 | + _data: SomeSharedData, |
| 329 | +) -> Result<Response> { |
| 330 | + let db = env.d1("DB")?; |
| 331 | + |
| 332 | + let stmt = worker::query!(&db, "SELECT * FROM nullable_people WHERE id = 9999"); |
| 333 | + assert!(stmt.first::<NullablePerson>(None).await?.is_none()); |
| 334 | + |
| 335 | + Response::ok("ok") |
| 336 | +} |
0 commit comments