test_events.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """Tests for the NDJSON event envelope and codec."""
  2. import json
  3. import pytest
  4. from stt_daemon import events
  5. def test_make_event_envelope():
  6. event = events.make_event(events.HEARTBEAT, 7, uptime_s=12.5)
  7. assert event["v"] == events.PROTOCOL_VERSION
  8. assert event["type"] == events.HEARTBEAT
  9. assert event["seq"] == 7
  10. assert isinstance(event["ts"], float)
  11. assert event["uptime_s"] == 12.5
  12. def test_make_event_explicit_timestamp():
  13. event = events.make_event(events.STATUS, 1, ts=1000.5)
  14. assert event["ts"] == 1000.5
  15. @pytest.mark.parametrize("type_", sorted(events.ALL_TYPES))
  16. def test_round_trip_every_type(type_):
  17. event = events.make_event(type_, 42, payload={"á": "ñ"}, n=1)
  18. line = events.encode(event)
  19. assert line.endswith(b"\n")
  20. assert events.decode(line) == event
  21. def test_encode_is_utf8_not_escaped():
  22. line = events.encode(events.make_event(events.TRANSCRIPT, 1, text="café"))
  23. assert "café".encode("utf-8") in line
  24. def test_decode_accepts_str_and_bytes():
  25. event = events.make_event(events.SPEECH_START, 3)
  26. assert events.decode(events.encode(event)) == event
  27. assert events.decode(events.encode(event).decode("utf-8")) == event
  28. @pytest.mark.parametrize(
  29. "bad",
  30. [
  31. b"not json\n",
  32. b"[1,2,3]\n",
  33. b'"a string"\n',
  34. b"42\n",
  35. b'{"type":"heartbeat","seq":1,"ts":1.0}\n', # missing v
  36. b'{"v":1,"seq":1,"ts":1.0}\n', # missing type
  37. b'{"v":1,"type":"heartbeat","ts":1.0}\n', # missing seq
  38. b'{"v":1,"type":"heartbeat","seq":1}\n', # missing ts
  39. b"\xff\xfe\n", # invalid utf-8
  40. ],
  41. )
  42. def test_decode_rejects_malformed(bad):
  43. with pytest.raises(events.DecodeError):
  44. events.decode(bad)
  45. def test_decode_rejects_wrong_argument_type():
  46. with pytest.raises(events.DecodeError):
  47. events.decode(json.dumps([]).encode() + b"\n") # object required
  48. def test_all_types_is_complete():
  49. assert events.ALL_TYPES == {
  50. events.TRANSCRIPT,
  51. events.SEGMENT_DONE,
  52. events.SPEECH_START,
  53. events.SPEECH_STOP,
  54. events.HEARTBEAT,
  55. events.STATUS,
  56. events.RING_END,
  57. events.SPEAKERS,
  58. }
  59. def test_speakers_event_constant():
  60. assert events.SPEAKERS == "speakers"
  61. assert events.SPEAKERS in events.ALL_TYPES