Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ganmacs/grpc_mock

Library for stubbing gRPC requests in Ruby.
https://github.com/ganmacs/grpc_mock

grpc grpc-ruby ruby stubbing-requests

Last synced: 4 days ago
JSON representation

Library for stubbing gRPC requests in Ruby.

Awesome Lists containing this project

README

        

# GrpcMock [![Build Status](https://github.com/ganmacs/grpc_mock/actions/workflows/ci.yml/badge.svg)](https://github.com/ganmacs/grpc_mock/actions/workflows/ci.yml)

Library for stubbing grpc in Ruby.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'grpc_mock'
```

And then execute:

$ bundle

Or install it yourself as:

$ gem install grpc_mock

## Usage

If you use [RSpec](https://github.com/rspec/rspec), add the following code to spec/spec_helper.rb:

```ruby
require 'grpc_mock/rspec'
```

## Examples

See definition of protocol buffers and gRPC generated code in [spec/examples/hello](https://github.com/ganmacs/grpc_mock/tree/master/spec/examples/hello)

### Stubbed request based on path and with the default response

```ruby
GrpcMock.stub_request("/hello.hello/Hello").to_return(Hello::HelloResponse.new(msg: 'test'))

client = Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure)
client.hello(Hello::HelloRequest.new(msg: 'hi')) # => Hello::HelloResponse.new(msg: 'test')
```

### Stubbing requests based on path and request

```ruby
GrpcMock.stub_request("/hello.hello/Hello").with(Hello::HelloRequest.new(msg: 'hi')).to_return(Hello::HelloResponse.new(msg: 'test'))

client = Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure)
client.hello(Hello::HelloRequest.new(msg: 'hello')) # => send a request to server
client client.hello(Hello::HelloRequest.new(msg: 'hi')) # => Hello::HelloResponse.new(msg: 'test') (without any requests to server)
```

### Responding dynamically to the stubbed requests

```ruby
GrpcMock.stub_request("/hello.hello/Hello").to_return do |req, call|
Hello::HelloResponse.new(msg: "#{req.msg} too")
end

client = Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure)
client.hello(Hello::HelloRequest.new(msg: 'hi')) # => Hello::HelloResponse.new(msg: 'hi too')
```

### Real requests to network can be allowed or disabled

```ruby
client = Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure)

GrpcMock.disable_net_connect!
client.hello(Hello::HelloRequest.new(msg: 'hello')) # => Raise NetConnectNotAllowedError error

GrpcMock.allow_net_connect!
Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure) # => send a request to server
```

### Raising errors

**Exception declared by class**

```ruby
GrpcMock.stub_request("/hello.hello/Hello").to_raise(StandardError)

client = Hello::Hello::Stub.new('localhost:8000', :this_channel_is_insecure)
client.hello(Hello::HelloRequest.new(msg: 'hi')) # => Raise StandardError
```

**or by exception instance**

```ruby
GrpcMock.stub_request("/hello.hello/Hello").to_raise(StandardError.new("Some error"))
```

**or by string**

```ruby
GrpcMock.stub_request("/hello.hello/Hello").to_raise("Some error")
```

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/ganmacs/grpc_mock. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).