require "rails_helper" RSpec.describe ApiController do controller do def index respond_to do |format| format.text { render plain: "Plain text" } format.json { render json: "JSON" } end end def show respond_to do |format| format.text { render plain: "Plain text" } format.any { render plain: "Fallback" } end end end it "returns the first format when given no Accept header" do get :index expect(response.media_type).to eq("text/plain") end it "returns the first format when given a wildcard Accept header" do request.headers["Accept"] = "*/*" get :index expect(response.media_type).to eq("text/plain") end it "returns the first format when given Safari and Chrome's default Accept header" do request.headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" get :index expect(response.media_type).to eq("text/plain") end it "returns a text/plain response when explicitly requested" do request.headers["Accept"] = "text/plain" get :index expect(response.media_type).to eq("text/plain") end it "returns an application/json response when explicitly requested" do request.headers["Accept"] = "application/json" get :index expect(response.media_type).to eq("application/json") end it "raises an error if given an unsupported MIME type" do request.headers["Accept"] = "image/webp" expect { get :index }.to raise_error(ActionController::UnknownFormat) end it "does not raise an error when given an unsupported MIME type if an 'any' format is present" do request.headers["Accept"] = "image/webp" get :show, params: { id: 1 } expect(response.body).to eq("Fallback") end it "raises an error when given an invalid MIME type" do request.headers["Accept"] = "not a valid MIME type" expect { get :index }.to raise_error(Mime::Type::InvalidMimeType) end it "raises an error when given an invalid MIME type even if an 'any' format is present" do request.headers["Accept"] = "not a valid MIME type" expect { get :show, params: { id: 1 } }.to raise_error(Mime::Type::InvalidMimeType) end end