gnu: ruby-railties: Enable test suite.

* gnu/packages/rails.scm (ruby-railties): Add a tip as comment about reviewing
test suite failures.
[arguments]: Delete #:tests?
argument.  Add delete-gemfiles, disable-bundler,
do-not-load-other-gems-from-source, patch-paths, prepare-for-tests,
disable-problematic-tests and set-paths phases.
Move check phase after install phase.
This commit is contained in:
Maxim Cournoyer 2023-03-10 15:35:29 -05:00
parent 2a70f3030a
commit 7cb3ca6260
No known key found for this signature in database
GPG Key ID: 1260E46482E63562

View File

@ -31,6 +31,8 @@
#:use-module (gnu packages databases)
#:use-module (gnu packages node)
#:use-module (gnu packages ruby)
#:use-module (gnu packages sqlite)
#:use-module (gnu packages version-control)
#:use-module (guix build-system ruby))
(define %ruby-rails-version "7.0.4.3")
@ -903,6 +905,8 @@ Extensions} type detection using magic numbers, filenames, and extensions")
(home-page "https://github.com/rails/marcel")
(license license:expat)))
;;; Pro-tip: to get a summary of the failures, run
;;; 'M-x occur [1-9][0-9]* \(failures\|errors\)' on the build log.
(define-public ruby-railties
(package
(name "ruby-railties")
@ -910,17 +914,240 @@ Extensions} type detection using magic numbers, filenames, and extensions")
(source ruby-rails-monorepo)
(build-system ruby-build-system)
(arguments
(list #:tests? #f ;requires rails to be installed
#:phases #~(modify-phases %standard-phases
(add-after 'delete-gemfiles 'chdir
(lambda _
(chdir "railties"))))))
(propagated-inputs (list ruby-actionpack
ruby-activesupport
ruby-method-source
ruby-rake
ruby-thor
ruby-zeitwerk))
(list
#:phases
#~(modify-phases %standard-phases
(add-after 'unpack 'delete-gemfiles
(lambda _
;; Delete Gemfile and Gemfile.lock, as they contains too many
;; dependencies not actually useful here.
(delete-file "Gemfile")
(delete-file "Gemfile.lock")))
(add-after 'extract-gemspec 'chdir
(lambda _
(chdir "railties")))
(add-after 'chdir 'disable-bundler
(lambda _
(substitute* (append (list "Rakefile")
(find-files "test" "\\.rb$")
(find-files "lib" "\\.tt$"))
;; Do not use Bundler, which causes errors such as not finding
;; the gem of this package (railties), or preferring the other
;; in-source gems.
(("`bundle exec") "`")
((".*require \"bundler/setup\".*") "")
((".*Bundler.require.*") ""))
;; Adjust a runtime substitution that uses a removed
;; Bundler.require in its pattern; instead of matching
;; "Bundler.require", it now appends to the 'require
;; "rails/all"' line in the generated 'application.rb' template
;; generated from
;; "lib/rails/generators/rails/app/templates/config/application.rb.tt".
(substitute* "test/isolation/abstract_unit.rb"
(("contents.sub!\\(/\\^Bundler\\\\.require\\.\\*/, \"([^\"]*)"
_ replacement)
(format #f "contents.sub!('require \"rails/all\"', \"\\\\0\\n~a"
replacement)))))
(add-after 'chdir 'do-not-load-other-gems-from-source
(lambda _
;; The Rakefile adds '-I' Ruby options so that the other Rails
;; libraries are loaded from source; since they are already
;; packaged separately, use these instead.
(substitute* "Rakefile"
((".*\"\\.\\./activesupport/lib\",.*") "")
((".*\"\\.\\./actionpack/lib\",.*") "")
((".*\"\\.\\./actionview/lib\",.*") "")
((".*\"\\.\\./activemodel/lib\".*") ""))))
(add-after 'chdir 'patch-paths
(lambda _
(substitute* "lib/rails/generators/base.rb"
(("/usr/bin/env") (which "env")))))
(delete 'check) ;moved after install phase
(add-after 'install 'check
(assoc-ref %standard-phases 'check))
(add-before 'check 'prepare-for-tests
(lambda _
(define (touch file-name)
(call-with-output-file file-name (const #t)))
;; Otherwise, the test suite attempts to use yarn to fetch
;; NodeJS modules.
(mkdir-p "../actionview/lib/assets/compiled")
(touch "../actionview/lib/assets/compiled/rails-ujs.js")
(mkdir-p "test/isolation/assets/node_modules")
;; Git requires to be able to write to HOME.
(setenv "HOME" "/tmp")))
(add-before 'check 'disable-problematic-tests
(lambda _
(let-syntax ((skip-tests
(syntax-rules ()
((_ file test ...)
(substitute* file
;; ActiveSupport test case.
(((string-append "test \"" test "\".*") all)
(string-append
all " skip 'fails on guix'\n")) ...
;; MiniTest test case.
(((string-append "def " test ".*") all)
(string-append
all " skip('fails on guix')\n")) ...)))))
(with-directory-excursion "test"
;; This test requires 'rails' and Bundler.
(delete-file "application/server_test.rb")
;; These tests are incompatible with MiniTest 5.17 (see:
;; https://github.com/rails/rails/issues/47657).
(skip-tests "generators_test.rb"
"test_invoke_with_config_values"
"test_simple_invoke"
"test_should_give_higher_preference_to_rails_generators"
"test_nested_fallbacks_for_generators"
"test_fallbacks_for_generators_on_invoke"
"test_invoke_with_default_values"
"test_invoke_with_nested_namespaces")
;; These tests requires the assets which we lack.
(delete-file "application/assets_test.rb")
(delete-file "railties/generators_test.rb")
(skip-tests "generators/shared_generator_tests.rb"
;; This test checks that bin/rails has /usr/bin/env has a
;; shebang and fails.
"test_shebang_when_is_the_same_as_default_use_env")
(skip-tests "generators/app_generator_test.rb"
;; This test requires networking.
"test_template_from_url"
;; This test requires Bundler.
"test_generation_use_original_bundle_environment"
;; This test requires assets.
"test_css_option_with_cssbundling_gem"
;; These tests require the rails/command
;; namespace provided by the 'ruby-rails'
;; package, which depends on this one.
"test_css_option_with_asset_pipeline_tailwind"
"test_hotwire")
(skip-tests
"generators/plugin_generator_test.rb"
;; These tests require assets.
"test_model_with_existent_application_record_in_mountable_engine"
"test_dummy_application_loads_plugin"
"test_generate_application_mailer_when_does_not_exist_in_\
mountable_engine"
"test_generate_mailer_layouts_when_does_not_exist_in_mountable_engine"
"test_ensure_that_migration_tasks_work_with_mountable_option"
"test_generating_controller_inside_mountable_engine"
"test_generate_application_job_when_does_not_exist_in_mountable_engine"
"test_run_default"
;; This test expects a /usr/bin/env shebang.
"test_shebang")
;; The following generator tests require assets.
(skip-tests "generators/plugin_test_runner_test.rb"
"test_run_default")
(skip-tests
"generators/scaffold_controller_generator_test.rb"
"test_controller_tests_pass_by_default_inside_full_engine"
"test_controller_tests_pass_by_default_inside_mountable_engine")
(skip-tests
"generators/scaffold_generator_test.rb"
"test_scaffold_tests_pass_by_default_inside_mountable_engine"
"test_scaffold_tests_pass_by_default_inside_api_mountable_engine"
"test_scaffold_tests_pass_by_default_inside_api_full_engine"
"test_scaffold_on_invoke_inside_mountable_engine"
"test_scaffold_tests_pass_by_default_inside_full_engine"
"test_scaffold_tests_pass_by_default_inside_namespaced_\
mountable_engine")
(skip-tests "generators/test_runner_in_engine_test.rb"
"test_run_default"
"test_rerun_snippet_is_relative_path")
;; The actions_test tests depend on assets or the rails gem.
(delete-file "generators/actions_test.rb")
(skip-tests "engine/commands_test.rb"
"test_server_command_work_inside_engine"
"test_runner_command_work_inside_engine")
;; These tests fails because of cleanup code
;; when the environment lacks a PTY device (see:
;; https://github.com/rails/rails/issues/47656).
(delete-file "engine/commands_test.rb")
;; The following tests require the 'rails' gem.
(skip-tests "application/test_runner_test.rb"
"test_run_app_without_rails_loaded"
"test_generated_scaffold_works_with_rails_test"
"test_load_fixtures_when_running_test_suites"
"test_run_in_parallel_with_unmarshable_exception"
"test_run_in_parallel_with_unknown_object")
(skip-tests
"application/test_test.rb"
"automatically synchronizes test schema after rollback"
"hooks for plugins"
"sql structure migrations when adding column to existing table"
"sql structure migrations"
"ruby schema migrations")
;; These tests require a PostgreSQL server accepting
;; connections under /var/run/postgresql.
(skip-tests
"application/rake_test.rb"
"test_not_protected_when_previous_migration_was_not_production")
(delete-file "application/rake/dbs_test.rb")
(delete-file "application/rake/migrations_test.rb")
(delete-file "application/rake/multi_dbs_test.rb")
(skip-tests "engine/test_test.rb"
"automatically synchronize test schema")
(skip-tests "isolation/abstract_unit.rb" "use_postgresql")
(skip-tests "railties/engine_test.rb"
"active_storage:install task works within engine"
"active_storage:update task works within engine"
"rake environment can be called in the engine"
"mountable engine should copy migrations within engine_path"
;; This test fails because we do not use the
;; in-source active/action gems.
"i18n files have lower priority than application ones"
;; This test fails when not using Bundler.
"setting priority for engines with config.railties_order")
;; This test requires a database server or networking.
(delete-file "application/bin_setup_test.rb")
(skip-tests "application/middleware/cache_test.rb"
;; This test produces "miss, store" instead of
;; "fresh".
"test_cache_works_with_expires"
;; This one produces "miss" instead of "stale,
;; valid, store".
"test_cache_works_with_etags"
;; Likewise.
"test_cache_works_with_last_modified")))))
(add-before 'check 'set-paths
(lambda _
(setenv "PATH" (string-append (getenv "PATH") ":"
#$output "/bin"))
(setenv "GEM_PATH" (string-append
(getenv "GEM_PATH") ":"
#$output "/lib/ruby/vendor_ruby")))))))
(native-inputs
(list git-minimal/pinned
ruby-actioncable
ruby-actionmailbox
ruby-actionmailer
ruby-actiontext
ruby-actionview
ruby-activejob
ruby-activemodel
ruby-activerecord
ruby-activestorage
ruby-bcrypt
ruby-bootsnap
ruby-capybara
ruby-dalli
ruby-importmap-rails-bootstrap
ruby-listen
ruby-minitest-retry
ruby-mysql2
ruby-pg
ruby-selenium-webdriver
ruby-sprockets-rails
ruby-webrick
sqlite))
(propagated-inputs
(list ruby-actionpack
ruby-activesupport
ruby-method-source
ruby-rake
ruby-thor
ruby-zeitwerk))
(synopsis "Rails internals, including application bootup and generators")
(description "@code{railties} provides the core Rails internals including
handling application bootup, plugins, generators, and Rake tasks.")