test_read_write.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import pytest
  2. import tempfile
  3. import os
  4. from io import TextIOWrapper
  5. from dataclasses import asdict
  6. from job_search.read_write import StdReadWriter, ReadWriter
  7. from job_search.messages import (
  8. InitialConfigurationMessage,
  9. JobOfferListMessage,
  10. JobAddedMessage,
  11. JobAlreadyExistsMessage,
  12. LogMessage,
  13. )
  14. def fake_std():
  15. (fd, file_path) = tempfile.mkstemp(prefix="job_search")
  16. yield file_path
  17. os.remove(file_path)
  18. @pytest.fixture
  19. def stdin():
  20. yield from fake_std()
  21. @pytest.fixture
  22. def stdout():
  23. yield from fake_std()
  24. @pytest.fixture
  25. def stdin_read(stdin):
  26. with open(stdin, "rb") as fake:
  27. yield TextIOWrapper(fake)
  28. @pytest.fixture
  29. def stdin_write(stdin):
  30. with open(stdin, "wb") as fake:
  31. yield TextIOWrapper(fake)
  32. @pytest.fixture
  33. def stdout_write(stdout):
  34. with open(stdout, "wb") as fake:
  35. yield TextIOWrapper(fake)
  36. @pytest.fixture
  37. def stdout_read(stdout):
  38. with open(stdout, "rb") as fake:
  39. yield TextIOWrapper(fake)
  40. @pytest.fixture
  41. def read_writer(stdin_read, stdout_write):
  42. return ReadWriter(stdin_read, stdout_write)
  43. class TestStdReadWriter:
  44. def test_get_message(self, stdin_read, stdin_write):
  45. simple_message = {"test": "pouet"}
  46. msg = StdReadWriter.encode_message(simple_message)
  47. StdReadWriter.send_message_on(stdin_write, msg)
  48. assert StdReadWriter.read_message(stdin_read) == simple_message
  49. def test_send(self, stdout_write, stdout_read):
  50. simple_message = {"test": "pouet"}
  51. msg = StdReadWriter.encode_message(simple_message)
  52. StdReadWriter.send_message_on(stdout_write, msg)
  53. assert StdReadWriter.read_message(stdout_read) == simple_message
  54. class TestReadWriter:
  55. @pytest.fixture(
  56. params=[
  57. (
  58. {"tag": "NativeMessageInitialConfiguration", "values": [{"jobsPath": "jobs_path"}]},
  59. InitialConfigurationMessage(jobs_path="jobs_path"),
  60. )
  61. ]
  62. )
  63. def input_message(self, request):
  64. (ext_message_as_dict, message) = request.param
  65. encoded = StdReadWriter.encode_message(ext_message_as_dict)
  66. return message, encoded
  67. def test_get_message(self, read_writer, stdin_write, input_message):
  68. expected_message, encoded = input_message
  69. StdReadWriter.send_message_on(stdin_write, encoded)
  70. assert read_writer.get_message() == expected_message
  71. @pytest.fixture(
  72. params=[
  73. (
  74. JobOfferListMessage(job_offers=[{"id": "job_offer_1"}, {"id": "job_offer_2"}]),
  75. {"tag": "NativeMessageJobOfferList", "values": [[{"id": "job_offer_1"}, {"id": "job_offer_2"}]]},
  76. ),
  77. (
  78. JobAddedMessage(job_id="job_id"),
  79. {"tag": "NativeMessageJobAdded", "values": [{"job_id": "job_id"}]},
  80. ),
  81. (
  82. JobAlreadyExistsMessage(job_id="job_id"),
  83. {"tag": "NativeMessageJobAlreadyExists", "values": [{"job_id": "job_id"}]},
  84. ),
  85. (
  86. LogMessage.debug(content="debug_content"),
  87. {"tag": "NativeMessageLog", "values": [{"level": "debug", "content": "debug_content"}]},
  88. ),
  89. (
  90. LogMessage.info(content={"message": "info"}),
  91. {"tag": "NativeMessageLog", "values": [{"level": "info", "content": {"message": "info"}}]},
  92. ),
  93. (
  94. LogMessage.error(content="error_content"),
  95. {"tag": "NativeMessageLog", "values": [{"level": "error", "content": "error_content"}]},
  96. ),
  97. ]
  98. )
  99. def output_message(self, request):
  100. return request.param
  101. def test_send_message(self, read_writer, stdout_read, output_message):
  102. original_message, expected_json = output_message
  103. read_writer.send_message(original_message)
  104. assert StdReadWriter.read_message(stdout_read) == expected_json