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

class AnnotationsControllerTest < ActionDispatch::IntegrationTest

  include Devise::Test::IntegrationHelpers

  setup do
    @question = Annotation.first.question
    
    # Get the first Org Admin
    scaffold_org_admin(@question.section.phase.template.org)

    # clear the existing annotations
    @question.annotations.where(org: @user.org).each do |annotation|
      annotation.destroy!
    end
        
    @create_hash = {question_id: @question.id, example_answer_text: "New example", guidance_text: "New guidance"}
    @example_answer_qry = {question: @question, org: @user.org, type: Annotation.types[:example_answer]}
    @guidance_qry = {question: @question, org: @user.org, type: Annotation.types[:guidance]}
  end

  test "cannot create/update if not logged in" do
    # Should redirect user to the root path if they are not logged in!
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    assert_unauthorized_redirect_to_root_path
  end
  
  test "can create example answer and guidance at the same time" do
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('example answer') && flash[:notice].include?('guidance')
    assert_equal 'New example', Annotation.find_by(@example_answer_qry).text, "expected example answer to have been created."
    assert_equal 'New guidance', Annotation.find_by(@guidance_qry).text, "expected guidance to have been created."
  end
  test "can create example answer without a guidance" do
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), {question_id: @question.id, example_answer_text: "New example"}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('updated')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert_equal 'New example', Annotation.find_by(@example_answer_qry).text, "expected example answer to have been created."
    assert Annotation.find_by(@guidance_qry).nil?, "expected no guidance to have been created."
  end
  test "can create guidance without an example answer" do
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), {question_id: @question.id, guidance_text: "New guidance"}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('updated')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert Annotation.find_by(@example_answer_qry).nil?, "expected no example answer to have been created."
    assert_equal 'New guidance', Annotation.find_by(@guidance_qry).text, "expected guidance to have been created."
  end
  
  test "can update example answer and guidance at the same time" do
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), {question_id: @question.id, example_answer_text: "Updated example", guidance_text: "Updated guidance"}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('updated')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert_equal 'Updated example', Annotation.find_by(@example_answer_qry).text, "expected example answer to have been updated."
    assert_equal 'Updated guidance', Annotation.find_by(@guidance_qry).text, "expected guidance to have been updated."
  end
  test "can remove example answer by not submitting it during save" do
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), {question_id: @question.id, guidance_text: "Updated guidance"}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('updated')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert Annotation.find_by(@example_answer_qry).nil?, "expected example answer to have been removed."
    assert_equal 'Updated guidance', Annotation.find_by(@guidance_qry).text, "expected guidance to have been updated."
  end
  test "can remove guidance by not submitting it during save" do
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), {question_id: @question.id, example_answer_text: "Updated example"}
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('updated')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert_equal 'Updated example', Annotation.find_by(@example_answer_qry).text, "expected example answer to have been updated."
    assert Annotation.find_by(@guidance_qry).nil?, "expected guidance to have been removed."
  end
  
  test "can delete a specific annotation" do
    sign_in @user
    put admin_update_annotation_path(id: @question.section.phase.id), @create_hash
    delete admin_destroy_annotation_path(Annotation.find_by(@example_answer_qry))
    assert flash[:notice].start_with?('Successfully') && flash[:notice].include?('deleted')
    assert_response :redirect
    assert_redirected_to "#{admin_show_phase_path(@question.section.phase.id)}?section_id=#{@question.section.id}&r=all-templates"
    assert Annotation.find_by(@example_answer_qry).nil?
    assert_equal 'New guidance', Annotation.find_by(@guidance_qry).text, "expected guidance to have been unchanged."
  end
end