require 'rails_helper' RSpec.describe Answer, type: :model do context "validations" do subject { build(:answer) } it { is_expected.to validate_presence_of(:plan) } it { is_expected.to validate_presence_of(:user) } it { is_expected.to validate_presence_of(:question) } it { is_expected.to validate_presence_of(:research_output) } end describe ".deep_copy" do let!(:answer) { build(:answer) } subject { Answer.deep_copy(answer) } it "creates a new record" do expect(subject).not_to eql(answer) end it "copies the lock_version attribute" do expect(subject.lock_version).to eql(answer.lock_version) end it "copies the text attribute" do expect(subject.text).to eql(answer.text) end it "copies the plan_id attribute" do expect(subject.plan_id).to eql(answer.plan_id) end it "copies the question_id attribute" do expect(subject.question_id).to eql(answer.question_id) end it "copies the user_id attribute" do expect(subject.user_id).to eql(answer.user_id) end end describe "#has_question_option" do let!(:answer) { create(:answer) } let!(:question_option) { create(:question_option) } subject { answer.has_question_option(question_option.id) } context "when answer has QuestionOption" do before do answer.question_options << question_option end it { is_expected.to eql(true) } end context "when answer doesn't have QuestionOption" do it { is_expected.to eql(false) } end end describe "#answered?" do let!(:answer) { create(:answer) } subject { answer.answered? } context "question present, question format is option and options empty" do before do answer.question.update(question_format: create(:question_format, option_based: true)) end it { is_expected.to eql(false) } end context "question present, question format is option and options present" do before do answer.question.update(question_format: create(:question_format, option_based: true)) answer.question_options << create_list(:question_option, 2) end it { is_expected.to eql(true) } end context "question present, question format not option and text empty" do before do answer.question.update(question_format: create(:question_format, option_based: false)) answer.text = "" end it { is_expected.to eql(false) } end context "question present, question format not option and text present" do before do answer.question.update(question_format: create(:question_format, option_based: false)) answer.text = "This is an answer" end it { is_expected.to eql(true) } end context "question absent" do before do answer.update(question: nil) end it { is_expected.to eql(false) } end end describe "#non_archived_notes" do before do @answer = create(:answer) @notes = create_list(:note, 3, answer: @answer, archived: false) @archived_notes = create_list(:note, 3, answer: @answer, archived: true) @other_notes = create_list(:note, 3) end subject { @answer.non_archived_notes } it "includes the non-archived notes" do @notes.each do |note| expect(subject).to include(note) end end it "excludes the archived notes" do @archived_notes.each do |note| expect(subject).not_to include(note) end end it "excludes notes belonging to other Answers" do @other_notes.each do |note| expect(subject).not_to include(note) end end end describe "#is_blank?" do context "when text is nil" do let!(:answer) { build(:answer, text: nil) } subject { answer } it { is_expected.to be_is_blank } end context "when text is ''" do let!(:answer) { build(:answer, text: "") } subject { answer } it { is_expected.to be_is_blank } end context "when text is plain text" do let!(:answer) { build(:answer, text: "Foo bar") } subject { answer } it { is_expected.not_to be_is_blank } end context "when text is html text" do let!(:answer) { build(:answer, text: "<p>Foo bar</p>") } subject { answer } it { is_expected.not_to be_is_blank } end end describe "#answer_hash" do let!(:answer) { build(:answer) } let(:default_json) { {'standards' => {}, 'text' => ''} } subject { answer.answer_hash } context "when text is nil" do before do answer.text = nil end it { is_expected.to eql(default_json) } end context "when text is blank" do before do answer.text = '' end it { is_expected.to eql(default_json) } end context "when text is valid JSON" do before do answer.text = { name: "foo", bar: "baz" }.to_json end it { is_expected.to eql({ "name" => "foo", "bar" => "baz" }) } end context "when text is HTML" do before do answer.text = '<p>foo bar</p>' end it { is_expected.to eql(default_json) } end end describe "#update_answer_hash" do let!(:answer) { build(:answer) } subject { answer.answer_hash } context "when standards parameter is present" do before do answer.update_answer_hash({foo: 'bar'}) end it { is_expected.to eql({"standards" => {"foo" => "bar"}, "text" => ""}) } end context "when both params are absent" do before do answer.update_answer_hash() end it { is_expected.to eql({"standards" => {}, "text" => ""}) } end context "when both params are present" do before do answer.update_answer_hash({foo: 'bar'}, "baz") end it { is_expected.to eql({ "standards" => {"foo" => "bar"}, "text" => "baz" }) } end end end