Write some basic functionality tests for trace.import
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 23 Jan 2019 15:47:54 +0000 (16:47 +0100)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 23 Jan 2019 15:47:54 +0000 (16:47 +0100)
Gemfile
Gemfile.lock
test/models/trace_test.rb

diff --git a/Gemfile b/Gemfile
index 1517123..fa14089 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -128,6 +128,7 @@ end
 
 # Gems needed for running tests
 group :test do
 
 # 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"
   gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20]
   gem "rails-controller-testing"
   gem "rubocop"
index df455ef..6f7a091 100644 (file)
@@ -117,6 +117,7 @@ GEM
     factory_bot_rails (4.11.1)
       factory_bot (~> 4.11.1)
       railties (>= 3.0.0)
     factory_bot_rails (4.11.1)
       factory_bot (~> 4.11.1)
       railties (>= 3.0.0)
+    fakefs (0.18.1)
     faraday (0.15.4)
       multipart-post (>= 1.2, < 3)
     ffi (1.9.25)
     faraday (0.15.4)
       multipart-post (>= 1.2, < 3)
     ffi (1.9.25)
@@ -403,6 +404,7 @@ DEPENDENCIES
   delayed_job_active_record
   dynamic_form
   factory_bot_rails
   delayed_job_active_record
   dynamic_form
   factory_bot_rails
+  fakefs
   faraday
   gd2-ffij
   geoip
   faraday
   gd2-ffij
   geoip
index 4a6ac10..8bae041 100644 (file)
@@ -192,6 +192,66 @@ class TraceTest < ActiveSupport::TestCase
     trace.destroy
   end
 
     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.import
+
+      assert_equal 0, Tracepoint.where(:latitude => 54321).count
+    end
+  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.import
+
+      trace.reload
+      assert_equal 1, Tracepoint.where(:gpx_id => trace.id).count
+    end
+  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(GPX_IMAGE_DIR, "#{trace.id}_icon.gif")
+      FileUtils.rm(icon_path)
+      assert_equal false, File.exist?(icon_path)
+
+      trace.import
+
+      assert_equal true, File.exist?(icon_path)
+    end
+  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(GPX_IMAGE_DIR, "#{trace.id}.gif")
+      FileUtils.rm(large_picture_path)
+      assert_equal false, File.exist?(large_picture_path)
+
+      trace.import
+
+      assert_equal true, File.exist?(large_picture_path)
+    end
+  end
+
   private
 
   def check_query(query, traces)
   private
 
   def check_query(query, traces)