Newer
Older
dmpopidor / test / functional / guidances_controller_test.rb
require 'test_helper'

class GuidancesControllerTest < ActionDispatch::IntegrationTest
  
  include Devise::Test::IntegrationHelpers

  # TODO: The following methods SHOULD replace the old 'admin_' prefixed methods. The routes file already has
  #       these defined. They are defined multiple times though and we need to clean this up:
  #
  # SHOULD BE:
  # --------------------------------------------------
  #   guidances            GET    /guidances        guidances#index
  #                        POST   /guidances        guidances#create
  #   guidance             GET    /guidance/:id     guidances#show
  #                        PATCH  /guidance/:id     guidances#update
  #                        PUT    /guidance/:id     guidances#update
  #                        DELETE /guidance/:id     guidances#destroy
  #
  # CURRENT RESULTS OF `rake routes`
  # --------------------------------------------------
  #   admin_show_guidance       GET      /org/admin/guidance/:id/admin_show           guidances#admin_show
  #   admin_index_guidance      GET      /org/admin/guidance/:id/admin_index          guidances#admin_index
  #   admin_edit_guidance       GET      /org/admin/guidance/:id/admin_edit           guidances#admin_edit
  #   admin_new_guidance        GET      /org/admin/guidance/:id/admin_new            guidances#admin_new
  #   admin_destroy_guidance    DELETE   /org/admin/guidance/:id/admin_destroy        guidances#admin_destroy
  #   admin_create_guidance     POST     /org/admin/guidance/:id/admin_create         guidances#admin_create
  #   admin_update_guidance     PUT      /org/admin/guidance/:id/admin_update         guidances#admin_update
  #   update_phases_guidance    GET      /org/admin/guidance/:id/update_phases        guidances#update_phases
  #   update_versions_guidance  GET      /org/admin/guidance/:id/update_versions      guidances#update_versions
  #   update_sections_guidance  GET      /org/admin/guidance/:id/update_sections      guidances#update_sections
  #   update_questions_guidance GET      /org/admin/guidance/:id/update_questions     guidances#update_questions

  setup do
    scaffold_org_admin(GuidanceGroup.first.org)
    @guidance_group = GuidanceGroup.first
  end
  
  # GET /org/admin/guidance/:id/admin_index (admin_index_guidance_path)
  # ----------------------------------------------------------
  test 'load the list of guidances page' do
    # Should redirect user to the root path if they are not logged in!
    get admin_index_guidance_path(@guidance_group)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    get admin_index_guidance_path(@guidance_group)
    assert_response :success
    assert assigns(:guidances)
    assert assigns(:guidance_groups)
  end
  
  # /org/admin/guidance/:id/admin_new (admin_new_guidance_path)
  # ----------------------------------------------------------
  test 'load the new guidance page' do
    # Should redirect user to the root path if they are not logged in!
    get admin_new_guidance_path(@guidance_group)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    get admin_new_guidance_path(@guidance_group)
    assert_response :success
    assert assigns(:guidance)
    assert assigns(:guidance_groups)
    assert assigns(:themes)
  end

  # /org/admin/guidance/:id/admin_edit (admin_edit_guidance_path)
  # ----------------------------------------------------------
  test 'load the edit guidance page' do
    # Should redirect user to the root path if they are not logged in!
    get admin_edit_guidance_path(@guidance_group)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    get admin_edit_guidance_path(@guidance_group)
    assert_response :success
    assert assigns(:guidance)
    assert assigns(:guidance_groups)
    assert assigns(:themes)
  end

  # POST /org/admin/guidance/:id/admin_create (admin_create_guidance_path)
  # ----------------------------------------------------------
  test 'create a new guidance' do
    params = {'guidance-text': 'Testing create', guidance: {guidance_group_id: GuidanceGroup.first.id, published: true}}
    
    # Should redirect user to the root path if they are not logged in!
    post admin_create_guidance_path(@user.org), params
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    post admin_create_guidance_path(@user.org), params
    assert_response :redirect
    assert_redirected_to admin_edit_guidance_path(Guidance.last)
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('created')
    assert assigns(:guidance)
    assert_equal 'Testing create', Guidance.last.text, "expected the record to have been created!"
    
    # Invalid object
    post admin_create_guidance_path(@user.org), {'guidance-text': nil, guidance: {published: false}}
    assert flash[:alert].starts_with?(_('Could not create your'))
    assert_response :success
    assert assigns(:guidance)
  end
    
  # PUT /org/admin/guidance/:id/admin_update (admin_update_guidance_path)
  # ----------------------------------------------------------
  test 'update the guidance' do
    params = {'guidance-text': 'Testing UPDATE', guidance: {guidance_group_id: GuidanceGroup.first.id}}
    
    # Should redirect user to the root path if they are not logged in!
    put admin_update_guidance_path(Guidance.first), params
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    put admin_update_guidance_path(Guidance.first), params
    assert_response :redirect
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('saved')
    assert_redirected_to "#{admin_edit_guidance_path(Guidance.first)}?guidance_group_id=#{GuidanceGroup.first.id}"
    assert assigns(:guidance)
    assert_equal 'Testing UPDATE', Guidance.first.text, "expected the record to have been updated"
    
    # Invalid object
    put admin_update_guidance_path(Guidance.first), {'guidance-text': nil, guidance: {guidance_group_id: GuidanceGroup.first.id}}
    assert flash[:alert].starts_with?(_('Could not update your'))
    assert_response :success
    assert assigns(:guidance)
  end

  # PUT /org/admin/guidance/:id/admin_publish (admin_publish_guidance)
  test 'publish the guidance' do 
    @guidance = Guidance.first
    @guidance_group = @guidance.guidance_group

    # Should redirect user to the root path if they are not logged in!
    put admin_publish_guidance_path(@guidance)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    put admin_publish_guidance_path(@guidance)
    assert_response :redirect
    assert flash[:notice].include?('published')
    assert_redirected_to "#{admin_index_guidance_path}"
    assert assigns(:guidance)
  end

  # PUT /org/admin/guidance/:id/admin_unpublish (admin_unpublish_guidance)        
  test 'unpublish the guidance' do 
    @guidance = Guidance.first
    @guidance_group = @guidance.guidance_group

    # Should redirect user to the root path if they are not logged in!
    put admin_unpublish_guidance_path(@guidance)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    put admin_unpublish_guidance_path(@guidance)
    assert_response :redirect
    assert flash[:notice].include?('no longer published')
    assert_redirected_to "#{admin_index_guidance_path}"
    assert assigns(:guidance)
  end

  # DELETE /org/admin/guidance/:id/admin_destroy (admin_destroy_guidance_path)
  # ----------------------------------------------------------
  test 'delete the guidance' do
    id = Guidance.first.id
    # Should redirect user to the root path if they are not logged in!
    delete admin_destroy_guidance_path(Guidance.first)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    delete admin_destroy_guidance_path(Guidance.first)
    assert_response :redirect
    assert_redirected_to admin_index_guidance_path
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('deleted')
    assert assigns(:guidance)
    assert_raise ActiveRecord::RecordNotFound do 
      Guidance.find(id).nil?
    end
  end

end