diff --git a/sensor_logging/tests/test_core.py b/sensor_logging/tests/test_core.py new file mode 100644 index 0000000..edaf400 --- /dev/null +++ b/sensor_logging/tests/test_core.py @@ -0,0 +1,62 @@ +import json +import re +from datetime import datetime +import pytest + +import src.sensor_logging.core as core + + +def test_sensor_data_to_json_contains_required_fields(): + sensor = core.SensorData(sensor_id='SensorA', temperature=22.5, humidity=55.3, timestamp=datetime(2024, 6, 12, 8, 30, 45)) + data_json = sensor.to_json() + + parsed = json.loads(data_json) + assert set(parsed.keys()) == {'sensor_id', 'temperature', 'humidity', 'timestamp'} + assert parsed['sensor_id'] == 'SensorA' + assert pytest.approx(parsed['temperature'], 0.001) == 22.5 + assert pytest.approx(parsed['humidity'], 0.001) == 55.3 + + +def test_sensor_data_timestamp_is_iso_format(): + sensor = core.SensorData(sensor_id='S123', temperature=10.0, humidity=50.0, timestamp=datetime.now()) + data_json = sensor.to_json() + parsed = json.loads(data_json) + timestamp = parsed['timestamp'] + + assert isinstance(timestamp, str) + # check ISO 8601-like pattern + iso_pattern = r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + assert re.match(iso_pattern, timestamp) + + +def test_log_sensor_data_writes_to_file(tmp_path): + log_file = tmp_path / 'sensor_log.json' + + # patch output path temporarily + original_output = core.os.path.join + def mocked_join(a, b): + if b == 'output/sensor_log.json': + return str(log_file) + return original_output(a, b) + + core.os.path.join = mocked_join + + try: + core.log_sensor_data('SensorB', 18.2, 42.1) + assert log_file.exists() + content = log_file.read_text().strip() + assert content # not empty + parsed = json.loads(content.splitlines()[-1]) + assert parsed['sensor_id'] == 'SensorB' + assert pytest.approx(parsed['temperature'], 0.001) == 18.2 + assert pytest.approx(parsed['humidity'], 0.001) == 42.1 + finally: + core.os.path.join = original_output + + +def test_invalid_temperature_type_raises(): + with pytest.raises((TypeError, ValueError)): + core.log_sensor_data('SensorC', 'not_a_float', 45.1) + + with pytest.raises((TypeError, ValueError)): + core.log_sensor_data('SensorC', 23.3, 'bad_humidity')