require 'test_helper'
class VersionableTest < ActiveSupport::TestCase
include Versionable
setup do
@template = create_template
end
def create_template
funder = init_funder
template = init_template(funder)
phase = init_phase(template)
section = init_section(phase)
question = init_question(section)
init_annotation(funder, question)
return template
end
test "versionable concern is included" do
assert(self.respond_to?(:get_modifiable))
end
test "#find_in_space raises ArgumentError when search_scape does not respond_to to each" do
exception = assert_raises(ArgumentError) do
find_in_space(nil, nil)
end
assert_equal(_('The search_space does not respond to each'), exception.message)
end
test "#find_in_space raises ArgumentError when search_scape does not have elements" do
exception = assert_raises(ArgumentError) do
find_in_space(nil, [])
end
assert_equal(_('The search space does not have elements associated'), exception.message)
end
test "#find_in_space looks for the object in the search_scape that has elements of its same class" do
# Looking for phase
phase = init_phase(@template)
assert_equal(@template.phases.first, find_in_space(phase, @template.phases), 'phase found in the space')
phase.number = 2
assert_not(find_in_space(phase, @template.phases), 'phase not found in the space')
# Looking for section
section = init_section(Phase.new)
assert_equal(@template.phases.first.sections.first,
find_in_space(section, @template.phases.first.sections),
'section found in the space')
section.number = 2
assert_not(find_in_space(section, @template.phases.first.sections), 'section not found in the space')
# Looking for a question
question = init_question(Section.new)
assert_equal(@template.phases.first.sections.first.questions.first,
find_in_space(question, @template.phases.first.sections.first.questions),
' question found in the space')
question.number = 2
assert_not(find_in_space(question, @template.phases.first.sections.first.questions), 'question not found in the space')
# Looking for an annotation
annotation = init_annotation(@template.org, Question.new)
assert_equal(@template.phases.first.sections.first.questions.first.annotations.first,
find_in_space(annotation, @template.phases.first.sections.first.questions.first.annotations), 'annotation found in the space')
annotation.text = 'foo'
assert_not(find_in_space(annotation, @template.phases.first.sections.first.questions.first.annotations))
# Looking for something else
assert_not(find_in_space({}, [{}]))
end
test "#find_in_space looks for the object in the relation" do
# Looking for section
section = init_section(@template.phases.first)
assert_equal(@template.phases.first.sections.first,
find_in_space(section, @template.phases), 'section found in the space through its phase number')
# Looking for question
question = init_question(@template.phases.first.sections.first)
assert_equal(@template.phases.first.sections.first.questions.first,
find_in_space(question, @template.phases), 'question found in the space through its phase/section number')
# Looking for annotation
annotation = init_annotation(@template.org, @template.phases.first.sections.first.questions.first)
assert_equal(@template.phases.first.sections.first.questions.first.annotations.first,
find_in_space(annotation, @template.phases), 'annotation found int the space through its phase/section/question number')
# Looking for a question in a not known search_space
assert_not(find_in_space(Question.new, [{}]))
end
test "#find_in_space looks for an object that does not belong to the hierarchy" do
question = init_question(@template.phases.first.sections.first)
question.phase.number = 2
assert_not(find_in_space(question, @template.phases))
end
test "#get_new raises ArgumentError unless the object respond_to template" do
exception = assert_raises(ArgumentError) do
get_new(@template)
end
assert_equal(_('obj should be a Phase, Section, Question, or Annotation'), exception.message)
end
test "#get_new raises RuntimeError when template is not latest" do
@template.published = true
@template.generate_version!
hierarchy_objects = [
Phase.new(template_id: @template.id),
Section.new(phase_id: @template.phases.first.id),
Question.new(section_id: @template.phases.first.sections.first.id),
Annotation.new(question_id: @template.phases.first.sections.first.questions.first.id)
]
hierarchy_objects.each do |obj|
exception = assert_raises(RuntimeError) do
get_new(obj)
end
assert_equal(_('A historical template cannot be retrieved for being modified'), exception.message)
end
end
test "#get_new returns same object when template is not published" do
# Looking for phase
phase = Phase.new(template: @template)
new_phase = get_new(phase)
assert_equal(phase.template_id, new_phase.template_id, 'returns the phase without generating a new template hierarchy')
# Looking for section
section = Section.new(phase: @template.phases.first)
new_section = get_new(section)
assert_equal(section.phase_id, new_section.phase_id, 'returns the section without generating a new template hierarchy')
# Looking for question
question = Question.new(section: @template.phases.first.sections.first)
new_question = get_new(question)
assert_equal(question.section_id, new_question.section_id, 'returns the question without generating a new template hierarchy')
# Looking for annotation fails
annotation = Annotation.new(question: @template.phases.first.sections.first.questions.first)
new_annotation = get_new(annotation)
assert_equal(annotation.question_id, new_annotation.question_id, 'returns the same annotation without generating a new template hierarchy')
end
test "#get_new returns new phase when template is published" do
@template.published = true
@template.save!
phase = Phase.new(template: @template)
new_phase = get_new(phase)
assert_not_equal(phase.template_id, new_phase.template_id)
end
test "#get_new returns new section when template is published" do
@template.published = true
@template.save!
section = Section.new(phase: @template.phases.first)
new_section = get_new(section)
assert_not_equal(section.phase_id, new_section.phase_id)
end
test "#get_new returns new question when template is published" do
@template.published = true
@template.save!
question = Question.new(section: @template.phases.first.sections.first)
new_question = get_new(question)
assert_not_equal(question.section_id, new_question.section_id)
end
test "#get_new returns new annotation when template is published" do
@template.published = true
@template.save!
annotation = Annotation.new(question: @template.phases.first.sections.first.questions.first)
new_annotation = get_new(annotation)
assert_not_equal(annotation.question_id, new_annotation.question_id)
end
test "#get_modifiable raises ArgumentError when the object is not template or object responding to template" do
exception = assert_raises(ArgumentError) do
get_modifiable({})
end
assert_equal(_('obj should be a Template, Phase, Section, Question, or Annotation'), exception.message)
end
test "#get_modifiable raises RuntimeError when template is not latest" do
@template.published = true
@template.generate_version!
hierarchy_objects = [
@template.phases.first,
@template.phases.first.sections.first,
@template.phases.first.sections.first.questions.first,
@template.phases.first.sections.first.questions.first.annotations.first
]
hierarchy_objects.each do |obj|
exception = assert_raises(RuntimeError) do
get_modifiable(obj)
end
assert_equal(_('A historical template cannot be retrieved for being modified'), exception.message)
end
end
test "#get_modifiable returns same object when template is not published" do
# Looking for phase
phase = @template.phases.first
new_phase = get_modifiable(phase)
assert_equal(phase.id, new_phase.id, 'returns the same phase id')
assert_equal(phase.template_id, new_phase.template_id, 'returns the phase without generating a new template hierarchy')
# Looking for section
section = @template.phases.first.sections.first
new_section = get_modifiable(section)
assert_equal(section.id, new_section.id, 'returns the same section id')
assert_equal(section.phase.template, new_section.phase.template, 'returns the section without generating a new template hierarchy')
# Looking for a question
question = @template.phases.first.sections.first.questions.first
new_question = get_modifiable(question)
assert_equal(question.id, new_question.id, 'returns the same question id')
assert_equal(question.section.phase.template, new_question.section.phase.template, 'returns the question without generating a new template hierarchy')
# Looking for an annotation
annotation = @template.phases.first.sections.first.questions.first.annotations.first
new_annotation = get_modifiable(annotation)
assert_equal(annotation.id, new_annotation.id, 'returns the same annotation id')
assert_equal(annotation.question.section.phase.template, new_annotation.question.section.phase.template, 'returns the annotation without generating a new template hierarchy')
end
test "#get_modifiable returns new phase when template is published" do
@template.published = true
@template.save!
phase = @template.phases.first
new_phase = get_modifiable(phase)
assert_not_equal(phase.id, new_phase.id, 'returns different phase id')
assert_not_equal(phase.template_id, new_phase.template_id, 'returns different template belonging')
end
test "#get_modifiable returns new section when template is published" do
@template.published = true
@template.save!
section = @template.phases.first.sections.first
new_section = get_modifiable(section)
assert_not_equal(section.id, new_section.id, 'returns different section id')
assert_not_equal(section.phase.template, new_section.phase.template, 'returns different template belonging')
end
test "#get_modifiable returns new question when template is published" do
@template.published = true
@template.save!
question = @template.phases.first.sections.first.questions.first
new_question = get_modifiable(question)
assert_not_equal(question.id, new_question.id, 'returns different question id')
assert_not_equal(question.section.phase.template, new_question.section.phase.template, 'returns different template belonging')
end
test "#get_modifiable returns new annotation when template is published" do
@template.published = true
@template.save!
annotation = @template.phases.first.sections.first.questions.first.annotations.first
new_annotation = get_modifiable(annotation)
assert_not_equal(annotation.id, new_annotation.id, 'returns different annotation id')
assert_not_equal(annotation.question.section.phase.template, new_annotation.question.section.phase.template, 'returns different template belonging')
end
test "#get_modifiable returns new question_option when template is published" do
@template.published = true
@template.save!
question = @template.phases.first.sections.first.questions.first
question.question_options << init_question_option(question)
question_option = question.question_options.first
new_question = get_modifiable(question)
new_question_option = new_question.question_options.first
assert_not_equal(question_option.id, new_question_option.id, 'returns different question_option id')
assert_not_equal(question_option.question.section.phase.template, new_question_option.question.section.phase.template, 'returns different template belonging')
end
end