require 'spec_helper'
require 'fakefs/spec_helpers'
require 'jasmine/headless/task'
require 'mocha'

describe Jasmine::Headless::Task do
  before do
    Jasmine::Headless::Task.any_instance.stubs(:desc)
    Jasmine::Headless::Task.any_instance.stubs(:task)
  end

  after do
    Object.send(:remove_const, :Rails) if defined?(Rails)
  end

  describe 'define task' do
    context 'without Rails' do
      it 'should not explode when Rails is undefined' do
        Jasmine::Headless::Task.new('jasmine:headless')
      end
    end

    context 'with Rails' do
      context 'without version' do
        before do
          module Rails
            def self.version
              return "0"
            end
          end
        end

        it 'should be OK if rails is defined' do
          Jasmine::Headless::Task.new('jasmine:headless')
        end
      end

      context 'with version' do
        before do
          module Rails
            def self.version
              return "0"
            end
          end
        end

        it 'should be OK if rails is defined' do
          Jasmine::Headless::Task.new('jasmine:headless')
        end
      end
    end
  end

  describe 'jasmine:headless integration test' do
    context 'with successful test' do
      let(:test) do
        described_class.new do |t|
          t.jasmine_config = "spec/jasmine/success/success.yml"
        end
      end

      it 'should do nothing on success' do
        expect { test.send(:run_rake_task) }.to_not raise_error
      end
    end

    context 'with failing test' do
      let(:test) do
        described_class.new do |t|
          t.jasmine_config = "spec/jasmine/failure/failure.yml"
        end
      end

      it 'should raise an exception on failure' do
        expect { test.send(:run_rake_task) }.to raise_error(Jasmine::Headless::TestFailure)
      end
    end

    context 'with console.log using test' do
      let(:test) do
        described_class.new do |t|
          t.jasmine_config = "spec/jasmine/console_log/console_log.yml"
        end
      end

      it 'should raise an exception on console.log usage' do
        expect { test.send(:run_rake_task) }.to raise_error(Jasmine::Headless::ConsoleLogUsage)
      end
    end
  end
end