]> source.dussan.org Git - redmine.git/commitdiff
scm: git: add test of UTF-8 Emoji committer and comments (#24030)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Tue, 14 Apr 2020 08:20:52 +0000 (08:20 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Tue, 14 Apr 2020 08:20:52 +0000 (08:20 +0000)
git-svn-id: http://svn.redmine.org/redmine/trunk@19699 e93f8b46-1217-0410-a6f0-8f06a7374b81

test/test_helper.rb
test/unit/repository_git_test.rb

index aeea0e2160c5b51bb265d92ce2d09afcc1727892..07464b2ffa6f218f81709549d7276de690c97935 100644 (file)
@@ -163,6 +163,21 @@ class ActiveSupport::TestCase
     File.directory?(repository_path(vendor))
   end
 
+  def self.is_mysql_utf8mb4
+    return false unless Redmine::Database::mysql?
+    character_sets = %w[
+      character_set_connection
+      character_set_database
+      character_set_results
+      character_set_server
+    ]
+    ActiveRecord::Base.connection.
+        select_rows('show variables like "character%"').each do |r|
+      return false if character_sets.include?(r[0]) && r[1] != "utf8mb4"
+    end
+    return true
+  end
+
   def repository_path_hash(arr)
     hs = {}
     hs[:path]  = arr.join("/")
index 7c0d40b6551f8c03204a64f5f4d80d0742c21405..88d16679efd2f9818ddb58ea68bbba10bb49b62b 100644 (file)
@@ -27,6 +27,9 @@ class RepositoryGitTest < ActiveSupport::TestCase
   REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s
   REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
 
+  REPOSITORY_UTF8_PATH = Rails.root.join('tmp/test/git_utf8_repository').to_s
+  REPOSITORY_UTF8_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
+
   NUM_REV = 28
   NUM_HEAD = 8
 
@@ -587,4 +590,32 @@ class RepositoryGitTest < ActiveSupport::TestCase
     puts "Git test repository NOT FOUND. Skipping unit tests !!!"
     def test_fake; assert true end
   end
+
+  if File.directory?(REPOSITORY_UTF8_PATH) &&
+      !(Redmine::Database::mysql? && !is_mysql_utf8mb4)
+    def test_utf8_emoji
+      repo = Repository::Git.create(
+                          :project      => @project,
+                          :url          => REPOSITORY_UTF8_PATH,
+                          :identifier   => 'utf8',
+                          :path_encoding => 'UTF-8'
+                        )
+      assert repo
+      assert_equal 0, repo.changesets.count
+      repo.fetch_changesets
+      @project.reload
+      assert_equal 1, repo.changesets.count
+      changeset = repo.find_changeset_by_name('9da6b5c6748cc62ee26616718c9bb0e9acfb3e15')
+      assert_equal "U+1F603\u{1F603} <none@none>", changeset.committer
+      assert_equal "U+1F603\u{1F603}", changeset.comments
+    end
+  elsif !File.directory?(REPOSITORY_UTF8_PATH)
+    puts "Git UTF-8 test repository NOT FOUND. Skipping unit tests !!!"
+    def test_fake; assert true end
+  else
+    puts "Git UTF-8 test repository contains Emoji."
+    puts "Tests connot run on NOT utf8mb4 MySQL."
+    puts "Skipping unit tests !!!"
+   def test_fake; assert true end
+  end
 end