# frozen_string_literal: true require "rake/testtask" require "rubocop/rake_task" require "json" require "tempfile" Rake::TestTask.new(:unit) do |t| ENV["ENV"] = "test" ENV["COVERAGE_NAME"] = "unit" t.libs << "test" t.libs << "lib" t.test_files = FileList["test/**/test_*.rb"].exclude("test/property/**") t.warning = false end Rake::TestTask.new(:_run_property) do |t| t.libs << "test" t.libs << "test/property" t.libs << "lib" t.test_files = FileList["test/property/**/test_*.rb"] + FileList["test/stubs/seed_*.rb"] t.ruby_opts << "-r failure_reporter" t.warning = false end Rake::Task[:_run_property].clear_comments desc "Run property tests (optional seed: rake property[SEED,no-stubs])" task :property, [:seed, :no_stubs] do |_t, args| ENV["SEED"] = (args[:seed] || rand(0xFFFF)).to_i.to_s ENV["COVERAGE_NAME"] = "property" srand(ENV["SEED"].to_i) warn "Property seed: #{ENV['SEED']}" stub_path = "test/stubs/seed_#{ENV['SEED']}.rb" if args[:seed] && File.exist?(stub_path) ENV["TESTOPTS"] = "--seed=#{ENV['SEED']}" Rake::TestTask.new(:_run_stub) do |t| t.libs << "test" t.libs << "test/property" t.libs << "lib" t.test_files = [stub_path] t.warning = false end Rake::Task[:_run_stub].clear_comments Rake::Task[:_run_stub].invoke next end report = Tempfile.new(["failures", ".json"]) begin ENV["FAILURE_REPORT_PATH"] = report.path ENV["TESTOPTS"] = "--seed=#{ENV['SEED']}" Rake::Task[:_run_property].invoke rescue RuntimeError unless args[:no_stubs] failing = JSON.parse(File.read(report.path)) mkdir_p "test/stubs" comment = failing.map { |n| "# - #{n}" }.join("\n") File.write(stub_path, <<~RUBY) # frozen_string_literal: true # Failing tests: #{comment} srand(#{ENV['SEED']}) require_relative "../property/test_webhook_handler" RUBY warn "\nStub written: #{stub_path}" warn "Reproduce: bundle exec ruby -Itest -Itest/property -Ilib #{stub_path}" end exit 1 ensure report&.close report&.unlink end end task :test => [:unit, :property] RuboCop::RakeTask.new(:lint) task :entr do sh "sh", "-c", "git ls-files | entr -s 'rake test && rubocop'" end task default: :test