Verified Commit 031b3e4b authored by Hercules Merscher's avatar Hercules Merscher 🌴
Browse files

fix: include colliding rate-limit identifier keys in errors

parent 18cebfb6
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ module Labkit

      def initialize(attributes = {})
        normalised = {}
        original_keys = {}

        attributes.each do |key, value|
          unless key.respond_to?(:to_sym)
@@ -33,9 +34,11 @@ module Labkit
            # Reject { user: 1, "user" => 2 } (and its reverse order): silently
            # choosing a value would make the rate-limit bucket insertion-order dependent.
            raise DuplicateNormalizedKeyError,
              "Identifier keys normalize to the same key #{normalised_key.inspect}: #{key.inspect}"
              "Identifier keys normalize to the same key #{normalised_key.inspect}: " \
                "#{original_keys[normalised_key].inspect} and #{key.inspect}"
          end

          original_keys[normalised_key] = key
          normalised[normalised_key] = value
        end

+2 −2
Original line number Diff line number Diff line
@@ -22,12 +22,12 @@ RSpec.describe Labkit::RateLimit::Identifier do

    it "rejects a symbol key followed by its string equivalent" do
      expect { described_class.new(user: 1, "user" => 2) }
        .to raise_error(described_class::DuplicateNormalizedKeyError, /:user/)
        .to raise_error(described_class::DuplicateNormalizedKeyError, /:user and "user"/)
    end

    it "rejects a string key followed by its symbol equivalent" do
      expect { described_class.new("user" => 1, user: 2) }
        .to raise_error(described_class::DuplicateNormalizedKeyError, /:user/)
        .to raise_error(described_class::DuplicateNormalizedKeyError, /"user" and :user/)
    end

    it "rejects duplicate normalized keys even when their values are equal" do