require "test_helper"

class ProfilesControllerTest < ActionDispatch::IntegrationTest
  ##
  # test all routes which lead to this controller
  def test_routes
    assert_routing(
      { :path => "/profile/edit", :method => :get },
      { :controller => "profiles", :action => "edit" }
    )

    assert_routing(
      { :path => "/profile", :method => :put },
      { :controller => "profiles", :action => "update" }
    )
  end

  def test_update
    user = create(:user)
    session_for(user)

    # Updating the description should work
    put profile_path, :params => { :user => { :description => "new description" } }
    assert_redirected_to user_path(user)
    follow_redirect!
    assert_response :success
    assert_template :show
    assert_select ".alert-success", /^Profile updated./
    assert_select "div", "new description"

    # Changing to an uploaded image should work
    image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
    put profile_path, :params => { :avatar_action => "new", :user => { :avatar => image, :description => user.description } }
    assert_redirected_to user_path(user)
    follow_redirect!
    assert_response :success
    assert_template :show
    assert_select ".alert-success", /^Profile updated./
    get edit_profile_path
    assert_select "form > fieldset > div > div.col-sm-10 > div.form-check > input[name=avatar_action][checked][value=?]", "keep"

    # Changing to a gravatar image should work
    put profile_path, :params => { :avatar_action => "gravatar", :user => { :description => user.description } }
    assert_redirected_to user_path(user)
    follow_redirect!
    assert_response :success
    assert_template :show
    assert_select ".alert-success", /^Profile updated./
    get edit_profile_path
    assert_select "form > fieldset > div > div.col-sm-10 > div > div.form-check > input[name=avatar_action][checked][value=?]", "gravatar"

    # Removing the image should work
    put profile_path, :params => { :avatar_action => "delete", :user => { :description => user.description } }
    assert_redirected_to user_path(user)
    follow_redirect!
    assert_response :success
    assert_template :show
    assert_select ".alert-success", /^Profile updated./
    get edit_profile_path
    assert_select "form > fieldset > div > div.col-sm-10 > div > input[name=avatar_action][checked]", false
    assert_select "form > fieldset > div > div.col-sm-10 > div > div.form-check > input[name=avatar_action][checked]", false
  end
end
