|
301 | 301 | expect(rpc.method).to be == :greet_user |
302 | 302 | end |
303 | 303 | end |
| 304 | + |
| 305 | + with "stream() decorator syntax" do |
| 306 | + it "supports unary RPC (no stream)" do |
| 307 | + request_class = self.request_class |
| 308 | + response_class = self.response_class |
| 309 | + |
| 310 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 311 | + rpc :div, request_class, response_class |
| 312 | + end |
| 313 | + |
| 314 | + rpc = interface_class.lookup_rpc(:div) |
| 315 | + expect(rpc.name).to be == :div |
| 316 | + expect(rpc.request_class).to be == request_class |
| 317 | + expect(rpc.response_class).to be == response_class |
| 318 | + expect(rpc.streaming).to be == :unary |
| 319 | + expect(rpc.streaming?).to be == false |
| 320 | + end |
| 321 | + |
| 322 | + it "supports client streaming with stream() on request" do |
| 323 | + request_class = self.request_class |
| 324 | + response_class = self.response_class |
| 325 | + |
| 326 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 327 | + rpc :sum, stream(request_class), response_class |
| 328 | + end |
| 329 | + |
| 330 | + rpc = interface_class.lookup_rpc(:sum) |
| 331 | + expect(rpc.name).to be == :sum |
| 332 | + expect(rpc.request_class).to be == request_class |
| 333 | + expect(rpc.response_class).to be == response_class |
| 334 | + expect(rpc.streaming).to be == :client_streaming |
| 335 | + expect(rpc.streaming?).to be == true |
| 336 | + end |
| 337 | + |
| 338 | + it "supports server streaming with stream() on response" do |
| 339 | + request_class = self.request_class |
| 340 | + response_class = self.response_class |
| 341 | + |
| 342 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 343 | + rpc :fib, request_class, stream(response_class) |
| 344 | + end |
| 345 | + |
| 346 | + rpc = interface_class.lookup_rpc(:fib) |
| 347 | + expect(rpc.name).to be == :fib |
| 348 | + expect(rpc.request_class).to be == request_class |
| 349 | + expect(rpc.response_class).to be == response_class |
| 350 | + expect(rpc.streaming).to be == :server_streaming |
| 351 | + expect(rpc.streaming?).to be == true |
| 352 | + end |
| 353 | + |
| 354 | + it "supports bidirectional streaming with stream() on both" do |
| 355 | + request_class = self.request_class |
| 356 | + response_class = self.response_class |
| 357 | + |
| 358 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 359 | + rpc :div_many, stream(request_class), stream(response_class) |
| 360 | + end |
| 361 | + |
| 362 | + rpc = interface_class.lookup_rpc(:div_many) |
| 363 | + expect(rpc.name).to be == :div_many |
| 364 | + expect(rpc.request_class).to be == request_class |
| 365 | + expect(rpc.response_class).to be == response_class |
| 366 | + expect(rpc.streaming).to be == :bidirectional |
| 367 | + expect(rpc.streaming?).to be == true |
| 368 | + end |
| 369 | + |
| 370 | + it "explicit streaming option overrides stream() decorator" do |
| 371 | + request_class = self.request_class |
| 372 | + response_class = self.response_class |
| 373 | + |
| 374 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 375 | + rpc :custom, stream(request_class), response_class, streaming: :unary |
| 376 | + end |
| 377 | + |
| 378 | + rpc = interface_class.lookup_rpc(:custom) |
| 379 | + expect(rpc.request_class).to be == request_class |
| 380 | + expect(rpc.response_class).to be == response_class |
| 381 | + expect(rpc.streaming).to be == :unary |
| 382 | + expect(rpc.streaming?).to be == false |
| 383 | + end |
| 384 | + |
| 385 | + it "unwraps message classes from Streaming wrapper" do |
| 386 | + request_class = self.request_class |
| 387 | + response_class = self.response_class |
| 388 | + |
| 389 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 390 | + rpc :test, stream(request_class), stream(response_class) |
| 391 | + end |
| 392 | + |
| 393 | + rpc = interface_class.lookup_rpc(:test) |
| 394 | + |
| 395 | + # Should unwrap to actual classes, not Streaming instances |
| 396 | + expect(rpc.request_class).to be == request_class |
| 397 | + expect(rpc.response_class).to be == response_class |
| 398 | + expect(rpc.request_class).not.to be_a(Protocol::GRPC::Streaming) |
| 399 | + expect(rpc.response_class).not.to be_a(Protocol::GRPC::Streaming) |
| 400 | + end |
| 401 | + |
| 402 | + it "can use stream() directly in Interface subclass" do |
| 403 | + request_class = self.request_class |
| 404 | + response_class = self.response_class |
| 405 | + |
| 406 | + interface_class = Class.new(Protocol::GRPC::Interface) do |
| 407 | + # Use stream() without Protocol::GRPC prefix |
| 408 | + rpc :sum, stream(request_class), response_class |
| 409 | + rpc :fib, request_class, stream(response_class) |
| 410 | + rpc :chat, stream(request_class), stream(response_class) |
| 411 | + end |
| 412 | + |
| 413 | + sum_rpc = interface_class.lookup_rpc(:sum) |
| 414 | + expect(sum_rpc.streaming).to be == :client_streaming |
| 415 | + expect(sum_rpc.request_class).to be == request_class |
| 416 | + expect(sum_rpc.response_class).to be == response_class |
| 417 | + |
| 418 | + fib_rpc = interface_class.lookup_rpc(:fib) |
| 419 | + expect(fib_rpc.streaming).to be == :server_streaming |
| 420 | + expect(fib_rpc.request_class).to be == request_class |
| 421 | + expect(fib_rpc.response_class).to be == response_class |
| 422 | + |
| 423 | + chat_rpc = interface_class.lookup_rpc(:chat) |
| 424 | + expect(chat_rpc.streaming).to be == :bidirectional |
| 425 | + expect(chat_rpc.request_class).to be == request_class |
| 426 | + expect(chat_rpc.response_class).to be == response_class |
| 427 | + end |
| 428 | + end |
304 | 429 | end |
0 commit comments