vanikam/src/ordering/domain/update_order_command.rs

104 lines
2.8 KiB
Rust

// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
//
// SPDX-License-Identifier: AGPL-3.0-or-later
use derive_builder::Builder;
use derive_getters::Getters;
use derive_more::{Display, Error};
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use uuid::Uuid;
use super::order_aggregate::*;
#[derive(Debug, Error, Display, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum UpdateOrderCommandError {
CustomerNameIsEmpty,
}
#[derive(
Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Getters, Builder,
)]
pub struct UpdateOrderCommand {
adding_by: Uuid,
#[builder(default = "OffsetDateTime::now_utc()")]
created_time: OffsetDateTime,
#[builder(setter(custom))]
customer_name: Option<String>,
old_order: Order,
}
impl UpdateOrderCommandBuilder {
pub fn customer_name(&mut self, customer_name: Option<String>) -> &mut Self {
self.customer_name = if let Some(customer_name) = customer_name {
let customer_name = customer_name.trim();
if customer_name.is_empty() {
Some(None)
} else {
Some(Some(customer_name.to_string()))
}
} else {
Some(None)
};
self
}
}
#[cfg(test)]
mod tests {
use time::macros::datetime;
use crate::utils::uuid::tests::UUID;
use super::*;
impl UpdateOrderCommand {
pub fn get_cmd() -> Self {
let customer_name = "foo-new-name";
let adding_by = UUID;
UpdateOrderCommandBuilder::default()
.customer_name(Some(customer_name.into()))
.adding_by(adding_by)
.created_time(datetime!(1970-01-01 0:00 UTC))
.old_order(Order::default())
.build()
.unwrap()
}
}
#[test]
fn test_cmd() {
let customer_name = "foo";
let adding_by = UUID;
let old_order = Order::default();
let cmd = UpdateOrderCommandBuilder::default()
.customer_name(Some(customer_name.into()))
.adding_by(adding_by)
.old_order(old_order.clone())
.build()
.unwrap();
assert_eq!(*cmd.adding_by(), adding_by);
assert_eq!(cmd.customer_name().as_ref().unwrap(), customer_name);
assert_eq!(cmd.old_order(), &old_order);
}
#[test]
fn test_cmd_customer_name_empty() {
let customer_name = "";
let adding_by = UUID;
let cmd = UpdateOrderCommandBuilder::default()
.customer_name(Some(customer_name.into()))
.adding_by(adding_by)
.old_order(Order::default())
.build()
.unwrap();
assert!(cmd.customer_name().is_none());
}
}