require 'test_helper'

class PeatyTest < Test::Unit::TestCase
  
  def setup
    RestClient.log = Logger.new(File.join(File.dirname(__FILE__), 'test.log'))
    # All test's use TEST_TOKEN which is a valid API key""
    @user = User.new(TEST_TOKEN)
  end
  
  # Tests for Projects
  def test_user_can_fetch_a_project
    project = @user.pivotal_tracker_projects.find(PROJECT_ID)
    
    assert !project.nil?
    assert project.is_a?(Peaty::Project)
    assert_equal PROJECT_ID, project.id
  end
  
  def test_user_can_fetch_all_projects
    assert !@user.pivotal_tracker_projects.all.empty?
    assert @user.pivotal_tracker_projects.all.first.is_a?(Peaty::Project)
  end
  
  # Tests for Users
  def test_user_can_fetch_all_users_for_a_project
    project = @user.pivotal_tracker_projects.find(PROJECT_ID)
    assert !project.users.empty?
    # users include the account that created the project
    assert user = project.users.detect{ |u| u.name == project.account }
    assert_equal project.account, user.name
  end
  
  # Tests for Stories
  def test_user_can_fetch_all_stories_for_a_project
    assert !@user.pivotal_tracker_projects.find(PROJECT_ID).stories.all.empty?
    assert_equal PROJECT_ID, @user.pivotal_tracker_projects.find(PROJECT_ID).stories.first.project.id
  end
  
  def test_user_can_fetch_all_releases_for_a_project
    assert !@user.pivotal_tracker_projects.find(PROJECT_ID).releases.all.empty?
    assert_equal PROJECT_ID, @user.pivotal_tracker_projects.find(PROJECT_ID).releases.first.project.id
  end
  
  def test_user_can_fetch_all_releases_for_a_project_including_accepted_for_the_current_iteration
    releases = @user.pivotal_tracker_projects.find(PROJECT_ID).releases.all
    assert !releases.empty?
    assert_equal PROJECT_ID, releases.first.project.id
    assert_equal "accepted", releases.first.current_state
  end
  
  def test_user_can_fetch_all_stories_for_a_project_even_from_previous_iterations
    project = @user.pivotal_tracker_projects.find(PROJECT_ID)
    stories = project.stories.all(:includedone => true)
    assert !stories.empty?
    assert stories.size > project.stories.all.size # exclude done
    
    story = stories.first
    assert_equal PROJECT_ID, story.project.id
    assert_equal "accepted", story.current_state
    
    done = project.iterations.find(:done)
    assert done.stories.any?{ |s| s.id == story.id }
  end
  
  def test_user_can_fetch_all_releases_for_a_project_via_stories
    assert !@user.pivotal_tracker_projects.find(PROJECT_ID).stories(:type => :release).all.empty?
    assert_equal :release, @user.pivotal_tracker_projects.find(PROJECT_ID).releases.first.story_type
  end
  
  def test_user_can_fetch_all_bugs_for_a_project_via_stories
    assert !@user.pivotal_tracker_projects.find(PROJECT_ID).stories(:type => :bug).all.empty?
    assert_equal :bug, @user.pivotal_tracker_projects.find(PROJECT_ID).bugs.first.story_type
  end
  
  def test_user_can_fetch_all_chores_for_a_project_via_stories
    assert !@user.pivotal_tracker_projects.find(PROJECT_ID).stories(:type => :chore).all.empty?
    assert_equal :chore, @user.pivotal_tracker_projects.find(PROJECT_ID).chores.first.story_type
  end
  
  # Tests for Iterations
  def test_user_can_fetch_a_projects_iterations
    project = @user.pivotal_tracker_projects.find(PROJECT_ID)
    assert !project.iterations.all.empty?
    assert iteration = project.iterations.first
    assert !iteration.stories.empty?
    assert_equal project.id, iteration.stories.first.project.id
  end
  
end