diff --git a/contracts/workspace_booking/src/test.rs b/contracts/workspace_booking/src/test.rs index c4dacd7..ac85533 100644 --- a/contracts/workspace_booking/src/test.rs +++ b/contracts/workspace_booking/src/test.rs @@ -166,6 +166,7 @@ fn test_book_workspace_success() { &1_000i128, ); + let now = env.ledger().timestamp(); let start = now + 60; let end = start + 7_200; @@ -184,6 +185,7 @@ fn test_book_workspace_success() { assert_eq!(booking.status, BookingStatus::Active); assert_eq!(booking.amount_paid, 2_000i128); + let balance = TokenClient::new(&env, &token_address).balance(&member); assert_eq!(balance, 10_000 - 2_000); } @@ -361,3 +363,232 @@ fn test_cancel_already_cancelled_fails() { client.cancel_booking(&member, &String::from_str(&env, "booking-001")); } + +#[test] +fn test_check_availability_no_conflict() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = setup_contract(&env); + let client = WorkspaceBookingContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let member = Address::generate(&env); + let token_address = setup_token(&env, &admin, &member, 10_000i128); + + client.initialize(&admin, &token_address); + client.register_workspace( + &admin, + &String::from_str(&env, "ws-001"), + &String::from_str(&env, "Room B"), + &WorkspaceType::MeetingRoom, + &8u32, + &1_500i128, + ); + + let now = env.ledger().timestamp(); + let start = now + 3_600; + let end = start + 3_600; + + + assert!(client.check_availability(&String::from_str(&env, "ws-001"), &start, &end)); + + + client.book_workspace( + &member, + &String::from_str(&env, "booking-001"), + &String::from_str(&env, "ws-001"), + &start, + &end, + ); + + + assert!(!client.check_availability(&String::from_str(&env, "ws-001"), &start, &end)); + + + assert!(client.check_availability( + &String::from_str(&env, "ws-001"), + &end, + &(end + 3_600) + )); +} + +#[test] +fn test_set_workspace_availability_blocks_new_bookings() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = setup_contract(&env); + let client = WorkspaceBookingContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let member = Address::generate(&env); + let token_address = setup_token(&env, &admin, &member, 10_000i128); + + client.initialize(&admin, &token_address); + client.register_workspace( + &admin, + &String::from_str(&env, "ws-001"), + &String::from_str(&env, "Desk C"), + &WorkspaceType::HotDesk, + &1u32, + &400i128, + ); + + + client.set_workspace_availability(&admin, &String::from_str(&env, "ws-001"), &false); + + assert!(!client.check_availability( + &String::from_str(&env, "ws-001"), + &(env.ledger().timestamp() + 60), + &(env.ledger().timestamp() + 3_660) + )); +} + +#[test] +fn test_multiple_workspaces_independent_availability() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = setup_contract(&env); + let client = WorkspaceBookingContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let member = Address::generate(&env); + let token_address = setup_token(&env, &admin, &member, 50_000i128); + + client.initialize(&admin, &token_address); + + for i in 0u32..3 { + let id = match i { + 0 => String::from_str(&env, "ws-001"), + 1 => String::from_str(&env, "ws-002"), + _ => String::from_str(&env, "ws-003"), + }; + client.register_workspace( + &admin, + &id, + &String::from_str(&env, "Workspace"), + &WorkspaceType::HotDesk, + &1u32, + &500i128, + ); + } + + assert_eq!(client.get_all_workspaces().len(), 3u32); + + let now = env.ledger().timestamp(); + let start = now + 60; + let end = start + 3_600; + + + client.book_workspace( + &member, + &String::from_str(&env, "booking-001"), + &String::from_str(&env, "ws-001"), + &start, + &end, + ); + + + assert!(client.check_availability(&String::from_str(&env, "ws-002"), &start, &end)); + assert!(client.check_availability(&String::from_str(&env, "ws-003"), &start, &end)); + + assert!(!client.check_availability(&String::from_str(&env, "ws-001"), &start, &end)); +} + +#[test] +fn test_member_and_workspace_booking_indexes() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = setup_contract(&env); + let client = WorkspaceBookingContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let member = Address::generate(&env); + let token_address = setup_token(&env, &admin, &member, 50_000i128); + + client.initialize(&admin, &token_address); + client.register_workspace( + &admin, + &String::from_str(&env, "ws-001"), + &String::from_str(&env, "Desk A"), + &WorkspaceType::DedicatedDesk, + &1u32, + &300i128, + ); + + let now = env.ledger().timestamp(); + + + let s1 = now + 100; + let e1 = s1 + 3_600; + let s2 = e1 + 600; + let e2 = s2 + 3_600; + + client.book_workspace( + &member, + &String::from_str(&env, "bk-1"), + &String::from_str(&env, "ws-001"), + &s1, + &e1, + ); + client.book_workspace( + &member, + &String::from_str(&env, "bk-2"), + &String::from_str(&env, "ws-001"), + &s2, + &e2, + ); + + assert_eq!(client.get_member_bookings(&member).len(), 2u32); + assert_eq!( + client.get_workspace_bookings(&String::from_str(&env, "ws-001")).len(), + 2u32 + ); +} + +#[test] +fn test_hourly_rate_update_applies_to_future_bookings() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = setup_contract(&env); + let client = WorkspaceBookingContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let member = Address::generate(&env); + let token_address = setup_token(&env, &admin, &member, 50_000i128); + + client.initialize(&admin, &token_address); + client.register_workspace( + &admin, + &String::from_str(&env, "ws-001"), + &String::from_str(&env, "Office"), + &WorkspaceType::PrivateOffice, + &1u32, + &1_000i128, + ); + + + client.set_workspace_rate(&admin, &String::from_str(&env, "ws-001"), &2_000i128); + + let ws = client.get_workspace(&String::from_str(&env, "ws-001")); + assert_eq!(ws.hourly_rate, 2_000i128); + + let now = env.ledger().timestamp(); + let start = now + 60; + let end = start + 3_600; + + client.book_workspace( + &member, + &String::from_str(&env, "bk-001"), + &String::from_str(&env, "ws-001"), + &start, + &end, + ); + + let booking = client.get_booking(&String::from_str(&env, "bk-001")); + assert_eq!(booking.amount_paid, 2_000i128); +}