mod common;
use common::init;
use mongodb::bson::{doc, oid::ObjectId};
use oximod::Model;
use serde::{Deserialize, Serialize};
use testresult::TestResult;
#[tokio::test]
async fn new_and_default_are_equivalent() -> TestResult {
#[derive(Model, Serialize, Deserialize, Debug, PartialEq)]
#[db("test")]
#[collection("builder_new_default_equivalent")]
pub struct User {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
name: String,
age: i32,
active: bool,
}
let user_new = User::new();
let user_default = User::default();
assert_eq!(user_new, user_default);
Ok(())
}
#[tokio::test]
async fn builder_sets_all_fields() -> TestResult {
#[derive(Model, Serialize, Deserialize, Debug, PartialEq)]
#[db("test")]
#[collection("builder_sets_all_fields")]
pub struct User {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
name: String,
age: i32,
active: bool,
}
let id = ObjectId::new();
let user = User::default().id(id).name("User1").age(30).active(true);
assert_eq!(user._id, Some(id));
assert_eq!(user.name, "User1");
assert_eq!(user.age, 30);
assert!(user.active);
Ok(())
}
#[tokio::test]
async fn builder_partial_fields_default_rest() -> TestResult {
#[derive(Model, Serialize, Deserialize, Debug, PartialEq)]
#[db("test")]
#[collection("builder_partial_fields")]
pub struct User {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
name: String,
age: i32,
active: bool,
}
let user = User::default().name("User1");
assert_eq!(user.name, "User1");
assert_eq!(user.age, 0);
assert!(!user.active);
assert_eq!(user._id, None);
Ok(())
}
#[tokio::test]
async fn builder_and_save_works_end_to_end() -> TestResult {
init().await?;
#[derive(Model, Serialize, Deserialize, Debug, PartialEq)]
#[db("test")]
#[collection("builder_save_end_to_end")]
pub struct User {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
name: String,
age: i32,
active: bool,
}
User::clear().await?;
let saved_id = User::default()
.name("User1")
.age(42)
.active(true)
.save()
.await?;
assert_ne!(saved_id, ObjectId::default());
let fetched = User::get_collection()?
.find_one(doc! { "_id": saved_id })
.await?;
assert!(fetched.is_some());
let user = fetched.unwrap();
assert_eq!(user.name, "User1");
assert_eq!(user.age, 42);
assert!(user.active);
Ok(())
}
#[tokio::test]
async fn builder_using_custom_document_id_setter() -> TestResult {
init().await?;
#[derive(Model, Serialize, Deserialize, Debug, PartialEq)]
#[db("test")]
#[collection("builder_custom_id_setter")]
#[document_id_setter_ident("my_custom_id_setter")]
pub struct User {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
name: String,
age: i32,
active: bool,
id: String,
}
User::clear().await?;
let custom_id = ObjectId::new();
let saved_id = User::default()
.my_custom_id_setter(custom_id)
.id("3894HR934HR00NJ23R324R")
.name("User1")
.age(42)
.active(true)
.save()
.await?;
assert_ne!(saved_id, ObjectId::default());
let fetched = User::get_collection()?
.find_one(doc! { "_id": saved_id })
.await?;
assert!(fetched.is_some());
let user = fetched.unwrap();
assert_eq!(user.name, "User1");
assert_eq!(user.age, 42);
assert!(user.active);
assert_eq!(user.id, "3894HR934HR00NJ23R324R");
Ok(())
}