Feature: mock with rspec

  RSpec uses its own mocking framework by default, or you can configure it
  explicitly.

  Scenario: passing message expectation
    Given a file named "example_spec.rb" with:
      """ruby
      RSpec.configure do |config|
        config.mock_framework = :rspec
      end

      describe "mocking with RSpec" do
        it "passes when it should" do
          receiver = double('receiver')
          receiver.should_receive(:message)
          receiver.message
        end
      end
      """
    When I run `rspec example_spec.rb`
    Then the examples should all pass

  Scenario: failing message expecation
    Given a file named "example_spec.rb" with:
      """ruby
      RSpec.configure do |config|
        config.mock_framework = :rspec
      end

      describe "mocking with RSpec" do
        it "fails when it should" do
          receiver = double('receiver')
          receiver.should_receive(:message)
        end
      end
      """
    When I run `rspec example_spec.rb`
    Then the output should contain "1 example, 1 failure"

  Scenario: failing message expectation in pending block (remains pending)
    Given a file named "example_spec.rb" with:
      """ruby
      RSpec.configure do |config|
        config.mock_framework = :rspec
      end

      describe "failed message expectation in a pending block" do
        it "is listed as pending" do
          pending do
            receiver = double('receiver')
            receiver.should_receive(:message)
          end
        end
      end
      """
    When I run `rspec example_spec.rb`
    Then the output should contain "1 example, 0 failures, 1 pending"
    And the exit status should be 0

  Scenario: passing message expectation in pending block (fails)
    Given a file named "example_spec.rb" with:
      """ruby
      RSpec.configure do |config|
        config.mock_framework = :rspec
      end

      describe "passing message expectation in a pending block" do
        it "fails with FIXED" do
          pending do
            receiver = double('receiver')
            receiver.should_receive(:message)
            receiver.message
          end
        end
      end
      """
    When I run `rspec example_spec.rb`
    Then the output should contain "FIXED"
    Then the output should contain "1 example, 1 failure"
    And the exit status should be 1

  Scenario: accessing RSpec.configuration.mock_framework.framework_name
    Given a file named "example_spec.rb" with:
      """ruby
      RSpec.configure do |config|
        config.mock_framework = :rspec
      end

      describe "RSpec.configuration.mock_framework.framework_name" do
        it "returns :rspec" do
          RSpec.configuration.mock_framework.framework_name.should eq(:rspec)
        end
      end
      """
    When I run `rspec example_spec.rb`
    Then the examples should all pass
