Switch traces to use ActiveStorage

This commit is contained in:
Tom Hughes 2021-10-17 16:00:22 +01:00
parent ef85e8c7b3
commit 0410596908
10 changed files with 249 additions and 268 deletions

View file

@ -54,6 +54,8 @@ module Api
send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
elsif request.format == Mime[:gpx]
send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
elsif trace.file.attached?
redirect_to rails_blob_path(trace.file, :disposition => "attachment")
else
send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
end
@ -97,12 +99,6 @@ module Api
# Sanitise the user's filename
name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, "_")
# Get a temporary filename...
filename = "/tmp/#{rand}"
# ...and save the uploaded file to that location
File.open(filename, "wb") { |f| f.write(file.read) }
# Create the trace object, falsely marked as already
# inserted to stop the import daemon trying to load it
trace = Trace.new(
@ -110,40 +106,14 @@ module Api
:tagstring => tags,
:description => description,
:visibility => visibility,
:inserted => true,
:inserted => false,
:user => current_user,
:timestamp => Time.now.getutc
:timestamp => Time.now.getutc,
:file => file
)
if trace.valid?
Trace.transaction do
begin
# Save the trace object
trace.save!
# Rename the temporary file to the final name
FileUtils.mv(filename, trace.trace_name)
rescue StandardError
# Remove the file as we have failed to update the database
FileUtils.rm_f(filename)
# Pass the exception on
raise
end
begin
# Clear the inserted flag to make the import daemon load the trace
trace.inserted = false
trace.save!
rescue StandardError
# Remove the file as we have failed to update the database
FileUtils.rm_f(trace.trace_name)
# Pass the exception on
raise
end
end
end
# Save the trace object
trace.save!
# Finally save the user's preferred privacy level
if pref = current_user.preferences.where(:k => "gps.trace.visibility").first

View file

@ -99,12 +99,8 @@ class TracesController < ApplicationController
logger.info(params[:trace][:gpx_file].class.name)
if params[:trace][:gpx_file].respond_to?(:read)
begin
@trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
params[:trace][:description], params[:trace][:visibility])
rescue StandardError => e
logger.debug e
end
@trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
params[:trace][:description], params[:trace][:visibility])
if @trace.id
flash[:notice] = t ".trace_uploaded"
@ -141,6 +137,8 @@ class TracesController < ApplicationController
send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
elsif request.format == Mime[:gpx]
send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
elsif trace.file.attached?
redirect_to rails_blob_path(trace.file, :disposition => "attachment")
else
send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
end
@ -217,8 +215,12 @@ class TracesController < ApplicationController
if trace.visible? && trace.inserted?
if trace.public? || (current_user && current_user == trace.user)
expires_in 7.days, :private => !trace.public?, :public => trace.public?
send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
if trace.icon.attached?
redirect_to rails_blob_path(trace.image, :disposition => "inline")
else
expires_in 7.days, :private => !trace.public?, :public => trace.public?
send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
end
else
head :forbidden
end
@ -234,8 +236,12 @@ class TracesController < ApplicationController
if trace.visible? && trace.inserted?
if trace.public? || (current_user && current_user == trace.user)
expires_in 7.days, :private => !trace.public?, :public => trace.public?
send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
if trace.icon.attached?
redirect_to rails_blob_path(trace.icon, :disposition => "inline")
else
expires_in 7.days, :private => !trace.public?, :public => trace.public?
send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
end
else
head :forbidden
end
@ -252,62 +258,29 @@ class TracesController < ApplicationController
# Sanitise the user's filename
name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, "_")
# Get a temporary filename...
filename = "/tmp/#{rand}"
# ...and save the uploaded file to that location
File.open(filename, "wb") { |f| f.write(file.read) }
# Create the trace object, falsely marked as already
# inserted to stop the import daemon trying to load it
# Create the trace object
trace = Trace.new(
:name => name,
:tagstring => tags,
:description => description,
:visibility => visibility,
:inserted => true,
:inserted => false,
:user => current_user,
:timestamp => Time.now.getutc
:timestamp => Time.now.getutc,
:file => file
)
if trace.valid?
Trace.transaction do
begin
# Save the trace object
trace.save!
# Rename the temporary file to the final name
FileUtils.mv(filename, trace.trace_name)
rescue StandardError
# Remove the file as we have failed to update the database
FileUtils.rm_f(filename)
# Pass the exception on
raise
end
begin
# Clear the inserted flag to make the import daemon load the trace
trace.inserted = false
trace.save!
rescue StandardError
# Remove the file as we have failed to update the database
FileUtils.rm_f(trace.trace_name)
# Pass the exception on
raise
end
# Save the trace object
if trace.save
# Finally save the user's preferred privacy level
if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
pref.v = visibility
pref.save
else
current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
end
end
# Finally save the user's preferred privacy level
if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
pref.v = visibility
pref.save
else
current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
end
trace
end

View file

@ -39,6 +39,10 @@ class Trace < ApplicationRecord
scope :visible_to_all, -> { where(:visibility => %w[public identifiable]) }
scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) }
has_one_attached :file, :service => Settings.trace_file_storage
has_one_attached :image, :service => Settings.trace_image_storage
has_one_attached :icon, :service => Settings.trace_icon_storage
validates :user, :presence => true, :associated => true
validates :name, :presence => true, :length => 1..255, :characters => true
validates :description, :presence => { :on => :create }, :length => 1..255, :characters => true
@ -46,6 +50,7 @@ class Trace < ApplicationRecord
validates :visibility, :inclusion => %w[private public trackable identifiable]
after_destroy :remove_files
after_save :set_filename
def tagstring
tags.collect(&:tag).join(", ")
@ -68,6 +73,18 @@ class Trace < ApplicationRecord
end
end
def file=(attachable)
case attachable
when ActionDispatch::Http::UploadedFile, Rack::Test::UploadedFile
super(:io => attachable,
:filename => attachable.original_filename,
:content_type => content_type(attachable.path),
:identify => false)
else
super(attachable)
end
end
def public?
visibility == "public" || visibility == "identifiable"
end
@ -80,29 +97,27 @@ class Trace < ApplicationRecord
visibility == "identifiable"
end
def large_picture=(data)
f = File.new(large_picture_name, "wb")
f.syswrite(data)
f.close
end
def icon_picture=(data)
f = File.new(icon_picture_name, "wb")
f.syswrite(data)
f.close
end
def large_picture
f = File.new(large_picture_name, "rb")
data = f.sysread(File.size(f.path))
f.close
if image.attached?
data = image.blob.download
else
f = File.new(large_picture_name, "rb")
data = f.sysread(File.size(f.path))
f.close
end
data
end
def icon_picture
f = File.new(icon_picture_name, "rb")
data = f.sysread(File.size(f.path))
f.close
if icon.attached?
data = icon.blob.download
else
f = File.new(icon_picture_name, "rb")
data = f.sysread(File.size(f.path))
f.close
end
data
end
@ -119,46 +134,22 @@ class Trace < ApplicationRecord
end
def mime_type
filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
gzipped = filetype.include?("gzip compressed")
bzipped = filetype.include?("bzip2 compressed")
zipped = filetype.include?("Zip archive")
tarred = filetype.include?("tar archive")
if gzipped
"application/x-gzip"
elsif bzipped
"application/x-bzip2"
elsif zipped
"application/x-zip"
elsif tarred
"application/x-tar"
if file.attached?
file.content_type
else
"application/gpx+xml"
content_type(trace_name)
end
end
def extension_name
filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
gzipped = filetype.include?("gzip compressed")
bzipped = filetype.include?("bzip2 compressed")
zipped = filetype.include?("Zip archive")
tarred = filetype.include?("tar archive")
if tarred && gzipped
".tar.gz"
elsif tarred && bzipped
".tar.bz2"
elsif tarred
".tar"
elsif gzipped
".gpx.gz"
elsif bzipped
".gpx.bz2"
elsif zipped
".zip"
else
".gpx"
case mime_type
when "application/x-tar+gzip" then ".tar.gz"
when "application/x-tar+x-bzip2" then ".tar.bz2"
when "application/x-tar" then ".tar"
when "application/zip" then ".zip"
when "application/gzip" then ".gpx.gz"
when "application/x-bzip2" then ".gpx.bz2"
else ".gpx"
end
end
@ -207,106 +198,136 @@ class Trace < ApplicationRecord
end
def xml_file
filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
gzipped = filetype.include?("gzip compressed")
bzipped = filetype.include?("bzip2 compressed")
zipped = filetype.include?("Zip archive")
tarred = filetype.include?("tar archive")
with_trace_file do |trace_name|
filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
gzipped = filetype.include?("gzip compressed")
bzipped = filetype.include?("bzip2 compressed")
zipped = filetype.include?("Zip archive")
tarred = filetype.include?("tar archive")
if gzipped || bzipped || zipped || tarred
file = Tempfile.new("trace.#{id}")
if gzipped || bzipped || zipped || tarred
file = Tempfile.new("trace.#{id}")
if tarred && gzipped
system("tar", "-zxOf", trace_name, :out => file.path)
elsif tarred && bzipped
system("tar", "-jxOf", trace_name, :out => file.path)
elsif tarred
system("tar", "-xOf", trace_name, :out => file.path)
elsif gzipped
system("gunzip", "-c", trace_name, :out => file.path)
elsif bzipped
system("bunzip2", "-c", trace_name, :out => file.path)
elsif zipped
system("unzip", "-p", trace_name, "-x", "__MACOSX/*", :out => file.path, :err => "/dev/null")
if tarred && gzipped
system("tar", "-zxOf", trace_name, :out => file.path)
elsif tarred && bzipped
system("tar", "-jxOf", trace_name, :out => file.path)
elsif tarred
system("tar", "-xOf", trace_name, :out => file.path)
elsif gzipped
system("gunzip", "-c", trace_name, :out => file.path)
elsif bzipped
system("bunzip2", "-c", trace_name, :out => file.path)
elsif zipped
system("unzip", "-p", trace_name, "-x", "__MACOSX/*", :out => file.path, :err => "/dev/null")
end
file.unlink
else
file = File.open(trace_name)
end
file.unlink
else
file = File.open(trace_name)
file
end
file
end
def import
logger.info("GPX Import importing #{name} (#{id}) from #{user.email}")
gpx = GPX::File.new(trace_name)
with_trace_file do |trace_name|
gpx = GPX::File.new(trace_name)
f_lat = 0
f_lon = 0
first = true
f_lat = 0
f_lon = 0
first = true
# If there are any existing points for this trace then delete them
Tracepoint.where(:gpx_id => id).delete_all
# If there are any existing points for this trace then delete them
Tracepoint.where(:gpx_id => id).delete_all
gpx.points.each_slice(1_000) do |points|
# Gather the trace points together for a bulk import
tracepoints = []
gpx.points.each_slice(1_000) do |points|
# Gather the trace points together for a bulk import
tracepoints = []
points.each do |point|
if first
f_lat = point.latitude
f_lon = point.longitude
first = false
points.each do |point|
if first
f_lat = point.latitude
f_lon = point.longitude
first = false
end
tp = Tracepoint.new
tp.lat = point.latitude
tp.lon = point.longitude
tp.altitude = point.altitude
tp.timestamp = point.timestamp
tp.gpx_id = id
tp.trackid = point.segment
tracepoints << tp
end
tp = Tracepoint.new
tp.lat = point.latitude
tp.lon = point.longitude
tp.altitude = point.altitude
tp.timestamp = point.timestamp
tp.gpx_id = id
tp.trackid = point.segment
tracepoints << tp
# Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import
tracepoints.each do |tp|
tp.run_callbacks(:save) { false }
tp.run_callbacks(:create) { false }
end
Tracepoint.import!(tracepoints)
end
# Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import
tracepoints.each do |tp|
tp.run_callbacks(:save) { false }
tp.run_callbacks(:create) { false }
if gpx.actual_points.positive?
max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)
max_lon = Tracepoint.where(:gpx_id => id).maximum(:longitude)
min_lon = Tracepoint.where(:gpx_id => id).minimum(:longitude)
max_lat = max_lat.to_f / 10000000
min_lat = min_lat.to_f / 10000000
max_lon = max_lon.to_f / 10000000
min_lon = min_lon.to_f / 10000000
self.latitude = f_lat
self.longitude = f_lon
image.attach(:io => gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points), :filename => "#{id}.gif", :content_type => "image/gif")
icon.attach(:io => gpx.icon(min_lat, min_lon, max_lat, max_lon), :filename => "#{id}_icon.gif", :content_type => "image/gif")
self.size = gpx.actual_points
self.inserted = true
save!
end
Tracepoint.import!(tracepoints)
logger.info "done trace #{id}"
gpx
end
if gpx.actual_points.positive?
max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)
max_lon = Tracepoint.where(:gpx_id => id).maximum(:longitude)
min_lon = Tracepoint.where(:gpx_id => id).minimum(:longitude)
max_lat = max_lat.to_f / 10000000
min_lat = min_lat.to_f / 10000000
max_lon = max_lon.to_f / 10000000
min_lon = min_lon.to_f / 10000000
self.latitude = f_lat
self.longitude = f_lon
self.large_picture = gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points)
self.icon_picture = gpx.icon(min_lat, min_lon, max_lat, max_lon)
self.size = gpx.actual_points
self.inserted = true
save!
end
logger.info "done trace #{id}"
gpx
end
private
def content_type(file)
case Open3.capture2("/usr/bin/file", "-Lbz", file).first.chomp
when /.*\btar archive\b.*\bgzip\b/ then "application/x-tar+gzip"
when /.*\btar archive\b.*\bbzip2\b/ then "application/x-tar+x-bzip2"
when /.*\btar archive\b/ then "application/x-tar"
when /.*\bZip archive\b/ then "application/zip"
when /.*\bXML\b.*\bgzip\b/ then "application/gzip"
when /.*\bXML\b.*\bbzip2\b/ then "application/x-bzip2"
else "application/gpx+xml"
end
end
def with_trace_file
if file.attached?
file.open do |file|
yield file.path
end
else
yield trace_name
end
end
def set_filename
file.blob.update(:filename => "#{id}#{extension_name}") if file.attached?
end
def remove_files
FileUtils.rm_f(trace_name)
FileUtils.rm_f(icon_picture_name)

View file

@ -134,3 +134,6 @@ smtp_user_name: null
smtp_password: null
# Storage services
avatar_storage: "local"
trace_file_storage: "local"
trace_image_storage: "local"
trace_icon_storage: "local"

View file

@ -21,3 +21,6 @@ wikipedia_auth_secret: "dummy"
server_url: "test.host"
# Storage services for testing
avatar_storage: "test"
trace_file_storage: "test"
trace_image_storage: "test"
trace_icon_storage: "test"

View file

@ -121,7 +121,7 @@ module GPX
output = StringIO.new
image.export(output)
output.read
output
end
def icon(min_lat, min_lon, max_lat, max_lon)
@ -161,7 +161,7 @@ module GPX
end
end
image.gif
StringIO.new(image.gif)
end
end

View file

@ -119,11 +119,15 @@ module Api
# Now with some other user, which should work since the trace is public
auth_header = basic_authorization_header create(:user).display_name, "test"
get api_trace_data_path(public_trace_file), :headers => auth_header
follow_redirect!
follow_redirect!
check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
# And finally we should be able to do it with the owner of the trace
auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
get api_trace_data_path(public_trace_file), :headers => auth_header
follow_redirect!
follow_redirect!
check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
end
@ -136,7 +140,9 @@ module Api
# First get the data as is
get api_trace_data_path(identifiable_trace_file), :headers => auth_header
check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/x-gzip", "gpx.gz"
follow_redirect!
follow_redirect!
check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
# Now ask explicitly for XML format
get api_trace_data_path(identifiable_trace_file, :format => "xml"), :headers => auth_header
@ -163,6 +169,8 @@ module Api
# And finally we should be able to do it with the owner of the trace
auth_header = basic_authorization_header anon_trace_file.user.display_name, "test"
get api_trace_data_path(anon_trace_file), :headers => auth_header
follow_redirect!
follow_redirect!
check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
end
@ -211,7 +219,7 @@ module Api
assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
assert_equal "trackable", trace.visibility
assert_not trace.inserted
assert_equal File.new(fixture).read, File.new(trace.trace_name).read
assert_equal File.new(fixture).read, trace.file.blob.download
trace.destroy
assert_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
@ -229,7 +237,7 @@ module Api
assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
assert_equal "public", trace.visibility
assert_not trace.inserted
assert_equal File.new(fixture).read, File.new(trace.trace_name).read
assert_equal File.new(fixture).read, trace.file.blob.download
trace.destroy
assert_equal "public", user.preferences.where(:k => "gps.trace.visibility").first.v
@ -248,7 +256,7 @@ module Api
assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
assert_equal "private", trace.visibility
assert_not trace.inserted
assert_equal File.new(fixture).read, File.new(trace.trace_name).read
assert_equal File.new(fixture).read, trace.file.blob.download
trace.destroy
assert_equal "private", second_user.preferences.where(:k => "gps.trace.visibility").first.v
end

View file

@ -369,16 +369,22 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
# First with no auth, which should work since the trace is public
get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
follow_redirect!
follow_redirect!
check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
# Now with some other user, which should work since the trace is public
session_for(create(:user))
get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
follow_redirect!
follow_redirect!
check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
# And finally we should be able to do it with the owner of the trace
session_for(public_trace_file.user)
get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
follow_redirect!
follow_redirect!
check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
end
@ -388,7 +394,9 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
# First get the data as is
get trace_data_path(:display_name => identifiable_trace_file.user.display_name, :id => identifiable_trace_file)
check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/x-gzip", "gpx.gz"
follow_redirect!
follow_redirect!
check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
# Now ask explicitly for XML format
get trace_data_path(:display_name => identifiable_trace_file.user.display_name, :id => identifiable_trace_file.id, :format => "xml")
@ -415,6 +423,8 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
# And finally we should be able to do it with the owner of the trace
session_for(anon_trace_file.user)
get trace_data_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
follow_redirect!
follow_redirect!
check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
end
@ -598,7 +608,7 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
assert_equal "trackable", trace.visibility
assert_not trace.inserted
assert_equal File.new(fixture).read, File.new(trace.trace_name).read
assert_equal File.new(fixture).read, trace.file.blob.download
trace.destroy
assert_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
end
@ -789,19 +799,22 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
end
def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
assert_response :success
assert_equal digest, Digest::MD5.hexdigest(response.body)
assert_equal content_type, response.media_type
assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
end
def check_trace_picture(trace)
follow_redirect!
follow_redirect!
assert_response :success
assert_equal "image/gif", response.media_type
assert_equal trace.large_picture, response.body
end
def check_trace_icon(trace)
follow_redirect!
follow_redirect!
assert_response :success
assert_equal "image/gif", response.media_type
assert_equal trace.icon_picture, response.body

View file

@ -17,14 +17,14 @@ FactoryBot.define do
fixture { nil }
end
after(:create) do |trace, evaluator|
after(:build) do |user, evaluator|
if evaluator.fixture
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"))
user.file.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx")))
if evaluator.inserted
user.image.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif")))
user.icon.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif")))
end
end
end
end

View file

@ -136,11 +136,11 @@ class TraceTest < ActiveSupport::TestCase
check_mime_type("a", "application/gpx+xml")
check_mime_type("b", "application/gpx+xml")
check_mime_type("c", "application/x-bzip2")
check_mime_type("d", "application/x-gzip")
check_mime_type("f", "application/x-zip")
check_mime_type("d", "application/gzip")
check_mime_type("f", "application/zip")
check_mime_type("g", "application/x-tar")
check_mime_type("h", "application/x-gzip")
check_mime_type("i", "application/x-bzip2")
check_mime_type("h", "application/x-tar+gzip")
check_mime_type("i", "application/x-tar+x-bzip2")
end
def test_extension_name
@ -168,24 +168,16 @@ class TraceTest < ActiveSupport::TestCase
def test_large_picture
picture = File.read(Rails.root.join("test/gpx/fixtures/a.gif"), :mode => "rb")
trace = create(:trace, :fixture => "a")
trace = Trace.create
trace.large_picture = picture
assert_equal "7c841749e084ee4a5d13f12cd3bef456", md5sum(File.new(trace.large_picture_name))
assert_equal picture, trace.large_picture
trace.destroy
end
def test_icon_picture
picture = File.read(Rails.root.join("test/gpx/fixtures/a_icon.gif"), :mode => "rb")
trace = create(:trace, :fixture => "a")
trace = Trace.create
trace.icon_picture = picture
assert_equal "b47baf22ed0e85d77e808694fad0ee27", md5sum(File.new(trace.icon_picture_name))
assert_equal picture, trace.icon_picture
trace.destroy
end
def test_import_removes_previous_tracepoints
@ -215,29 +207,27 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_creates_icon
trace = create(:trace, :fixture => "a")
icon_path = File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif")
FileUtils.rm(icon_path)
assert_not File.exist?(icon_path)
trace = create(:trace, :inserted => false, :fixture => "a")
assert_not trace.icon.attached?
trace.import
assert_path_exists(icon_path)
assert trace.icon.attached?
end
def test_import_creates_large_picture
trace = create(:trace, :fixture => "a")
large_picture_path = File.join(Settings.gpx_image_dir, "#{trace.id}.gif")
FileUtils.rm(large_picture_path)
assert_not File.exist?(large_picture_path)
trace = create(:trace, :inserted => false, :fixture => "a")
assert_not trace.image.attached?
trace.import
assert_path_exists(large_picture_path)
assert trace.image.attached?
end
def test_import_handles_bz2
trace = create(:trace, :fixture => "c")
trace = create(:trace, :inserted => false, :fixture => "c")
trace.import
@ -245,7 +235,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_plain
trace = create(:trace, :fixture => "a")
trace = create(:trace, :inserted => false, :fixture => "a")
trace.import
@ -253,7 +243,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_plain_with_bom
trace = create(:trace, :fixture => "b")
trace = create(:trace, :inserted => false, :fixture => "b")
trace.import
@ -261,7 +251,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_gz
trace = create(:trace, :fixture => "d")
trace = create(:trace, :inserted => false, :fixture => "d")
trace.import
@ -269,7 +259,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_zip
trace = create(:trace, :fixture => "f")
trace = create(:trace, :inserted => false, :fixture => "f")
trace.import
@ -277,7 +267,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_tar
trace = create(:trace, :fixture => "g")
trace = create(:trace, :inserted => false, :fixture => "g")
trace.import
@ -285,7 +275,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_tar_gz
trace = create(:trace, :fixture => "h")
trace = create(:trace, :inserted => false, :fixture => "h")
trace.import
@ -293,7 +283,7 @@ class TraceTest < ActiveSupport::TestCase
end
def test_import_handles_tar_bz2
trace = create(:trace, :fixture => "i")
trace = create(:trace, :inserted => false, :fixture => "i")
trace.import