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

class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
  
  # command
  
  context "A plain command with the job template set to nil" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        every 2.hours do
          command "blahblah"
        end
      file
    end
    
    should "output the command" do
      assert_match /^.+ .+ .+ .+ blahblah$/, @output
    end
  end
  
  context "A plain command with no job template set" do
    setup do
      @output = Whenever.cron \
      <<-file
        every 2.hours do
          command "blahblah"
        end
      file
    end
    
    should "output the command with the default job template" do
      assert_match /^.+ .+ .+ .+ \/bin\/bash -l -c 'blahblah'$/, @output
    end
  end
  
  context "A plain command that overrides the job_template set" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, "/bin/bash -l -c ':job'"
        every 2.hours do
          command "blahblah", :job_template => "/bin/sh -l -c ':job'"
        end
      file
    end
    
    should "output the command using that job_template" do
      assert_match /^.+ .+ .+ .+ \/bin\/sh -l -c 'blahblah'$/, @output
      assert_no_match /bash/, @output
    end
  end
  
  context "A plain command that is conditional on default environent and path" do
    setup do
      Whenever.expects(:path).at_least_once.returns('/what/you/want')
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        if environment == 'production' && path == '/what/you/want'
          every 2.hours do
            command "blahblah"
          end
        end
      file
    end
    
    should "output the command" do
      assert_match /blahblah/, @output
    end
  end

  # runner
  
  context "A runner with path set" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        set :path, '/my/path'
        every 2.hours do
          runner 'blahblah'
        end
      file
    end
    
    should "output the runner using that path" do
      assert_match two_hours + %( cd /my/path && script/runner -e production 'blahblah'), @output
    end
  end
  
  context "A runner that overrides the path set" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        set :path, '/my/path'
        every 2.hours do
          runner "blahblah", :path => '/some/other/path'
        end
      file
    end
    
    should "output the runner using that path" do
      assert_match two_hours + %( cd /some/other/path && script/runner -e production 'blahblah'), @output
    end
  end
  
  context "A runner for a Rails 3 app" do
    setup do
      Whenever.expects(:path).at_least_once.returns('/my/path')
      File.expects(:exists?).with('/my/path/script/rails').returns(true)
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        every 2.hours do
          runner 'blahblah'
        end
      file
    end
    
    should "use the Rails 3 runner job by default" do
      assert_match two_hours + %( cd /my/path && script/rails runner -e production 'blahblah'), @output
    end
  end
  
  # rake
  
  context "A rake command with path set" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        set :path, '/my/path'
        every 2.hours do
          rake "blahblah"
        end
      file
    end
    
    should "output the rake command using that path" do
      assert_match two_hours + ' cd /my/path && RAILS_ENV=production rake blahblah --silent', @output
    end
  end
  
  context "A rake command that overrides the path set" do
    setup do
      @output = Whenever.cron \
      <<-file
        set :job_template, nil
        set :path, '/my/path'
        every 2.hours do
          rake "blahblah", :path => '/some/other/path'
        end
      file
    end
    
    should "output the rake command using that path" do
      assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production rake blahblah --silent', @output
    end
  end
  
end