use std::sync::Mutex; use chrono::{DateTime, Datelike, Days, Local, Timelike, Weekday}; use once_cell::sync::Lazy; use serial_test::serial; use tracktorial::{api::FactorialApi, config::Configuration, login::Credential}; static API_MUTEX: Lazy<Mutex<FactorialApi>> = Lazy::new(|| { let api = FactorialApi::get_api().unwrap(); Mutex::new(api) }); #[test] fn client_authentication_with_invalid_cred() { let invalid_cred = Credential::new("", ""); let mut config = Configuration::get_config().unwrap(); let api = FactorialApi::new(invalid_cred, &mut config); assert_eq!(true, api.is_err()); } #[test] fn client_authentication_with_valid_cred() { let mut config = Configuration::get_config().unwrap(); if config.email.len() == 0 { config.prompt_for_email().unwrap(); config.write_config().unwrap(); } let mut valid_cred = Credential::new_without_password(&config.email); if valid_cred.get_password().is_err() { valid_cred.ask_for_password().unwrap(); } let api = FactorialApi::new(valid_cred, &mut config); assert_eq!(true, api.is_ok()); } #[serial] #[test] fn starting_shift() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); let result = api.shift_start(sunday); match result.as_ref() { Ok(_) => (), Err(e) => eprintln!("{}", e.to_string()), } api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } #[serial] #[test] fn cannot_clock_in_if_already_clocked_in() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); let result = api.shift_start(sunday); api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_err()); } #[serial] #[test] fn starting_break() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); let result = api.break_start(sunday); match result.as_ref() { Ok(_) => (), Err(e) => eprintln!("{}", e.to_string()), } api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } #[serial] #[test] fn cannot_start_break_if_not_clocked_in() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); let result = api.break_start(sunday); assert_eq!(true, result.is_err()); } #[serial] #[test] fn cannot_start_break_if_already_on_break() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); api.break_start(sunday).unwrap(); let result = api.break_start(sunday); api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_err()); } #[serial] #[test] fn ending_break() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); api.break_start(sunday).unwrap(); let result = api.break_end(sunday); match result.as_ref() { Ok(_) => (), Err(e) => eprintln!("{}", e.to_string()), } api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } #[serial] #[test] fn cannot_end_break_if_not_on_break() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); let result = api.break_end(sunday); api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_err()); } #[serial] #[test] fn ending_shift() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); api.shift_start(sunday).unwrap(); let result = api.shift_end(sunday); match result.as_ref() { Ok(_) => (), Err(e) => eprintln!("{}", e.to_string()), } api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } #[serial] #[test] fn create_shift() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); let result = api.make_shift( sunday.with_hour(8).unwrap(), sunday .checked_add_signed(chrono::Duration::hours(8)) .unwrap(), ); api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } #[serial] #[test] fn create_break() { let sunday = get_next_sunday(); let api = API_MUTEX.lock().unwrap(); let result = api.make_break( sunday.with_hour(8).unwrap(), sunday .checked_add_signed(chrono::Duration::hours(8)) .unwrap(), ); api.delete_all_shifts(sunday).unwrap(); assert_eq!(true, result.is_ok()); } fn get_next_sunday() -> DateTime<Local> { let mut today = Local::now(); while today.weekday() != Weekday::Sun { today = today.checked_add_days(Days::new(1)).unwrap(); } today }