require_relative "../spec_helper"

describe "halt plugin" do
  it "should still have halt return current response if no arguments given" do
    app(:halt) do |r|
      response.write 'foo'
      r.halt
    end

    body.must_equal "foo"
  end

  it "should still have halt return rack response as argument given it as argument" do
    app(:halt) do |r|
      r.halt [200, {}, ['foo']]
    end

    body.must_equal "foo"
  end

  it "should consider string argument as response body" do
    app(:halt) do |r|
      r.halt "foo"
    end

    body.must_equal "foo"
  end

  it "should consider integer argument as response status" do
    app(:halt) do |r|
      r.halt 300
    end

    status.must_equal 300 
  end

  it "should consider other single arguments similar to block bodies" do
    app(:bare) do
      plugin :halt
      plugin :json
      route do |r|
        r.halt({'a'=>1})
      end
    end

    body.must_equal  '{"a":1}'
  end

  it "should consider 2 arguments as response status and body" do
    app(:halt) do |r|
      r.halt 300, "foo"
    end

    status.must_equal 300 
    body.must_equal "foo"
  end

  it "should handle 2nd of 2 arguments similar to block bodies" do
    app(:bare) do
      plugin :halt
      plugin :json
      route do |r|
        r.halt(300, {'a'=>1})
      end
    end

    status.must_equal 300 
    body.must_equal  '{"a":1}'
  end

  it "should consider 3 arguments as response" do
    app(:halt) do |r|
      r.halt 300, {'a'=>'b'}, "foo"
    end

    status.must_equal 300 
    header('a').must_equal 'b'
    body.must_equal "foo"
  end

  it "should consider an array as a rack response" do
    app(:halt) do |r|
      r.halt [300, {'a'=>'b'}, ["foo"]]
    end

    status.must_equal 300 
    header('a').must_equal 'b'
    body.must_equal "foo"
  end

  it "should handle 3rd of 3 arguments similar to block bodies" do
    app(:bare) do
      plugin :halt
      plugin :json
      route do |r|
        r.halt(300, {'a'=>'b'}, {'a'=>1})
      end
    end

    status.must_equal 300 
    header('a').must_equal 'b'
    body.must_equal  '{"a":1}'
  end

  it "should raise an error for too many arguments" do
    app(:halt) do |r|
      r.halt 300, {'a'=>'b'}, "foo", 1
    end

    proc{req}.must_raise(Roda::RodaError)
  end

  it "should raise an error for single argument not integer, String, or Array" do
    app(:halt) do |r|
      r.halt nil
    end

    proc{req}.must_raise(Roda::RodaError)
  end

  it "should raise an error for single argument not integer, String, or Array" do
    app(:halt) do |r|
      r.halt('a'=>'b')
    end

    proc{req}.must_raise(Roda::RodaError)
  end
end
