require "spec_helper"

describe Alephant::Publisher::Queue::Writer do
  let(:opts) do
    {
      :lookup_table_name    => "lookup_table_name",
      :msg_vary_id_path     => "$.vary",
      :renderer_id          => :renderer_id,
      :s3_bucket_id         => :s3_bucket_id,
      :s3_object_path       => :s3_object_path,
      :sequence_id_path     => "$.sequence",
      :sequencer_table_name => "sequencer_table_name",
      :view_path            => :view_path
    }
  end

  before(:each) do
    AWS.stub!

    allow_any_instance_of(Alephant::Cache).to receive(:initialize)
      .with(
        opts[:s3_bucket_id],
        opts[:s3_object_path]
      )

    allow_any_instance_of(
      Alephant::Sequencer::SequenceTable
    ).to receive_messages(
      :create          => nil,
      :sequence_exists => nil
    )

    allow_any_instance_of(Alephant::Sequencer::Sequencer)
      .to receive_messages(
        :sequencer_id_from => nil,
        :set_last_seen     => nil,
        :get_last_seen     => nil,
        :exists?           => nil
      )

    allow_any_instance_of(Alephant::Lookup::LookupTable)
      .to receive_messages(
        :create     => nil,
        :table_name => nil
      )

    allow_any_instance_of(
      Alephant::Renderer::Renderer
    ).to receive(:views).and_return({})
  end

  describe "#run!" do
    let(:msg) do
      data = {
        "sequence" => "1",
        "vary"     => "foo"
      }
      Struct.new(:body, :id).new(data.to_json, "id")
    end

    let(:expected_location) do
      "renderer_id/component_id/218c835cec343537589dbf1619532e4d/1"
    end

    let(:renderer) do
      instance_double(Alephant::Renderer::Renderer)
    end

    subject do
      Alephant::Publisher::Queue::Writer.new(opts, msg)
    end

    it "should write the correct lookup location" do
      allow_any_instance_of(Alephant::Cache).to receive(:put)

      allow_any_instance_of(Alephant::Lookup::LookupHelper).to receive(:write)
        .with(
          "component_id",
          { :variant => "foo" },
          1,
          expected_location
        )
    end

    it "should put the correct location, content to cache" do
      allow_any_instance_of(Alephant::Lookup::LookupHelper).to receive(:write)

      allow_any_instance_of(Alephant::Cache).to receive(:put)
        .with(expected_location, "content", "foo/bar", :msg_id=>"id")
    end

    after do
      subject.run!
    end
  end
end