diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa5922ad0..4b12a3c51 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,7 +61,7 @@ jobs: run: | bundle config path vendor/bundle bundle update - bundle exec rake + bundle exec rake test spec env: RAISE_ON_WARNING: 1 MEASURE_COVERAGE: true diff --git a/.rspec b/.rspec new file mode 100644 index 000000000..c99d2e739 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/Gemfile b/Gemfile index d69c96304..730c26d06 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,7 @@ rails_version = (ENV["RAILS_VERSION"] || "~> 7.0.0").to_s gem "capybara", "~> 3" gem "rails", rails_version == "main" ? {git: "https://github.com/rails/rails", ref: "main"} : rails_version +gem "rspec-rails", "~> 5" if RUBY_VERSION >= "3.1" gem "net-imap", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 44fb1c6e3..c5c33abf4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -103,6 +103,7 @@ GEM coderay (1.1.3) concurrent-ruby (1.1.10) crass (1.0.6) + diff-lcs (1.5.0) digest (3.1.0) docile (1.4.0) erb_lint (0.0.37) @@ -193,6 +194,23 @@ GEM rake (13.0.6) regexp_parser (2.4.0) rexml (3.2.5) + rspec-core (3.11.0) + rspec-support (~> 3.11.0) + rspec-expectations (3.11.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.11.0) + rspec-mocks (3.11.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.11.0) + rspec-rails (5.1.2) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) + rspec-core (~> 3.10) + rspec-expectations (~> 3.10) + rspec-mocks (~> 3.10) + rspec-support (~> 3.10) + rspec-support (3.11.0) rubocop (1.13.0) parallel (~> 1.10) parser (>= 3.0.0.0) @@ -268,6 +286,7 @@ DEPENDENCIES pry (~> 0.13) rails (~> 7.0.0) rake (~> 13.0) + rspec-rails (~> 5) simplecov (~> 0.18.0) simplecov-console (~> 0.7.2) slim (~> 4.0) diff --git a/Rakefile b/Rakefile index abb3f2aa6..a77107bb8 100644 --- a/Rakefile +++ b/Rakefile @@ -11,6 +11,12 @@ Rake::TestTask.new(:test) do |t| t.test_files = FileList["test/**/*_test.rb"] end +begin + require "rspec/core/rake_task" + RSpec::Core::RakeTask.new(:spec) +rescue LoadError +end + desc "Runs benchmarks against components" task :partial_benchmark do ruby "./performance/partial_benchmark.rb" diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index fa2af924c..3d8dac552 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,6 +9,10 @@ title: Changelog ## main +* Add support for `render_preview` in RSpec tests. + + *Thomas Hutterer* + ## 2.59.0 * Expose Capybara DSL methods directly inside tests. diff --git a/gemfiles/rails_6.0.gemfile b/gemfiles/rails_6.0.gemfile index ac8cea8ca..837afbd05 100644 --- a/gemfiles/rails_6.0.gemfile +++ b/gemfiles/rails_6.0.gemfile @@ -4,6 +4,7 @@ source "https://rubygems.org" gem "capybara", "~> 3" gem "rails", "~> 6.0.0" +gem "rspec-rails", "~> 5.1" gem "tailwindcss-rails", "~> 2.0" gemspec path: "../" diff --git a/gemfiles/rails_6.1.gemfile b/gemfiles/rails_6.1.gemfile index 3280ead1b..4f68feb46 100644 --- a/gemfiles/rails_6.1.gemfile +++ b/gemfiles/rails_6.1.gemfile @@ -4,6 +4,7 @@ source "https://rubygems.org" gem "capybara", "~> 3" gem "rails", "~> 6.1.0" +gem "rspec-rails", "~> 5.1" gem "tailwindcss-rails", "~> 2.0" gem "net-smtp", require: false gem "net-imap", require: false diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile index 72345f4ca..cfc057a56 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_7.0.gemfile @@ -4,6 +4,7 @@ source "https://rubygems.org" gem "capybara", "~> 3" gem "rails", "~> 7.0.0" +gem "rspec-rails", "~> 5.1" gem "tailwindcss-rails", "~> 2.0" gemspec path: "../" diff --git a/gemfiles/rails_head.gemfile b/gemfiles/rails_head.gemfile index 8431b9a11..d187ac20e 100644 --- a/gemfiles/rails_head.gemfile +++ b/gemfiles/rails_head.gemfile @@ -4,6 +4,7 @@ source "https://rubygems.org" gem "capybara", "~> 3" gem "rails", github: "rails/rails", branch: "main" +gem "rspec-rails", "~> 5.1" gem "tailwindcss-rails", "~> 2.0" gemspec path: "../" diff --git a/lib/view_component/render_preview_helper.rb b/lib/view_component/render_preview_helper.rb index dff5785c2..0f7bb8c37 100644 --- a/lib/view_component/render_preview_helper.rb +++ b/lib/view_component/render_preview_helper.rb @@ -15,11 +15,21 @@ module RenderPreviewHelper # # MyComponentTest -> MyComponentPreview etc. # + # In RSpec, `Preview` is appended to `described_class`. + # # @param preview [String] The name of the preview to be rendered. # @return [Nokogiri::HTML] def render_preview(name) begin - preview_klass = self.class.name.gsub("Test", "Preview") + preview_klass = if respond_to?(:described_class) + if described_class.nil? + raise "`render_preview` expected a described_class, but it is nil." + end + + "#{described_class}Preview" + else + self.class.name.gsub("Test", "Preview") + end preview_klass = preview_klass.constantize rescue NameError raise NameError.new( diff --git a/spec/sandbox b/spec/sandbox new file mode 120000 index 000000000..43fb4e071 --- /dev/null +++ b/spec/sandbox @@ -0,0 +1 @@ +../test/sandbox \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 000000000..2c4309696 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "simplecov" +require "simplecov-console" + +if ENV["MEASURE_COVERAGE"] + SimpleCov.start do + command_name "rails#{ENV["RAILS_VERSION"]}-ruby#{ENV["RUBY_VERSION"]}" if ENV["RUBY_VERSION"] + + formatter SimpleCov::Formatter::Console + end +end + +require "bundler/setup" + +# Configure Rails Environment +ENV["RAILS_ENV"] = "test" + +require "view_component/deprecation" +ViewComponent::Deprecation.behavior = :silence + +require File.expand_path("../sandbox/config/environment.rb", __FILE__) +require "rspec/rails" + +RSpec.configure do |config| + config.include ViewComponent::TestHelpers +end diff --git a/test/sandbox/spec/components/previews/preview_component_spec.rb b/test/sandbox/spec/components/previews/preview_component_spec.rb new file mode 100644 index 000000000..7ff19a5db --- /dev/null +++ b/test/sandbox/spec/components/previews/preview_component_spec.rb @@ -0,0 +1,25 @@ +describe PreviewComponent do + include ViewComponent::RenderPreviewHelper + + before do + ViewComponent::Preview.load_previews + end + + it "renders the preview" do + render_preview(:default) + + expect(page).to have_css "h1", text: "Lorem Ipsum" + end +end + +describe "PreviewComponent" do + include ViewComponent::RenderPreviewHelper + + before do + ViewComponent::Preview.load_previews + end + + it "raises an error" do + expect { render_preview(:default) }.to raise_error(/expected a described_class/) + end +end