require 'spec_helper'
RSpec.describe Alephant::Publisher::Queue::RevalidateWriter do
subject { described_class.new(config, message) }
let(:config) do
{
s3_bucket_id: 'qwerty',
s3_object_path: 'hello/int',
lookup_table_name: 'lookup_table'
}
end
let(:message) { double(body: JSON.generate(message_body)) }
let(:http_response) { { ticker: 'WMT', val: 180.00 } }
let(:ttl) { 45 }
let(:message_body) do
{
renderer_id: 'hello_world',
http_options: { id: 'hello_world', options: { ticker: 'WMT', duration: '1_day' } },
http_response: JSON.generate(http_response),
ttl: ttl
}
end
describe '#run!' do
let(:storage_double) { instance_double(Alephant::Cache, put: nil) }
let(:lookup_double) { instance_double(Alephant::Lookup::LookupHelper, write: nil) }
let(:renderer_double) do
instance_double(Alephant::Renderer::Renderer, views: { hello_world_view: hello_world_view })
end
let(:hello_world_view) { double(render: rendered_content, content_type: rendered_content_type) }
let(:rendered_content) { '
Hello, world!
' }
let(:rendered_content_type) { 'text/html' }
let(:storage_location) { "hello_world/hello_world_view/#{Crimp.signature(message_body[:http_options])}" }
before do
allow(Alephant::Renderer).to receive(:create).and_return(renderer_double)
allow(Alephant::Cache).to receive(:new).and_return(storage_double)
allow(Alephant::Lookup).to receive(:create).and_return(lookup_double)
end
it 'renders the http_response in the Renderer' do
expect(renderer_double).to receive(:views).and_return(foo: hello_world_view)
expect(hello_world_view).to receive(:render)
expect(hello_world_view).to receive(:content_type)
subject.run!
end
it 'stores the HTTP content in S3 with Alephant::Cache' do
expect(storage_double)
.to receive(:put)
.with(storage_location, rendered_content, rendered_content_type, ttl: ttl)
subject.run!
end
it 'writes the S3 location with Alephant::Lookup' do
expect(lookup_double)
.to receive(:write)
.with(:hello_world_view, message_body[:http_options][:options], 1, storage_location)
subject.run!
end
end
describe '#renderer' do
it 'builds an Alephant::Renderer::Renderer object' do
expect(subject.renderer).to be_a(Alephant::Renderer::Renderer)
end
it 'passes through the `renderer_id` from the message' do
expect(Alephant::Renderer)
.to receive(:create)
.with(hash_including(renderer_id: 'hello_world'), http_response)
subject.renderer
end
end
describe '#storage' do
it 'builds an Alephant::Cache object' do
expect(subject.storage).to be_a(Alephant::Cache)
end
end
describe '#lookup' do
it 'builds an Alephant::Lookup object' do
expect(subject.lookup).to be_a(Alephant::Lookup::LookupHelper)
end
end
end