require File.join(File.dirname(__FILE__), "spec_helper")

describe Sequel::Model::DatasetMethods, "#destroy"  do
  before do
    @c = Class.new(Sequel::Model(:items)) do
      @@destroyed = []
      def destroy
        @@destroyed << self
      end
      def self.destroyed
        @@destroyed
      end
    end
    @d = @c.dataset
  end

  it "should instantiate objects in the dataset and call destroy on each" do
    def @d.fetch_rows(sql)
      yield({:id=>1})
      yield({:id=>2})
    end
    @d.destroy
    @c.destroyed.collect{|x| x.values}.should == [{:id=>1}, {:id=>2}]
  end

  it "should return the number of records destroyed" do
    def @d.fetch_rows(sql)
      yield({:id=>1})
      yield({:id=>2})
    end
    @d.destroy.should == 2
    def @d.fetch_rows(sql)
      yield({:id=>1})
    end
    @d.destroy.should == 1
    def @d.fetch_rows(sql)
    end
    @d.destroy.should == 0
  end
end

describe Sequel::Model::DatasetMethods, "#to_hash"  do
  before do
    @c = Class.new(Sequel::Model(:items)) do
      set_primary_key :name
    end
    @d = @c.dataset
  end

  it "should result in a hash with primary key value keys and model object values" do
    def @d.fetch_rows(sql)
      yield({:name=>1})
      yield({:name=>2})
    end
    h = @d.to_hash
    h.should be_a_kind_of(Hash)
    a = h.to_a
    a.collect{|x| x[1].class}.should == [@c, @c]
    a.sort_by{|x| x[0]}.collect{|x| [x[0], x[1].values]}.should == [[1, {:name=>1}], [2, {:name=>2}]]
  end

  it "should result in a hash with given value keys and model object values" do
    def @d.fetch_rows(sql)
      yield({:name=>1, :number=>3})
      yield({:name=>2, :number=>4})
    end
    h = @d.to_hash(:number)
    h.should be_a_kind_of(Hash)
    a = h.to_a
    a.collect{|x| x[1].class}.should == [@c, @c]
    a.sort_by{|x| x[0]}.collect{|x| [x[0], x[1].values]}.should == [[3, {:name=>1, :number=>3}], [4, {:name=>2, :number=>4}]]
  end

  it "should raise an error if the class doesn't have a primary key" do
    @c.no_primary_key
    proc{@d.to_hash}.should raise_error(Sequel::Error)
  end
end
