From 66334b5757e27f88bf237ad4aadc7023dd3dbaca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Thu, 19 Sep 2019 23:35:14 +0200 Subject: [PATCH] Add globalizable tests for all translatable models So now we test in depth at the model level, and can be a bit more relaxed about integration tests for translations. Note we're defining some extra factories to make sure all translatable attributes with presence validation rules are mandatory. This way we can simplify the way we obtain required fields, using `required_attribute?`. Otherwise, fields having an `unless` condition in their presence validation rules would count as mandatory even when they're not. --- spec/factories/milestones.rb | 6 ++++++ spec/factories/proposals.rb | 2 ++ spec/models/banner_spec.rb | 1 + spec/models/budget/group_spec.rb | 1 + spec/models/budget/heading_spec.rb | 1 + spec/models/budget/phase_spec.rb | 2 ++ spec/models/budget_spec.rb | 1 + spec/models/concerns/globalizable.rb | 14 +++++++------- spec/models/legislation/draft_version_spec.rb | 1 + spec/models/legislation/process_spec.rb | 1 + spec/models/legislation/question_option_spec.rb | 1 + spec/models/legislation/question_spec.rb | 1 + spec/models/milestone_spec.rb | 1 + spec/models/poll/active_poll_spec.rb | 5 +++++ spec/models/poll/poll_spec.rb | 1 + spec/models/poll/question/answer_spec.rb | 5 +++++ spec/models/poll/question_spec.rb | 1 + spec/models/progress_bar_spec.rb | 2 ++ spec/models/proposal_spec.rb | 2 +- spec/models/site_customization/page_spec.rb | 2 ++ spec/models/widget/card_spec.rb | 3 ++- 21 files changed, 45 insertions(+), 9 deletions(-) create mode 100644 spec/models/poll/active_poll_spec.rb create mode 100644 spec/models/poll/question/answer_spec.rb diff --git a/spec/factories/milestones.rb b/spec/factories/milestones.rb index 9d2aebceb..8be395e4f 100644 --- a/spec/factories/milestones.rb +++ b/spec/factories/milestones.rb @@ -10,6 +10,10 @@ FactoryBot.define do sequence(:title) { |n| "Milestone #{n} title" } description { "Milestone description" } publication_date { Date.current } + + factory :milestone_with_description do + status { nil } + end end factory :progress_bar do @@ -21,5 +25,7 @@ FactoryBot.define do kind { :secondary } sequence(:title) { |n| "Progress bar #{n} title" } end + + factory :secondary_progress_bar, traits: [:secondary] end end diff --git a/spec/factories/proposals.rb b/spec/factories/proposals.rb index 93b1cd54a..b11f9eae7 100644 --- a/spec/factories/proposals.rb +++ b/spec/factories/proposals.rb @@ -73,6 +73,8 @@ FactoryBot.define do trait :with_milestone_tags do after(:create) { |proposal| proposal.milestone_tags << create(:tag, :milestone) } end + + factory :retired_proposal, traits: [:retired] end factory :proposal_notification do diff --git a/spec/models/banner_spec.rb b/spec/models/banner_spec.rb index fac153a25..d253efc27 100644 --- a/spec/models/banner_spec.rb +++ b/spec/models/banner_spec.rb @@ -6,6 +6,7 @@ describe Banner do describe "Concerns" do it_behaves_like "acts as paranoid", :banner + it_behaves_like "globalizable", :banner end it "is valid" do diff --git a/spec/models/budget/group_spec.rb b/spec/models/budget/group_spec.rb index 26f4d0ade..38290810a 100644 --- a/spec/models/budget/group_spec.rb +++ b/spec/models/budget/group_spec.rb @@ -2,6 +2,7 @@ require "rails_helper" describe Budget::Group do it_behaves_like "sluggable", updatable_slug_trait: :drafting_budget + it_behaves_like "globalizable", :budget_group describe "Validations" do diff --git a/spec/models/budget/heading_spec.rb b/spec/models/budget/heading_spec.rb index 966a52269..3e83ae7ea 100644 --- a/spec/models/budget/heading_spec.rb +++ b/spec/models/budget/heading_spec.rb @@ -6,6 +6,7 @@ describe Budget::Heading do let(:group) { create(:budget_group, budget: budget) } it_behaves_like "sluggable", updatable_slug_trait: :drafting_budget + it_behaves_like "globalizable", :budget_heading describe "OSM_DISTRICT_LEVEL_ZOOM constant" do it "is defined" do diff --git a/spec/models/budget/phase_spec.rb b/spec/models/budget/phase_spec.rb index e7ef5fa28..a191bc284 100644 --- a/spec/models/budget/phase_spec.rb +++ b/spec/models/budget/phase_spec.rb @@ -9,6 +9,8 @@ describe Budget::Phase do let(:fourth_phase) { budget.phases.reviewing } let(:final_phase) { budget.phases.finished } + it_behaves_like "globalizable", :budget_phase + describe "validates" do it "is not valid without a budget" do expect(build(:budget_phase, budget: nil)).not_to be_valid diff --git a/spec/models/budget_spec.rb b/spec/models/budget_spec.rb index 7899bfae6..e45061274 100644 --- a/spec/models/budget_spec.rb +++ b/spec/models/budget_spec.rb @@ -6,6 +6,7 @@ describe Budget do it_behaves_like "sluggable", updatable_slug_trait: :drafting it_behaves_like "reportable" + it_behaves_like "globalizable", :budget describe "name" do before do diff --git a/spec/models/concerns/globalizable.rb b/spec/models/concerns/globalizable.rb index 08d5f81cf..58900442b 100644 --- a/spec/models/concerns/globalizable.rb +++ b/spec/models/concerns/globalizable.rb @@ -1,13 +1,15 @@ require "spec_helper" shared_examples_for "globalizable" do |factory_name| - let(:record) { create(:factory_name) } - let(:fields) { record.translated_attribute_names } - let(:required_fields) do - fields.reject do |field| - record.translations.first.dup.tap { |duplicate| duplicate.send(:"#{field}=", "") }.valid? + let(:record) do + if factory_name == :budget_phase + create(:budget).phases.last + else + create(factory_name) end end + let(:fields) { record.translated_attribute_names } + let(:required_fields) { fields.select { |field| record.send(:required_attribute?, field) } } let(:attribute) { required_fields.sample || fields.sample } before do @@ -177,8 +179,6 @@ shared_examples_for "globalizable" do |factory_name| end it "Falls back to the first available locale after removing a locale" do - Globalize.set_fallbacks_to_all_available_locales - expect(record.send(attribute)).to eq "In English" record.update(translations_attributes: [ diff --git a/spec/models/legislation/draft_version_spec.rb b/spec/models/legislation/draft_version_spec.rb index 5beb04a1b..4052b40b3 100644 --- a/spec/models/legislation/draft_version_spec.rb +++ b/spec/models/legislation/draft_version_spec.rb @@ -4,6 +4,7 @@ describe Legislation::DraftVersion do let(:legislation_draft_version) { build(:legislation_draft_version) } it_behaves_like "acts as paranoid", :legislation_draft_version + it_behaves_like "globalizable", :legislation_draft_version it "is valid" do expect(legislation_draft_version).to be_valid diff --git a/spec/models/legislation/process_spec.rb b/spec/models/legislation/process_spec.rb index 787199fc3..d07dcb8ac 100644 --- a/spec/models/legislation/process_spec.rb +++ b/spec/models/legislation/process_spec.rb @@ -4,6 +4,7 @@ describe Legislation::Process do let(:process) { create(:legislation_process) } it_behaves_like "acts as paranoid", :legislation_process + it_behaves_like "globalizable", :legislation_process it "is valid" do expect(process).to be_valid diff --git a/spec/models/legislation/question_option_spec.rb b/spec/models/legislation/question_option_spec.rb index 20f288dbf..b8d8b681f 100644 --- a/spec/models/legislation/question_option_spec.rb +++ b/spec/models/legislation/question_option_spec.rb @@ -4,6 +4,7 @@ describe Legislation::QuestionOption do let(:legislation_question_option) { build(:legislation_question_option) } it_behaves_like "acts as paranoid", :legislation_question_option + it_behaves_like "globalizable", :legislation_question_option it "is valid" do expect(legislation_question_option).to be_valid diff --git a/spec/models/legislation/question_spec.rb b/spec/models/legislation/question_spec.rb index 0db4b957b..1b3b62355 100644 --- a/spec/models/legislation/question_spec.rb +++ b/spec/models/legislation/question_spec.rb @@ -7,6 +7,7 @@ describe Legislation::Question do describe "Concerns" do it_behaves_like "notifiable" + it_behaves_like "globalizable", :legislation_question end it "is valid" do diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index 87ba6fb8b..2e796c46c 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -1,6 +1,7 @@ require "rails_helper" describe Milestone do + it_behaves_like "globalizable", :milestone_with_description describe "Validations" do let(:milestone) { build(:milestone) } diff --git a/spec/models/poll/active_poll_spec.rb b/spec/models/poll/active_poll_spec.rb new file mode 100644 index 000000000..1326c2a9c --- /dev/null +++ b/spec/models/poll/active_poll_spec.rb @@ -0,0 +1,5 @@ +require "rails_helper" + +describe ActivePoll do + it_behaves_like "globalizable", :active_poll +end diff --git a/spec/models/poll/poll_spec.rb b/spec/models/poll/poll_spec.rb index bf878d2c5..d0c3b63f1 100644 --- a/spec/models/poll/poll_spec.rb +++ b/spec/models/poll/poll_spec.rb @@ -8,6 +8,7 @@ describe Poll do it_behaves_like "notifiable" it_behaves_like "acts as paranoid", :poll it_behaves_like "reportable" + it_behaves_like "globalizable", :poll end describe "validations" do diff --git a/spec/models/poll/question/answer_spec.rb b/spec/models/poll/question/answer_spec.rb new file mode 100644 index 000000000..e1af0365c --- /dev/null +++ b/spec/models/poll/question/answer_spec.rb @@ -0,0 +1,5 @@ +require "rails_helper" + +describe Poll::Question::Answer do + it_behaves_like "globalizable", :poll_question_answer +end diff --git a/spec/models/poll/question_spec.rb b/spec/models/poll/question_spec.rb index 63b9cd63a..249742392 100644 --- a/spec/models/poll/question_spec.rb +++ b/spec/models/poll/question_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Poll::Question, type: :model do describe "Concerns" do it_behaves_like "acts as paranoid", :poll_question + it_behaves_like "globalizable", :poll_question end describe "#poll_question_id" do diff --git a/spec/models/progress_bar_spec.rb b/spec/models/progress_bar_spec.rb index 46b0ce08b..e09663e0a 100644 --- a/spec/models/progress_bar_spec.rb +++ b/spec/models/progress_bar_spec.rb @@ -3,6 +3,8 @@ require "rails_helper" describe ProgressBar do let(:progress_bar) { build(:progress_bar) } + it_behaves_like "globalizable", :secondary_progress_bar + it "is valid" do expect(progress_bar).to be_valid end diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index 9d34a1b58..bbe74bde3 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -8,7 +8,7 @@ describe Proposal do it_behaves_like "has_public_author" it_behaves_like "notifiable" it_behaves_like "map validations" - it_behaves_like "globalizable", :proposal + it_behaves_like "globalizable", :retired_proposal it_behaves_like "sanitizable" it_behaves_like "acts as paranoid", :proposal end diff --git a/spec/models/site_customization/page_spec.rb b/spec/models/site_customization/page_spec.rb index ccbe8bfa8..e2c4f4250 100644 --- a/spec/models/site_customization/page_spec.rb +++ b/spec/models/site_customization/page_spec.rb @@ -3,6 +3,8 @@ require "rails_helper" RSpec.describe SiteCustomization::Page, type: :model do let(:custom_page) { build(:site_customization_page) } + it_behaves_like "globalizable", :site_customization_page + it "is valid" do expect(custom_page).to be_valid end diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb index c0a393984..75c7dd3d4 100644 --- a/spec/models/widget/card_spec.rb +++ b/spec/models/widget/card_spec.rb @@ -1,9 +1,10 @@ require "rails_helper" describe Widget::Card do - let(:card) { build(:widget_card) } + it_behaves_like "globalizable", :widget_card + context "validations" do it "is valid" do