RSpec.describe Evil::Client::Builder::Scope do
  let(:builder) { described_class.new schema, parent }
  let(:options) { { id: 83, password: "qux", age: 38 } }
  let(:parent)  { double :parent, options: { user: "foo", password: "bar" } }
  let(:schema)  { double :schema, name: "fetch", settings: settings }

  let(:settings) do
    Class.new(Evil::Client::Settings) do
      option :id
      option :user
      option :password
    end
  end

  describe "#to_s" do
    subject { builder.to_s }

    it "represents the builder in a human-friendly manner" do
      expect(subject).to eq "#[Double :parent].scopes[:fetch]"
    end
  end

  describe "#to_str" do
    subject { builder.to_str }

    it "represents the builder in a human-friendly manner" do
      expect(subject).to eq "#[Double :parent].scopes[:fetch]"
    end
  end

  describe "#inspect" do
    subject { builder.inspect }

    it "represents the builder in a human-friendly manner" do
      expect(subject).to eq "#[Double :parent].scopes[:fetch]"
    end
  end

  describe "#schema" do
    subject { builder.schema }

    it "refers to the wrapped schema" do
      expect(subject).to eq schema
    end
  end

  describe "#parent" do
    subject { builder.parent }

    it "refers to wrapped parent" do
      expect(subject).to eq parent
    end
  end

  describe "#new" do
    subject { builder.new(**options) }

    it "creates scope with inherited options accepted by settings" do
      expect(subject).to be_a Evil::Client::Container::Scope
      expect(subject.schema).to eq schema
      expect(subject.options).to eq id: 83, user: "foo", password: "qux"
    end
  end

  describe "#call" do
    subject { builder.call(**options) }

    it "creates scope with inherited options accepted by settings" do
      expect(subject).to be_a Evil::Client::Container::Scope
      expect(subject.schema).to eq schema
      expect(subject.options).to eq id: 83, user: "foo", password: "qux"
    end
  end

  describe "#[]" do
    subject { builder[**options] }

    it "creates scope with inherited options accepted by settings" do
      expect(subject).to be_a Evil::Client::Container::Scope
      expect(subject.schema).to eq schema
      expect(subject.options).to eq id: 83, user: "foo", password: "qux"
    end
  end
end
