From a7a7e7ef180f88587ee72f3d8e3a057ce8ebac5c 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