require File.expand_path(File.dirname(__FILE__) + '/../test_helper')

class WebTest < ActiveSupport::TestCase
  fixtures :system, :webs, :pages, :revisions, :wiki_references
  
  def setup
    @web = webs(:instiki)
  end
  
  def test_pages_by_revision
    add_sample_pages
    assert_equal 'EverBeenHated', @web.select.by_revision.first.name
  end
  
  def test_pages_by_match
    add_sample_pages
    assert_equal 3, @web.select { |page| page.content =~ /me/i }.length
    assert_equal 1, @web.select { |page| page.content =~ /Who/i }.length
    assert_equal 0, @web.select { |page| page.content =~ /none/i }.length
  end
  
  def test_002_references
    add_sample_pages
    assert_equal 1, @web.select.pages_that_reference('EverBeenHated').length
    assert_equal 0, @web.select.pages_that_reference('EverBeenInLove').length
  end
  
  def test_delete
    add_sample_pages
    assert_equal 3, @web.pages.length
    @web.remove_pages([ @web.page('EverBeenInLove') ])
    assert_equal 2, @web.pages(true).length
  end
  
  def test_initialize  
    web = Web.new(:name => 'Wiki2', :address => 'wiki2', :password => '123')
  
    assert_equal 'Wiki2', web.name
    assert_equal 'wiki2', web.address
    assert_equal '123', web.password
  
    # new web should be set for maximum features enabled
    assert_equal :markdownMML, web.markup
    assert_equal '008B26', web.color
    assert !web.safe_mode?
    assert_equal([], web.pages)
    assert web.allow_uploads?
    assert_nil web.additional_style
    assert !web.published?
    assert !web.brackets_only?
    assert !web.count_pages?
    assert_equal 100, web.max_upload_size
  end
  
  def test_initialize_invalid_name
    assert_raises(Instiki::ValidationError) { 
      Web.create(:name => 'Wiki2', :address => "wiki\234", :password => '123') 
    }
    assert_raises(Instiki::ValidationError) { 
      Web.create(:name => 'Wiki2', :address => "web_list", :password => '123') 
    }
    assert_raises(Instiki::ValidationError) { 
      Web.create(:name => 'Wiki2', :address => "", :password => '123') 
    }
    assert_raises(Instiki::ValidationError) { 
      Web.create!(:name => 'Wiki2', :address => "", :password => '123') 
      Web.create(:name => 'Wiki2', :address => "", :password => '123') 
    }
  end
  
  def test_new_page_linked_from_mother_page
    # this was a bug in revision 204
    home = @web.add_page('HomePage', 'This page refers to AnotherPage', 
        Time.local(2004, 4, 4, 16, 50), 'Alexey Verkhovsky', x_test_renderer)
    @web.add_page('AnotherPage', 'This is \AnotherPage', 
        Time.local(2004, 4, 4, 16, 51), 'Alexey Verkhovsky', x_test_renderer)

    @web.pages(true)
    assert_equal [home], @web.select.pages_that_link_to('AnotherPage')
  end

  def test_001_orphaned_pages
    add_sample_pages
    home = @web.add_page('HomePage', 
        'This is a home page, it should not be an orphan',
        Time.local(2004, 4, 4, 16, 50), 'AlexeyVerkhovsky', x_test_renderer)
    author = @web.add_page('AlexeyVerkhovsky', 
        'This is an author page, it should not be an orphan',
        Time.local(2004, 4, 4, 16, 50), 'AlexeyVerkhovsky', x_test_renderer)
    self_linked = @web.add_page('SelfLinked', 
        "I am SelfLinked and link to EverBeenInLove\ncategory: fubar",
        Time.local(2004, 4, 4, 16, 50), 'Anonymous', x_test_renderer)
        
    # page that links to itself, and nobody else links to it must be an orphan
    assert_equal ['EverBeenHated', 'SelfLinked'], 
       @web.select.orphaned_pages.collect{ |page| page.name }.sort
    pages_in_category = @web.select.pages_in_category('fubar')
    orphaned_pages = @web.select.orphaned_pages
    assert_equal ['SelfLinked'], 
       (pages_in_category & orphaned_pages).collect{ |page| page.name }.sort
  end  

  def test_page_names_by_author
    page_names_by_author = webs(:test_wiki).page_names_by_author
    assert_equal %w(AnAuthor DavidHeinemeierHansson Guest Me TreeHugger),
        page_names_by_author.keys.sort
    assert_equal %w(FirstPage HomePage), page_names_by_author['DavidHeinemeierHansson']
    assert_equal %w(Oak), page_names_by_author['TreeHugger']
  end

  private
  
  def add_sample_pages
    @in_love = @web.add_page('EverBeenInLove', "Who am I me\ncategory: fubar", 
        Time.local(2004, 4, 4, 16, 50), 'DavidHeinemeierHansson', x_test_renderer)
    @hated = @web.add_page('EverBeenHated', 'I am me EverBeenHated', 
        Time.local(2004, 4, 4, 16, 51), 'DavidHeinemeierHansson', x_test_renderer)
  end
end
