diff --git a/sensor_logging/tests/test_main.py b/sensor_logging/tests/test_main.py new file mode 100644 index 0000000..1ea37fe --- /dev/null +++ b/sensor_logging/tests/test_main.py @@ -0,0 +1,59 @@ +import json +import tempfile +import os +import pytest +from pathlib import Path + +import src.sensor_logging.main as main + + +def test_sensor_data_to_json_structure(): + s = main.SensorData(voltage=123.4, temperature=22.1, humidity=55.2) + data = s.to_json() + assert isinstance(data, dict) + assert set(data.keys()) == {"timestamp", "voltage", "temperature", "humidity"} + assert isinstance(data["timestamp"], str) + assert data["voltage"] == pytest.approx(123.4) + assert data["temperature"] == pytest.approx(22.1) + assert data["humidity"] == pytest.approx(55.2) + + +def test_log_sensor_data_creates_file_and_appends(): + with tempfile.TemporaryDirectory() as tmpdir: + logfile = Path(tmpdir) / "sensor_log.json" + + # First log entry + main.log_sensor_data(1.0, 2.0, 3.0) + # Override output path temporarily + orig_path = getattr(main, "DEFAULT_OUTPUT_PATH", None) + try: + main.DEFAULT_OUTPUT_PATH = logfile + main.log_sensor_data(4.5, 6.7, 8.9) + finally: + if orig_path is not None: + main.DEFAULT_OUTPUT_PATH = orig_path + + assert logfile.exists() + content = logfile.read_text().strip().splitlines() + # Assuming each line is separate JSON object + parsed = [json.loads(line) for line in content] + assert len(parsed) >= 1 + for p in parsed: + assert set(p.keys()) == {"timestamp", "voltage", "temperature", "humidity"} + assert isinstance(p["voltage"], (int, float)) + + +def test_log_sensor_data_invalid_inputs_raises(tmp_path): + # Invalid voltage type + with pytest.raises((TypeError, ValueError)): + main.log_sensor_data("bad", 25.0, 40.0) + + with pytest.raises((TypeError, ValueError)): + main.log_sensor_data(2.0, None, 50.0) + + +def test_sensor_data_timestamp_format(): + s = main.SensorData(voltage=2.2, temperature=3.3, humidity=4.4) + t = s.to_json()["timestamp"] + # Basic ISO8601 pattern validation + assert "T" in t and t.endswith("Z") \ No newline at end of file