require 'rails_helper'

RSpec.describe QuestionOption, type: :model do

  context "validations" do

    it { is_expected.to validate_presence_of(:question) }

    it { is_expected.to validate_presence_of(:text) }

    it { is_expected.to validate_presence_of(:number) }

    it { is_expected.to allow_values(true, false).for(:is_default) }

    it { is_expected.not_to allow_value(nil).for(:is_default) }

  end

  context "associations" do

    it { is_expected.to belong_to(:question) }

    it { is_expected.to have_and_belong_to_many(:answers)
                          .join_table("answers_question_options") }
  end

  describe ".by_number" do

    subject { QuestionOption.by_number }

    before do
      @a = create(:question_option, number: 1)
      @b = create(:question_option, number: 3)
      @c = create(:question_option, number: 2)
    end

    it "orders records by the number attribute" do
      expect(subject.first).to eql(@a)
      expect(subject.last).to eql(@b)
    end

  end

  describe "#deep_copy" do

    let!(:options) { Hash.new }

    let!(:question_option) { create(:question_option, is_default: true) }

    subject { question_option.deep_copy(options) }

    context "when no options provided" do

      it "builds a new record" do
        expect(subject).to be_new_record
      end

      it "copies is_default from original" do
        expect(subject.is_default).to eql(question_option.is_default)
      end

      it "copies number from original" do
        expect(subject.number).to eql(question_option.number)
      end

      it "copies text from original" do
        expect(subject.text).to eql(question_option.text)
      end

      it "sets question_id to nil" do
        expect(subject.question_id).to be_nil
      end

    end

    context "when question_id option is present" do

      let!(:question) { create(:question) }

      let!(:options) { { question_id: question.id } }

      it "sets question_id to given option" do
        expect(subject.question_id).to eql(question.id)
      end

    end
  end

end
