profile_test.rb 4.45 KB
require File.dirname(__FILE__) + '/../test_helper'

class ProfileTest < Test::Unit::TestCase
  fixtures :profiles, :environments, :users, :comatose_pages

  def test_identifier_validation
    p = Profile.new
    p.valid?
    assert p.errors.invalid?(:identifier)

    p.identifier = 'with space'
    p.valid?
    assert p.errors.invalid?(:identifier)

    p.identifier = 'áéíóú'
    p.valid?
    assert p.errors.invalid?(:identifier)

    p.identifier = 'rightformat2007'
    p.valid?
    assert ! p.errors.invalid?(:identifier)

    p.identifier = 'rightformat'
    p.valid?
    assert ! p.errors.invalid?(:identifier)

    p.identifier = 'right_format'
    p.valid?
    assert ! p.errors.invalid?(:identifier)
  end

  def test_has_domains
    p = Profile.new
    assert_kind_of Array, p.domains
  end

  def test_belongs_to_environment_and_has_default
    p = Profile.new
    assert_kind_of Environment, p.environment
  end

  def test_cannot_rename
    p1 = profiles(:johndoe)
    assert_raise ArgumentError do
      p1.identifier = 'bli'
    end
  end

  # when a profile called a page named after it  must also be created.
  def test_should_create_homepage_when_creating_profile
    Profile.create!(:identifier => 'newprofile', :name => 'New Profile')
    page = Comatose::Page.find_by_path('newprofile')
    assert_not_nil page
    assert_equal 'New Profile', page.title
  end
  
  def test_should_provide_access_to_homepage
    profile = Profile.create!(:identifier => 'newprofile', :name => 'New Profile')
    page = profile.homepage
    assert_kind_of Article, page
    assert_equal profile.identifier, page.slug
  end

  def test_name_should_be_mandatory
    p = Profile.new
    p.valid?
    assert p.errors.invalid?(:name)
    p.name = 'a very unprobable name'
    p.valid?
    assert !p.errors.invalid?(:name)
  end

  def test_can_be_tagged
    p = Profile.create(:name => 'tagged_profile', :identifier => 'tagged')
    p.tags << Tag.create(:name => 'a_tag')
    assert Profile.find_tagged_with('a_tag').include?(p)
  end

  def test_can_have_affiliated_people
    pr = Profile.create(:name => 'composite_profile', :identifier => 'composite')
    pe = User.create(:login => 'aff', :email => 'aff@pr.coop', :password => 'blih', :password_confirmation => 'blih').person
    
    member_role = Role.new(:name => 'member')
    assert member_role.save
    assert pr.affiliate(pe, member_role)

    assert pe.memberships.include?(pr)
  end

  def test_search
    p = Profile.create(:name => 'wanted', :identifier => 'wanted')
    p.update_attribute(:tag_list, 'bla')

    assert Profile.search('wanted').include?(p)
    assert Profile.search('bla').include?(p)
    assert ! Profile.search('not_wanted').include?(p)
  end

  def test_should_remove_pages_when_removing_profile
    profile = Profile.create(:name => 'To bee removed', :identifier => 'to_be_removed')
    assert Comatose::Page.find_by_path('to_be_removed')
    profile.destroy
    assert !Comatose::Page.find_by_path('to_be_removed')
  end

  def test_should_define_info
    assert_nil Profile.new.info
  end

  def test_should_avoid_reserved_identifiers
    assert_invalid_identifier 'admin'
    assert_invalid_identifier 'system'
    assert_invalid_identifier 'myprofile'
    assert_invalid_identifier 'profile'
    assert_invalid_identifier 'cms'
    assert_invalid_identifier 'community'
    assert_invalid_identifier 'test'
  end

  def test_should_provide_recent_documents
    profile = Profile.create!(:name => 'Testing Recent documents', :identifier => 'testing_recent_documents')
    doc1 = Article.new(:title => 'document 1', :body => 'la la la la la')
    doc1.parent = profile.homepage
    doc1.save!

    doc2 = Article.new(:title => 'document 2', :body => 'la la la la la')
    doc2.parent = profile.homepage
    doc2.save!

    docs = profile.recent_documents(2)
    assert_equal 2, docs.size
    assert docs.map(&:id).include?(doc1.id)
    assert docs.map(&:id).include?(doc2.id)
  end

  def test_should_provide_most_recent_documents
    profile = Profile.create!(:name => 'Testing Recent documents', :identifier => 'testing_recent_documents')
    doc1 = Article.new(:title => 'document 1', :body => 'la la la la la')
    doc1.parent = profile.homepage
    doc1.save!

    docs = profile.recent_documents(1)
    assert_equal 1, docs.size
    assert_equal doc1.id, docs.first.id
  end

  private

  def assert_invalid_identifier(id)
    profile = Profile.new(:identifier => id)
    assert !profile.valid?
    assert profile.errors.invalid?(:identifier)
  end

end