wards 0.1.10

Библиотека для камеры Beward B2530RZQ-LP
Documentation
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();
}