aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/rails.scm
diff options
context:
space:
mode:
authorMaxim Cournoyer <maxim.cournoyer@gmail.com>2023-03-10 15:35:29 -0500
committerMaxim Cournoyer <maxim.cournoyer@gmail.com>2023-03-28 22:22:38 -0400
commit7cb3ca626020cca1e3e372fe82837d774397440d (patch)
tree075a9799a6a2864b60ded8e44256048366b3ff98 /gnu/packages/rails.scm
parent2a70f3030a8034e2c637ba90c1555211ed1f77f5 (diff)
downloadguix-7cb3ca626020cca1e3e372fe82837d774397440d.tar.gz
guix-7cb3ca626020cca1e3e372fe82837d774397440d.zip
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.
Diffstat (limited to 'gnu/packages/rails.scm')
-rw-r--r--gnu/packages/rails.scm249
1 files changed, 238 insertions, 11 deletions
diff --git a/gnu/packages/rails.scm b/gnu/packages/rails.scm
index 4abecb8409..fbb85f271d 100644
--- a/gnu/packages/rails.scm
+++ b/gnu/packages/rails.scm
@@ -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.")