# == Schema Information
#
# Table name: questions
#
# id :integer not null, primary key
# text :text
# default_value :text
# number :integer
# section_id :integer
# created_at :datetime
# updated_at :datetime
# question_format_id :integer
# option_comment_display :boolean default(TRUE)
# modifiable :boolean
#
require 'test_helper'
class QuestionTest < ActiveSupport::TestCase
setup do
# Need to clear the tables until we get seed.rb out of test_helper.rb
Template.delete_all
@funder = init_funder
@institution = init_institution
@template = init_template(@institution, published: true)
@phase = init_phase(@template)
@section = init_section(@phase)
@question = init_question(@section)
end
test "required fields are required" do
assert_not Question.new.valid?
assert_not Question.new(section: @section, number: 7).valid?, "expected the 'text' field to be required"
assert_not Question.new(number: 7, text: 'Testing').valid?, "expected the 'section' field to be required"
assert_not Question.new(section: @section, text: 'Testing').valid?, "expected the 'number' field to be required"
# Ensure the bare minimum and complete versions are valid
a = Question.new(section: @section, text: 'Testing', number: 7)
assert a.valid?, "expected the 'text', 'section' and 'number' fields to be enough to create an Question! - #{a.errors.map{|f, m| f.to_s + ' ' + m}.join(', ')}"
end
test "to_s returns the Question text" do
assert_equal @question.text, @question.to_s
end
test "option_based? returns the correct boolean value" do
assert_not @question.option_based?
# TODO: replace with a call to the init_question_format factory method once seeds.rb is no longer being loaded
@question.question_format = QuestionFormat.find_by(option_based: true)
@question.save!
assert @question.option_based?
end
test "#deep_copy creates a new question object and attaches new annotations/question_options objects" do
init_annotation(@institution, @question)
init_question_option(@question)
assert_deep_copy(@question, @question.deep_copy, relations: [:annotations, :question_options])
end
# TODO: This method should get moved to a view helper instead
test "returns the correct themed guidance for the org" do
theme = init_theme
guidance_group = init_guidance_group(@institution)
funder_guidance_group = init_guidance_group(@funder, { name: 'Test funder guidance group' } )
guidance = init_guidance(guidance_group, { themes: [theme] })
funder_guidance = init_guidance(funder_guidance_group, { themes: [theme] })
@question.themes << theme
@question.save!
institution_guidances = @question.guidance_for_org(@institution)
# method retuns a hash {'descriptive string': 'guidances array'}
assert_equal 1, institution_guidances.length
assert_equal guidance, institution_guidances.first.last
funder_guidances = @question.guidance_for_org(@funder)
# method retuns a hash {'descriptive string', 'guidances array'}
assert_equal 1, funder_guidances.length
assert_equal funder_guidance, funder_guidances.first.last
end
# ---------------------------------------------------
test "returns the correct annotation for the org" do
annotation = init_annotation(@institution, @question, { type: Annotation.types[:example_answer] })
annotation2 = init_annotation(@institution, @question)
funder_annotation = init_annotation(@funder, @question, { text: 'Test funder example answer', type: Annotation.types[:example_answer] } )
funder_annotation2 = init_annotation(@funder, @question, { text: 'Test funder guidance'} )
institutional_annotations = @question.get_example_answers(@institution)
assert_equal 1, institutional_annotations.length
assert_equal annotation, institutional_annotations.first
funder_annotations = @question.get_example_answers(@funder)
assert_equal 1, funder_annotations.length
assert_equal funder_annotation, funder_annotations.first
end
end