Module: ViewComponent::TestHelpers

Included in:
TestCase
Defined in:
lib/view_component/test_helpers.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#rendered_contentObject (readonly)



55
56
57
# File 'lib/view_component/test_helpers.rb', line 55

def rendered_content
  @rendered_content
end

Instance Method Details

#build_controller(klass) ⇒ Object



189
190
191
# File 'lib/view_component/test_helpers.rb', line 189

def build_controller(klass)
  klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
end

#controllerObject



108
109
110
# File 'lib/view_component/test_helpers.rb', line 108

def controller
  @controller ||= build_controller(Base.test_controller.constantize)
end

#render_in_view_context(&block) ⇒ Object

Execute the given block in the view context. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:

“‘ruby render_in_view_context do

render(MyComponent.new)

end

assert_text(“Hello, World!”) “‘



101
102
103
104
105
# File 'lib/view_component/test_helpers.rb', line 101

def render_in_view_context(&block)
  @page = nil
  @rendered_content = controller.view_context.instance_exec(&block)
  Nokogiri::HTML.fragment(@rendered_content)
end

#render_inline(component, **args, &block) ⇒ Nokogiri::HTML

Render a component inline. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:

“‘ruby render_inline(MyComponent.new) assert_text(“Hello, World!”) “`

Parameters:

Returns:

  • (Nokogiri::HTML)


79
80
81
82
83
84
85
86
87
88
89
# File 'lib/view_component/test_helpers.rb', line 79

def render_inline(component, **args, &block)
  @page = nil
  @rendered_content =
    if Rails.version.to_f >= 6.1
      controller.view_context.render(component, args, &block)
    else
      controller.view_context.render_component(component, &block)
    end

  Nokogiri::HTML.fragment(@rendered_content)
end

#rendered_componentString

Returns the result of a render_inline call.

Returns:

  • (String)


60
61
62
63
64
65
66
67
# File 'lib/view_component/test_helpers.rb', line 60

def rendered_component
  ViewComponent::Deprecation.warn(
    "`rendered_component` is deprecated and will be removed in v3.0.0. " \
    "Use `page` instead."
  )

  rendered_content
end

#requestObject



113
114
115
116
117
118
119
120
# File 'lib/view_component/test_helpers.rb', line 113

def request
  @request ||=
    begin
      request = ActionDispatch::TestRequest.create
      request.session = ActionController::TestSession.new
      request
    end
end

#with_controller_class(klass) ⇒ Object

Set the controller to be used while executing the given block, allowing access to controller-specific methods:

“‘ruby with_controller_class(UsersController) do

render_inline(MyComponent.new)

end “‘

Parameters:

  • klass (ActionController::Base)

    The controller to be used.



150
151
152
153
154
155
156
157
# File 'lib/view_component/test_helpers.rb', line 150

def with_controller_class(klass)
  old_controller = defined?(@controller) && @controller

  @controller = build_controller(klass)
  yield
ensure
  @controller = old_controller
end

#with_request_url(path) ⇒ Object

Set the URL of the current request (such as when using request-dependent path helpers):

“‘ruby with_request_url(“/users/42”) do

render_inline(MyComponent.new)

end “‘

Parameters:

  • path (String)

    The path to set for the current request.



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/view_component/test_helpers.rb', line 168

def with_request_url(path)
  old_request_path_info = request.path_info
  old_request_path_parameters = request.path_parameters
  old_request_query_parameters = request.query_parameters
  old_request_query_string = request.query_string
  old_controller = defined?(@controller) && @controller

  request.path_info = path
  request.path_parameters = Rails.application.routes.recognize_path(path)
  request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(path.split("?")[1]))
  request.set_header(Rack::QUERY_STRING, path.split("?")[1])
  yield
ensure
  request.path_info = old_request_path_info
  request.path_parameters = old_request_path_parameters
  request.set_header("action_dispatch.request.query_parameters", old_request_query_parameters)
  request.set_header(Rack::QUERY_STRING, old_request_query_string)
  @controller = old_controller
end

#with_variant(variant) ⇒ Object

Set the Action Pack request variant for the given block:

“‘ruby with_variant(:phone) do

render_inline(MyComponent.new)

end “‘

Parameters:

  • variant (Symbol)

    The variant to be set for the provided block.



131
132
133
134
135
136
137
138
# File 'lib/view_component/test_helpers.rb', line 131

def with_variant(variant)
  old_variants = controller.view_context.lookup_context.variants

  controller.view_context.lookup_context.variants = variant
  yield
ensure
  controller.view_context.lookup_context.variants = old_variants
end