Add sensor_logging/tests/test_core.py

This commit is contained in:
Mika 2026-03-01 03:11:38 +00:00
parent b8b14097eb
commit d053faef61

View file

@ -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')