Module: ViewComponent::TestHelpers
- Included in:
- SystemTestHelpers, TestCase
- Defined in:
- lib/view_component/test_helpers.rb
Instance Attribute Summary collapse
-
#rendered_content ⇒ ActionView::OutputBuffer
readonly
Returns the result of a render_inline call.
Instance Method Summary collapse
-
#render_in_view_context(*args, &block) ⇒ Object
Execute the given block in the view context (using ‘instance_exec`).
-
#render_inline(component, **args, &block) ⇒ Nokogiri::HTML
Render a component inline.
-
#render_preview(name, from: __vc_test_helpers_preview_class, params: {}) ⇒ Nokogiri::HTML
Render a preview inline.
-
#vc_test_controller ⇒ ActionController::Base
Access the controller used by ‘render_inline`:.
-
#vc_test_request ⇒ ActionDispatch::TestRequest
Access the request used by ‘render_inline`:.
-
#with_controller_class(klass) ⇒ Object
Set the controller to be used while executing the given block, allowing access to controller-specific methods:.
-
#with_request_url(full_path, host: nil, method: nil, format: :html) ⇒ Object
Set the URL of the current request (such as when using request-dependent path helpers):.
-
#with_variant(variant) ⇒ Object
Set the Action Pack request variant for the given block:.
Instance Attribute Details
#rendered_content ⇒ ActionView::OutputBuffer (readonly)
Returns the result of a render_inline call.
34 35 36 |
# File 'lib/view_component/test_helpers.rb', line 34 def rendered_content @rendered_content end |
Instance Method Details
#render_in_view_context(*args, &block) ⇒ Object
Execute the given block in the view context (using ‘instance_exec`). Internally sets `page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used. All arguments are forwarded to the block.
“‘ruby render_in_view_context(arg1, arg2: nil) do |arg1, arg2:|
render(MyComponent.new(arg1, arg2))
end
assert_text(“Hello, World!”) “‘
110 111 112 113 114 |
# File 'lib/view_component/test_helpers.rb', line 110 def render_in_view_context(*args, &block) @page = nil @rendered_content = vc_test_controller.view_context.instance_exec(*args, &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!”) “`
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/view_component/test_helpers.rb', line 46 def render_inline(component, **args, &block) @page = nil @rendered_content = if Rails.version.to_f >= 6.1 vc_test_controller.view_context.render(component, args, &block) # :nocov: else vc_test_controller.view_context.render_component(component, &block) end # :nocov: Nokogiri::HTML.fragment(@rendered_content) end |
#render_preview(name, from: __vc_test_helpers_preview_class, params: {}) ⇒ Nokogiri::HTML
Render a preview inline. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
“‘ruby render_preview(:default) assert_text(“Hello, World!”) “`
Note: ‘#rendered_preview` expects a preview to be defined with the same class name as the calling test, but with `Test` replaced with `Preview`:
MyComponentTest -> MyComponentPreview etc.
In RSpec, ‘Preview` is appended to `described_class`.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/view_component/test_helpers.rb', line 81 def render_preview(name, from: __vc_test_helpers_preview_class, params: {}) previews_controller = __vc_test_helpers_build_controller(Rails.application.config.view_component.preview_controller.constantize) # From what I can tell, it's not possible to overwrite all request parameters # at once, so we set them individually here. params.each do |k, v| previews_controller.request.params[k] = v end previews_controller.request.params[:path] = "#{from.preview_name}/#{name}" previews_controller.set_response!(ActionDispatch::Response.new) result = previews_controller.previews @rendered_content = result Nokogiri::HTML.fragment(@rendered_content) end |
#vc_test_controller ⇒ ActionController::Base
Access the controller used by ‘render_inline`:
“‘ruby test “logged out user sees login link” do
vc_test_controller.expects(:logged_in?).at_least_once.returns(false)
render_inline(LoginComponent.new)
assert_selector("[aria-label='You must be signed in']")
end “‘
225 226 227 |
# File 'lib/view_component/test_helpers.rb', line 225 def vc_test_controller @vc_test_controller ||= __vc_test_helpers_build_controller(Base.test_controller.constantize) end |
#vc_test_request ⇒ ActionDispatch::TestRequest
Access the request used by ‘render_inline`:
“‘ruby test “component does not render in Firefox” do
request.env["HTTP_USER_AGENT"] = "Mozilla/5.0"
render_inline(NoFirefoxComponent.new)
refute_component_rendered
end “‘
240 241 242 243 244 245 246 247 248 249 |
# File 'lib/view_component/test_helpers.rb', line 240 def vc_test_request require "action_controller/test_case" @vc_test_request ||= begin out = ActionDispatch::TestRequest.create out.session = ActionController::TestSession.new out 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 “‘
145 146 147 148 149 150 151 152 |
# File 'lib/view_component/test_helpers.rb', line 145 def with_controller_class(klass) old_controller = defined?(@vc_test_controller) && @vc_test_controller @vc_test_controller = __vc_test_helpers_build_controller(klass) yield ensure @vc_test_controller = old_controller end |
#with_request_url(full_path, host: nil, method: nil, format: :html) ⇒ 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 “‘
To use a specific host, pass the host param:
“‘ruby with_request_url(“/users/42”, host: “app.example.com”) do
render_inline(MyComponent.new)
end “‘
To specify a request method, pass the method param:
“‘ruby with_request_url(“/users/42”, method: “POST”) do
render_inline(MyComponent.new)
end “‘
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/view_component/test_helpers.rb', line 181 def with_request_url(full_path, host: nil, method: nil, format: :html) old_request_host = vc_test_request.host old_request_method = vc_test_request.request_method old_request_path_info = vc_test_request.path_info old_request_path_parameters = vc_test_request.path_parameters old_request_query_parameters = vc_test_request.query_parameters old_request_query_string = vc_test_request.query_string old_request_format = vc_test_request.format.symbol old_controller = defined?(@vc_test_controller) && @vc_test_controller path, query = full_path.split("?", 2) vc_test_request.instance_variable_set(:@fullpath, full_path) vc_test_request.instance_variable_set(:@original_fullpath, full_path) vc_test_request.host = host if host vc_test_request.request_method = method if method vc_test_request.path_info = path vc_test_request.path_parameters = Rails.application.routes.recognize_path_with_request(vc_test_request, path, {}) vc_test_request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(query).with_indifferent_access) vc_test_request.set_header(Rack::QUERY_STRING, query) vc_test_request.format = format yield ensure vc_test_request.host = old_request_host vc_test_request.request_method = old_request_method vc_test_request.path_info = old_request_path_info vc_test_request.path_parameters = old_request_path_parameters vc_test_request.set_header("action_dispatch.request.query_parameters", old_request_query_parameters) vc_test_request.set_header(Rack::QUERY_STRING, old_request_query_string) vc_test_request.format = old_request_format @vc_test_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 “‘
126 127 128 129 130 131 132 133 |
# File 'lib/view_component/test_helpers.rb', line 126 def with_variant(variant) old_variants = vc_test_controller.view_context.lookup_context.variants vc_test_controller.view_context.lookup_context.variants = variant yield ensure vc_test_controller.view_context.lookup_context.variants = old_variants end |