require 'test_helper'

class TestGeneratorInitialization < Test::Unit::TestCase
  def setup
    set_default_git_config
  end

  context "given a nil github repo name" do
    setup do
      stub_git_config
    end

    should 'raise NoGithubRepoNameGiven' do
      assert_raise Jeweler::NoGitHubRepoNameGiven do
        Jeweler::Generator.new()
      end
    end
  end

  context "without git user's name set" do
    setup do
      stub_git_config 
    end

    should 'raise an NoGitUserName' do
      assert_raise Jeweler::NoGitUserName do
        Jeweler::Generator.new(:project_name => @project_name, :testing_framework => :shoulda, :documentation_framework => :rdoc)
      end
    end
  end

  context "without git user's email set" do
    setup do
      stub_git_config 
    end

    should 'raise NoGitUserEmail' do
      assert_raise Jeweler::NoGitUserEmail do
        Jeweler::Generator.new(:project_name => @project_name, :user_name => @git_name, :testing_framework => :shoulda, :documentation_framework => :rdoc)
      end
    end
  end

  context "without github username set" do
    setup do
      stub_git_config
    end

    should 'raise NotGitHubUser' do
      assert_raise Jeweler::NoGitHubUser do
        Jeweler::Generator.new(:project_name => @project_name, :user_name => @git_name, :user_email => @git_email, :testing_framework => :shoulda, :documentation_framework => :rdoc)
      end
    end
  end
  
  context "without github token set" do
    setup do
      stub_git_config
    end

    should 'raise NoGitHubToken if creating repo' do
      assert_raise Jeweler::NoGitHubToken do
        Jeweler::Generator.new(:project_name => @project_name, :user_name => @git_name, :user_email => @git_email, :github_username => @github_user, :create_repo => true, :testing_framework => :shoulda, :documentation_framework => :rdoc)
      end
    end
  end

  def build_generator(options = {})
    defaults = { :project_name => @project_name,
                 :user_name => @git_name,
                 :user_email => @git_email,
                 :github_username => @github_user,
                 :github_token => @github_token,
                 :testing_framework =>             :shoulda,
                 :documentation_framework =>       :rdoc }

    options = defaults.merge(options)
    Jeweler::Generator.new(options) 
  end

  context "default configuration" do
    setup do
      stub_git_config
      @generator = build_generator
    end

    should "use shoulda for testing" do
      assert_equal :shoulda, @generator.testing_framework
    end

    should "use rdoc for documentation" do
      assert_equal :rdoc, @generator.documentation_framework
    end

    should "set todo in summary" do
      assert_match /todo/i, @generator.summary
    end

    should "set todo in description" do
      assert_match /todo/i, @generator.description
    end

    should "set target directory to the project name" do
      assert_equal @project_name, File.split(@generator.target_dir).last
    end

    should "set user's name from git config" do
      assert_equal @git_name, @generator.user_name
    end

    should "set email from git config" do
      assert_equal @git_email, @generator.user_email
    end

    should "set origin remote as github, based on username and project name" do
      assert_equal "git@github.com:#{@github_user}/#{@project_name}.git", @generator.git_remote
    end

    should "set homepage as github based on username and project name" do
      assert_equal "http://github.com/#{@github_user}/#{@project_name}", @generator.homepage
    end

    should "set github username from git config" do
      assert_equal @github_user, @generator.github_username
    end

    should "set project name as the-perfect-gem" do
      assert_equal @project_name, @generator.project_name
    end
  end

  context "using yard" do
    setup do
      @generator = build_generator(:documentation_framework => :yard)
    end

    should "set the doc_task to yardoc" do
      assert_equal "yardoc", @generator.doc_task
    end

  end

  context "using rdoc" do
    setup do
      @generator = build_generator(:documentation_framework => :rdoc)
    end

    should "set the doc_task to rdoc" do
      assert_equal "rdoc", @generator.doc_task
    end
  end

  context "using a custom homepage" do
    setup do
      @generator = build_generator(:homepage => 'http://zomg.com')
    end

    should "set the homepage" do
      assert_equal "http://zomg.com", @generator.homepage
    end

  end

end
