require 'helper'

module TestExtensions
  class TestConnections < Coupler::Test::IntegrationTest
    def setup
      super
      @connections = []
      @configs = {}
      each_adapter do |adapter, config|
        conn = new_connection(adapter, :name => "#{adapter} connection").save!
        @connections << conn
        @configs[adapter] = config
      end
    end

    test "index" do
      get "/connections"
      assert last_response.ok?
    end

    test "new" do
      get "/connections/new"
      assert last_response.ok?

      doc = Nokogiri::HTML(last_response.body)
      assert_equal 1, doc.css("form[action='/connections']").length
      assert_equal 1, doc.css("select[name='connection[adapter]']").length
      %w{name host port username password}.each do |name|
        assert_equal 1, doc.css("input[name='connection[#{name}]']").length
      end
    end

    test "successfully creating connection" do
      attributes = @configs['mysql'].merge(:name => 'foo', :adapter => 'mysql')
      post "/connections", { 'connection' => attributes }
      connection = Connection[:name => 'foo']
      assert connection

      assert last_response.redirect?, "Wasn't redirected"
      assert_equal "http://example.org/connections", last_response['location']
    end

    test "successfully creating connection with return to" do
      attributes = @configs['mysql'].merge(:name => 'foo', :adapter => 'mysql')
      post "/connections", { 'connection' => attributes }, { 'rack.session' => { :return_to => '/foo' } }

      assert last_response.redirect?, "Wasn't redirected"
      assert_equal "http://example.org/foo", last_response['location']
    end

    test "successfully creating connection with first use" do
      attributes = @configs['mysql'].merge(:name => 'foo', :adapter => 'mysql')
      post "/connections", { 'connection' => attributes }, { 'rack.session' => { :first_use => true } }

      assert last_response.redirect?, "Wasn't redirected"
      assert_equal "http://example.org/projects/new", last_response['location']
    end

    test "failing to create connection" do
      attributes = @configs['mysql'].merge(:name => nil, :adapter => 'mysql')
      post "/connections", { 'connection' => attributes }
      assert last_response.ok?
      assert_match /Name is not present/, last_response.body
    end

    test "show" do
      @connections.each do |conn|
        get "/connections/#{conn.id}"
        assert last_response.ok?
      end
    end

    test "destroy" do
      delete "/connections/#{@connections[0].id}"
      assert_nil Models::Connection[@connections[0].id]
      assert last_response.redirect?
      assert_equal "http://example.org/connections", last_response['location']
    end
  end
end