| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 
 | # frozen_string_literal: true
require "abstract_unit"
require "controller/fake_models"
require "active_support/logger"
class RenderJsonTest < ActionController::TestCase
  class JsonRenderable
    def as_json(options = {})
      hash = { a: :b, c: :d, e: :f }
      hash.except!(*options[:except]) if options[:except]
      hash
    end
    def to_json(options = {})
      super except: [:c, :e]
    end
  end
  class TestController < ActionController::Base
    protect_from_forgery
    def self.controller_path
      "test"
    end
    def render_json_nil
      render json: nil
    end
    def render_json_render_to_string
      render plain: render_to_string(json: "[]")
    end
    def render_json_hello_world
      render json: ActiveSupport::JSON.encode(hello: "world")
    end
    def render_json_hello_world_with_status
      render json: ActiveSupport::JSON.encode(hello: "world"), status: 401
    end
    def render_json_hello_world_with_callback
      render json: ActiveSupport::JSON.encode(hello: "world"), callback: "alert"
    end
    def render_json_with_custom_content_type
      render json: ActiveSupport::JSON.encode(hello: "world"), content_type: "text/javascript"
    end
    def render_symbol_json
      render json: ActiveSupport::JSON.encode(hello: "world")
    end
    def render_json_with_render_to_string
      render json: { hello: render_to_string(partial: "partial") }
    end
    def render_json_with_extra_options
      render json: JsonRenderable.new, except: [:c, :e]
    end
    def render_json_without_options
      render json: JsonRenderable.new
    end
  end
  tests TestController
  def setup
    # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
    # a more accurate simulation of what happens in "real life".
    super
    @controller.logger = ActiveSupport::Logger.new(nil)
    @request.host = "www.nextangle.com"
  end
  def test_render_json_nil
    get :render_json_nil
    assert_equal "null", @response.body
    assert_equal "application/json", @response.media_type
  end
  def test_render_json_render_to_string
    get :render_json_render_to_string
    assert_equal "[]", @response.body
  end
  def test_render_json
    get :render_json_hello_world
    assert_equal '{"hello":"world"}', @response.body
    assert_equal "application/json", @response.media_type
  end
  def test_render_json_with_status
    get :render_json_hello_world_with_status
    assert_equal '{"hello":"world"}', @response.body
    assert_equal 401, @response.status
  end
  def test_render_json_with_callback
    get :render_json_hello_world_with_callback, xhr: true
    assert_equal '/**/alert({"hello":"world"})', @response.body
    assert_equal "text/javascript", @response.media_type
  end
  def test_render_json_with_custom_content_type
    get :render_json_with_custom_content_type, xhr: true
    assert_equal '{"hello":"world"}', @response.body
    assert_equal "text/javascript", @response.media_type
  end
  def test_render_symbol_json
    get :render_symbol_json
    assert_equal '{"hello":"world"}', @response.body
    assert_equal "application/json", @response.media_type
  end
  def test_render_json_with_render_to_string
    get :render_json_with_render_to_string
    assert_equal '{"hello":"partial html"}', @response.body
    assert_equal "application/json", @response.media_type
  end
  def test_render_json_forwards_extra_options
    get :render_json_with_extra_options
    assert_equal '{"a":"b"}', @response.body
    assert_equal "application/json", @response.media_type
  end
  def test_render_json_calls_to_json_from_object
    get :render_json_without_options
    assert_equal '{"a":"b"}', @response.body
  end
end
 |