# frozen_string_literal: true

require "test_helper"

module Accounts
  class PdDeclarationsControllerTest < ActionDispatch::IntegrationTest
    ##
    # test all routes which lead to this controller
    def test_routes
      assert_routing(
        { :path => "/account/pd_declaration", :method => :get },
        { :controller => "accounts/pd_declarations", :action => "show" }
      )
      assert_routing(
        { :path => "/account/pd_declaration", :method => :post },
        { :controller => "accounts/pd_declarations", :action => "create" }
      )
    end

    def test_show_not_logged_in
      get account_pd_declaration_path

      assert_redirected_to login_path(:referer => account_pd_declaration_path)
    end

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

      get account_pd_declaration_path

      assert_response :success
    end

    def test_create_not_logged_in
      post account_pd_declaration_path

      assert_response :forbidden
    end

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

      post account_pd_declaration_path

      assert_redirected_to account_path
      assert_nil flash[:notice]
      assert_equal "You didn't confirm that you consider your edits to be in the Public Domain.", flash[:warning]

      user.reload
      assert_not_predicate user, :consider_pd
    end

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

      post account_pd_declaration_path, :params => { :consider_pd => true }

      assert_equal "You have successfully declared that you consider your edits to be in the Public Domain.", flash[:notice]
      assert_nil flash[:warning]

      user.reload
      assert_predicate user, :consider_pd
    end

    def test_create_already_declared_unconfirmed
      user = create(:user, :consider_pd => true)
      session_for(user)

      post account_pd_declaration_path

      assert_nil flash[:notice]
      assert_equal "You have already declared that you consider your edits to be in the Public Domain.", flash[:warning]

      user.reload
      assert_predicate user, :consider_pd
    end

    def test_create_already_declared_confirmed
      user = create(:user, :consider_pd => true)
      session_for(user)

      post account_pd_declaration_path, :params => { :consider_pd => true }

      assert_nil flash[:notice]
      assert_equal "You have already declared that you consider your edits to be in the Public Domain.", flash[:warning]

      user.reload
      assert_predicate user, :consider_pd
    end
  end
end
