# == Schema Information
#
# Table name: phases
#
# id :integer not null, primary key
# title :string
# description :text
# number :integer
# template_id :integer
# created_at :datetime
# updated_at :datetime
# slug :string
# modifiable :boolean
#
require 'test_helper'
class PhaseTest < 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
@template = init_template(@funder, published: true)
@phase = init_phase(@template)
end
test "required fields are required" do
assert_not Phase.new.valid?
assert_not Phase.new(title: 'Testing', number: 1).valid?, "expected the template field to be required"
assert_not Phase.new(number: 2, template: @template).valid?, "expected the title field to be required"
assert_not Phase.new(title: 'Testing', template: @template).valid?, "expected the number field to be required"
# Ensure the bare minimum and complete versions are valid
a = Phase.new(title: 'Testing', template: @template, number: 2)
assert a.valid?, "expected the 'title', 'number' and 'template' fields to be enough to create an Phase! - #{a.errors.map { |f, m| f.to_s + ' ' + m }.join(', ')}"
end
test "titles scope returns a list of all phase id with their titles for the specified template" do
init_phase(@template, title: 'test scope 1', number: 2)
init_phase(@template, title: 'test scope 2', number: 3)
titles = Phase.titles(@template)
assert_equal 3, titles.length, 'expected 3 phases, the orignal and 2 new'
assert_not titles.select { |p| p.title == 'test scope 2' }.empty?, "expected to find the second phase"
end
test "titles scope does not return phases from other templates" do
init_phase(@template, title: 'test scope 1', number: 2)
template2 = init_template(@funder, title: 'template 2')
init_phase(template2, title: 'other template scope')
titles = Phase.titles(@template)
assert titles.select { |p| p.title == 'other template scope' }.empty?, "expected to not find the other template's phase"
end
test "#deep_copy creates a new phase object and attaches new section objects" do
assert_deep_copy(@phase, @phase.deep_copy, relations: [:sections])
end
test "num_questions returns the total number of questions for the phase" do
section = init_section(@phase)
section2 = init_section(@phase, title: 'Section B', number: 2)
init_question(section)
init_question(section, text: 'Question number 2', number: 2)
init_question(section2)
assert_equal 3, @phase.num_questions, 'expected 3 questions for the phase, 2 for the 1st section and 1 for the 2nd section'
end
test "num_questions does not count questions that belong to other templates" do
section = init_section(@phase)
init_question(section)
template2 = init_template(@funder, title: 'template 2')
phase2 = init_phase(template2, title: 'other template scope')
section2 = init_section(phase2)
init_question(section2)
assert_equal 1, @phase.num_questions, 'expected 1 question for the phase'
end
test "prefix_section is the first section with the lowest number" do
@phase = Phase.create!(title: "lorem", number: 123, template: @template)
@section_a = @phase.sections.create!(title: "Gavin test 1", modifiable: false, number: 12)
@section_b = @phase.sections.create!(title: "Gavin test 2", modifiable: true, number: 11)
assert(@section_b.modifiable)
assert_equal(@phase.sections.minimum(:number), @section_b.number)
assert_equal(@phase.sections.not_modifiable.minimum(:number), @section_a.number)
assert_equal @phase.prefix_section, @section_b
end
end