# encoding: utf-8
require 'spec_helper'
module Bullet
describe Rack do
let(:middleware) { Bullet::Rack.new app }
let(:app) { Support::AppDouble.new }
context "#html_request?" do
it "should be true if Content-Type is text/html and http body contains html tag" do
headers = {"Content-Type" => "text/html"}
response = double(:body => "
")
expect(middleware).to be_html_request(headers, response)
end
it "should be true if Content-Type is text/html and http body contains html tag with attributes" do
headers = {"Content-Type" => "text/html"}
response = double(:body => "")
expect(middleware).to be_html_request(headers, response)
end
it "should be false if there is no Content-Type header" do
headers = {}
response = double(:body => "")
expect(middleware).not_to be_html_request(headers, response)
end
it "should be false if Content-Type is javascript" do
headers = {"Content-Type" => "text/javascript"}
response = double(:body => "")
expect(middleware).not_to be_html_request(headers, response)
end
it "should be false if response body doesn't contain html tag" do
headers = {"Content-Type" => "text/html"}
response = double(:body => "Partial
")
expect(middleware).not_to be_html_request(headers, response)
end
end
context "empty?" do
it "should be false if response is a string and not empty" do
response = double(:body => "")
expect(middleware).not_to be_empty(response)
end
it "should be true if response is not found" do
response = ["Not Found"]
expect(middleware).to be_empty(response)
end
it "should be true if response body is empty" do
response = double(:body => "")
expect(middleware).to be_empty(response)
end
end
context "#call" do
context "when Bullet is enabled" do
it "should return original response body" do
expected_response = Support::ResponseDouble.new "Actual body"
app.response = expected_response
_, _, response = middleware.call({})
expect(response).to eq(expected_response)
end
it "should change response body if notification is active" do
expect(Bullet).to receive(:notification?).and_return(true)
expect(Bullet).to receive(:gather_inline_notifications).and_return("")
expect(Bullet).to receive(:perform_out_of_channel_notifications)
status, headers, response = middleware.call({"Content-Type" => "text/html"})
expect(headers["Content-Length"]).to eq("56")
expect(response).to eq([""])
end
it "should set the right Content-Length if response body contains accents" do
response = Support::ResponseDouble.new
response.body = "é"
app.response = response
expect(Bullet).to receive(:notification?).and_return(true)
expect(Bullet).to receive(:gather_inline_notifications).and_return("")
status, headers, response = middleware.call({"Content-Type" => "text/html"})
expect(headers["Content-Length"]).to eq("58")
end
end
context "when Bullet is disabled" do
before(:each) { allow(Bullet).to receive(:enable?).and_return(false) }
it "should not call Bullet.start_request" do
expect(Bullet).not_to receive(:start_request)
middleware.call({})
end
end
end
describe "#response_body" do
let(:response) { double }
let(:body_string) { "My Body" }
context "when `response` responds to `body`" do
before { allow(response).to receive(:body).and_return(body) }
context "when `body` returns an Array" do
let(:body) { [body_string, 'random string'] }
it "should return the plain body string" do
expect(middleware.response_body(response)).to eq body_string
end
end
context "when `body` does not return an Array" do
let(:body) { body_string }
it "should return the plain body string" do
expect(middleware.response_body(response)).to eq body_string
end
end
end
context "when `response` does not respond to `body`" do
before { allow(response).to receive(:first).and_return(body_string) }
it "should return the plain body string" do
expect(middleware.response_body(response)).to eq body_string
end
end
end
end
end