From 98b6dd75eab8ba2499b6e6c9a724d53734e1f778 Mon Sep 17 00:00:00 2001 From: Amaia Castro Date: Mon, 2 Jan 2017 19:51:39 +0100 Subject: [PATCH] Fix stack level too deep bug when deleting questions with answers --- app/models/legislation/answer.rb | 4 +-- .../admin/legislation/questions_spec.rb | 18 +++++++++++ spec/models/legislation/question_spec.rb | 32 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/app/models/legislation/answer.rb b/app/models/legislation/answer.rb index fd4bc90ed..375bcad8c 100644 --- a/app/models/legislation/answer.rb +++ b/app/models/legislation/answer.rb @@ -1,6 +1,6 @@ class Legislation::Answer < ActiveRecord::Base - belongs_to :question, class_name: 'Legislation::Question', foreign_key: 'legislation_question_id', dependent: :destroy, inverse_of: :answers, counter_cache: true - belongs_to :question_option, class_name: 'Legislation::QuestionOption', foreign_key: 'legislation_question_option_id', dependent: :destroy, inverse_of: :answers, counter_cache: true + belongs_to :question, class_name: 'Legislation::Question', foreign_key: 'legislation_question_id', inverse_of: :answers, counter_cache: true + belongs_to :question_option, class_name: 'Legislation::QuestionOption', foreign_key: 'legislation_question_option_id', inverse_of: :answers, counter_cache: true belongs_to :user, dependent: :destroy, inverse_of: :legislation_answers validates :question, presence: true, uniqueness: { scope: :user_id} diff --git a/spec/features/admin/legislation/questions_spec.rb b/spec/features/admin/legislation/questions_spec.rb index 5b2dd0ef6..44698a25c 100644 --- a/spec/features/admin/legislation/questions_spec.rb +++ b/spec/features/admin/legislation/questions_spec.rb @@ -86,4 +86,22 @@ feature 'Admin legislation questions' do expect(page).to have_content 'Question 2b' end end + + context 'Delete' do + scenario 'Legislation question', :js do + process = create(:legislation_process, title: 'An example legislation process') + create(:legislation_question, title: 'Question 1', process: process) + question = create(:legislation_question, title: 'Question 2', process: process) + question_option = create(:legislation_question_option, question: question, value: 'Yes') + create(:legislation_answer, question: question, question_option: question_option) + + visit edit_admin_legislation_process_question_path(process, question) + + click_link 'Delete' + + expect(page).to have_content 'Questions' + expect(page).to have_content 'Question 1' + expect(page).to_not have_content 'Question 2' + end + end end diff --git a/spec/models/legislation/question_spec.rb b/spec/models/legislation/question_spec.rb index 25815cd38..660f87cd2 100644 --- a/spec/models/legislation/question_spec.rb +++ b/spec/models/legislation/question_spec.rb @@ -6,4 +6,36 @@ RSpec.describe Legislation::Question, type: :model do it "should be valid" do expect(legislation_question).to be_valid end + + context "can be deleted" do + example "when it has no options or answers" do + question = create(:legislation_question) + + expect do + question.destroy + end.to change { Legislation::Question.count }.by(-1) + end + + example "when it has options but no answers" do + question = create(:legislation_question) + create(:legislation_question_option, question: question, value: "Yes") + create(:legislation_question_option, question: question, value: "No") + + expect do + question.destroy + end.to change { Legislation::Question.count }.by(-1) + end + + example "when it has options and answers" do + question = create(:legislation_question) + option_1 = create(:legislation_question_option, question: question, value: "Yes") + option_2 = create(:legislation_question_option, question: question, value: "No") + create(:legislation_answer, question: question, question_option: option_1) + create(:legislation_answer, question: question, question_option: option_2) + + expect do + question.destroy + end.to change { Legislation::Question.count }.by(-1) + end + end end