test_protoc_plugin.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """The plugin turns a CodeGeneratorRequest into async+sync client stubs."""
  2. from chattolib._pb.google.protobuf import protoc_gen_request_pb2 as g
  3. from chattolib._protoc_plugin import generate
  4. def _request_with_room_service() -> g.CodeGeneratorRequest:
  5. req = g.CodeGeneratorRequest()
  6. req.file_to_generate.append("chatto/api/v1/rooms.proto")
  7. fd = req.proto_file.add()
  8. fd.name = "chatto/api/v1/rooms.proto"
  9. fd.package = "chatto.api.v1"
  10. svc = fd.service.add()
  11. svc.name = "RoomService"
  12. for name in ("JoinRoom", "CreateRoom"):
  13. m = svc.method.add()
  14. m.name = name
  15. m.input_type = f".chatto.api.v1.{name}Request"
  16. m.output_type = f".chatto.api.v1.{name}Response"
  17. return req
  18. def test_emits_one_file_per_service_with_both_clients():
  19. resp = generate(_request_with_room_service())
  20. assert len(resp.file) == 1
  21. out = resp.file[0]
  22. assert out.name.endswith("rooms_connect.py")
  23. content = out.content
  24. # Both client classes, correct base classes, one method per RPC.
  25. assert "class RoomServiceClient(ConnectClient):" in content
  26. assert "class RoomServiceClientSync(ConnectClientSync):" in content
  27. assert "async def join_room(" in content
  28. assert "async def create_room(" in content
  29. assert "def join_room(" in content # sync variant
  30. # Imports only from chattolib._connect and the sibling pb2.
  31. assert "from chattolib._connect import ConnectClient, ConnectClientSync, MethodInfo" in content
  32. assert "import chatto.api.v1.rooms_pb2 as _pb2" in content
  33. # No connectrpc anywhere.
  34. assert "connectrpc" not in content
  35. # use_get is dropped.
  36. assert "use_get" not in content
  37. def test_skips_files_without_services():
  38. req = g.CodeGeneratorRequest()
  39. req.file_to_generate.append("chatto/realtime/v1/realtime.proto")
  40. fd = req.proto_file.add()
  41. fd.name = "chatto/realtime/v1/realtime.proto"
  42. fd.package = "chatto.realtime.v1"
  43. fd.message_type.add().name = "RealtimeClientFrame" # messages, no service
  44. resp = generate(req)
  45. assert len(resp.file) == 0