-
Notifications
You must be signed in to change notification settings - Fork 492
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
AO3-4728 Fix Error 500 on subscriptions page for invalid items (#4816)
* AO3-4728: Don't 500 on invalid subscribable * AO3-4728: PR feedback * AO3-4728: lint * AO3-4728: fix test expectation * AO3-4728: adding controller tests * AO3-4728: lint * AO3-4728 Tidy and apply review feedback * AO3-4728 Tidy and fix subtle logic mistake * AO3-4728 Try to fix type params bug * AO3-4728 Feedback --------- Co-authored-by: tlee911 <tlee911@users.noreply.github.com>
- Loading branch information
Showing
7 changed files
with
163 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,61 +1,67 @@ | ||
<!--Descriptive page name, messages and instructions--> | ||
<h2 class="heading"> | ||
<%= params[:type].blank? ? ts('My Subscriptions') : | ||
ts('My %{type} Subscriptions', type: params[:type].to_s.singularize.titleize) | ||
%> | ||
<% if @subscribable_type %> | ||
<%= t(".page_heading.#{@subscribable_type}") %> | ||
<% else %> | ||
<%= t(".page_heading.all") %> | ||
<% end %> | ||
</h2> | ||
<!--/descriptions--> | ||
|
||
<!--subnav--> | ||
<h3 class="landmark heading"><%= ts('Navigation') %></h3> | ||
<h3 class="landmark heading"><%= t("a11y.navigation") %></h3> | ||
<ul class="navigation actions" role="navigation"> | ||
<li> | ||
<%= span_if_current ts('All Subscriptions'), | ||
user_subscriptions_path(@user), params[:type].blank? %> | ||
<%= span_if_current(t(".navigation.all"), | ||
user_subscriptions_path(@user), | ||
@subscribable_type.blank?) %> | ||
</li> | ||
<li> | ||
<%= span_if_current ts('Series Subscriptions'), | ||
user_subscriptions_path(@user, :type => "series"), | ||
params[:type] == "series" %> | ||
<%= span_if_current(t(".navigation.series"), | ||
user_subscriptions_path(@user, type: "series"), | ||
@subscribable_type == "series") %> | ||
</li> | ||
<li> | ||
<%= span_if_current ts('User Subscriptions'), | ||
user_subscriptions_path(@user, :type => "users"), | ||
params[:type] == "users" %> | ||
<%= span_if_current(t(".navigation.user"), | ||
user_subscriptions_path(@user, type: "users"), | ||
@subscribable_type == "users") %> | ||
</li> | ||
<li> | ||
<%= span_if_current ts('Work Subscriptions'), | ||
user_subscriptions_path(@user, :type => "works"), | ||
params[:type] == "works" %> | ||
<%= span_if_current(t(".navigation.work"), | ||
user_subscriptions_path(@user, type: "works"), | ||
@subscribable_type == "works") %> | ||
</li> | ||
</ul> | ||
<!--/subnav--> | ||
|
||
<!--main content--> | ||
<%= will_paginate @subscriptions %> | ||
|
||
<h3 class="landmark heading"><%= ts('List of Subscriptions') %></h3> | ||
<h3 class="landmark heading"><%= t(".heading.landmark.list") %></h3> | ||
<dl class="subscription index group"> | ||
<% @subscriptions.each do |subscription| %> | ||
<dt> | ||
<%= link_to(subscription.name, subscription.subscribable) %> | ||
<% if params[:type].blank? && subscription.subscribable_type == "Work" %> | ||
<%= ts('(Work)') %> | ||
<% end %> | ||
<% if params[:type].blank? && subscription.subscribable_type == "Series" %> | ||
<%= ts('(Series)') %> | ||
<% end %> | ||
<% unless subscription.subscribable_type == "User" %> | ||
<%= ts('by %{creators}', :creators => byline(subscription.subscribable)).html_safe %> | ||
<% if subscription.subscribable %> | ||
<%= link_to(subscription.name, subscription.subscribable) %> | ||
<% case subscription.subscribable_type %> | ||
<% when "Work" %> | ||
<%= t(".work") if @subscribable_type.blank? %> | ||
<%= t(".byline", creators: byline(subscription.subscribable)) %> | ||
<% when "Series" %> | ||
<%= t(".series") if @subscribable_type.blank? %> | ||
<%= t(".byline", creators: byline(subscription.subscribable)) %> | ||
<% end %> | ||
<% else %> | ||
<%= subscription.name %> | ||
<% end %> | ||
</dt> | ||
<dd> | ||
<%= form_for [current_user, subscription], :html => {:method => :delete} do |f| %> | ||
<%= f.submit ts('Unsubscribe from %{name}', :name => subscription.name).html_safe %> | ||
<%= f.submit t(".button_html", name: subscription.name) %> | ||
<% end %> | ||
</dd> | ||
<% end %> | ||
</dl> | ||
|
||
<%= will_paginate @subscriptions %> | ||
<!--/content--> | ||
<!--/content--> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
require "spec_helper" | ||
|
||
describe SubscriptionsController do | ||
include LoginMacros | ||
include RedirectExpectationHelper | ||
|
||
let(:user) { create(:user) } | ||
|
||
describe "GET #index" do | ||
let(:author) { create(:user) } | ||
let(:work) { create(:work) } | ||
let(:series) { create(:series) } | ||
let!(:sub_series) { create(:subscription, user: user, subscribable: series) } | ||
let!(:sub_work) { create(:subscription, user: user, subscribable_type: "Work", subscribable_id: work.id) } | ||
let!(:sub_user) { create(:subscription, user: user, subscribable_type: "User", subscribable_id: author.id) } | ||
|
||
it "redirects to login when not logged in" do | ||
get :index, params: { user_id: user.login } | ||
it_redirects_to_with_error(new_user_session_path, | ||
"Sorry, you don't have permission to access the page you were trying to reach. Please log in.") | ||
end | ||
|
||
context "when logged in" do | ||
before { fake_login_known_user(user) } | ||
|
||
it "renders all subscriptions" do | ||
get :index, params: { user_id: user.login } | ||
expect(response).to render_template("index") | ||
expect(assigns(:subscriptions)).to contain_exactly(sub_series, sub_work, sub_user) | ||
end | ||
|
||
context "with invalid subscriptions" do | ||
let!(:subscription) { create(:subscription, user: user) } | ||
|
||
before do | ||
Subscription.update_all(subscribable_id: -1) | ||
end | ||
|
||
it "renders all subscriptions" do | ||
get :index, params: { user_id: user.login } | ||
expect(response).to render_template("index") | ||
|
||
bad_sub = assigns(:subscriptions)[0] | ||
expect(bad_sub.subscribable_id).to eq(-1) | ||
expect(bad_sub.name).to eq("Deleted item") | ||
end | ||
|
||
it "allows deletion of invalid subscriptions" do | ||
get :index, params: { user_id: user.login } | ||
sub_id = assigns(:subscriptions)[0].id | ||
delete :destroy, params: { user_id: user.login, id: sub_id } | ||
it_redirects_to_with_notice(user_subscriptions_path(user), "You have successfully unsubscribed from Deleted item.") | ||
end | ||
end | ||
|
||
context "with valid subscription types in params" do | ||
%w[series works users].each do |sub_type| | ||
it "renders #{sub_type} subscriptions only" do | ||
get :index, params: { user_id: user.login, type: sub_type } | ||
|
||
expect(response).to render_template("index") | ||
expect(assigns(:subscribable_type)).to eq(sub_type) | ||
expect(assigns(:subscriptions).count).to eq(1) | ||
end | ||
end | ||
end | ||
|
||
context "with invalid subscription type in params" do | ||
it "renders all subscriptions" do | ||
get :index, params: { user_id: user.login, type: "Invalid" } | ||
|
||
expect(response).to render_template("index") | ||
expect(assigns(:subscribable_type)).to be_nil | ||
expect(assigns(:subscriptions)).to contain_exactly(sub_series, sub_work, sub_user) | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters