From 9bda868f7a702d8200fd9f6a4c91ba9490fab43e Mon Sep 17 00:00:00 2001 From: Pablo Brasero Date: Thu, 14 Apr 2022 21:10:18 +0100 Subject: [PATCH] Added missing checks and specs --- app/views/fields/has_one/_index.html.erb | 3 +- app/views/fields/polymorphic/_index.html.erb | 12 ++- .../views/fields/belongs_to/_index_spec.rb | 15 ++++ .../views/fields/has_one/_index_spec.rb | 74 ++++++++++++------- .../views/fields/polymorphic/_index_spec.rb | 67 +++++++++++------ 5 files changed, 119 insertions(+), 52 deletions(-) diff --git a/app/views/fields/has_one/_index.html.erb b/app/views/fields/has_one/_index.html.erb index e6fc01a44f..e8f32fa95c 100644 --- a/app/views/fields/has_one/_index.html.erb +++ b/app/views/fields/has_one/_index.html.erb @@ -16,7 +16,8 @@ By default, the relationship is rendered as a link to the associated object. %> <% if field.linkable? %> - <%= link_to( + <%= link_to_if( + administrate_valid_action?(field.data, :show), field.display_associated_resource, [namespace, field.data], ) %> diff --git a/app/views/fields/polymorphic/_index.html.erb b/app/views/fields/polymorphic/_index.html.erb index 7c27a3b379..35ec725312 100644 --- a/app/views/fields/polymorphic/_index.html.erb +++ b/app/views/fields/polymorphic/_index.html.erb @@ -17,8 +17,12 @@ By default, the relationship is rendered as a link to the associated object. %> <% if field.data %> - <%= link_to( - field.display_associated_resource, - [namespace, field.data] - ) %> + <% if administrate_valid_action?(field.data, :show) %> + <%= link_to( + field.display_associated_resource, + [namespace, field.data] + ) %> + <% else %> + <%= field.display_associated_resource %> + <% end %> <% end %> diff --git a/spec/administrate/views/fields/belongs_to/_index_spec.rb b/spec/administrate/views/fields/belongs_to/_index_spec.rb index 587bf13c30..ccce07d260 100644 --- a/spec/administrate/views/fields/belongs_to/_index_spec.rb +++ b/spec/administrate/views/fields/belongs_to/_index_spec.rb @@ -14,6 +14,21 @@ ) end + context "without an associated record" do + let(:belongs_to) do + instance_double( + "Administrate::Field::BelongsTo", + associated_class: associated_class, + data: nil, + ) + end + + it "displays nothing" do + render_belongs_to_index + expect(rendered.strip).to eq("") + end + end + context "if associated resource has a show route" do context "and the user has permission to access it" do it "displays link" do diff --git a/spec/administrate/views/fields/has_one/_index_spec.rb b/spec/administrate/views/fields/has_one/_index_spec.rb index 56a234ee9e..9f23e7b36c 100644 --- a/spec/administrate/views/fields/has_one/_index_spec.rb +++ b/spec/administrate/views/fields/has_one/_index_spec.rb @@ -1,41 +1,63 @@ require "rails_helper" describe "fields/has_one/_index", type: :view do - context "without an associated record" do - it "displays nothing" do - has_one = Administrate::Field::HasOne.new( - :product_meta_tag, - build(:product_meta_tag), - :index, - ) + let(:product) { create(:product) } + let(:product_path) { polymorphic_path([:admin, product]) } + let(:link) { "#{product.name}" } + let(:has_one) do + instance_double( + "Administrate::Field::HasOne", + data: product, + linkable?: true, + display_associated_resource: product.name, + ) + end - render( - partial: "fields/has_one/index", - locals: { field: has_one }, + context "without an associated record" do + let(:has_one) do + instance_double( + "Administrate::Field::HasOne", + linkable?: false ) + end + it "displays nothing" do + allow(view).to receive(:administrate_valid_action?).and_return(true) + render_has_one_index expect(rendered.strip).to eq("") end end - context "with an associated record" do - it "renders a link to the record" do - product = create(:product) - product_path = polymorphic_path([:admin, product]) - has_one = instance_double( - "Administrate::Field::HasOne", - data: product, - linkable?: true, - display_associated_resource: product.name, - ) + context "if associated resource has a show route" do + context "and the user has permission to access it" do + it "displays link" do + allow(view).to receive(:administrate_valid_action?).and_return(true) + render_has_one_index + expect(rendered.strip).to include(link) + end + end - render( - partial: "fields/has_one/index", - locals: { field: has_one, namespace: :admin }, - ) + context "and the user does not have permission to access it" do + it "hides link" do + allow(view).to receive(:administrate_valid_action?).and_return(false) + render_has_one_index + expect(rendered.strip).to_not include(link) + end + end + end - expected = "#{product.name}" - expect(rendered.strip).to eq(expected) + context "if associated resource has no show route" do + it "hides link" do + allow(view).to receive(:administrate_valid_action?).and_return(false) + render_has_one_index + expect(rendered.strip).to_not include(link) end end + + def render_has_one_index + render( + partial: "fields/has_one/index", + locals: { field: has_one, namespace: :admin }, + ) + end end diff --git a/spec/administrate/views/fields/polymorphic/_index_spec.rb b/spec/administrate/views/fields/polymorphic/_index_spec.rb index 0845576ac6..8e1a5f915c 100644 --- a/spec/administrate/views/fields/polymorphic/_index_spec.rb +++ b/spec/administrate/views/fields/polymorphic/_index_spec.rb @@ -1,36 +1,61 @@ require "rails_helper" describe "fields/polymorphic/_index", type: :view do - context "without an associated records" do - it "displays nothing" do - polymorphic = double(data: nil) + let(:product) { create(:product) } + let(:product_path) { polymorphic_path([:admin, product]) } + let(:link) { "#{product.name}" } + let(:polymorphic) do + instance_double( + "Administrate::Field::Polymorphic", + data: product, + display_associated_resource: product.name, + ) + end - render( - partial: "fields/polymorphic/index", - locals: { field: polymorphic }, + context "without an associated record" do + let(:polymorphic) do + instance_double( + "Administrate::Field::Polymorphic", + data: nil, ) + end + it "displays nothing" do + render_polymorphic_index expect(rendered.strip).to eq("") end end - context "with an associated record" do - it "renders a link to the record" do - product = create(:product) - product_path = polymorphic_path([:admin, product]) - polymorphic = instance_double( - "Administrate::Field::Polymorphic", - data: product, - display_associated_resource: product.name, - ) + context "if associated resource has a show route" do + context "and the user has permission to access it" do + it "displays link" do + allow(view).to receive(:administrate_valid_action?).and_return(true) + render_polymorphic_index + expect(rendered.strip).to include(link) + end + end - render( - partial: "fields/polymorphic/index", - locals: { field: polymorphic, namespace: :admin }, - ) + context "and the user does not have permission to access it" do + it "hides link" do + allow(view).to receive(:administrate_valid_action?).and_return(false) + render_polymorphic_index + expect(rendered.strip).to_not include(link) + end + end + end - expected = "#{product.name}" - expect(rendered.strip).to eq(expected) + context "if associated resource has no show route" do + it "hides link" do + allow(view).to receive(:administrate_valid_action?).and_return(false) + render_polymorphic_index + expect(rendered.strip).to_not include(link) end end + + def render_polymorphic_index + render( + partial: "fields/polymorphic/index", + locals: { field: polymorphic, namespace: :admin }, + ) + end end