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

class GuidanceGroupsControllerTest < 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! In particular
  #       look at the unnamed routes after 'new_plan_phase' below. They are not named because they are duplicates.
  #       We should just have:
  #
  # SHOULD BE:
  # --------------------------------------------------
  #   guidance_groups      GET    /guidance_groups        guidance_groups#index
  #                        POST   /guidance_groups        guidance_groups#create
  #   guidance_group       GET    /guidance_group/:id     guidance_groups#show
  #                        PATCH  /guidance_groups/:id    guidance_groups#update
  #                        PUT    /guidance_groups/:id    guidance_groups#update
  #                        DELETE /guidance_groups/:id    guidance_groups#destroy
  #
  # CURRENT RESULTS OF `rake routes`
  # --------------------------------------------------
  #   admin_show_guidance_group     GET      /org/admin/guidancegroup/:id/admin_show    guidance_groups#admin_show
  #   admin_new_guidance_group      GET      /org/admin/guidancegroup/:id/admin_new     guidance_groups#admin_new
  #   admin_edit_guidance_group     GET      /org/admin/guidancegroup/:id/admin_edit    guidance_groups#admin_edit
  #   admin_destroy_guidance_group  DELETE   /org/admin/guidancegroup/:id/admin_destroy guidance_groups#admin_destroy
  #   admin_create_guidance_group   POST     /org/admin/guidancegroup/:id/admin_create  guidance_groups#admin_create
  #   admin_update_guidance_group   PUT      /org/admin/guidancegroup/:id/admin_update  guidance_groups#admin_update

  setup do
    scaffold_org_admin(GuidanceGroup.first.org)
  end
  
  # GET /org/admin/guidancegroup/:id/admin_new (admin_new_guidance_group_path)
  # ----------------------------------------------------------
  test 'load the new guidance_group page' do
    # Should redirect user to the root path if they are not logged in!
    # TODO: Why is there an id here!? its a new guidance_group!
    get admin_new_guidance_group_path(@user.org)
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    get admin_new_guidance_group_path(@user.org)
    assert_response :success
  end
  
  # POST /org/admin/guidancegroup/:id/admin_create (admin_create_guidance_group_path)
  # ----------------------------------------------------------
  test 'create a new guidance_group' do
    params = {org_id: @user.org.id, published: false, name: 'Testing create'}
    
    # Should redirect user to the root path if they are not logged in!
    post admin_create_guidance_group_path(@user.org), {guidance_group: params}
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    post admin_create_guidance_group_path(@user.org), {guidance_group: params}
    assert_response :redirect
    assert_redirected_to admin_index_guidance_path(@user.org)
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('created')
    assert assigns(:guidance_group)
    assert_equal 'Testing create', GuidanceGroup.last.name, "expected the record to have been created!"
    
    # Invalid object
    post admin_create_guidance_group_path(@user.org), {guidance_group: {name: nil}}
    assert flash[:alert].start_with?(_('Could not create your'))
    assert_response :success
    assert assigns(:guidance_group)
  end
  
  # GET /org/admin/guidancegroup/:id/admin_edit (admin_edit_guidance_group_path)
  # ----------------------------------------------------------
  test 'load the edit guidance_group page' do
    # Should redirect user to the root path if they are not logged in!
    get admin_edit_guidance_group_path(GuidanceGroup.find_by(org: @user.org))
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    get admin_edit_guidance_group_path(GuidanceGroup.find_by(org: @user.org))
    assert_response :success
  end
  
  # PUT /org/admin/templates/:id/admin_template (admin_update_guidance_group_path)
  # ----------------------------------------------------------
  test 'update the guidance_group' do
    params = {name: 'Testing UPDATE'}
    
    # Should redirect user to the root path if they are not logged in!
    put admin_update_guidance_group_path(GuidanceGroup.first), {guidance_group: params}
    assert_unauthorized_redirect_to_root_path
    
    sign_in @user
    
    put admin_update_guidance_group_path(GuidanceGroup.first), {guidance_group: params}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('saved')
    assert_response :redirect
    assert_redirected_to "#{admin_index_guidance_path(@user.org)}?name=Testing+UPDATE"
    assert assigns(:guidance_group)
    assert_equal 'Testing UPDATE', GuidanceGroup.first.name, "expected the record to have been updated"
    
    # Invalid object
    put admin_update_guidance_group_path(GuidanceGroup.first), {guidance_group: {name: nil}}
    assert flash[:alert].starts_with?(_('Could not update your'))
    assert_response :success
    assert assigns(:guidance_group)
  end

  # PUT /org/admin/guidancegroup/:id/admin_update_publish (admin_update_publish_guidance_group)
  test 'publish the guidance' do 
    @guidance_group = GuidanceGroup.first

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

  # PUT /org/admin/guidancegroup/:id/admin_update_unpublish (admin_update_unpublish_guidance_group)
  test 'unpublish the guidance' do 
    @guidance_group = GuidanceGroup.first

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

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