use crate::prelude::*;
#[driver_test(id(ID))]
pub async fn native_enum_crud_lifecycle(t: &mut Test) -> Result<()> {
#[derive(Debug, PartialEq, toasty::Embed)]
enum Priority {
Low,
Medium,
High,
}
#[derive(Debug, toasty::Model)]
struct Task {
#[key]
#[auto]
id: ID,
title: String,
priority: Priority,
}
let mut db = t.setup_db(models!(Task, Priority)).await;
let t1 = toasty::create!(Task {
title: "A",
priority: Priority::Low
})
.exec(&mut db)
.await?;
let t2 = toasty::create!(Task {
title: "B",
priority: Priority::Medium
})
.exec(&mut db)
.await?;
let t3 = toasty::create!(Task {
title: "C",
priority: Priority::High
})
.exec(&mut db)
.await?;
assert_eq!(t1.priority, Priority::Low);
assert_eq!(t2.priority, Priority::Medium);
assert_eq!(t3.priority, Priority::High);
assert_eq!(
Task::get_by_id(&mut db, &t1.id).await?.priority,
Priority::Low
);
assert_eq!(
Task::get_by_id(&mut db, &t2.id).await?.priority,
Priority::Medium
);
assert_eq!(
Task::get_by_id(&mut db, &t3.id).await?.priority,
Priority::High
);
let mut t1 = t1;
t1.update().priority(Priority::High).exec(&mut db).await?;
assert_eq!(
Task::get_by_id(&mut db, &t1.id).await?.priority,
Priority::High
);
Task::filter_by_id(t2.id)
.update()
.priority(Priority::Low)
.exec(&mut db)
.await?;
assert_eq!(
Task::get_by_id(&mut db, &t2.id).await?.priority,
Priority::Low
);
let t3_id = t3.id;
t3.delete().exec(&mut db).await?;
assert!(Task::get_by_id(&mut db, &t3_id).await.is_err());
Ok(())
}
#[driver_test(requires(sql))]
pub async fn native_enum_filter_operations(t: &mut Test) -> Result<()> {
#[derive(Debug, PartialEq, toasty::Embed)]
enum Status {
Pending,
Active,
Done,
}
#[derive(Debug, toasty::Model)]
#[allow(dead_code)]
struct Task {
#[key]
#[auto]
id: uuid::Uuid,
name: String,
status: Status,
}
let mut db = t.setup_db(models!(Task, Status)).await;
for (name, status) in [
("A", Status::Pending),
("B", Status::Active),
("C", Status::Active),
("D", Status::Done),
] {
toasty::create!(Task { name, status }).exec(&mut db).await?;
}
let active = Task::filter(Task::fields().status().is_active())
.exec(&mut db)
.await?;
assert_eq!(active.len(), 2);
let not_active = Task::filter(Task::fields().status().ne(Status::Active))
.exec(&mut db)
.await?;
assert_eq!(not_active.len(), 2);
assert!(not_active.iter().all(|t| t.status != Status::Active));
let pending_or_done = Task::filter(
Task::fields()
.status()
.in_list([Status::Pending, Status::Done]),
)
.exec(&mut db)
.await?;
assert_eq!(pending_or_done.len(), 2);
assert!(pending_or_done.iter().all(|t| t.status != Status::Active));
Task::filter(Task::fields().status().is_done())
.delete()
.exec(&mut db)
.await?;
let remaining = Task::all().exec(&mut db).await?;
assert_eq!(remaining.len(), 3);
Ok(())
}
#[driver_test(id(ID))]
pub async fn native_enum_multiple_fields(t: &mut Test) -> Result<()> {
#[derive(Debug, PartialEq, toasty::Embed)]
enum Priority {
Low,
High,
}
#[derive(Debug, PartialEq, toasty::Embed)]
enum Status {
Open,
Closed,
}
#[derive(Debug, toasty::Model)]
struct Ticket {
#[key]
#[auto]
id: ID,
priority: Priority,
status: Status,
}
let mut db = t.setup_db(models!(Ticket, Priority, Status)).await;
let ticket = toasty::create!(Ticket {
priority: Priority::High,
status: Status::Open,
})
.exec(&mut db)
.await?;
let found = Ticket::get_by_id(&mut db, &ticket.id).await?;
assert_eq!(found.priority, Priority::High);
assert_eq!(found.status, Status::Open);
let mut ticket = found;
ticket
.update()
.priority(Priority::Low)
.status(Status::Closed)
.exec(&mut db)
.await?;
let found = Ticket::get_by_id(&mut db, &ticket.id).await?;
assert_eq!(found.priority, Priority::Low);
assert_eq!(found.status, Status::Closed);
Ok(())
}
#[driver_test(id(ID))]
pub async fn native_enum_custom_type_name(t: &mut Test) -> Result<()> {
#[derive(Debug, PartialEq, toasty::Embed)]
#[column(type = enum("task_priority"))]
enum Priority {
Low,
Medium,
High,
}
#[derive(Debug, toasty::Model)]
struct Task {
#[key]
#[auto]
id: ID,
priority: Priority,
}
let mut db = t.setup_db(models!(Task, Priority)).await;
let task = toasty::create!(Task {
priority: Priority::Medium
})
.exec(&mut db)
.await?;
assert_eq!(
Task::get_by_id(&mut db, &task.id).await?.priority,
Priority::Medium
);
let mut task = task;
task.update().priority(Priority::High).exec(&mut db).await?;
assert_eq!(
Task::get_by_id(&mut db, &task.id).await?.priority,
Priority::High
);
Ok(())
}