require "spec_helper"

describe Mongoid::Sessions::Options do

  describe "#with" do

    context "when passing some options" do

      let(:options) { { database: 'test' } }

      let!(:klass) do
        Band.with(options)
      end

      it "sets the options into the class" do
        expect(klass.persistence_options).to eq(options)
      end

      it "sets the options into the instance" do
        expect(klass.new.persistence_options).to eq(options)
      end

      it "doesnt set the options on class level" do
        expect(Band.new.persistence_options).to be_nil
      end

      context "when calling .collection method" do

        before do
          klass.collection
        end

        it "keeps the options" do
          expect(klass.persistence_options).to eq(options)
        end
      end
    end
  end

  describe ".with" do

    let(:options) { { database: 'test' } }

    let(:instance) do
      Band.new.with(options)
    end

    it "sets the options into" do
      expect(instance.persistence_options).to eq(options)
    end

    it "passes down the options to collection" do
      expect_any_instance_of(Moped::Session).to receive(:with).with(options).and_return({})
      instance.collection
    end
  end

  describe "#persistence_options" do

    it "touches the thread local" do
      expect(Thread.current).to receive(:[]).with("[mongoid][Band]:persistence-options").and_return({foo: :bar})
      expect(Band.persistence_options).to eq({foo: :bar})
    end

    it "cannot force a value on thread local" do
      expect {
        Band.set_persistence_options(Band, {})
      }.to raise_error(NoMethodError)
    end
  end

  describe ".persistence_options" do

    context "when options exist on the current thread" do

      let(:klass) do
        Band.with(write: { w: 2 })
      end

      it "returns the options" do
        expect(klass.persistence_options).to eq(write: { w: 2 })
      end
    end

    context "when there are no options on the current thread" do

      it "returns nil" do
        expect(Band.persistence_options).to be_nil
      end
    end
  end
end
