From 8407c0dd98f98deb0327428817fe22acdf337a61 Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 27 Nov 2019 14:01:40 +0100 Subject: [PATCH 1/5] Use the settings for the destination of the gpx fixture symlinks This lets us change the settings values and have the fixtures appear in the right place. --- test/factories/traces.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/factories/traces.rb b/test/factories/traces.rb index 713a5be17..458faca83 100644 --- a/test/factories/traces.rb +++ b/test/factories/traces.rb @@ -20,11 +20,11 @@ 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.join(Settings.gpx_trace_dir, "#{trace.id}.gpx")) File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"), - Rails.root.join("test", "gpx", "images", "#{trace.id}.gif")) + File.join(Settings.gpx_image_dir, "#{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")) + File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif")) end end end From 979a474c682c894125e0fe9ddfc5bae566ad895c Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 27 Nov 2019 14:57:49 +0100 Subject: [PATCH 2/5] Use unique test directories for each trace test This allows tests to be run in parallel, since it avoids deleting some of the symlinks that other tests expect to be there. --- test/controllers/api/traces_controller_test.rb | 15 +++++++++++++-- test/controllers/traces_controller_test.rb | 15 +++++++++++++-- test/models/trace_test.rb | 15 +++++++++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/test/controllers/api/traces_controller_test.rb b/test/controllers/api/traces_controller_test.rb index 53964b2db..be5cb16cf 100644 --- a/test/controllers/api/traces_controller_test.rb +++ b/test/controllers/api/traces_controller_test.rb @@ -3,9 +3,20 @@ 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 ## diff --git a/test/controllers/traces_controller_test.rb b/test/controllers/traces_controller_test.rb index 312d451d7..0f9a9c1db 100644 --- a/test/controllers/traces_controller_test.rb +++ b/test/controllers/traces_controller_test.rb @@ -2,9 +2,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 ## diff --git a/test/models/trace_test.rb b/test/models/trace_test.rb index e0c65e33e..b610a338a 100644 --- a/test/models/trace_test.rb +++ b/test/models/trace_test.rb @@ -3,9 +3,20 @@ 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 From 6bd6cbd2031e4dce3c81db3fc669dbc42978b225 Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 27 Nov 2019 14:58:36 +0100 Subject: [PATCH 3/5] Enable parallel tests --- test/test_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 08f01e8e7..c19b809ec 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -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 From 0e612ea99af6b15cc808b342d6431e630b940d5d Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 4 Dec 2019 12:45:16 +0100 Subject: [PATCH 4/5] Remove unused directories --- test/gpx/images/.gitkeep | 0 test/gpx/traces/.gitkeep | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/gpx/images/.gitkeep delete mode 100644 test/gpx/traces/.gitkeep diff --git a/test/gpx/images/.gitkeep b/test/gpx/images/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/gpx/traces/.gitkeep b/test/gpx/traces/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 1cb0767e3dae1312d0dfefe011f339d814eaf2d5 Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 18 Mar 2020 15:35:55 +0100 Subject: [PATCH 5/5] Copy trace fixture files, rather than symlinking Since we are using tmpdirs in order to enable parallel testing, we can go the full hog and drop the fakefs too and just copy all the files directly into the tmpdir. If a test makes changes (e.g. changing the icon file during an import) the copy in the tmpdir is thrown away at the end of the test anyway. --- Gemfile | 1 - Gemfile.lock | 2 - .../controllers/api/traces_controller_test.rb | 1 - test/controllers/traces_controller_test.rb | 1 - test/factories/traces.rb | 12 +- test/models/trace_test.rb | 143 ++++++------------ 6 files changed, 52 insertions(+), 108 deletions(-) diff --git a/Gemfile b/Gemfile index 9a3fb1f6b..95144d438 100644 --- 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" diff --git a/Gemfile.lock b/Gemfile.lock index f4403e7a1..95fdf3569 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) diff --git a/test/controllers/api/traces_controller_test.rb b/test/controllers/api/traces_controller_test.rb index be5cb16cf..88c6fa90f 100644 --- a/test/controllers/api/traces_controller_test.rb +++ b/test/controllers/api/traces_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "minitest/mock" module Api class TracesControllerTest < ActionController::TestCase diff --git a/test/controllers/traces_controller_test.rb b/test/controllers/traces_controller_test.rb index 0f9a9c1db..72a375939 100644 --- a/test/controllers/traces_controller_test.rb +++ b/test/controllers/traces_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "minitest/mock" class TracesControllerTest < ActionController::TestCase # Use temporary directories with unique names for each test diff --git a/test/factories/traces.rb b/test/factories/traces.rb index 458faca83..961d52988 100644 --- a/test/factories/traces.rb +++ b/test/factories/traces.rb @@ -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"), - File.join(Settings.gpx_trace_dir, "#{trace.id}.gpx")) - File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"), - File.join(Settings.gpx_image_dir, "#{trace.id}.gif")) - File.symlink(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif"), - File.join(Settings.gpx_image_dir, "#{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/models/trace_test.rb b/test/models/trace_test.rb index b610a338a..2955be3ad 100644 --- a/test/models/trace_test.rb +++ b/test/models/trace_test.rb @@ -1,6 +1,5 @@ require "test_helper" require "gpx" -require "minitest/mock" class TraceTest < ActiveSupport::TestCase # Use temporary directories with unique names for each test @@ -189,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