# encoding: UTF-8 require File.expand_path("./helper", File.dirname(__FILE__)) class User < Ohm::Model attribute :name attribute :account def validate assert_present :name assert_present :account assert false, :terrible_error end end setup do @model = User.new(:account => "") @model.valid? end test "raise an error if the errors are not handled" do begin @model.errors.present do |e| e.on :terrible_error do end end rescue => e assert e.class == Ohm::Validations::Presenter::UnhandledErrors end end test "evaluate blocks when errors match" do values = [] @model.errors.present do |e| e.on [:name, :not_present] do values << 1 end e.on [:account, :not_present] do values << 2 end e.on :terrible_error do values << 3 end end assert [1, 2, 3] == values end test "accept case-like matches for an error" do values = [] @model.errors.present do |e| e.on Array do values << 1 end e.on :terrible_error do values << 3 end end assert [1, 3] == values end test "accept multiple matches for an error" do values = @model.errors.present do |e| e.on [:name, :not_present], "A" e.on [:account, :not_present] do "B" end e.on :terrible_error, "C" end assert %w{A B C} == values end class MyPresenter < Ohm::Validations::Presenter def on(*args) super(*args) do yield.downcase end end end test "take a custom presenter" do values = @model.errors.present(MyPresenter) do |e| e.on([:name, :not_present]) { "A" } e.on([:account, :not_present]) { "B" } e.on(:terrible_error) { "C" } end assert %w{a b c} == values end test "raise an error if neither a message nor a block are supplied" do begin Ohm::Validations::Presenter.new([:custom]).present do |e| e.on(:custom) end rescue => e assert e.class == ArgumentError end end test "not raise an error if the message passed is nil" do values = Ohm::Validations::Presenter.new([:custom]).present do |e| e.on(:custom, nil) end assert [nil] == values Ohm::Validations::Presenter.new([:custom]).present do |e| e.on(:custom, nil) do raise "Should not call block" end end end