# 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