From 72eafd285b873731e8d76be945a703e33de7fed8 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sat, 3 Jan 2026 22:53:09 +0100 Subject: [PATCH] test(domain): write failing tests for Relay aggregate Created test suite for Relay entity covering construction, state toggling, and explicit state control methods. Tests intentionally fail as Relay struct is not yet implemented. Tests cover: - Relay::new() with id, state, and optional label - toggle() flipping state between On/Off - turn_on() setting state to On - turn_off() setting state to Off TDD phase: RED - Tests written, implementation pending (T022) Ref: T021 (specs/001-modbus-relay-control/tasks.md) --- backend/src/domain/relay/entity.rs | 63 +++++++++++++++++++++++++ backend/src/domain/relay/mod.rs | 2 + specs/001-modbus-relay-control/tasks.md | 2 +- 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 backend/src/domain/relay/entity.rs diff --git a/backend/src/domain/relay/entity.rs b/backend/src/domain/relay/entity.rs new file mode 100644 index 0000000..2307e96 --- /dev/null +++ b/backend/src/domain/relay/entity.rs @@ -0,0 +1,63 @@ +//! Relay entity representing a relay aggregate in the domain model. + +use super::types::{RelayId, RelayState}; + +#[cfg(test)] +mod tests { + use super::*; + use crate::domain::relay::controler::ControllerError; + + #[test] + fn test_relay_new_creates_relay() { + // Test: Relay::new(RelayId(1), RelayState::Off, None) creates relay + let relay_id = RelayId::new(1).unwrap(); + let relay = Relay::new(relay_id, RelayState::Off, None); + + assert_eq!(relay.id(), relay_id); + assert_eq!(relay.state(), RelayState::Off); + assert_eq!(relay.label(), None); + } + + #[test] + fn test_relay_toggle_flips_state() { + // Test: relay.toggle() flips state + let relay_id = RelayId::new(1).unwrap(); + let mut relay = Relay::new(relay_id, RelayState::Off, None); + + // Toggle from Off to On + relay.toggle(); + assert_eq!(relay.state(), RelayState::On); + + // Toggle from On to Off + relay.toggle(); + assert_eq!(relay.state(), RelayState::Off); + } + + #[test] + fn test_relay_turn_on_sets_state_to_on() { + // Test: relay.turn_on() sets state to On + let relay_id = RelayId::new(1).unwrap(); + let mut relay = Relay::new(relay_id, RelayState::Off, None); + + relay.turn_on(); + assert_eq!(relay.state(), RelayState::On); + + // Calling turn_on when already on should keep it on + relay.turn_on(); + assert_eq!(relay.state(), RelayState::On); + } + + #[test] + fn test_relay_turn_off_sets_state_to_off() { + // Test: relay.turn_off() sets state to Off + let relay_id = RelayId::new(1).unwrap(); + let mut relay = Relay::new(relay_id, RelayState::On, None); + + relay.turn_off(); + assert_eq!(relay.state(), RelayState::Off); + + // Calling turn_off when already off should keep it off + relay.turn_off(); + assert_eq!(relay.state(), RelayState::Off); + } +} diff --git a/backend/src/domain/relay/mod.rs b/backend/src/domain/relay/mod.rs index 4e63f39..26748e6 100644 --- a/backend/src/domain/relay/mod.rs +++ b/backend/src/domain/relay/mod.rs @@ -9,3 +9,5 @@ pub mod repository; pub mod types; /// Controller error types for relay operations. pub mod controler; +/// Relay entity representing the relay aggregate. +pub mod entity; diff --git a/specs/001-modbus-relay-control/tasks.md b/specs/001-modbus-relay-control/tasks.md index eda7f91..4d81a07 100644 --- a/specs/001-modbus-relay-control/tasks.md +++ b/specs/001-modbus-relay-control/tasks.md @@ -231,7 +231,7 @@ - **File**: src/domain/relay.rs - **Complexity**: Low | **Uncertainty**: Low -- [ ] **T021** [US1] [TDD] Write tests for Relay aggregate +- [x] **T021** [US1] [TDD] Write tests for Relay aggregate - Test: Relay::new(RelayId(1), RelayState::Off, None) creates relay - Test: relay.toggle() flips state - Test: relay.turn_on() sets state to On