require 'spec_helper'
require 'support/dummy_app'
require 'support/matchers/have_text'

app = DummyApp.new(ENV['RAILS_ENV'])
spec_types = {
  view: ['/posts/1', 'PostsController'],
  mailer: ['/posts/1/mail', 'PostMailer']
}

app.start_server do
  spec_types.each do |type, (path, controller)|
    page = app.get(path)

    describe "in a #{type}" do
      it 'runs in the correct environment' do
        expect(page).to have_text(app.environment).in('#environment')
      end

      it 'uses the correct view context controller' do
        expect(page).to have_text(controller).in('#controller')
      end

      it 'can use built-in helpers' do
        expect(page).to have_text('Once upon a...').in('#truncated')
      end

      it 'can use built-in private helpers' do
        # Nokogiri unescapes text!
        expect(page).to have_text('<script>danger</script>').in('#html_escaped')
      end

      it 'can use user-defined helpers from app/helpers' do
        expect(page).to have_text('Hello, world!').in('#hello_world')
      end

      it 'can use user-defined helpers from the controller' do
        expect(page).to have_text('Goodnight, moon!').in('#goodnight_moon')
      end

      if type != :mailer
        it 'can be passed to path helpers' do
          expect(page).to have_text('/posts/1').in('#path_with_decorator')
        end

        it 'can use path helpers with a model' do
          expect(page).to have_text('/posts/1').in('#path_with_model')
        end

        it 'can use path helpers with an id' do
          expect(page).to have_text('/posts/1').in('#path_with_id')
        end
      end

      it 'can be passed to url helpers' do
        expect(page).to have_text('http://test.host/posts/1').in('#url_with_decorator')
      end

      it 'can use url helpers with a model' do
        expect(page).to have_text('http://test.host/posts/1').in('#url_with_model')
      end

      it 'can use url helpers with an id' do
        expect(page).to have_text('http://test.host/posts/1').in('#url_with_id')
      end
    end
  end
end
