test_codegen_descriptors.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. """The vendored protoc codegen descriptors must be loadable and usable.
  2. Loaded by file path (not via ``import chattolib._codegen``) so this test is
  3. valid even before the generated service stubs exist — importing through the
  4. ``chattolib`` package would otherwise trigger ``chattolib/__init__.py``.
  5. """
  6. import importlib.util
  7. import os
  8. _CODEGEN_DIR = os.path.join(
  9. os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
  10. "src",
  11. "chattolib",
  12. "_codegen",
  13. )
  14. def _load(name):
  15. path = os.path.join(_CODEGEN_DIR, f"{name}.py")
  16. spec = importlib.util.spec_from_file_location(f"_test_codegen_{name}", path)
  17. mod = importlib.util.module_from_spec(spec)
  18. spec.loader.exec_module(mod) # type: ignore[union-attr]
  19. return mod
  20. def test_codegen_request_round_trips():
  21. g = _load("protoc_gen_request_pb2")
  22. req = g.CodeGeneratorRequest()
  23. req.language = "chattolib"
  24. req.file_to_generate.append("chatto/api/v1/rooms.proto")
  25. fd = req.proto_file.add()
  26. fd.name = "chatto/api/v1/rooms.proto"
  27. fd.package = "chatto.api.v1"
  28. svc = fd.service.add()
  29. svc.name = "RoomService"
  30. m = svc.method.add()
  31. m.name = "JoinRoom"
  32. m.input_type = ".chatto.api.v1.JoinRoomRequest"
  33. m.output_type = ".chatto.api.v1.JoinRoomResponse"
  34. req2 = g.CodeGeneratorRequest.FromString(req.SerializeToString())
  35. assert req2.file_to_generate[0] == "chatto/api/v1/rooms.proto"
  36. assert req2.proto_file[0].service[0].method[0].name == "JoinRoom"
  37. def test_codegen_response_file_field():
  38. g = _load("protoc_gen_response_pb2")
  39. resp = g.CodeGeneratorResponse()
  40. resp.file.add().name = "out/foo_connect.py"
  41. resp.file.add().content = "print('hi')"
  42. resp2 = g.CodeGeneratorResponse.FromString(resp.SerializeToString())
  43. assert resp2.file[1].content == "print('hi')"