]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/2448'
authorTom Hughes <tom@compton.nu>
Wed, 18 Mar 2020 14:58:06 +0000 (14:58 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 18 Mar 2020 14:58:06 +0000 (14:58 +0000)
Gemfile
Gemfile.lock
test/controllers/api/traces_controller_test.rb
test/controllers/traces_controller_test.rb
test/factories/traces.rb
test/gpx/images/.gitkeep [deleted file]
test/gpx/traces/.gitkeep [deleted file]
test/models/trace_test.rb
test/test_helper.rb

diff --git a/Gemfile b/Gemfile
index 9a3fb1f6b03d3e82b49f74f5cace9443fb335e8e..95144d438f1957f8a1f6f60d039b2ec6a90e4d1f 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -138,7 +138,6 @@ end
 
 # Gems needed for running tests
 group :test do
-  gem "fakefs", :require => "fakefs/safe"
   gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20]
   gem "rails-controller-testing"
   gem "rubocop"
index f4403e7a14b83a60621a53c0e67d31bb860dafde..95fdf3569521b7e89bc81930dd2c222a2cddf15e 100644 (file)
@@ -206,7 +206,6 @@ GEM
     factory_bot_rails (5.1.1)
       factory_bot (~> 5.1.0)
       railties (>= 4.2.0)
-    fakefs (1.0.0)
     faraday (1.0.0)
       multipart-post (>= 1.2, < 3)
     ffi (1.12.2)
@@ -496,7 +495,6 @@ DEPENDENCIES
   dynamic_form
   erb_lint
   factory_bot_rails
-  fakefs
   faraday
   ffi-libarchive
   gd2-ffij (>= 0.4.0)
index 53964b2db0f4ebccfe36ba57ded0e80d8ac29e71..88c6fa90f82dbff3f885feaea1d73a32c7189792 100644 (file)
@@ -1,11 +1,21 @@
 require "test_helper"
-require "minitest/mock"
 
 module Api
   class TracesControllerTest < ActionController::TestCase
+    # Use temporary directories with unique names for each test
+    # This allows the tests to be run in parallel.
+    def setup
+      @gpx_trace_dir_orig = Settings.gpx_trace_dir
+      @gpx_image_dir_orig = Settings.gpx_image_dir
+      Settings.gpx_trace_dir = Dir.mktmpdir("trace", Rails.root.join("test/gpx"))
+      Settings.gpx_image_dir = Dir.mktmpdir("image", Rails.root.join("test/gpx"))
+    end
+
     def teardown
-      File.unlink(*Dir.glob(File.join(Settings.gpx_trace_dir, "*.gpx")))
-      File.unlink(*Dir.glob(File.join(Settings.gpx_image_dir, "*.gif")))
+      FileUtils.remove_dir(Settings.gpx_trace_dir)
+      FileUtils.remove_dir(Settings.gpx_image_dir)
+      Settings.gpx_trace_dir = @gpx_trace_dir_orig
+      Settings.gpx_image_dir = @gpx_image_dir_orig
     end
 
     ##
index 312d451d7e328cc37ea8d052effada071d4a88e6..72a3759390850b0fdb743d133feda1a96e43ed5f 100644 (file)
@@ -1,10 +1,20 @@
 require "test_helper"
-require "minitest/mock"
 
 class TracesControllerTest < ActionController::TestCase
+  # Use temporary directories with unique names for each test
+  # This allows the tests to be run in parallel.
+  def setup
+    @gpx_trace_dir_orig = Settings.gpx_trace_dir
+    @gpx_image_dir_orig = Settings.gpx_image_dir
+    Settings.gpx_trace_dir = Dir.mktmpdir("trace", Rails.root.join("test/gpx"))
+    Settings.gpx_image_dir = Dir.mktmpdir("image", Rails.root.join("test/gpx"))
+  end
+
   def teardown
-    File.unlink(*Dir.glob(File.join(Settings.gpx_trace_dir, "*.gpx")))
-    File.unlink(*Dir.glob(File.join(Settings.gpx_image_dir, "*.gif")))
+    FileUtils.remove_dir(Settings.gpx_trace_dir)
+    FileUtils.remove_dir(Settings.gpx_image_dir)
+    Settings.gpx_trace_dir = @gpx_trace_dir_orig
+    Settings.gpx_image_dir = @gpx_image_dir_orig
   end
 
   ##
index 713a5be17ee9aa84fcd76c35de3ee486c5c64ae7..961d52988fc0595c841e9464e9f4028b23447ef6 100644 (file)
@@ -19,12 +19,12 @@ FactoryBot.define do
 
     after(:create) do |trace, evaluator|
       if evaluator.fixture
-        File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx"),
-                     Rails.root.join("test", "gpx", "traces", "#{trace.id}.gpx"))
-        File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"),
-                     Rails.root.join("test", "gpx", "images", "#{trace.id}.gif"))
-        File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif"),
-                     Rails.root.join("test", "gpx", "images", "#{trace.id}_icon.gif"))
+        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx"),
+                       File.join(Settings.gpx_trace_dir, "#{trace.id}.gpx"))
+        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"),
+                       File.join(Settings.gpx_image_dir, "#{trace.id}.gif"))
+        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif"),
+                       File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif"))
       end
     end
   end
diff --git a/test/gpx/images/.gitkeep b/test/gpx/images/.gitkeep
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/test/gpx/traces/.gitkeep b/test/gpx/traces/.gitkeep
deleted file mode 100644 (file)
index e69de29..0000000
index e0c65e33eeb58884dd23a9ebdbc1d7a909a53660..2955be3ad67768103b26f3446b5cd63734a3c03c 100644 (file)
@@ -1,11 +1,21 @@
 require "test_helper"
 require "gpx"
-require "minitest/mock"
 
 class TraceTest < ActiveSupport::TestCase
+  # Use temporary directories with unique names for each test
+  # This allows the tests to be run in parallel.
+  def setup
+    @gpx_trace_dir_orig = Settings.gpx_trace_dir
+    @gpx_image_dir_orig = Settings.gpx_image_dir
+    Settings.gpx_trace_dir = Dir.mktmpdir("trace", Rails.root.join("test/gpx"))
+    Settings.gpx_image_dir = Dir.mktmpdir("image", Rails.root.join("test/gpx"))
+  end
+
   def teardown
-    File.unlink(*Dir.glob(File.join(Settings.gpx_trace_dir, "*.gpx")))
-    File.unlink(*Dir.glob(File.join(Settings.gpx_image_dir, "*.gif")))
+    FileUtils.remove_dir(Settings.gpx_trace_dir)
+    FileUtils.remove_dir(Settings.gpx_image_dir)
+    Settings.gpx_trace_dir = @gpx_trace_dir_orig
+    Settings.gpx_image_dir = @gpx_image_dir_orig
   end
 
   def test_visible
@@ -178,166 +188,116 @@ class TraceTest < ActiveSupport::TestCase
     trace.destroy
   end
 
-  # When testing the trace.import method, care needs to be taken regarding the icon
-  # fixture files, since the fixtures could be overwritten by newly generated files.
-  # We use FakeFS to temporarily protect the real fixture files from being overwritten.
-
   def test_import_removes_previous_tracepoints
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "a")
-      # Tracepoints don't have a primary key, so we use a specific latitude to
-      # check for successful deletion
-      create(:tracepoint, :latitude => 54321, :trace => trace)
-      assert_equal 1, Tracepoint.where(:latitude => 54321).count
+    trace = create(:trace, :fixture => "a")
+    # Tracepoints don't have a primary key, so we use a specific latitude to
+    # check for successful deletion
+    create(:tracepoint, :latitude => 54321, :trace => trace)
+    assert_equal 1, Tracepoint.where(:latitude => 54321).count
 
-      trace.import
+    trace.import
 
-      assert_equal 0, Tracepoint.where(:latitude => 54321).count
-    end
+    assert_equal 0, Tracepoint.where(:latitude => 54321).count
   end
 
   def test_import_creates_tracepoints
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "a")
-      assert_equal 0, Tracepoint.where(:gpx_id => trace.id).count
+    trace = create(:trace, :fixture => "a")
+    assert_equal 0, Tracepoint.where(:gpx_id => trace.id).count
 
-      trace.import
+    trace.import
 
-      trace.reload
-      assert_equal 1, Tracepoint.where(:gpx_id => trace.id).count
+    trace.reload
+    assert_equal 1, Tracepoint.where(:gpx_id => trace.id).count
 
-      # Check that the tile has been set prior to the bulk import
-      # i.e. that the callbacks have been run correctly
-      assert_equal 3221331576, Tracepoint.where(:gpx_id => trace.id).first.tile
-    end
+    # Check that the tile has been set prior to the bulk import
+    # i.e. that the callbacks have been run correctly
+    assert_equal 3221331576, Tracepoint.where(:gpx_id => trace.id).first.tile
   end
 
   def test_import_creates_icon
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "a")
-      icon_path = File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif")
-      FileUtils.rm(icon_path)
-      assert_equal false, File.exist?(icon_path)
+    trace = create(:trace, :fixture => "a")
+    icon_path = File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif")
+    FileUtils.rm(icon_path)
+    assert_equal false, File.exist?(icon_path)
 
-      trace.import
+    trace.import
 
-      assert_equal true, File.exist?(icon_path)
-    end
+    assert_equal true, File.exist?(icon_path)
   end
 
   def test_import_creates_large_picture
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "a")
-      large_picture_path = File.join(Settings.gpx_image_dir, "#{trace.id}.gif")
-      FileUtils.rm(large_picture_path)
-      assert_equal false, File.exist?(large_picture_path)
+    trace = create(:trace, :fixture => "a")
+    large_picture_path = File.join(Settings.gpx_image_dir, "#{trace.id}.gif")
+    FileUtils.rm(large_picture_path)
+    assert_equal false, File.exist?(large_picture_path)
 
-      trace.import
+    trace.import
 
-      assert_equal true, File.exist?(large_picture_path)
-    end
+    assert_equal true, File.exist?(large_picture_path)
   end
 
   def test_import_handles_bz2
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "c")
+    trace = create(:trace, :fixture => "c")
 
-      trace.import
+    trace.import
 
-      assert_equal 1, trace.size
-    end
+    assert_equal 1, trace.size
   end
 
   def test_import_handles_plain
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "a")
+    trace = create(:trace, :fixture => "a")
 
-      trace.import
+    trace.import
 
-      assert_equal 1, trace.size
-    end
+    assert_equal 1, trace.size
   end
 
   def test_import_handles_plain_with_bom
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace = create(:trace, :fixture => "b")
+    trace = create(:trace, :fixture => "b")
 
-      trace.import
+    trace.import
 
-      assert_equal 1, trace.size
-    end
+    assert_equal 1, trace.size
   end
 
   def test_import_handles_gz
     trace = create(:trace, :fixture => "d")
 
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace.import
+    trace.import
 
-      assert_equal 1, trace.size
-    ensure
-      trace.destroy
-    end
+    assert_equal 1, trace.size
   end
 
   def test_import_handles_zip
     trace = create(:trace, :fixture => "f")
 
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace.import
+    trace.import
 
-      assert_equal 2, trace.size
-    ensure
-      trace.destroy
-    end
+    assert_equal 2, trace.size
   end
 
   def test_import_handles_tar
     trace = create(:trace, :fixture => "g")
 
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace.import
+    trace.import
 
-      assert_equal 2, trace.size
-    ensure
-      trace.destroy
-    end
+    assert_equal 2, trace.size
   end
 
   def test_import_handles_tar_gz
     trace = create(:trace, :fixture => "h")
 
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace.import
+    trace.import
 
-      assert_equal 2, trace.size
-    ensure
-      trace.destroy
-    end
+    assert_equal 2, trace.size
   end
 
   def test_import_handles_tar_bz2
     trace = create(:trace, :fixture => "i")
 
-    FakeFS do
-      FakeFS::FileSystem.clone(Rails.root.join("test/gpx"))
-      trace.import
+    trace.import
 
-      assert_equal 2, trace.size
-    ensure
-      trace.destroy
-    end
+    assert_equal 2, trace.size
   end
 
   private
index 08f01e8e7d488c21c2b9493ca74434b5a82516ee..c19b809ecbcd102e4f606afa29a395ecfd2d681a 100644 (file)
@@ -28,6 +28,9 @@ module ActiveSupport
     include FactoryBot::Syntax::Methods
     include ActiveJob::TestHelper
 
+    # Run tests in parallel with specified workers
+    parallelize(:workers => :number_of_processors)
+
     ##
     # takes a block which is executed in the context of a different
     # ActionController instance. this is used so that code can call methods