From f91cf59d7a62643140378e601f0a11a4deb23465 Mon Sep 17 00:00:00 2001 From: Sebastiano Date: Tue, 17 Jan 2023 14:55:35 +0100 Subject: improve validation add test cases --- lib/axlsx/drawing/pic.rb | 7 +++++-- lib/axlsx/util/mime_type_utils.rb | 9 +++++++++ test/drawing/tc_pic.rb | 18 ++++++++++++++++++ test/util/tc_mime_type_utils.rb | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/axlsx/drawing/pic.rb b/lib/axlsx/drawing/pic.rb index b6d085de..f2f72cea 100644 --- a/lib/axlsx/drawing/pic.rb +++ b/lib/axlsx/drawing/pic.rb @@ -77,7 +77,10 @@ module Axlsx def image_src=(v) Axlsx::validate_string(v) - unless remote? + if remote? + RegexValidator.validate('Pic.image_src', /\A#{URI::DEFAULT_PARSER.make_regexp}\z/, v) + RestrictionValidator.validate 'Pic.image_src', ALLOWED_MIME_TYPES, MimeTypeUtils.get_mime_type_from_uri(v) + else RestrictionValidator.validate 'Pic.image_src', ALLOWED_MIME_TYPES, MimeTypeUtils.get_mime_type(v) raise ArgumentError, "File does not exist" unless File.exist?(v) end @@ -194,7 +197,7 @@ module Axlsx str << '' str << '' if remote? - str << ('') + str << ('') else str << ('') end diff --git a/lib/axlsx/util/mime_type_utils.rb b/lib/axlsx/util/mime_type_utils.rb index 9ad56630..5a6ad38e 100644 --- a/lib/axlsx/util/mime_type_utils.rb +++ b/lib/axlsx/util/mime_type_utils.rb @@ -1,3 +1,5 @@ +require 'open-uri' + module Axlsx # This module defines some utils related with mime type detection module MimeTypeUtils @@ -7,5 +9,12 @@ module Axlsx def self.get_mime_type(v) Marcel::MimeType.for(Pathname.new(v)) end + + # Detect a file mime type from URI + # @param [String] v URI + # @return [String] File mime type + def self.get_mime_type_from_uri(v) + Marcel::MimeType.for(URI.open(v)) + end end end diff --git a/test/drawing/tc_pic.rb b/test/drawing/tc_pic.rb index 56042de5..aa4d6af7 100644 --- a/test/drawing/tc_pic.rb +++ b/test/drawing/tc_pic.rb @@ -8,7 +8,10 @@ class TestPic < Test::Unit::TestCase @test_img_png = File.dirname(__FILE__) + "/../fixtures/image1.png" @test_img_gif = File.dirname(__FILE__) + "/../fixtures/image1.gif" @test_img_fake = File.dirname(__FILE__) + "/../fixtures/image1_fake.jpg" + @test_img_remote_png = "https://via.placeholder.com/150.png" + @test_img_remote_fake = "invalid_URI" @image = ws.add_image :image_src => @test_img, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?", :opacity => 5 + @image_remote = ws.add_image :image_src => @test_img_remote_png, remote: true, :hyperlink => 'https://github.com/randym', :tooltip => "What's up doc?", :opacity => 5 end def test_initialization @@ -17,6 +20,13 @@ class TestPic < Test::Unit::TestCase assert_equal(@image.image_src, @test_img) end + def test_remote_img_initialization + assert_equal(@p.workbook.images[1], @image_remote) + assert_equal(@image_remote.file_name, nil) + assert_equal(@image_remote.image_src, @test_img_remote_png) + end + + def test_anchor_swapping # swap from one cell to two cell when end_at is specified assert(@image.anchor.is_a?(Axlsx::OneCellAnchor)) @@ -76,6 +86,14 @@ class TestPic < Test::Unit::TestCase assert_equal(@image.image_src, @test_img_jpg) end + def test_remote_image_src + assert_raise(ArgumentError) { @image_remote.image_src = @test_img_fake } + assert_raise(ArgumentError) { @image_remote.image_src = @test_img_remote_fake } + assert_nothing_raised { @image_remote.image_src = @test_img_remote_png } + assert_equal(@image_remote.image_src, @test_img_remote_png) + end + + def test_descr assert_raise(ArgumentError) { @image.descr = 49 } assert_nothing_raised { @image.descr = "test" } diff --git a/test/util/tc_mime_type_utils.rb b/test/util/tc_mime_type_utils.rb index cfeec9d3..9d116931 100644 --- a/test/util/tc_mime_type_utils.rb +++ b/test/util/tc_mime_type_utils.rb @@ -2,6 +2,7 @@ require 'tc_helper.rb' class TestMimeTypeUtils < Test::Unit::TestCase def setup @test_img = File.dirname(__FILE__) + "/../fixtures/image1.jpeg" + @test_img_url = "https://via.placeholder.com/150.png" end def teardown @@ -9,5 +10,6 @@ class TestMimeTypeUtils < Test::Unit::TestCase def test_mime_type_utils assert_equal(Axlsx::MimeTypeUtils::get_mime_type(@test_img), 'image/jpeg') + assert_equal(Axlsx::MimeTypeUtils::get_mime_type_from_uri(@test_img_url), 'image/png') end end -- cgit v1.2.3