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| +|:---:| +|@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