diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ec5c9e8f..f65c132ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
## main
+* Generate preview at overridden path if one exists when using `--preview` flag.
+
+ *Nishiki Liu*
+
## 2.26.1
* Fix bug that raises when trying to use a collection before the component has been compiled.
diff --git a/docs/index.md b/docs/index.md
index 9283bfdee..c6e8b87b8 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1248,3 +1248,8 @@ ViewComponent is built by:
|:---:|:---:|:---:|:---:|:---:|
|@mixergtz|@jules2689|@g13ydson|@swanson|@bobmaerten|
|Medellin, Colombia|Toronto, Canada|João Pessoa, Brazil|Indianapolis, IN|Valenciennes, France|
+
+|
|
+|:---:|
+|@nshki|
+|Los Angeles, CA|
diff --git a/lib/rails/generators/preview/component_generator.rb b/lib/rails/generators/preview/component_generator.rb
index 440afcaf5..9dde66dd2 100644
--- a/lib/rails/generators/preview/component_generator.rb
+++ b/lib/rails/generators/preview/component_generator.rb
@@ -8,7 +8,11 @@ class ComponentGenerator < ::Rails::Generators::NamedBase
check_class_collision suffix: "ComponentPreview"
def create_preview_file
- template "component_preview.rb", File.join("test/components/previews", class_path, "#{file_name}_component_preview.rb")
+ preview_paths = Rails.application.config.view_component.preview_paths
+ return if preview_paths.count > 1
+
+ path_prefix = preview_paths.one? ? preview_paths.first : "test/components/previews"
+ template "component_preview.rb", File.join(path_prefix, class_path, "#{file_name}_component_preview.rb")
end
private
diff --git a/test/generators/component_generator_test.rb b/test/generators/component_generator_test.rb
index 6068ee416..f29b842b6 100644
--- a/test/generators/component_generator_test.rb
+++ b/test/generators/component_generator_test.rb
@@ -32,11 +32,34 @@ def test_component_tests
end
def test_component_preview
- run_generator %w[user --preview]
+ with_preview_paths([]) do
+ run_generator %w[user --preview]
- assert_file "test/components/previews/user_component_preview.rb" do |component|
- assert_match(/class UserComponentPreview < /, component)
- assert_match(/render\(UserComponent.new\)/, component)
+ assert_file "test/components/previews/user_component_preview.rb" do |component|
+ assert_match(/class UserComponentPreview < /, component)
+ assert_match(/render\(UserComponent.new\)/, component)
+ end
+ end
+ end
+
+ def test_component_preview_with_one_overridden_preview_path
+ with_preview_paths(%w[spec/components/previews]) do
+ run_generator %w[user --preview]
+
+ assert_file "spec/components/previews/user_component_preview.rb" do |component|
+ assert_match(/class UserComponentPreview < /, component)
+ assert_match(/render\(UserComponent.new\)/, component)
+ end
+ end
+ end
+
+ def test_component_preview_with_two_overridden_preview_paths
+ with_preview_paths(%w[spec/components/previews some/other/directory]) do
+ run_generator %w[user --preview]
+
+ assert_no_file "test/components/previews/user_component_preview.rb"
+ assert_no_file "spec/components/previews/user_component_preview.rb"
+ assert_no_file "some/other/directory/user_component_preview.rb"
end
end
@@ -76,11 +99,13 @@ def test_component_tests_with_namespace
end
def test_component_preview_with_namespace
- run_generator %w[admins/user --preview]
+ with_preview_paths([]) do
+ run_generator %w[admins/user --preview]
- assert_file "test/components/previews/admins/user_component_preview.rb" do |component|
- assert_match(/class Admins::UserComponentPreview < /, component)
- assert_match(/render\(Admins::UserComponent.new\)/, component)
+ assert_file "test/components/previews/admins/user_component_preview.rb" do |component|
+ assert_match(/class Admins::UserComponentPreview < /, component)
+ assert_match(/render\(Admins::UserComponent.new\)/, component)
+ end
end
end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 61996e03d..06434c639 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -21,6 +21,18 @@
require File.expand_path("../config/environment.rb", __FILE__)
require "rails/test_help"
+# Sets custom preview paths in tests.
+#
+# @param new_value [Array] List of preview paths
+# @yield Test code to run
+# @return [void]
+def with_preview_paths(new_value)
+ old_value = Rails.application.config.view_component.preview_paths
+ Rails.application.config.view_component.preview_paths = new_value
+ yield
+ Rails.application.config.view_component.preview_paths = old_value
+end
+
def with_preview_route(new_value)
old_value = Rails.application.config.view_component.preview_route
Rails.application.config.view_component.preview_route = new_value