4651: Merge branch 'master' into 4651-boolean-params
[arvados.git] / services / api / test / functional / arvados / v1 / groups_controller_test.rb
index f83bf53c6383dac387bbfaa367843f844e6edf28..c974076c6fc15610e2e062e3b89dc926375f7355 100644 (file)
@@ -141,15 +141,34 @@ class Arvados::V1::GroupsControllerTest < ActionController::TestCase
         filters: [['uuid', 'is_a', "arvados#collection"]],
         order: "collections.name #{order}"
       }
-      sorted_entries = json_response['items'].collect { |item| item["name"] }
+      sorted_names = json_response['items'].collect { |item| item["name"] }
+      # Here we avoid assuming too much about the database
+      # collation. Both "alice"<"Bob" and "alice">"Bob" can be
+      # correct. Hopefully it _is_ safe to assume that if "a" comes
+      # before "b" in the ascii alphabet, "aX">"bY" is never true for
+      # any strings X and Y.
+      reliably_sortable_names = sorted_names.select do |name|
+        name[0] >= 'a' and name[0] <= 'z'
+      end.uniq do |name|
+        name[0]
+      end
+      # Preserve order of sorted_names. But do not use &=. If
+      # sorted_names has out-of-order duplicates, we want to preserve
+      # them here, so we can detect them and fail the test below.
+      sorted_names.select! do |name|
+        reliably_sortable_names.include? name
+      end
+      actually_checked_anything = false
       previous = nil
-      sorted_entries.each do |entry|
+      sorted_names.each do |entry|
         if previous
           assert_operator(previous, operator, entry,
-                          "Entries sorted incorrectly. Perhaps the application and database have mismatched locale settings?")
+                          "Entries sorted incorrectly.")
+          actually_checked_anything = true
         end
         previous = entry
       end
+      assert actually_checked_anything, "Didn't even find two names to compare."
     end
   end