From 68e65b2aba85fa48b6415e3aed3517eb366addc7 Mon Sep 17 00:00:00 2001 From: Gabe Berke-Williams Date: Fri, 30 Mar 2012 14:07:41 -0400 Subject: [PATCH] Check primality of DB columns. Fixes #35. --- .../active_record/have_db_column_matcher.rb | 19 ++++++++++++++++++- .../have_db_column_matcher_spec.rb | 18 ++++++++++++++++++ 2 files changed, 36 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 87290c62..fb76a6c9 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 @@ module Shoulda # :nodoc: @default = opts[:default] @null = opts[:null] @scale = opts[:scale] + @primary = opts[:primary] self end @@ -46,7 +47,8 @@ module Shoulda # :nodoc: correct_limit? && correct_default? && correct_null? && - correct_scale? + correct_scale? && + correct_primary? end def failure_message @@ -150,6 +152,21 @@ module Shoulda # :nodoc: 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 3d928842..98587841 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 @@ describe Shoulda::Matchers::ActiveRecord::HaveDbColumnMatcher do 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