require 'test/unit' require 'rubygems' require 'active_record' require "#{File.dirname(__FILE__)}/../lib/raccess" require "#{File.dirname(__FILE__)}/model/beer" require "#{File.dirname(__FILE__)}/model/brewery" class RaccessTest < Test::Unit::TestCase def setup ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => "#{File.dirname(__FILE__)}/test.db") ActiveRecord::Schema.define() do create_table "beers" do |beer| beer.column "name", :string, :limit => 255 beer.column "ibu", :int beer.column "abv", :int beer.column "botted_at", :datetime beer.column "deleted", :boolean, :default => false, :null => false beer.column "brewery_id", :int end create_table "breweries" do |brewery| brewery.column "name", :string, :limit => 255 end end @yards = Brewery.create(:name => "Yard's") @dogfishhead = Brewery.create(:name => "Dogfishhead Brewery") @ipa = Beer.create(:name => "IPA", :brewery => @yards, :abv => 9) @ipa_120_minute = Beer.create(:name => "120 Minute IPA", :brewery => @dogfishhead, :abv => 23) end def teardown ActiveRecord::Schema.define() do drop_table "beers" drop_table "breweries" end ActiveRecord::Base.remove_connection Beer.class_eval do flush_visiblity_rules end end def test_fake_model_load assert_equal @yards, @ipa.brewery assert_equal 1, @yards.beers.size end def test_no_rules beers = Beer.find(:all) Beer.class_eval do acts_as_filterable end assert_equal beers, Beer.find(:all) end def test_beer_rules assert Beer.find(:all).include?( @ipa_120_minute ) assert @dogfishhead.beers.include?( @ipa_120_minute ) ipa_id = @ipa_120_minute.id @ipa_120_minute.deleted = true assert @ipa_120_minute.save Beer.class_eval do acts_as_filterable invisible_if(:deleted) end assert !Beer.find(:all).include?( @ipa_120_minute ) assert_raises ActiveRecord::RecordNotFound do ipa = Beer.find( ipa_id ) end end def test_test_unaffected_beers # And grab the unaffected beer assert_nothing_raised do ipa = Beer.find(@ipa.id) assert_equal ipa, Beer.find(:first) end end def test_multipe_rules # Test Another Rule being added Beer.class_eval do acts_as_filterable def too_weak? return true if abv < 15 end invisible_if :deleted invisible_if :too_weak? end assert_equal 0, Beer.find(:all).size end def test_default_ruleset_true @ipa.deleted = true @ipa.save ActiveRecord::Base.security_ignore do assert_equal 1, Beer.find(:all, :conditions => ['deleted = ?', true]).size end # We're saying its visible by default, and we're # adding visibility if its deleted (should be all) Beer.class_eval do acts_as_filterable :visible => true visible_if :deleted end assert_equal 2, Beer.find(:all).size end def test_default_releset_false @ipa.deleted = true assert @ipa.save ActiveRecord::Base.security_ignore do Beer.find(:all).each do |beer| puts "#{beer.name} - #{beer.deleted}" end assert_equal 1, Beer.find(:all, :conditions => ['deleted = ?', true]).size end # The one deleted record should override # the default visibility of false Beer.class_eval do acts_as_filterable :visible => false visible_if :deleted end assert_equal 1, Beer.find(:all).size end def test_always_flag end end