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 87290c62f..fb76a6c9d 100644 --- a/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +++ b/lib/shoulda/matchers/active_record/have_db_column_matcher.rb @@ -35,6 +35,7 @@ def with_options(opts = {}) @default = opts[:default] @null = opts[:null] @scale = opts[:scale] + @primary = opts[:primary] self end @@ -46,7 +47,8 @@ def matches?(subject) correct_limit? && correct_default? && correct_null? && - correct_scale? + correct_scale? && + correct_primary? end def failure_message @@ -150,6 +152,21 @@ def correct_scale? end end + def correct_primary? + return true if @primary.nil? + if matched_column.primary == @primary + true + else + @missing = "#{model_class} has a db column named #{@column} " + if @primary + @missing << "that is not primary, but should be" + else + @missing << "that is primary, but should not be" + end + false + end + end + def matched_column model_class.columns.detect { |each| each.name == @column.to_s } end diff --git a/spec/shoulda/active_record/have_db_column_matcher_spec.rb b/spec/shoulda/active_record/have_db_column_matcher_spec.rb index 3d9288422..985878414 100644 --- a/spec/shoulda/active_record/have_db_column_matcher_spec.rb +++ b/spec/shoulda/active_record/have_db_column_matcher_spec.rb @@ -164,4 +164,22 @@ Superhero.new.should_not @matcher end end + + context "have_db_column with primary option" do + it "should accept a column that is primary" do + create_table 'superheros' do |table| + table.integer :id, :primary => true + end + define_model_class 'Superhero' + Superhero.new.should have_db_column(:id).with_options(:primary => true) + end + + it "should reject a column that is not primary" do + create_table 'superheros' do |table| + table.integer :primary + end + define_model_class 'Superhero' + Superhero.new.should_not have_db_column(:primary).with_options(:primary => true) + end + end end