From ed26361edf254269a01b599fa5ee1dfd18f93f97 Mon Sep 17 00:00:00 2001 From: Patrick Arnett Date: Sat, 7 Jun 2025 09:17:48 -0400 Subject: [PATCH] Add Rails 8.0 support --- .github/workflows/rspec.yml | 15 +- .github/workflows/rubocop.yml | 11 +- .gitignore | 1 + .rubocop.yml | 14 +- Appraisals | 15 + CHANGELOG.md | 5 + Gemfile | 2 + Gemfile.lock | 396 ++++---- README.md | 2 +- Rakefile | 2 +- .../digestors/with_view_component_rb.rb | 2 +- .../resolvers/view_component_resolver.rb | 2 +- .../trackers/view_component_tracking.rb | 2 +- .../fragment_caching/version.rb | 2 +- spec/dummy/Rakefile | 6 + spec/dummy/config/environments/test.rb | 4 +- spec/dummy/lib/tasks/dump_output.rake | 17 + spec/features/fragment_caching_spec.rb | 881 +++++++++--------- spec/rails_helper.rb | 2 +- view_component-fragment_caching.gemspec | 12 +- 20 files changed, 763 insertions(+), 630 deletions(-) create mode 100644 Appraisals create mode 100644 spec/dummy/Rakefile create mode 100644 spec/dummy/lib/tasks/dump_output.rake diff --git a/.github/workflows/rspec.yml b/.github/workflows/rspec.yml index d503401..9437c08 100644 --- a/.github/workflows/rspec.yml +++ b/.github/workflows/rspec.yml @@ -12,16 +12,9 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: 3.2.4 - - name: Cache gems - uses: actions/cache@v1 - with: - path: vendor/bundle - key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-rubocop- - name: Install gems - run: | - bundle config path vendor/bundle - bundle install + run: bundle install + - name: Install appraisal + run: bundle exec appraisal install - name: Run RSpec - run: bundle exec rspec + run: bundle exec appraisal rspec diff --git a/.github/workflows/rubocop.yml b/.github/workflows/rubocop.yml index b860225..7b1a0bb 100644 --- a/.github/workflows/rubocop.yml +++ b/.github/workflows/rubocop.yml @@ -12,16 +12,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: 3.2.4 - - name: Cache gems - uses: actions/cache@v1 - with: - path: vendor/bundle - key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-rubocop- - name: Install gems - run: | - bundle config path vendor/bundle - bundle install + run: bundle install - name: Run RuboCop run: bundle exec rubocop --parallel diff --git a/.gitignore b/.gitignore index 90ef57b..08149ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.gem /.bundle/ /doc/ +/gemfiles/ /log/*.log /pkg/ /tmp/ diff --git a/.rubocop.yml b/.rubocop.yml index 8868c94..ec603f9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,19 +1,24 @@ -require: +plugins: - rubocop-rails - rubocop-rspec + - rubocop-rspec_rails AllCops: EnabledByDefault: true Exclude: - bin/**/* + - gemfiles/**/* - spec/dummy/bin/**/* - vendor/bundle/**/* - Rakefile - TargetRubyVersion: 2.6 + TargetRubyVersion: 2.7 Bundler/GemComment: Enabled: false +Gemspec/DevelopmentDependencies: + Enabled: false + Layout/RedundantLineBreak: Enabled: false @@ -49,6 +54,8 @@ Style/DisableCopsWithinSourceCodeDirective: - Metrics/BlockLength - Metrics/ParameterLists - Naming/AccessorMethodName + - RSpec/BeforeAfterAll + - RSpec/MultipleExpectations - Style/SymbolProc Style/Documentation: @@ -72,6 +79,9 @@ Style/PercentLiteralDelimiters: '%i': '()' '%w': '()' +Style/RedundantConstantBase: + Enabled: false + Style/WordArray: Enabled: true EnforcedStyle: percent diff --git a/Appraisals b/Appraisals new file mode 100644 index 0000000..fcb4c99 --- /dev/null +++ b/Appraisals @@ -0,0 +1,15 @@ +appraise 'rails-7.0' do + gem 'rails', '~> 7.0.0' +end + +appraise 'rails-7.1' do + gem 'rails', '~> 7.1.0' +end + +appraise 'rails-7.2' do + gem 'rails', '~> 7.2.0' +end + +appraise 'rails-8.0' do + gem 'rails', '~> 8.0.0' +end diff --git a/CHANGELOG.md b/CHANGELOG.md index f932cb7..1e764dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [0.6.0] +### Changes +- Support Rails 8.0. +- Refactor tests to better simulate behavior around deployment. + ## [0.5.0] ### Changes diff --git a/Gemfile b/Gemfile index 39ced20..680a71e 100644 --- a/Gemfile +++ b/Gemfile @@ -3,3 +3,5 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Specify your gem's dependencies in view_component-fragment_caching.gemspec. gemspec + +gem 'concurrent-ruby', '1.3.4' diff --git a/Gemfile.lock b/Gemfile.lock index 2786298..3e32939 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,238 +1,302 @@ PATH remote: . specs: - view_component-fragment_caching (0.5.0) - rails (~> 7.0) + view_component-fragment_caching (0.6.0) + rails (>= 7.0, < 8.1) view_component (< 4.0) GEM remote: https://rubygems.org/ specs: - actioncable (7.0.2.3) - actionpack (= 7.0.2.3) - activesupport (= 7.0.2.3) + actioncable (8.0.2) + actionpack (= 8.0.2) + activesupport (= 8.0.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (7.0.2.3) - actionpack (= 7.0.2.3) - activejob (= 7.0.2.3) - activerecord (= 7.0.2.3) - activestorage (= 7.0.2.3) - activesupport (= 7.0.2.3) - mail (>= 2.7.1) - net-imap - net-pop - net-smtp - actionmailer (7.0.2.3) - actionpack (= 7.0.2.3) - actionview (= 7.0.2.3) - activejob (= 7.0.2.3) - activesupport (= 7.0.2.3) - mail (~> 2.5, >= 2.5.4) - net-imap - net-pop - net-smtp - rails-dom-testing (~> 2.0) - actionpack (7.0.2.3) - actionview (= 7.0.2.3) - activesupport (= 7.0.2.3) - rack (~> 2.0, >= 2.2.0) + zeitwerk (~> 2.6) + actionmailbox (8.0.2) + actionpack (= 8.0.2) + activejob (= 8.0.2) + activerecord (= 8.0.2) + activestorage (= 8.0.2) + activesupport (= 8.0.2) + mail (>= 2.8.0) + actionmailer (8.0.2) + actionpack (= 8.0.2) + actionview (= 8.0.2) + activejob (= 8.0.2) + activesupport (= 8.0.2) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (8.0.2) + actionview (= 8.0.2) + activesupport (= 8.0.2) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (7.0.2.3) - actionpack (= 7.0.2.3) - activerecord (= 7.0.2.3) - activestorage (= 7.0.2.3) - activesupport (= 7.0.2.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + useragent (~> 0.16) + actiontext (8.0.2) + actionpack (= 8.0.2) + activerecord (= 8.0.2) + activestorage (= 8.0.2) + activesupport (= 8.0.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.0.2.3) - activesupport (= 7.0.2.3) + actionview (8.0.2) + activesupport (= 8.0.2) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (7.0.2.3) - activesupport (= 7.0.2.3) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (8.0.2) + activesupport (= 8.0.2) globalid (>= 0.3.6) - activemodel (7.0.2.3) - activesupport (= 7.0.2.3) - activerecord (7.0.2.3) - activemodel (= 7.0.2.3) - activesupport (= 7.0.2.3) - activestorage (7.0.2.3) - actionpack (= 7.0.2.3) - activejob (= 7.0.2.3) - activerecord (= 7.0.2.3) - activesupport (= 7.0.2.3) + activemodel (8.0.2) + activesupport (= 8.0.2) + activerecord (8.0.2) + activemodel (= 8.0.2) + activesupport (= 8.0.2) + timeout (>= 0.4.0) + activestorage (8.0.2) + actionpack (= 8.0.2) + activejob (= 8.0.2) + activerecord (= 8.0.2) + activesupport (= 8.0.2) marcel (~> 1.0) - mini_mime (>= 1.1.0) - activesupport (7.0.2.3) - concurrent-ruby (~> 1.0, >= 1.0.2) + activesupport (8.0.2) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) + logger (>= 1.4.2) minitest (>= 5.1) - tzinfo (~> 2.0) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) - ast (2.4.2) - base64 (0.2.0) - builder (3.2.4) - capybara (3.36.0) - addressable - matrix - mini_mime (>= 0.1.3) - nokogiri (~> 1.8) - rack (>= 1.6.0) - rack-test (>= 0.6.3) - regexp_parser (>= 1.5, < 3.0) - xpath (~> 3.2) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + appraisal (2.5.0) + bundler + rake + thor (>= 0.14.0) + ast (2.4.3) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.2) + builder (3.3.0) coderay (1.1.3) - concurrent-ruby (1.1.10) + concurrent-ruby (1.3.4) + connection_pool (2.5.3) crass (1.0.6) date (3.4.1) - diff-lcs (1.5.0) - erubi (1.10.0) + diff-lcs (1.6.2) + drb (2.2.3) + erb (5.0.1) + erubi (1.13.1) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.10.0) + i18n (1.14.7) concurrent-ruby (~> 1.0) - loofah (2.16.0) + io-console (0.8.0) + irb (1.15.2) + pp (>= 0.6.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + json (2.12.2) + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + logger (1.7.0) + loofah (2.24.1) crass (~> 1.0.2) - nokogiri (>= 1.5.9) + nokogiri (>= 1.12.0) mail (2.8.1) mini_mime (>= 0.1.1) net-imap net-pop net-smtp marcel (1.0.4) - matrix (0.4.2) - method_source (1.0.0) - mini_mime (1.1.2) - minitest (5.15.0) - net-imap (0.5.5) + method_source (1.1.0) + mini_mime (1.1.5) + minitest (5.25.5) + net-imap (0.5.8) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.5.0) + net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.16.0-arm64-darwin) + nokogiri (1.18.8-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.16.0-x86_64-darwin) + nokogiri (1.18.8-aarch64-linux-musl) racc (~> 1.4) - parallel (1.22.1) - parser (3.1.2.0) + nokogiri (1.18.8-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.18.8-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.18.8-arm64-darwin) + racc (~> 1.4) + nokogiri (1.18.8-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.18.8-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.18.8-x86_64-linux-musl) + racc (~> 1.4) + parallel (1.27.0) + parser (3.3.8.0) ast (~> 2.4.1) - pry (0.14.1) + racc + pp (0.6.2) + prettyprint + prettyprint (0.2.0) + prism (1.4.0) + pry (0.15.2) coderay (~> 1.1) method_source (~> 1.0) - pry-rails (0.3.9) - pry (>= 0.10.4) - public_suffix (4.0.7) - racc (1.6.0) - rack (2.2.3) - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (7.0.2.3) - actioncable (= 7.0.2.3) - actionmailbox (= 7.0.2.3) - actionmailer (= 7.0.2.3) - actionpack (= 7.0.2.3) - actiontext (= 7.0.2.3) - actionview (= 7.0.2.3) - activejob (= 7.0.2.3) - activemodel (= 7.0.2.3) - activerecord (= 7.0.2.3) - activestorage (= 7.0.2.3) - activesupport (= 7.0.2.3) + pry-rails (0.3.11) + pry (>= 0.13.0) + psych (5.2.6) + date + stringio + racc (1.8.1) + rack (3.1.16) + rack-session (2.1.1) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rack-test (2.2.0) + rack (>= 1.3) + rackup (2.2.1) + rack (>= 3) + rails (8.0.2) + actioncable (= 8.0.2) + actionmailbox (= 8.0.2) + actionmailer (= 8.0.2) + actionpack (= 8.0.2) + actiontext (= 8.0.2) + actionview (= 8.0.2) + activejob (= 8.0.2) + activemodel (= 8.0.2) + activerecord (= 8.0.2) + activestorage (= 8.0.2) + activesupport (= 8.0.2) bundler (>= 1.15.0) - railties (= 7.0.2.3) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + railties (= 8.0.2) + rails-dom-testing (2.3.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.4.2) - loofah (~> 2.3) - railties (7.0.2.3) - actionpack (= 7.0.2.3) - activesupport (= 7.0.2.3) - method_source + rails-html-sanitizer (1.6.2) + loofah (~> 2.21) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + railties (8.0.2) + actionpack (= 8.0.2) + activesupport (= 8.0.2) + irb (~> 1.13) + rackup (>= 1.0.0) rake (>= 12.2) - thor (~> 1.0) - zeitwerk (~> 2.5) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.0.6) - regexp_parser (2.3.0) - rexml (3.2.5) - rspec-core (3.11.0) - rspec-support (~> 3.11.0) - rspec-expectations (3.11.0) + rake (13.3.0) + rdoc (6.14.0) + erb + psych (>= 4.0.0) + regexp_parser (2.10.0) + reline (0.6.1) + io-console (~> 0.5) + rspec-core (3.13.4) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.5) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.11.0) - rspec-mocks (3.11.1) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.5) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.11.0) - rspec-rails (5.1.1) - 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.27.0) + rspec-support (~> 3.13.0) + rspec-rails (7.1.1) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) + rspec-core (~> 3.13) + rspec-expectations (~> 3.13) + rspec-mocks (~> 3.13) + rspec-support (~> 3.13) + rspec-support (3.13.4) + rubocop (1.76.0) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) parallel (~> 1.10) - parser (>= 3.1.0.0) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) - regexp_parser (>= 1.8, < 3.0) - rexml - rubocop-ast (>= 1.16.0, < 2.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.45.0, < 2.0) ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.17.0) - parser (>= 3.1.1.0) - rubocop-rails (2.14.2) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.45.0) + parser (>= 3.3.7.2) + prism (~> 1.4) + rubocop-rails (2.32.0) activesupport (>= 4.2.0) + lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.7.0, < 2.0) - rubocop-rspec (2.10.0) - rubocop (~> 1.19) - ruby-progressbar (1.11.0) - thor (1.2.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + rubocop-rspec (3.6.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec_rails (2.31.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) + ruby-progressbar (1.13.0) + securerandom (0.4.1) + stringio (3.1.7) + thor (1.3.2) timeout (0.4.3) - tzinfo (2.0.4) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicode-display_width (2.1.0) - view_component (3.21.0) + unicode-display_width (3.1.4) + unicode-emoji (~> 4.0, >= 4.0.4) + unicode-emoji (4.0.4) + uri (1.0.3) + useragent (0.16.11) + view_component (3.23.2) activesupport (>= 5.2.0, < 8.1) - concurrent-ruby (~> 1.0) + concurrent-ruby (~> 1) method_source (~> 1.0) - websocket-driver (0.7.7) + websocket-driver (0.8.0) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - xpath (3.2.0) - nokogiri (~> 1.8) - zeitwerk (2.5.4) + zeitwerk (2.7.3) PLATFORMS - arm64-darwin-23 - x86_64-darwin-20 - x86_64-darwin-21 - x86_64-darwin-22 + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl DEPENDENCIES - capybara (~> 3.36) + appraisal (~> 2.5) + concurrent-ruby (= 1.3.4) + nokogiri (~> 1.18) pry-rails (~> 0.3) - rspec-rails (~> 5.1) + rspec-rails (~> 7.0) rubocop (~> 1.26) rubocop-rails (~> 2.14) - rubocop-rspec (~> 2.10) + rubocop-rspec (~> 3.6) + rubocop-rspec_rails (~> 2.31) view_component-fragment_caching! BUNDLED WITH - 2.3.9 + 2.6.2 diff --git a/README.md b/README.md index edb84ee..cd2b993 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ It is important that naming conventions are followed. The tracker will ignore co ## Contributing Please follow conventions and write tests. ```bash -$ bundle exec rspec +$ bundle exec appraisal rspec $ bundle exec rubocop ``` diff --git a/Rakefile b/Rakefile index 34bcc14..146bd70 100644 --- a/Rakefile +++ b/Rakefile @@ -1,6 +1,6 @@ require 'bundler/setup' -APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__) +APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__) load 'rails/tasks/engine.rake' load 'rails/tasks/statistics.rake' diff --git a/lib/view_component/fragment_caching/digestors/with_view_component_rb.rb b/lib/view_component/fragment_caching/digestors/with_view_component_rb.rb index 6f3bf2d..6152b8c 100644 --- a/lib/view_component/fragment_caching/digestors/with_view_component_rb.rb +++ b/lib/view_component/fragment_caching/digestors/with_view_component_rb.rb @@ -45,7 +45,7 @@ def view_component_path_regex def view_component_ancestors(component_class) ancestors = component_class.ancestors - return [] unless ancestors.include? ViewComponent::Base + return [] if ancestors.exclude? ViewComponent::Base ancestors.each_with_object [] do |ancestor, memo| return memo if ancestor == ViewComponent::Base diff --git a/lib/view_component/fragment_caching/resolvers/view_component_resolver.rb b/lib/view_component/fragment_caching/resolvers/view_component_resolver.rb index 3a63c09..ab28ba7 100644 --- a/lib/view_component/fragment_caching/resolvers/view_component_resolver.rb +++ b/lib/view_component/fragment_caching/resolvers/view_component_resolver.rb @@ -113,7 +113,7 @@ def find_all(*args) locals = args.fetch 5, [] key = build_key given_key, details - super name, prefix, partial, details, key, locals + super(name, prefix, partial, details, key, locals) end private diff --git a/lib/view_component/fragment_caching/trackers/view_component_tracking.rb b/lib/view_component/fragment_caching/trackers/view_component_tracking.rb index bfc4efe..cd7cc50 100644 --- a/lib/view_component/fragment_caching/trackers/view_component_tracking.rb +++ b/lib/view_component/fragment_caching/trackers/view_component_tracking.rb @@ -76,7 +76,7 @@ def add_view_component_dependency(dependencies, dependency) return if dependency.blank? path = dependency.underscore - dependencies << path unless dependencies.include? path + dependencies << path if dependencies.exclude? path end def view_component_inheritance_dependencies diff --git a/lib/view_component/fragment_caching/version.rb b/lib/view_component/fragment_caching/version.rb index daf9cb8..2e7bff3 100644 --- a/lib/view_component/fragment_caching/version.rb +++ b/lib/view_component/fragment_caching/version.rb @@ -1,6 +1,6 @@ module ViewComponent module FragmentCaching - VERSION = '0.5.0'.freeze + VERSION = '0.6.0'.freeze public_constant :VERSION end end diff --git a/spec/dummy/Rakefile b/spec/dummy/Rakefile new file mode 100644 index 0000000..e85f913 --- /dev/null +++ b/spec/dummy/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/spec/dummy/config/environments/test.rb b/spec/dummy/config/environments/test.rb index acd7983..2a50dd1 100644 --- a/spec/dummy/config/environments/test.rb +++ b/spec/dummy/config/environments/test.rb @@ -25,10 +25,10 @@ # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = true - # config.cache_store = :null_store + config.cache_store = :file_store, Rails.root.join('tmp/cache') # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false + config.action_dispatch.show_exceptions = :none # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false diff --git a/spec/dummy/lib/tasks/dump_output.rake b/spec/dummy/lib/tasks/dump_output.rake new file mode 100644 index 0000000..67ce816 --- /dev/null +++ b/spec/dummy/lib/tasks/dump_output.rake @@ -0,0 +1,17 @@ +task dump_output: :environment do + test_klass = + Class.new do + include ActionDispatch::Integration::Runner + + def app + Rails.application + end + + def run_test + get ENV.fetch('TEST_REQUEST_PATH') + puts response.body + end + end + + test_klass.new.run_test +end diff --git a/spec/features/fragment_caching_spec.rb b/spec/features/fragment_caching_spec.rb index 54d4f4f..1ee70b9 100644 --- a/spec/features/fragment_caching_spec.rb +++ b/spec/features/fragment_caching_spec.rb @@ -1,58 +1,85 @@ -require 'rails_helper' +require 'spec_helper' + +require 'nokogiri' + +# rubocop:disable Metrics/BlockLength, RSpec/MultipleExpectations +describe 'fragment caching' do + before { clear_cache } + after(:all) { clear_cache } # rubocop:disable RSpec/BeforeAfterAll + + def clear_cache + with_dummy_app { `rm -rf tmp/cache` } + end -# rubocop:disable Metrics/BlockLength -describe 'fragment caching', type: :feature do def modify_file(file) - filename = Rails.root.join file + filename = "spec/dummy/#{file}" old_content = File.read filename begin - File.open(filename, 'wb+') { |f| f.write("#{old_content}\n#comment") } + File.open(filename, 'wb+') { |f| f.write "#{old_content}\n#comment" } yield ensure - File.open(filename, 'wb+') { |f| f.write(old_content) } + File.open(filename, 'wb+') { |f| f.write old_content } end end + def with_dummy_app(&block) + og_pwd = Dir.pwd + Dir.chdir 'spec/dummy' + block.call + ensure + Dir.chdir og_pwd + end + + def render_output(path) + with_dummy_app do + Nokogiri::HTML(`RAILS_ENV=test TEST_REQUEST_PATH=#{path} bundle exec rake dump_output`) + end + end + + def extract_text(html, id) + html.at_css(id).text.gsub(/\A\s+|\s+\z/, '') + end + context 'when components are tracked' do context 'when detected via render call' do context 'when child component has its own view file' do context 'when parent rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'new title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end end @@ -60,61 +87,61 @@ def modify_file(file) context 'when child component inherits view file' do context 'when parent rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when parent view file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when child rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/extended_blog_component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/extended_blog_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end end @@ -122,41 +149,41 @@ def modify_file(file) context 'when component inherits from vc base' do context 'when rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when view file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/render_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end end @@ -166,41 +193,41 @@ def modify_file(file) context 'when child component has its own view file' do context 'when parent rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'new title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end end @@ -208,61 +235,61 @@ def modify_file(file) context 'when child component inherits view file' do context 'when parent rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when parent view file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when child rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/extended_blog_component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/extended_blog_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end end @@ -270,41 +297,41 @@ def modify_file(file) context 'when component inherits from vc base' do context 'when rb file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end context 'when view file is updated' do it 'busts cache' do - blog = Blog.new 'original title' - visit "tracked_dependencies/explicit_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#blog-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#blog-component', text: 'new title' - end + title = 'original title' + path = "/tracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + title = 'new title' + path = "/tracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'original title' + + modify_file('app/included_components/blogs/component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#blog-component')).to eq 'new title' end end end @@ -316,41 +343,41 @@ def modify_file(file) context 'when child component has its own view file' do context 'when parent rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end end @@ -358,61 +385,61 @@ def modify_file(file) context 'when child component inherits view file' do context 'when parent rb file is updated' do it 'does not busts cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when child rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/extended_blog_component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/extended_user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end end @@ -420,41 +447,41 @@ def modify_file(file) context 'when component inherits from vc base' do context 'when rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/render_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/render_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end end @@ -464,41 +491,41 @@ def modify_file(file) context 'when child component has its own view file' do context 'when parent rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#extended-with-view', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_child_has_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#extended-with-view', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_child_has_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#extended-with-view')).to eq 'original title' end end end @@ -506,61 +533,61 @@ def modify_file(file) context 'when child component inherits view file' do context 'when parent rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when parent view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when child rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/extended_blog_component.rb' do - visit "vc_inherits_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_inherits_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/extended_user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end end @@ -568,45 +595,45 @@ def modify_file(file) context 'when component inherits from vc base' do context 'when rb file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.rb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.rb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end context 'when view file is updated' do it 'does not bust cache' do - blog = Blog.new 'original title' - visit "untracked_dependencies/explicit_dependencies/vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'original title' - assert_selector '#user-component', text: 'original title' - - blog = Blog.new 'new title' - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - - modify_file 'app/included_components/blogs/component.html.erb' do - visit "vc_has_own_view?#{blog.to_query}" - assert_selector '#uncached', text: 'new title' - assert_selector '#user-component', text: 'original title' - end + title = 'original title' + path = "/untracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'original title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + title = 'new title' + path = "/untracked_dependencies/explicit_dependencies/vc_has_own_view?title=#{CGI.escape title}" + html = render_output path + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' + + modify_file('app/excluded_components/users/user_component.html.erb') { html = render_output path } + expect(extract_text(html, '#uncached')).to eq 'new title' + expect(extract_text(html, '#user-component')).to eq 'original title' end end end end end end -# rubocop:enable Metrics/BlockLength +# rubocop:enable Metrics/BlockLength, RSpec/MultipleExpectations diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 057b564..9bd8742 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -1,7 +1,7 @@ # This file is copied to spec/ when you run 'rails generate rspec:install' require 'spec_helper' ENV['RAILS_ENV'] ||= 'test' -require_relative './dummy/config/environment' +require_relative 'dummy/config/environment' # Prevent database truncation if the environment is production abort 'The Rails environment is running in production mode!' if Rails.env.production? require 'rspec/rails' diff --git a/view_component-fragment_caching.gemspec b/view_component-fragment_caching.gemspec index 44986f4..64310ce 100644 --- a/view_component-fragment_caching.gemspec +++ b/view_component-fragment_caching.gemspec @@ -14,20 +14,22 @@ require_relative 'lib/view_component/fragment_caching/version' spec.metadata['changelog_uri'] = "#{github_url}/blob/main/CHANGELOG.md" spec.metadata['rubygems_mfa_required'] = 'true' - spec.required_ruby_version = '>= 2.6.0' + spec.required_ruby_version = '>= 2.7.0' spec.files = ::Dir.chdir ::File.expand_path(__dir__) do ::Dir['{app,config,db,lib}/**/*', 'MIT-LICENSE', 'Rakefile', 'README.md'] end - spec.add_dependency 'rails', '~> 7.0' + spec.add_dependency 'rails', '>= 7.0', '< 8.1' spec.add_dependency 'view_component', '< 4.0' - spec.add_development_dependency 'capybara', '~> 3.36' + spec.add_development_dependency 'appraisal', '~> 2.5' + spec.add_development_dependency 'nokogiri', '~> 1.18' spec.add_development_dependency 'pry-rails', '~> 0.3' - spec.add_development_dependency 'rspec-rails', '~> 5.1' + spec.add_development_dependency 'rspec-rails', '~> 7.0' spec.add_development_dependency 'rubocop', '~> 1.26' spec.add_development_dependency 'rubocop-rails', '~> 2.14' - spec.add_development_dependency 'rubocop-rspec', '~> 2.10' + spec.add_development_dependency 'rubocop-rspec', '~> 3.6' + spec.add_development_dependency 'rubocop-rspec_rails', '~> 2.31' end