-
Notifications
You must be signed in to change notification settings - Fork 443
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support devise using ViewComponent::TestCase #1849
base: main
Are you sure you want to change the base?
Changes from all commits
5c1edde
d3ad78f
73281ef
94dd746
57b562f
2fa7ada
b7e0c99
0041fb4
275ea47
633e682
f24369a
41e1169
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -75,7 +75,7 @@ def render_inline(component, **args, &block) | |
# @param params [Hash] Parameters to be passed to the preview. | ||
# @return [Nokogiri::HTML] | ||
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) | ||
previews_controller = __vc_render_preview_controller | ||
|
||
# From what I can tell, it's not possible to overwrite all request parameters | ||
# at once, so we set them individually here. | ||
|
@@ -225,6 +225,16 @@ def vc_test_request | |
end | ||
end | ||
|
||
def before_setup | ||
@request = __vc_render_preview_controller.request | ||
super | ||
end | ||
|
||
def teardown | ||
super | ||
@vc_render_preview_controller = nil | ||
end | ||
|
||
# Note: We prefix private methods here to prevent collisions in consumer's tests. | ||
private | ||
|
||
|
@@ -244,5 +254,9 @@ def __vc_test_helpers_preview_class | |
rescue NameError | ||
raise NameError, "`render_preview` expected to find #{result}, but it does not exist." | ||
end | ||
|
||
def __vc_render_preview_controller | ||
@vc_render_preview_controller ||= __vc_test_helpers_build_controller(Rails.application.config.view_component.preview_controller.constantize) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is slightly changing behavior since we're now memoizing this value. Is this okay to memoize or do we need to reset it each render? I think we want to keep the old behavior and have it re-evaluate per-call to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mentioned it above, but not every test needs a preview controller. Can we revert this back to the previous, lazy loaded implementation to avoid extra work in test suites? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately to support devise I don't see this being possible. We can't predict when One possible alternative that might meet your requirements is a new concern, which sets up a test environment for devise and Honestly if it weren't for the fact that this project already has a bunch of minitests built before I started working on it, I'd just move the whole thing over to rspec and be done with it :D There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Something like module ViewComponent::TestHelpers::DevisePreviewHelper
def self.included(base)
base.instance_eval do
setup do
@request = __vc_render_preview_controller.request
end
teardown do
@request = nil
@vc_render_preview_controller = nil
end
# ....
end
def __vc_render_preview_controller
@vc_render_preview_controller ||= super
end
end There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To help clarify things, are devise helpers only broken for previews or for previews + render_inline? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just checked, it works for |
||
end | ||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't correct since this is creating the request from the preview controller, not using the same request the
request
method uses. Can we update this to use the proper request?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I follow. On line 78 we have
previews_controller = __vc_render_preview_controller
,#request
tracks toViewComponent::Base#request
which memoizes the request.If you debug the call you can see that the request objects are indeed the same.
@request -> #<ActionDispatch::TestRequest:0x000000010c675838>
preview_controller.request -> #<ActionDispatch::TestRequest:0x000000010c675838>
These are identical. Am I missing something?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That wasn't completely clear in hindsight, sorry about that.
We shouldn't use
__vc_render_preview_controller.request
here because we don't need to couple the@request
to the preview controller or how it's constructed. Also not every test requires a preview controller to be present either, so we should skip instantiating one except where necessary.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually we do. The Warden context is not correctly set up in
ActionDispatch::TestRequest.create
. I tested this myself with one of your earlier suggestions.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We don't always use the preview controller instance to render since users can pass their own controller class to us and
render_inline
uses its own controller.What does Devise need the controller instance for?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It fails setting up the request object.
https://github.com/heartcombo/devise/blob/f6e73e5b5c8f519f4be29ac9069c6ed8a2343ce4/lib/devise/test/controller_helpers.rb#L44
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@BlakeWilliams to be clear, this path is ONLY triggered if you call
current_user
in any of your components. Which is kindof edge case ish right now. I actually refactored so that current_user is only ever passed into components when they need it, so this PR actually wont even apply to my case anymore.That said, I read somewhere that the long term goal of ViewComponent is that it would be used for page rendering as well, which will make this a lot less of an edge case.