use mongodb::bson::{doc, oid::ObjectId};
use oximod::Model;
use serde::{Deserialize, Serialize};
use testresult::TestResult;
mod common;
use common::init;
#[tokio::test]
async fn saves_with_default_string_and_number() -> TestResult {
init().await?;
#[derive(Model, Serialize, Deserialize, Debug)]
#[db("test")]
#[collection("defaults_str_num_saves_with_default")]
pub struct Thing {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
#[default("Anonymous".to_string())]
name: String,
#[default(0)]
count: i32,
}
Thing::clear().await?;
let thing = Thing::default();
let id = thing.save().await?;
let collection = Thing::get_collection()?;
let doc = collection.find_one(doc! { "_id": id }).await?.unwrap();
assert_eq!(doc.name, "Anonymous");
assert_eq!(doc.count, 0);
Ok(())
}
#[tokio::test]
async fn override_default_values() -> TestResult {
init().await?;
#[derive(Model, Serialize, Deserialize, Debug)]
#[db("test")]
#[collection("defaults_override_explicitly")]
pub struct Record {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
#[default("Guest".to_string())]
user: String,
#[default(1)]
retries: i32,
}
Record::clear().await?;
let rec = Record::default().user("Alice").retries(5);
let id = rec.save().await?;
let collection = Record::get_collection()?;
let got = collection.find_one(doc! { "_id": id }).await?.unwrap();
assert_eq!(got.user, "Alice");
assert_eq!(got.retries, 5);
Ok(())
}
#[tokio::test]
async fn enum_default_and_override() -> TestResult {
init().await?;
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub enum Status {
Pending,
Complete,
}
#[derive(Model, Serialize, Deserialize, Debug)]
#[db("test")]
#[collection("defaults_enum_status_test")]
pub struct Task {
#[serde(skip_serializing_if = "Option::is_none")]
_id: Option<ObjectId>,
#[default(Status::Pending)]
status: Status,
description: String,
}
Task::clear().await?;
let collection = Task::get_collection()?;
let t1 = Task::default().description("T1");
let id1 = t1.save().await?;
let got1 = collection.find_one(doc! { "_id": id1 }).await?.unwrap();
assert_eq!(got1.status, Status::Pending);
assert_eq!(got1.description, "T1");
let t2 = Task::default().status(Status::Complete).description("T2");
let id2 = t2.save().await?;
let got2 = collection.find_one(doc! { "_id": id2 }).await?.unwrap();
assert_eq!(got2.status, Status::Complete);
assert_eq!(got2.description, "T2");
Ok(())
}