From 63b6321175c636addb67df8050d78e02d9df00cc Mon Sep 17 00:00:00 2001 From: Rodrigo A Chaves Date: Thu, 1 Oct 2020 21:43:03 -0300 Subject: [PATCH] fix have_db_column.with_options misspelled options have_db_column().with_options() should raise an ArgumentError if receives a misspelled argument --- .../matchers/active_record/have_db_column_matcher.rb | 12 +++++++++++- .../active_record/have_db_column_matcher_spec.rb | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/shoulda/matchers/active_record/have_db_column_matcher.rb b/lib/shoulda/matchers/active_record/have_db_column_matcher.rb index 4430e72a4..c6ab4e412 100644 --- a/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +++ b/lib/shoulda/matchers/active_record/have_db_column_matcher.rb @@ -84,6 +84,8 @@ def have_db_column(column) # @private class HaveDbColumnMatcher + OPTIONS = %i(precision limit default null scale primary) + def initialize(column) @column = column @options = {} @@ -95,7 +97,8 @@ def of_type(column_type) end def with_options(opts = {}) - %w(precision limit default null scale primary).each do |attribute| + validate_options(opts) + OPTIONS.each do |attribute| if opts.key?(attribute.to_sym) @options[attribute.to_sym] = opts[attribute.to_sym] end @@ -141,6 +144,13 @@ def description protected + def validate_options(opts) + invalid_options = opts.keys.map(&:to_sym) - OPTIONS + if invalid_options.any? + raise ArgumentError, "Unknown option(s): #{invalid_options.map(&:inspect).join(", ")}" + end + end + def column_exists? if model_class.column_names.include?(@column.to_s) true diff --git a/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb b/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb index 1d23259a1..ab165f39f 100644 --- a/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +++ b/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb @@ -98,6 +98,14 @@ end end + context 'with invalid argument option' do + it 'raises an error with the unknown options' do + expect { + have_db_column(:salary).with_options(preccision: 5, primaryy: true) + }.to raise_error("Unknown option(s): :preccision, :primaryy") + end + end + def model(options = {}) define_model(:employee, options).new end