use std::{
any::{Any, TypeId},
str::FromStr,
thread,
time::Duration,
};
use chrono::NaiveDate;
use common::camera;
use wards::{
car::{Car, CarFeatures, Notify},
errors::WardError,
};
mod common;
#[test]
fn list_cars() {
let cam = camera();
let cars = cam.list_cars().unwrap();
if cars.len() > 0 {
cars.iter().for_each(|car| {
assert!(!car.number.is_empty());
match car.notify {
Notify::On => assert_eq!(car.notify, Notify::On),
Notify::Off => assert_eq!(car.notify, Notify::Off),
}
match car.begin {
Some(date) => assert_eq!(date.type_id(), TypeId::of::<NaiveDate>()),
None => assert!(car.begin.is_none()),
}
match car.end {
Some(date) => assert_eq!(date.type_id(), TypeId::of::<NaiveDate>()),
None => assert!(car.end.is_none()),
}
})
}
}
#[test]
fn add_and_remove_car() {
let cam = camera();
let car = Car {
number: "2211XX".to_string(),
begin: Some(NaiveDate::from_str("2024-07-09").unwrap()),
end: None,
notify: Notify::Off,
note: Some("Some Comment".to_string()),
};
if let Err(err) = cam.remove_car(&car.number) {
assert_eq!(err.type_id(), TypeId::of::<WardError>())
};
thread::sleep(Duration::from_millis(100));
let cars = cam.list_cars().unwrap();
let find_car = cars.iter().find(|c| c.number == car.number);
assert!(find_car.is_none());
thread::sleep(Duration::from_millis(100));
cam.add_car(&car).unwrap();
thread::sleep(Duration::from_millis(100));
let cars = cam.list_cars().unwrap();
let find_car = cars.iter().find(|c| c.number == car.number);
assert!(find_car.is_some());
assert_eq!(find_car.unwrap().number, car.number);
assert_eq!(find_car.unwrap().note, car.note);
assert_eq!(find_car.unwrap().notify, car.notify);
thread::sleep(Duration::from_millis(100));
cam.remove_car(&car.number).unwrap();
thread::sleep(Duration::from_millis(100));
let cars = cam.list_cars().unwrap();
let find_car = cars.iter().find(|c| c.number == car.number);
assert!(find_car.is_none());
}
#[test]
fn add_many_cars() {
let cam = camera();
let car_one = Car {
number: "3333XX".to_string(),
begin: Some(NaiveDate::from_str("2024-07-09").unwrap()),
end: None,
notify: Notify::Off,
note: None,
};
let car_two = Car {
number: "4444XX".to_string(),
begin: Some(NaiveDate::from_str("2024-07-09").unwrap()),
end: None,
notify: Notify::On,
note: Some("Any comment".to_string()),
};
let cars = vec![car_one, car_two];
let added_numbers = cam.add_cars(&cars).unwrap();
assert_eq!(added_numbers.len(), 2);
assert!(added_numbers.contains(&cars[0].number.as_str()));
assert!(added_numbers.contains(&cars[1].number.as_str()));
thread::sleep(Duration::from_millis(100));
let cars_list = cam.list_cars().unwrap();
cars.iter().for_each(|car| {
let find_car = cars_list.iter().find(|c| c.number == car.number);
assert!(find_car.is_some());
assert_eq!(find_car.unwrap().number, car.number);
thread::sleep(Duration::from_millis(100));
cam.remove_car(&car.number).unwrap();
});
}
#[test]
fn remove_cars_by_date() {
let cam = camera();
let car_one = Car {
number: "3333XX".to_string(),
begin: Some(NaiveDate::from_str("2024-07-09").unwrap()),
end: Some(NaiveDate::from_str("2024-07-09").unwrap()),
notify: Notify::Off,
note: None,
};
let car_two = Car {
number: "4444XX".to_string(),
begin: Some(NaiveDate::from_str("2024-07-09").unwrap()),
end: Some(NaiveDate::from_str("2024-07-09").unwrap()),
notify: Notify::Off,
note: None,
};
let cars = vec![car_one.clone(), car_two];
let added_numbers = cam.add_cars(&cars).unwrap();
assert_eq!(added_numbers.len(), 2);
assert!(added_numbers.contains(&cars[0].number.as_str()));
assert!(added_numbers.contains(&cars[1].number.as_str()));
thread::sleep(Duration::from_millis(100));
let cars_list = cam.list_cars().unwrap();
cars.iter().for_each(|car| {
let find_car = cars_list.iter().find(|c| c.number == car.number);
assert!(find_car.is_some());
assert_eq!(find_car.unwrap().number, car.number);
});
let removes_cars = cam.remove_cars(car_one.begin).unwrap();
thread::sleep(Duration::from_millis(100));
let cars_list = cam.list_cars().unwrap();
let find_car = cars_list
.into_iter()
.find(|c| removes_cars.contains(&c.number));
assert!(find_car.is_none());
}
#[test]
fn editing_car() {
let cam = camera();
let mut car = Car {
number: "XXX999".to_string(),
begin: Some(NaiveDate::from_str("2024-07-10").unwrap()),
end: None,
notify: Notify::On,
note: None,
};
cam.add_car(&car).unwrap();
thread::sleep(Duration::from_millis(100));
let cars = cam.list_cars().unwrap();
let find_car = cars.iter().find(|c| c.number == car.number);
assert!(find_car.is_some());
assert_eq!(find_car.unwrap().number, car.number);
car.begin = Some(NaiveDate::from_str("2024-07-08").unwrap());
car.end = Some(NaiveDate::from_str("2024-07-11").unwrap());
car.notify = Notify::Off;
thread::sleep(Duration::from_millis(100));
cam.edit_car(&car).unwrap();
thread::sleep(Duration::from_millis(100));
let cars = cam.list_cars().unwrap();
let find_car = cars.iter().find(|c| c.number == car.number);
assert!(find_car.is_some());
assert_eq!(find_car.unwrap().number, car.number);
assert_eq!(find_car.unwrap().begin, car.begin);
assert_eq!(find_car.unwrap().end, car.end);
assert_eq!(find_car.unwrap().notify, car.notify);
thread::sleep(Duration::from_millis(100));
cam.remove_car(&car.number).unwrap();
}