factories.rb 1.73 KB
module Noosfero::Factory
  
  def fast_create(name, attrs = {})
    obj = build(name, attrs)
    obj.attributes.keys.each do |attr|
      if !obj.column_for_attribute(attr).null && obj.send(attr).nil?
        obj.send("#{attr}=", factory_num_seq)
      end
    end
    obj.save_without_validation!
    obj
  end

  def create(name, attrs = {})
    target = 'create_' + name.to_s
    if respond_to?(target)
      send(target, attrs)
    else
      obj = build(name, attrs)
      obj.save!
      obj
    end
  end

  def build(name, attrs = {})
    data = 
      if respond_to?('defaults_for_' + name.to_s)
        send('defaults_for_'+ name.to_s).merge(attrs)
      else
        attrs
      end
    eval(name.to_s.camelize).new(data)
  end

  def self.num_seq
    @num_seq ||= 0
    @num_seq += 1
    @num_seq
  end

  protected

  def factory_num_seq
    Noosfero::Factory.num_seq
  end

  ###############################################
  # Blog
  ###############################################
  def create_blog
    profile = Profile.create!(:identifier => 'testuser' + factory_num_seq.to_s, :name => 'Test user')
    Blog.create!(:name => 'blog', :profile => profile)
  end

  ###############################################
  # ExternalFeed
  ###############################################
  def defaults_for_external_feed
    { :address => RAILS_ROOT + '/test/fixtures/files/feed.xml' }
  end

  def create_external_feed(attrs = {})
    feed = build(:external_feed, attrs)
    feed.blog = create_blog
    feed.save!
    feed
  end

  ###############################################
  # FeedReaderBlock
  ###############################################
  def defaults_for_feed_reader_block
    { :address => RAILS_ROOT + '/test/fixtures/files/feed.xml' }
  end

end