module RSpec::Grape::Entity::ItsExposure

Public Instance Methods

its_exposure(attribute, *options, &block) click to toggle source

Creates a nested example group named by the entity exposure ‘attribute`, and then generates an example using the submitted block.

@example

class MyEntity < Grape::Entity
  expose :size, safe: true
  expose :name do
    expose :first_name, as: :first
    expose :last_name, as: :last
  end
end

# This ...
describe MyEntity do
  its_exposure(:size) { is_expected.to be_safe }
end

# ... generates the same runtime structure as this:
describe MyEntity do
  describe "size" do
    let(:entity) { described_class }

    it "is_expected.to be_safe" do
      exposure = entity.find_exposure :size
      expect(exposure).to be_safe
    end
  end
end

The attribute can be a ‘Symbol` or a `String`. Given a `String` with dots, the result is as though you concatenated that `String` onto the entities nested exposures.

@example

describe MyEntity do
  its_exposure("name.first_name") { should have_key :first }
end

With an implicit exposure, ‘is_expected` can be used as an alternative to `should` (e.g. for one-liner use).

@example

describe MyEntity do
  its_exposure(:size) { is_expected.to eq(0) }
end
# File lib/rspec_grape_entity/its_exposure.rb, line 55
def its_exposure(attribute, *options, &block)
  its_caller = caller.reject { |file_line| file_line =~ %r{/lib/rspec_grape_entity/its_exposure} }

  describe_exposure attribute, caller: its_caller do
    options << {} unless options.last.is_a?(Hash)
    options.last.merge!(caller: its_caller)

    if block
      example(nil, *options, &block)
    else
      example(nil, *options) { is_expected.not_to be_nil }
    end
  end
end