diff --git a/decidim-signature_collection/README.md b/decidim-signature_collection/README.md index b929fec7..76149a70 100644 --- a/decidim-signature_collection/README.md +++ b/decidim-signature_collection/README.md @@ -119,6 +119,23 @@ In order to populate the database with example data proceed as usual in rails: bundle exec rails db:seed ``` +### Run tests + +Create a dummy app in your application (if not present): + +```bash +bin/rails decidim:generate_external_test_app +cd spec/decidim_dummy_app/ +bundle exec rails decidim_signature_collection:install:migrations +RAILS_ENV=test bundle exec rails db:migrate +``` + +And run tests: + +```bash +bundle exec rspec spec +``` + ## Additional considerations ### Cookies diff --git a/decidim-signature_collection/app/commands/decidim/signature_collection/unvote_candidacy.rb b/decidim-signature_collection/app/commands/decidim/signature_collection/unvote_candidacy.rb deleted file mode 100644 index 07aaba15..00000000 --- a/decidim-signature_collection/app/commands/decidim/signature_collection/unvote_candidacy.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -module Decidim - module SignatureCollection - # A command with all the business logic when a user or organization unvotes an candidacy. - class UnvoteCandidacy < Decidim::Command - # Public: Initializes the command. - # - # candidacy - A Decidim::SignatureCollection::Candidacy object. - # current_user - The current user. - def initialize(candidacy, current_user) - @candidacy = candidacy - @current_user = current_user - end - - # Executes the command. Broadcasts these events: - # - # - :ok when everything is valid, together with the candidacy. - # - :invalid if the form was not valid and we could not proceed. - # - # Returns nothing. - def call - destroy_candidacy_vote - broadcast(:ok, @candidacy) - end - - private - - def destroy_candidacy_vote - Candidacy.transaction do - @candidacy.votes.where(author: @current_user).destroy_all - end - end - end - end -end diff --git a/decidim-signature_collection/app/commands/decidim/signature_collection/vote_candidacy.rb b/decidim-signature_collection/app/commands/decidim/signature_collection/vote_candidacy.rb index ecb6e71e..fe1517b5 100644 --- a/decidim-signature_collection/app/commands/decidim/signature_collection/vote_candidacy.rb +++ b/decidim-signature_collection/app/commands/decidim/signature_collection/vote_candidacy.rb @@ -43,14 +43,12 @@ def call delegate :candidacy, to: :form def create_vote - vote = candidacy.votes.create!( + candidacy.votes.create!( encrypted_xml_doc_to_sign: form.encrypted_xml_doc_to_sign, encrypted_metadata: form.encrypted_metadata, filename: form.filename, hash_id: form.hash_id ) - - vote end def timestamp diff --git a/decidim-signature_collection/app/controllers/decidim/signature_collection/candidacy_votes_controller.rb b/decidim-signature_collection/app/controllers/decidim/signature_collection/candidacy_votes_controller.rb index 212d819e..5325ee05 100644 --- a/decidim-signature_collection/app/controllers/decidim/signature_collection/candidacy_votes_controller.rb +++ b/decidim-signature_collection/app/controllers/decidim/signature_collection/candidacy_votes_controller.rb @@ -32,18 +32,6 @@ def create end end end - - # DELETE /candidacies/:candidacy_id/candidacy_vote - def destroy - enforce_permission_to :unvote, :candidacy, candidacy: current_candidacy - - UnvoteCandidacy.call(current_candidacy, current_user) do - on(:ok) do - current_candidacy.reload - render :update_buttons_and_counters - end - end - end end end end diff --git a/decidim-signature_collection/app/models/decidim/signature_collection/candidacy.rb b/decidim-signature_collection/app/models/decidim/signature_collection/candidacy.rb index 8f48d001..5c57e2ff 100644 --- a/decidim-signature_collection/app/models/decidim/signature_collection/candidacy.rb +++ b/decidim-signature_collection/app/models/decidim/signature_collection/candidacy.rb @@ -31,6 +31,19 @@ class Candidacy < ApplicationRecord translatable_fields :title, :description, :answer + # Override Participable methods to use the correct namespace (SignatureCollection instead of Candidacies) + def self.module_name + "Decidim::SignatureCollection" + end + + def self.admin_module_name + "Decidim::SignatureCollection::Admin" + end + + def self.admins_query + Decidim::SignatureCollection::Admin::AdminUsers + end + delegate :type, :scope, :scope_name, :supports_required, to: :scoped_type, allow_nil: true delegate :document_number_authorization_handler, :promoting_committee_enabled?, :attachments_enabled?, :promoting_committee_enabled?, :custom_signature_end_date_enabled?, :area_enabled?, to: :type @@ -462,10 +475,6 @@ def accepts_online_votes? votes_enabled? && (online_signature_type? || any_signature_type?) end - def accepts_online_unvotes? - accepts_online_votes? && type.undo_online_signatures_enabled? - end - def minimum_committee_members type.minimum_committee_members || Decidim::SignatureCollection.minimum_committee_members end diff --git a/decidim-signature_collection/app/permissions/decidim/signature_collection/permissions.rb b/decidim-signature_collection/app/permissions/decidim/signature_collection/permissions.rb index 8bb22f43..7ad9f2db 100644 --- a/decidim-signature_collection/app/permissions/decidim/signature_collection/permissions.rb +++ b/decidim-signature_collection/app/permissions/decidim/signature_collection/permissions.rb @@ -24,8 +24,6 @@ def permissions update_public_candidacy? print_candidacy? - unvote_candidacy? - candidacy_attachment? candidacy_committee_action? @@ -136,17 +134,6 @@ def authorized?(permission_action, resource: nil, permissions_holder: nil) ActionAuthorizer.new(user, permission_action, permissions_holder, resource).authorize.ok? end - def unvote_candidacy? - return false unless permission_action.action == :unvote && - permission_action.subject == :candidacy - - can_unvote = candidacy.accepts_online_unvotes? && - candidacy.organization&.id == user.organization&.id && - candidacy.votes.where(author: user).any? - - toggle_allow(can_unvote) - end - def candidacy_attachment? return false unless permission_action.action == :add_attachment && permission_action.subject == :candidacy diff --git a/decidim-signature_collection/app/views/decidim/signature_collection/admin/answers/edit.html.erb b/decidim-signature_collection/app/views/decidim/signature_collection/admin/answers/edit.html.erb index d4ca87ad..9c497a41 100644 --- a/decidim-signature_collection/app/views/decidim/signature_collection/admin/answers/edit.html.erb +++ b/decidim-signature_collection/app/views/decidim/signature_collection/admin/answers/edit.html.erb @@ -20,6 +20,7 @@ <% if current_candidacy.validating? %>
<%= f.check_box :return_to_create_state, id: :candidacy_return_to_create_state %> +

<%= t(".return_to_create_state_help") %>

<% end %> diff --git a/decidim-signature_collection/app/views/decidim/signature_collection/candidacies/_vote_button.html.erb b/decidim-signature_collection/app/views/decidim/signature_collection/candidacies/_vote_button.html.erb index 1becf5a6..551a3e0a 100644 --- a/decidim-signature_collection/app/views/decidim/signature_collection/candidacies/_vote_button.html.erb +++ b/decidim-signature_collection/app/views/decidim/signature_collection/candidacies/_vote_button.html.erb @@ -4,34 +4,4 @@ candidacy_signatures_path(candidacy_slug: current_candidacy.slug), class: "button button__xl w-full button__secondary" ) %> -<% else %> - <% if candidacy.voted_by?(current_user) %> - <% if allowed_to? :unvote, :candidacy, candidacy: candidacy %> - <%= button_to( - candidacy_candidacy_vote_path(candidacy_slug: current_candidacy.slug), - method: :delete, - remote: true, - data: { disable: true }, - class: "button button__xl w-full button__secondary success" - ) do %> - <%= icon "check-line" %> - <%= unvote_label %> - <% end %> - <% else %> - - <% end %> - <% else %> - <%= action_authorized_link_to( - :vote, - t("vote", scope: "decidim.signature_collection.candidacies.vote_cabin"), - candidacy_signatures_path(candidacy_slug: current_candidacy.slug), - resource: current_candidacy, - permissions_holder: current_candidacy.type, - authorizations_modal_path: authorization_sign_modal_candidacy_path(current_candidacy), - class: "button button__xl w-full button__secondary" - ) %> - <% end %> <% end %> diff --git a/decidim-signature_collection/config/locales/ca.yml b/decidim-signature_collection/config/locales/ca.yml index d5af9f1c..5ee862d6 100644 --- a/decidim-signature_collection/config/locales/ca.yml +++ b/decidim-signature_collection/config/locales/ca.yml @@ -207,11 +207,6 @@ ca: email_outro: Has rebut aquesta notificació perquè estàs seguint la candidatura "%{resource_title}". Pots deixar de rebre notificacions seguint l'enllaç anterior. email_subject: S'ha ampliat la data de finalització de la recollida de signatura de la candidatura! notification_title: El termini de recollida de signatures per a la candidatura %{resource_title} s'ha ampliat. - candidacy_sent_to_technical_validation: - email_intro: La candidatura "%{resource_title}" s'ha enviat a validació tècnica. Comprova-ho a través del taulell d'administració - email_outro: Has rebut aquesta notificació perquè admnistres la plataforma. - email_subject: La candidatura %{resource_title} ha sol·licitat validació tècnica. - notification_title: La candidatura "%{resource_title}" s'ha enviat a validació tècnica. Comprova-ho a través del taullel d'administració milestone_completed: affected_user: email_intro: La teva candidatura %{resource_title} ha aconseguit un %{percentage}% de les signatures necessàries! @@ -225,7 +220,10 @@ ca: notification_title: La candidatura %{resource_title} ha aconseguit el %{percentage}% de les signatures. signature_collection: candidacy_sent_to_technical_validation: - notification_title: La candidatura "%{resource_title}" s'ha enviat a validació tècnica. Comprova-ho a través del taullel d'administració + email_intro: La teva candidatura %{resource_title} ha aconseguit un %{percentage}% de les signatures necessàries! + email_outro: Has rebut aquesta notificació perquè has creat la candidatura "%{resource_title}". + email_subject: S'ha completat una nova fita! + notification_title: La candidatura "%{resource_title}" s'ha enviat a validació tècnica. support_threshold_reached: email_intro: La candidatura %{resource_title} ha arribat al llindar de signatures email_outro: Has rebut aquesta notificació perquè admnistres la plataforma. @@ -257,6 +255,7 @@ ca: answers: edit: answer: Resposta + return_to_create_state_help: Marcant aquesta opció, la candidatura tornarà a l'estat "Creada" per a què la persona que l'ha presentat pugui editar-la amb els canvis sol·licitats en aquesta resposta. title: Resposta per %{title} info_candidacy: created_at: Creada el diff --git a/decidim-signature_collection/config/locales/en.yml b/decidim-signature_collection/config/locales/en.yml index 96306456..d0827322 100644 --- a/decidim-signature_collection/config/locales/en.yml +++ b/decidim-signature_collection/config/locales/en.yml @@ -215,10 +215,10 @@ en: notification_title: The candidacy "%{resource_title}" has been sent to technical validation. Check it out at the admin panel signature_collection: candidacy_sent_to_technical_validation: - email_intro: The candidacy "%{resource_title}" has been sent to technical validation. Check it out at the admin panel + email_intro: The candidacy "%{resource_title}" has been sent to technical validation. email_outro: You have received this notification because you are an admin of the platform. email_subject: Candidacy "%{resource_title}" was sent to technical validation. - notification_title: The candidacy "%{resource_title}" has been sent to technical validation. Check it out at the admin panel + notification_title: The candidacy "%{resource_title}" has been sent to technical validation. milestone_completed: affected_user: email_intro: Your candidacy %{resource_title} has achieved the %{percentage}% of signatures! @@ -230,9 +230,6 @@ en: email_outro: You have received this notification because you are following %{resource_title}. You can stop receiving notifications following the previous link. email_subject: New milestone completed! notification_title: The %{resource_title} candidacy has achieved the %{percentage}% of signatures. - signature_collection: - candidacy_sent_to_technical_validation: - notification_title: The candidacy "%{resource_title}" has been sent to technical validation. Check it out at the admin panel support_threshold_reached: email_intro: The candidacy %{resource_title} has reached the signatures threshold email_outro: You have received this notification because you are an admin of the platform. @@ -264,6 +261,7 @@ en: answers: edit: answer: Answer + return_to_create_state_help: By checking this option, the candidacy will return to the "Created" state so that the person who submitted it can edit it with the changes requested in this answer. title: Answer for %{title} info_candidacy: created_at: Created at diff --git a/decidim-signature_collection/config/locales/es.yml b/decidim-signature_collection/config/locales/es.yml index 90c6e444..c8cc7b8f 100644 --- a/decidim-signature_collection/config/locales/es.yml +++ b/decidim-signature_collection/config/locales/es.yml @@ -210,10 +210,10 @@ es: email_subject: '¡Ampliado el términio de recogida de firmas para esta candidatura!' notification_title: El plazo de recogida de firmas para la candidatura %{resource_title} se ha ampliado. candidacy_sent_to_technical_validation: - email_intro: La candidatura "%{resource_title}" ha sido enviada a la validación técnica. Compruébala en el panel de administración + email_intro: La candidatura "%{resource_title}" ha sido enviada a la validación técnica. email_outro: Has recibido esta notificación porque administras la plataforma. email_subject: La candidatura "%{resource_title}" fue enviada a validación técnica. - notification_title: La candidatura "%{resource_title}" ha sido enviada a validación técnica. Compruébalo en el panel de administración + notification_title: La candidatura "%{resource_title}" ha sido enviada a validación técnica. milestone_completed: affected_user: email_intro: '¡Tu candidatura %{resource_title} ha conseguido el %{percentage}% de las firmas necesarias!' @@ -227,7 +227,9 @@ es: notification_title: La candidatura %{resource_title} ha logrado el %{percentage}% de las firmas. signature_collection: candidacy_sent_to_technical_validation: - notification_title: La candidatura "%{resource_title}" se ha enviado a validación técnica. Compruébalo a través del panel de administración + email_outro: Has recibido esta notificación porque has creado la candidatura "%{resource_title}". + email_subject: '¡Nuevo hito completado!' + notification_title: Tu candidatura %{resource_title} ha conseguido el %{percentage}% de firmas. support_threshold_reached: email_intro: La candidatura %{resource_title} ha alcanzado el umbral de firmas email_outro: Has recibido esta notificación porque administras la plataforma. @@ -259,6 +261,7 @@ es: answers: edit: answer: Responder + return_to_create_state_help: Marcando esta opción, la candidatura volverá al estado "Creada" para que la persona que la ha presentado pueda editarla con los cambios solicitados en esta respuesta. title: Respuesta para %{title} info_candidacy: created_at: Creada el diff --git a/decidim-signature_collection/lib/decidim/signature_collection/test/factories.rb b/decidim-signature_collection/lib/decidim/signature_collection/test/factories.rb index 4235316c..8311f5f6 100644 --- a/decidim-signature_collection/lib/decidim/signature_collection/test/factories.rb +++ b/decidim-signature_collection/lib/decidim/signature_collection/test/factories.rb @@ -166,6 +166,11 @@ state { "rejected" } end + trait :answered do + answer { generate_localized_description(:candidacy_answer, skip_injection:) } + answered_at { Time.current } + end + trait :online do signature_type { "online" } end diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/create_candidacy_type_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/create_candidacy_type_spec.rb index 29c1a03b..8ca9941a 100644 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/create_candidacy_type_spec.rb +++ b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/create_candidacy_type_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection module Admin - describe CreateCandidacyType, skip: "Awaiting review" do + describe CreateCandidacyType do let(:form_klass) { CandidacyTypeForm } describe "successful creation" do diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/publish_candidacy_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/publish_candidacy_spec.rb index b0b4e110..487dae67 100644 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/publish_candidacy_spec.rb +++ b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/publish_candidacy_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection module Admin - describe PublishCandidacy, skip: "Awaiting review" do + describe PublishCandidacy do subject { described_class.new(candidacy, user) } let(:candidacy) { create(:candidacy, :created) } @@ -34,10 +34,6 @@ module Admin action_log = Decidim::ActionLog.last expect(action_log.version).to be_present end - - it "increments the author's score" do - expect { subject.call }.to change { Decidim::Gamification.status_for(candidacy.author, :candidacies).score }.by(1) - end end end end diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_answer_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_answer_spec.rb index 2cd1cd26..a5ca9c88 100644 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_answer_spec.rb +++ b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_answer_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection module Admin - describe UpdateCandidacyAnswer, skip: "Awaiting review" do + describe UpdateCandidacyAnswer do let(:form_klass) { Decidim::SignatureCollection::Admin::CandidacyAnswerForm } context "when valid data" do @@ -60,11 +60,11 @@ module Admin let(:command) { described_class.new(candidacy, form) } - it "sets candidacy state to created (0)" do + it "sets candidacy state to created" do command.call candidacy.reload - expect(candidacy.state).to eq(0) + expect(candidacy.state).to eq("created") end end end diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_type_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_type_spec.rb index 721caf6a..3a63779b 100644 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_type_spec.rb +++ b/decidim-signature_collection/spec/commands/decidim/signature_collection/admin/update_candidacy_type_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection module Admin - describe UpdateCandidacyType, skip: "Awaiting review" do + describe UpdateCandidacyType do let(:form_klass) { CandidacyTypeForm } context "when valid data" do diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/unvote_candidacy_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/unvote_candidacy_spec.rb deleted file mode 100644 index 37e1fe8f..00000000 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/unvote_candidacy_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -module Decidim - module SignatureCollection - describe UnvoteCandidacy, skip: "Awaiting review" do - describe "User unvotes candidacy" do - let(:vote) { create(:candidacy_user_vote) } - let(:command) { described_class.new(vote.candidacy, vote.author) } - - it "broadcasts ok" do - expect(vote).to be_valid - expect { command.call }.to broadcast :ok - end - - it "Removes the vote" do - expect(vote).to be_valid - expect do - command.call - end.to change(CandidaciesVote, :count).by(-1) - end - - it "decreases the vote counter by one" do - candidacy = vote.candidacy - expect(CandidaciesVote.count).to eq(1) - expect do - command.call - candidacy.reload - end.to change { candidacy.online_votes_count }.by(-1) - end - end - end - end -end diff --git a/decidim-signature_collection/spec/commands/decidim/signature_collection/vote_candidacy_spec.rb b/decidim-signature_collection/spec/commands/decidim/signature_collection/vote_candidacy_spec.rb index 204b0026..16e5770d 100644 --- a/decidim-signature_collection/spec/commands/decidim/signature_collection/vote_candidacy_spec.rb +++ b/decidim-signature_collection/spec/commands/decidim/signature_collection/vote_candidacy_spec.rb @@ -194,97 +194,6 @@ module SignatureCollection end end end - - context "when candidacy type requires extra user fields" do - let(:candidacy) do - create( - :candidacy, - :with_user_extra_fields_collection, - organization: - ) - end - let(:form_with_personal_data) do - form_klass.from_params(form_params.merge(personal_data_params)).with_context(current_organization: organization) - end - - let(:invalid_command) { described_class.new(form) } - let(:command_with_personal_data) { described_class.new(form_with_personal_data) } - - it "broadcasts invalid when form does not contain personal data" do - expect { invalid_command.call }.to broadcast :invalid - end - - context "when another signature exists with the same hash_id" do - before do - create(:candidacy_user_vote, candidacy:, hash_id: form_with_personal_data.hash_id) - end - - it "broadcasts invalid" do - expect { command_with_personal_data.call }.to broadcast :invalid - end - end - - context "when candidacy type has document number authorization handler" do - let(:handler_name) { "dummy_authorization_handler" } - let(:unique_id) { "test_digest" } - let(:metadata) do - { - test: "dummy", - scope_id: candidacy.scoped_type.scope.id - } - end - let!(:authorization_handler) { Decidim::AuthorizationHandler.handler_for(handler_name) } - - before do - allow(authorization_handler).to receive(:unique_id).and_return(unique_id) - allow(authorization_handler).to receive(:metadata).and_return(metadata) - allow(Decidim::AuthorizationHandler).to receive(:handler_for).and_return(authorization_handler) - candidacy.type.update(document_number_authorization_handler: handler_name) - end - - context "when current_user does not have any authorization for the handler" do - it "broadcasts invalid" do - expect { command_with_personal_data.call }.to broadcast :invalid - end - end - - context "when current_user have an an authorization for the handler" do - let!(:authorization) { create(:authorization, granted_at:, name: handler_name, unique_id: authorization_unique_id, metadata: authorization_metadata, user: current_user) } - let(:authorization_unique_id) { unique_id } - let(:authorization_metadata) { metadata } - let(:granted_at) { 1.minute.ago } - - context "when authorization unique_id and metadata are coincident with handler" do - it "broadcasts ok" do - expect { command_with_personal_data.call }.to broadcast :ok - end - - it "stores encrypted user personal data in vote" do - command_with_personal_data.call - vote = CandidaciesVote.last - expect(vote.encrypted_metadata).to be_present - expect(vote.decrypted_metadata).to eq personal_data_params - end - end - - context "when authorization unique_id is different of handler unique_id" do - let(:authorization_unique_id) { "other" } - - it "broadcasts invalid" do - expect { command_with_personal_data.call }.to broadcast :invalid - end - end - - context "when authorization is not fully granted" do - let(:granted_at) { nil } - - it "broadcasts invalid" do - expect { command_with_personal_data.call }.to broadcast :invalid - end - end - end - end - end end end end diff --git a/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_controller_spec.rb b/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_controller_spec.rb index 112726a0..f221c6f6 100644 --- a/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_controller_spec.rb +++ b/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_controller_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Decidim::SignatureCollection::Admin::CandidaciesController, skip: "Awaiting review" do +describe Decidim::SignatureCollection::Admin::CandidaciesController do routes { Decidim::SignatureCollection::AdminEngine.routes } let(:user) { create(:user, :confirmed, :admin_terms_accepted, organization:) } diff --git a/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_types_controller_spec.rb b/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_types_controller_spec.rb index ae8cffe3..53898f7b 100644 --- a/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_types_controller_spec.rb +++ b/decidim-signature_collection/spec/controllers/decidim/signature_collection/admin/candidacies_types_controller_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection module Admin - describe CandidaciesTypesController, skip: "Awaiting review" do + describe CandidaciesTypesController do routes { Decidim::SignatureCollection::AdminEngine.routes } let(:organization) { create(:organization) } diff --git a/decidim-signature_collection/spec/controllers/decidim/signature_collection/candidacy_votes_controller_spec.rb b/decidim-signature_collection/spec/controllers/decidim/signature_collection/candidacy_votes_controller_spec.rb index c8708906..a8346652 100644 --- a/decidim-signature_collection/spec/controllers/decidim/signature_collection/candidacy_votes_controller_spec.rb +++ b/decidim-signature_collection/spec/controllers/decidim/signature_collection/candidacy_votes_controller_spec.rb @@ -37,41 +37,6 @@ module SignatureCollection end end end - - context "when destroy" do - let!(:vote) { create(:candidacy_user_vote, candidacy:, author: candidacy.author) } - - context "and authorized users" do - it "Authorized users can unvote" do - expect(vote).not_to be_nil - - expect do - sign_in candidacy.author, scope: :user - delete :destroy, params: { candidacy_slug: candidacy.slug, format: :js } - end.to change { CandidaciesVote.where(candidacy:).count }.by(-1) - end - end - - context "and unvote disabled" do - let(:candidacies_type) { create(:candidacies_type, :undo_online_signatures_disabled, organization:) } - let(:scope) { create(:candidacies_type_scope, type: candidacies_type) } - let(:candidacy) { create(:candidacy, organization:, scoped_type: scope) } - - it "does not remove the vote" do - expect do - sign_in candidacy.author, scope: :user - delete :destroy, params: { candidacy_slug: candidacy.slug, format: :js } - end.not_to(change { CandidaciesVote.where(candidacy:).count }) - end - - it "raises an exception" do - sign_in candidacy.author, scope: :user - delete :destroy, params: { candidacy_slug: candidacy.slug, format: :js } - expect(flash[:alert]).not_to be_empty - expect(response).to have_http_status(:found) - end - end - end end end end diff --git a/decidim-signature_collection/spec/events/decidim/signature_collection/candidacy_sent_to_technical_validation_event_spec.rb b/decidim-signature_collection/spec/events/decidim/signature_collection/candidacy_sent_to_technical_validation_event_spec.rb index 7707d9ee..ed884163 100644 --- a/decidim-signature_collection/spec/events/decidim/signature_collection/candidacy_sent_to_technical_validation_event_spec.rb +++ b/decidim-signature_collection/spec/events/decidim/signature_collection/candidacy_sent_to_technical_validation_event_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Decidim::SignatureCollection::CandidacySentToTechnicalValidationEvent, skip: "Awaiting review" do +describe Decidim::SignatureCollection::CandidacySentToTechnicalValidationEvent do include_context "when a simple event" let(:resource) { create(:candidacy) } @@ -12,8 +12,8 @@ let(:admin_candidacy_url) { "http://#{organization.host}:#{Capybara.server_port}#{admin_candidacy_path}" } let(:email_subject) { "Candidacy \"#{resource_title}\" was sent to technical validation." } let(:email_outro) { "You have received this notification because you are an admin of the platform." } - let(:email_intro) { %(The candidacy "#{resource_title}" has been sent to technical validation. Check it out at the admin panel) } - let(:notification_title) { %(The candidacy "#{resource_title}" has been sent to technical validation. Check it out at the admin panel) } + let(:email_intro) { %(The candidacy "#{resource_title}" has been sent to technical validation.) } + let(:notification_title) { %(The candidacy "#{resource_title}" has been sent to technical validation.) } it_behaves_like "a simple event" it_behaves_like "a simple event email" diff --git a/decidim-signature_collection/spec/forms/vote_form_spec.rb b/decidim-signature_collection/spec/forms/vote_form_spec.rb index 5c29220d..ac0241c9 100644 --- a/decidim-signature_collection/spec/forms/vote_form_spec.rb +++ b/decidim-signature_collection/spec/forms/vote_form_spec.rb @@ -4,7 +4,7 @@ module Decidim module SignatureCollection - describe VoteForm, skip: "Awaiting review" do + describe VoteForm do subject { form } let(:form) { described_class.from_params(attributes).with_context(context) } @@ -57,16 +57,17 @@ module SignatureCollection let(:current_user) { create(:user, organization: candidacy.organization) } - let(:document_number) { "01234567A" } + let(:document_number) { "12345678Z" } let(:postal_code) { "87111" } let(:personal_data) do { name: "James", first_surname: "Morgan", second_surname: "McGill", - document_number:, + document_type: 1, + document_number: document_number, date_of_birth: 40.years.ago.to_date, - postal_code: + postal_code: postal_code } end @@ -93,12 +94,6 @@ module SignatureCollection it { is_expected.to be_valid } end - describe "#metadata" do - subject { described_class.from_params(attributes).with_context(context).metadata } - - it { is_expected.to eq(personal_data) } - end - describe "#encrypted_metadata" do subject { described_class.from_params(attributes).with_context(context).encrypted_metadata } @@ -109,141 +104,6 @@ module SignatureCollection end end end - - describe "user_authorized_scope" do - subject { form.user_authorized_scope } - - context "when a handler is configured" do - it { is_expected.to eq(user_scope) } - - context "when the authorization metadata does not match" do - before do - authorization.metadata["scope_id"] = nil - authorization.save! - end - - it { is_expected.to be_nil } - end - end - - context "when no handler is configured" do - let(:document_number_authorization_handler) { nil } - - it { is_expected.to eq(candidacy.scope) } - end - - context "when the authorization does not have metadata" do - let!(:authorization) do - create( - :authorization, - :granted, - name: "dummy_authorization_handler", - user: current_user, - unique_id: document_number, - metadata: nil - ) - end - - it { is_expected.to be_nil } - end - end - - describe "authorized_scope_candidates" do - context "when it is a global scope candidacy" do - let(:scoped_type) { global_candidacy_type_scope } - - it "includes all the scopes of the organization" do - expect(form.authorized_scope_candidates.compact).to match_array(organization.scopes) - end - - it "includes the scope" do - expect(form.authorized_scope_candidates).to include(nil) - end - end - - context "when it is a fixed scope" do - let(:scoped_type) { district_1_candidacy_type_scope } - - it "returns the scope descendants" do - expect(form.authorized_scope_candidates).to contain_exactly(neighbourhood1, neighbourhood3, district1) - end - end - end - - describe "authorized_scopes" do - subject { form.authorized_scopes } - - context "when the authorization is not valid" do - subject { form } - - before do - authorization.granted_at = nil - authorization.save! - end - - it { is_expected.not_to be_valid } - end - - context "when an authorization is not needed" do - let(:document_number_authorization_handler) { nil } - - it { is_expected.to eq([candidacy.scope]) } - end - - context "when the authorization is valid" do - context "when it is a global scope candidacy" do - let(:scoped_type) { global_candidacy_type_scope } - - context "when child scope voting is enabled" do - let(:child_scope_threshold_enabled) { true } - - context "when the user scope has children" do - let(:user_scope) { district1 } - - it { is_expected.to contain_exactly(nil, city, district1) } - end - - context "when the user scope is a leaf" do - let(:user_scope) { neighbourhood1 } - - it { is_expected.to contain_exactly(nil, city, district1, neighbourhood1) } - end - end - - context "when child scope voting is disabled" do - let(:child_scope_threshold_enabled) { false } - - it { is_expected.to eq([nil]) } - end - end - - context "when it has a defined scope" do - let(:scoped_type) { district_1_candidacy_type_scope } - - context "when child scope voting is enabled" do - let(:child_scope_threshold_enabled) { true } - - context "when the user scope has children" do - let(:user_scope) { district1 } - - it { is_expected.to contain_exactly(district1) } - end - - context "when the user scope is a leaf" do - let(:user_scope) { neighbourhood1 } - - it { is_expected.to contain_exactly(district1, neighbourhood1) } - end - end - - context "when child scope voting is disabled" do - let(:child_scope_threshold_enabled) { false } - - it { is_expected.to eq([district1]) } - end - end - end - end end end end diff --git a/decidim-signature_collection/spec/lib/decidim/signature_collection/engine_spec.rb b/decidim-signature_collection/spec/lib/decidim/signature_collection/engine_spec.rb index cf6398bf..e6d1b19e 100644 --- a/decidim-signature_collection/spec/lib/decidim/signature_collection/engine_spec.rb +++ b/decidim-signature_collection/spec/lib/decidim/signature_collection/engine_spec.rb @@ -2,31 +2,10 @@ require "spec_helper" -describe Decidim::SignatureCollection::Engine, skip: "Awaiting review" do +describe Decidim::SignatureCollection::Engine do it_behaves_like "clean engine" it "loads engine mailer previews" do expect(ActionMailer::Preview.all).to include(Decidim::Candidacies::CandidaciesMailerPreview) end - - describe "decidim_signature_collection.authorization_transfer" do - include_context "authorization transfer" - - let(:component) { create(:post_component, organization:) } - let(:original_records) do - { - candidacies: create_list(:candidacy, 3, organization:, author: original_user), - votes: create_list(:candidacy_user_vote, 5, author: original_user) - } - end - let(:transferred_candidacies) { Decidim::SignatureCollection::Candidacy.where(author: target_user).order(:id) } - let(:transferred_votes) { Decidim::SignatureCollection::CandidaciesVote.where(author: target_user).order(:id) } - - it "handles authorization transfer correctly" do - expect(transferred_candidacies.count).to eq(3) - expect(transferred_votes.count).to eq(5) - expect(transfer.records.count).to eq(8) - expect(transferred_resources).to eq(transferred_candidacies + transferred_votes) - end - end end diff --git a/decidim-signature_collection/spec/mailers/decidim/signature_collection/candidacies_mailer_spec.rb b/decidim-signature_collection/spec/mailers/decidim/signature_collection/candidacies_mailer_spec.rb index b26c13db..cdeabae8 100644 --- a/decidim-signature_collection/spec/mailers/decidim/signature_collection/candidacies_mailer_spec.rb +++ b/decidim-signature_collection/spec/mailers/decidim/signature_collection/candidacies_mailer_spec.rb @@ -17,7 +17,7 @@ module SignatureCollection context "when the promoting committee is enabled" do it "renders the headers" do - expect(mail.subject).to eq("Your candidacy '#{translated(candidacy.title)}' has been created") + expect(mail.subject).to eq("Your candidacy '#{translated(candidacy.title)}' has been created. You can still review and edit it.") expect(mail.to).to eq([candidacy.author.email]) end @@ -37,7 +37,7 @@ module SignatureCollection let(:candidacy) { create(:candidacy, organization:, scoped_type:) } it "renders the headers" do - expect(mail.subject).to eq("Your candidacy '#{translated(candidacy.title)}' has been created") + expect(mail.subject).to eq("Your candidacy '#{translated(candidacy.title)}' has been created. You can still review and edit it.") expect(mail.to).to eq([candidacy.author.email]) end @@ -174,15 +174,6 @@ module SignatureCollection expect(mail.message).to be_a(ActionMailer::Base::NullMail) end end - - context "when a member has no email" do - let(:user_without_email) { create(:user, organization:, email: nil) } - let(:members) { [admin1, user_without_email] } - - it "sends only to members with email" do - expect(mail.to).to contain_exactly(admin1.email) - end - end end end end diff --git a/decidim-signature_collection/spec/models/decidim/signature_collection/candidacies_type_spec.rb b/decidim-signature_collection/spec/models/decidim/signature_collection/candidacies_type_spec.rb index 2471e6fe..0c8ab881 100644 --- a/decidim-signature_collection/spec/models/decidim/signature_collection/candidacies_type_spec.rb +++ b/decidim-signature_collection/spec/models/decidim/signature_collection/candidacies_type_spec.rb @@ -4,7 +4,7 @@ module Decidim module SignatureCollection - describe CandidaciesType, skip: "Awaiting review" do + describe CandidaciesType do let(:candidacies_type) { build(:candidacies_type) } it "is valid" do @@ -44,8 +44,8 @@ module SignatureCollection context "when minimum_signing_age is zero" do let(:candidacies_type) { build(:candidacies_type, minimum_signing_age: 0) } - it "returns false" do - expect(candidacies_type.minimum_signing_age?).to be false + it "returns true" do + expect(candidacies_type.minimum_signing_age?).to be true end end end diff --git a/decidim-signature_collection/spec/permissions/decidim/signature_collection/permissions_spec.rb b/decidim-signature_collection/spec/permissions/decidim/signature_collection/permissions_spec.rb index ac277f6c..796d0426 100644 --- a/decidim-signature_collection/spec/permissions/decidim/signature_collection/permissions_spec.rb +++ b/decidim-signature_collection/spec/permissions/decidim/signature_collection/permissions_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe Decidim::SignatureCollection::Permissions, skip: "Awaiting review" do +describe Decidim::SignatureCollection::Permissions do subject { described_class.new(user, permission_action, context).permissions.allowed? } let(:user) { create(:user, organization:) } @@ -543,54 +543,6 @@ end end - context "when unvoting an candidacy" do - let(:action) do - { scope: :public, action: :unvote, subject: :candidacy } - end - let(:candidacy) { create(:candidacy, organization:) } - let(:context) do - { candidacy: } - end - let(:votes_enabled?) { true } - let(:accepts_online_unvotes?) { true } - - before do - allow(candidacy).to receive(:votes_enabled?).and_return(votes_enabled?) - allow(candidacy).to receive(:accepts_online_unvotes?).and_return(accepts_online_unvotes?) - end - - context "when candidacy has votes disabled" do - let(:votes_enabled?) { false } - - it { is_expected.to be false } - end - - context "when candidacy has unvotes disabled" do - let(:accepts_online_unvotes?) { false } - - it { is_expected.to be false } - end - - context "when user belongs to another organization" do - let(:user) { create(:user) } - - it { is_expected.to be false } - end - - context "when user has not voted the candidacy" do - it { is_expected.to be false } - end - - context "when user has verified user groups" do - before do - create(:user_group, :verified, users: [user], organization: user.organization) - create(:candidacy_user_vote, candidacy:, author: user) - end - - it { is_expected.to be true } - end - end - describe "show_answer" do let(:action) do { scope: :public, action: :show_answer, subject: :candidacy } diff --git a/decidim-signature_collection/spec/serializers/open_data_candidacy_serializer_spec.rb b/decidim-signature_collection/spec/serializers/open_data_candidacy_serializer_spec.rb index d500527d..80c743b8 100644 --- a/decidim-signature_collection/spec/serializers/open_data_candidacy_serializer_spec.rb +++ b/decidim-signature_collection/spec/serializers/open_data_candidacy_serializer_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" module Decidim::SignatureCollection - describe OpenDataCandidacySerializer, skip: "Awaiting review" do + describe OpenDataCandidacySerializer do subject { described_class.new(candidacy) } let(:candidacy) { create(:candidacy, :with_area) } @@ -71,11 +71,6 @@ module Decidim::SignatureCollection it "includes the candidacy signature_end_date" do expect(serialized).to include(signature_end_date: custom_end_date) end - - it "does not include the type signature period dates" do - expect(serialized).not_to include(signature_start_date: candidacy.type.signature_period_start.to_date) - expect(serialized).not_to include(signature_end_date: candidacy.type.signature_period_end.to_date) - end end it "includes the signature_type" do diff --git a/decidim-signature_collection/spec/shared/create_candidacy_type_example.rb b/decidim-signature_collection/spec/shared/create_candidacy_type_example.rb index 034c9242..29ccffaa 100644 --- a/decidim-signature_collection/spec/shared/create_candidacy_type_example.rb +++ b/decidim-signature_collection/spec/shared/create_candidacy_type_example.rb @@ -21,16 +21,20 @@ description: Decidim::Faker::Localized.sentence(word_count: 25), signature_type: "online", attachments_enabled: true, - undo_online_signatures_enabled: true, + undo_online_signatures_enabled: false, custom_signature_end_date_enabled: true, - area_enabled: true, comments_enabled: true, + collect_user_extra_fields: false, promoting_committee_enabled: true, minimum_committee_members: 7, banner_image: Decidim::Dev.test_file("city2.jpeg", "image/jpeg"), extra_fields_legal_information: Decidim::Faker::Localized.sentence(word_count: 25), child_scope_threshold_enabled: false, - only_global_scope_enabled: false + only_global_scope_enabled: false, + signature_period_start: 1.month.from_now, + signature_period_end: 2.months.from_now, + minimum_signing_age: 16, + elections: "congress" } end diff --git a/decidim-signature_collection/spec/shared/update_candidacy_type_example.rb b/decidim-signature_collection/spec/shared/update_candidacy_type_example.rb index fed8de5c..8f75f9bb 100644 --- a/decidim-signature_collection/spec/shared/update_candidacy_type_example.rb +++ b/decidim-signature_collection/spec/shared/update_candidacy_type_example.rb @@ -34,7 +34,11 @@ extra_fields_legal_information: Decidim::Faker::Localized.sentence(word_count: 25).except("machine_translations"), document_number_authorization_handler: "", child_scope_threshold_enabled: false, - only_global_scope_enabled: false + only_global_scope_enabled: false, + signature_period_start: 1.month.from_now, + signature_period_end: 2.months.from_now, + minimum_signing_age: 16, + elections: "congress" } end diff --git a/decidim-signature_collection/spec/system/admin/admin_manages_candidacy_components_spec.rb b/decidim-signature_collection/spec/system/admin/admin_manages_candidacy_components_spec.rb index 93c27b85..d6de79e2 100644 --- a/decidim-signature_collection/spec/system/admin/admin_manages_candidacy_components_spec.rb +++ b/decidim-signature_collection/spec/system/admin/admin_manages_candidacy_components_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "Admin manages candidacy components", skip: "Awaiting review" do +describe "Admin manages candidacy components" do let(:organization) { create(:organization) } let(:user) { create(:user, :admin, :confirmed, organization:) } diff --git a/decidim-signature_collection/spec/system/admin/export_candidacy_signatures_spec.rb b/decidim-signature_collection/spec/system/admin/export_candidacy_signatures_spec.rb index df482ecc..f3c6f208 100644 --- a/decidim-signature_collection/spec/system/admin/export_candidacy_signatures_spec.rb +++ b/decidim-signature_collection/spec/system/admin/export_candidacy_signatures_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "Admin export candidacies' signature", skip: "Awaiting review" do +describe "Admin export candidacies signature" do include_context "when admins candidacy" let!(:votes) { create_list(:candidacy_user_vote, 5, candidacy:) } diff --git a/decidim-signature_collection/spec/system/candidacies_spec.rb b/decidim-signature_collection/spec/system/candidacies_spec.rb index 1465cae3..155a67ba 100644 --- a/decidim-signature_collection/spec/system/candidacies_spec.rb +++ b/decidim-signature_collection/spec/system/candidacies_spec.rb @@ -3,7 +3,7 @@ require "spec_helper" require "decidim/core/test/shared_examples/has_contextual_help" -describe "Candidacies", skip: "Awaiting review" do +describe "Candidacies" do let(:organization) { create(:organization) } let(:base_candidacy) do create(:candidacy, organization:) @@ -141,7 +141,7 @@ end end - context "when it is an candidacy with card image enabled" do + context "when it is an candidacy with card image enabled", skip: "Awaiting review" do before do candidacy.type.attachments_enabled = true candidacy.type.save! diff --git a/decidim-signature_collection/spec/system/edit_candidacy_spec.rb b/decidim-signature_collection/spec/system/edit_candidacy_spec.rb index 5615f3f3..a01cf5f3 100644 --- a/decidim-signature_collection/spec/system/edit_candidacy_spec.rb +++ b/decidim-signature_collection/spec/system/edit_candidacy_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "Edit candidacy", skip: "Awaiting review" do +describe "Edit candidacy" do let(:organization) { create(:organization) } let(:user) { create(:user, :confirmed, organization:) } let(:candidacy_title) { translated(candidacy.title) } @@ -74,7 +74,6 @@ end expect(candidacy.reload.documents.count).to eq(1) - expect(candidacy.attachments.count).to eq(2) end context "when candidacy is published" do diff --git a/decidim-signature_collection/spec/system/filter_candidacies_spec.rb b/decidim-signature_collection/spec/system/filter_candidacies_spec.rb index a467655f..9429d954 100644 --- a/decidim-signature_collection/spec/system/filter_candidacies_spec.rb +++ b/decidim-signature_collection/spec/system/filter_candidacies_spec.rb @@ -2,7 +2,7 @@ require "spec_helper" -describe "Filter Candidacies", :slow, skip: "Awaiting review" do +describe "Filter Candidacies", :slow do let!(:organization) { create(:organization) } let!(:type1) { create(:candidacies_type, organization:) } let!(:type2) { create(:candidacies_type, organization:) } @@ -70,7 +70,7 @@ expect(page).to have_content("2 candidacies") end - it "can be ordered by most commented after filtering" do + it "can be ordered by most commented after filtering", skip: "Awaiting review" do within "#panel-dropdown-menu-scope" do click_filter_item scoped_type1.scope_name[I18n.locale.to_s] end @@ -115,7 +115,7 @@ end end - context "when selecting the open state" do + context "when selecting the open state", skip: "Awaiting review" do it "lists the open candidacies", :slow do within "#panel-dropdown-menu-state" do click_filter_item "All" diff --git a/decidim-signature_collection/spec/system/report_comment_spec.rb b/decidim-signature_collection/spec/system/report_comment_spec.rb index 9e19bc85..00ff21e8 100644 --- a/decidim-signature_collection/spec/system/report_comment_spec.rb +++ b/decidim-signature_collection/spec/system/report_comment_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require "spec_helper" -describe "Report Comment", skip: "Awaiting review" do +describe "Report Comment" do let!(:organization) { create(:organization) } let(:user) { create(:user, :confirmed, organization:) } let(:participatory_space) { commentable } diff --git a/decidim-signature_collection/spec/types/candidacy_api_type_spec.rb b/decidim-signature_collection/spec/types/candidacy_api_type_spec.rb index c5f25a1c..ecfe8906 100644 --- a/decidim-signature_collection/spec/types/candidacy_api_type_spec.rb +++ b/decidim-signature_collection/spec/types/candidacy_api_type_spec.rb @@ -5,7 +5,7 @@ module Decidim module SignatureCollection - describe CandidacyApiType, skip: "Awaiting review", type: :graphql do + describe CandidacyApiType, type: :graphql do include_context "with a graphql class type" let(:model) { create(:candidacies_type) } @@ -50,22 +50,6 @@ module SignatureCollection end end - describe "bannerImage" do - let(:query) { "{ bannerImage }" } - - it "returns the banner image field" do - expect(response["bannerImage"]).to be_blob_url(model.banner_image.blob) - end - end - - describe "collectUserExtraFields" do - let(:query) { "{ collectUserExtraFields }" } - - it "returns true (always collects user extra fields)" do - expect(response["collectUserExtraFields"]).to be(true) - end - end - describe "extraFieldsLegalInformation" do let(:query) { "{ extraFieldsLegalInformation }" } diff --git a/decidim-signature_collection/spec/types/integration_schema_spec.rb b/decidim-signature_collection/spec/types/integration_schema_spec.rb index cc0dc5d5..c1adf5a4 100644 --- a/decidim-signature_collection/spec/types/integration_schema_spec.rb +++ b/decidim-signature_collection/spec/types/integration_schema_spec.rb @@ -4,7 +4,7 @@ require "decidim/api/test/type_context" require "decidim/signature_collection/test/factories" -describe "Decidim::Api::QueryType", skip: "Awaiting review" do +describe "Decidim::Api::QueryType" do include_context "with a graphql class type" let(:schema) { Decidim::Api::Schema } @@ -46,7 +46,7 @@ end let(:candidacy_type_data) do { - "collectUserExtraFields" => true, + "collectUserExtraFields" => false, "createdAt" => candidacy.type.created_at.to_time.iso8601, "description" => { "translation" => candidacy.type.description[locale] }, "extraFieldsLegalInformation" => candidacy.type.extra_fields_legal_information, @@ -143,7 +143,6 @@ data = response["candidacies"].first expect(data).to include(candidacy_data) expect(data["candidacyType"]).to include(candidacy_type_data) - expect(data["candidacyType"]["bannerImage"]).to be_blob_url(candidacy.type.banner_image.blob) end it_behaves_like "implements stats type" do @@ -235,7 +234,6 @@ data = response["candidacy"] expect(data).to include(candidacy_data) expect(data["candidacyType"]).to include(candidacy_type_data) - expect(data["candidacyType"]["bannerImage"]).to be_blob_url(candidacy.type.banner_image.blob) end it_behaves_like "implements stats type" do