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::()), None => assert!(car.begin.is_none()), } match car.end { Some(date) => assert_eq!(date.type_id(), TypeId::of::()), 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, }; // пытаемся удалить номер // если вернулась ошибка, значит номер отутствует в базе if let Err(err) = cam.remove_car(&car.number) { assert_eq!(err.type_id(), TypeId::of::()) }; // проверяем список авто на отсутствие номера 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); // удаляем номер из камеры 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, }; let car_two = Car { number: "4444XX".to_string(), begin: Some(NaiveDate::from_str("2024-07-09").unwrap()), end: None, notify: Notify::Off, }; 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, }; 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, }; 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, }; 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(); }