import pytest from pydantic import ValidationError def test_action_read_file(): from sre_defender_env.models import SreDefenderAction action = SreDefenderAction(action_type="read_file", filepath="/app/logs/nginx_access.log") assert action.action_type == "read_file" assert action.filepath == "/app/logs/nginx_access.log" assert action.rule_content is None assert action.file_content is None def test_action_append_nginx_rule(): from sre_defender_env.models import SreDefenderAction action = SreDefenderAction(action_type="append_nginx_rule", rule_content="deny 1.2.3.4;") assert action.action_type == "append_nginx_rule" assert action.rule_content == "deny 1.2.3.4;" assert action.filepath is None def test_action_write_middleware(): from sre_defender_env.models import SreDefenderAction action = SreDefenderAction( action_type="write_express_middleware", file_content="const express = require('express'); const app = express();" ) assert action.action_type == "write_express_middleware" assert action.file_content is not None def test_action_rejects_invalid_type(): from sre_defender_env.models import SreDefenderAction with pytest.raises(ValidationError): SreDefenderAction(action_type="execute_command", filepath="/etc/passwd") def test_action_read_file_requires_filepath(): from sre_defender_env.models import SreDefenderAction with pytest.raises(ValidationError): SreDefenderAction(action_type="read_file") # no filepath def test_observation_reward_bounds(): from sre_defender_env.models import SreDefenderObservation with pytest.raises(ValidationError): SreDefenderObservation(done=False, reward=1.5) # out of bounds def test_action_requires_action_type(): from sre_defender_env.models import SreDefenderAction with pytest.raises(ValidationError): SreDefenderAction() def test_observation_reward_is_float(): from sre_defender_env.models import SreDefenderObservation obs = SreDefenderObservation(done=False) assert isinstance(obs.reward, float) assert obs.reward == 0.0 def test_observation_current_score_matches_reward(): from sre_defender_env.models import SreDefenderObservation obs = SreDefenderObservation(done=False, reward=0.75, current_score=0.75) assert obs.reward == 0.75 assert obs.current_score == 0.75 def test_observation_defaults(): from sre_defender_env.models import SreDefenderObservation obs = SreDefenderObservation(done=False) assert obs.log_tail == "" assert obs.server_status == "unknown" assert obs.task_id == 1 assert obs.error_message == ""