diff --git a/app/models/user.rb b/app/models/user.rb index 177befd5c..b6ee626d6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -147,8 +147,8 @@ class User < ActiveRecord::Base end def erase(erase_reason = nil) - self.hide self.update( + erased_at: Time.now, erase_reason: erase_reason, username: nil, email: nil, @@ -162,6 +162,10 @@ class User < ActiveRecord::Base ) end + def erased? + erased_at.present? + end + def email_provided? !!(email && email !~ OMNIAUTH_EMAIL_REGEX) || !!(unconfirmed_email && unconfirmed_email !~ OMNIAUTH_EMAIL_REGEX) @@ -189,11 +193,11 @@ class User < ActiveRecord::Base end def username_required? - !organization? && !hidden? + !organization? && !erased? end def email_required? - !hidden? + !erased? end private diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 5a87dde7d..ac61483fc 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -19,7 +19,7 @@ <% else %> <%= avatar_image(comment.user, seed: comment.user_id, size: 32, class: "left") %> <% end %> - <% if comment.user.hidden? %> + <% if comment.user.hidden? || comment.user.erased? %> <% end %> <% end %> @@ -33,7 +33,7 @@ <%= t("comments.comment.moderator") %> #<%= comment.moderator_id%> <% else %> - <% if comment.user.hidden? %> + <% if comment.user.hidden? || comment.user.erased? %> <%= t("comments.comment.user_deleted") %> <% else %> <%= comment.user.name %> diff --git a/app/views/debates/_debate.html.erb b/app/views/debates/_debate.html.erb index d9a4fe7d5..6148630d3 100644 --- a/app/views/debates/_debate.html.erb +++ b/app/views/debates/_debate.html.erb @@ -14,7 +14,7 @@  •  <%= l debate.created_at.to_date %> - <% if debate.author.hidden? %> + <% if debate.author.hidden? || debate.author.erased? %>  •  <%= t("debates.show.author_deleted") %> diff --git a/app/views/debates/show.html.erb b/app/views/debates/show.html.erb index 8adc9ce27..371260550 100644 --- a/app/views/debates/show.html.erb +++ b/app/views/debates/show.html.erb @@ -23,7 +23,7 @@
<%= avatar_image(@debate.author, seed: @debate.author_id, size: 32, class: 'author-photo') %> - <% if @debate.author.hidden? %> + <% if @debate.author.hidden? || @debate.author.erased? %> <%= t("debates.show.author_deleted") %> diff --git a/app/views/proposals/_proposal.html.erb b/app/views/proposals/_proposal.html.erb index c536c897f..ac2f0ec2f 100644 --- a/app/views/proposals/_proposal.html.erb +++ b/app/views/proposals/_proposal.html.erb @@ -13,7 +13,7 @@  •  <%= l proposal.created_at.to_date %> - <% if proposal.author.hidden? %> + <% if proposal.author.hidden? || proposal.author.erased? %>  •  <%= t("proposals.show.author_deleted") %> diff --git a/app/views/proposals/show.html.erb b/app/views/proposals/show.html.erb index 06e61937a..95adf93aa 100644 --- a/app/views/proposals/show.html.erb +++ b/app/views/proposals/show.html.erb @@ -29,7 +29,7 @@
<%= avatar_image(@proposal.author, seed: @proposal.author_id, size: 32, class: 'author-photo') %> - <% if @proposal.author.hidden? %> + <% if @proposal.author.hidden? || @proposal.author.erased? %> <%= t("proposals.show.author_deleted") %> diff --git a/spec/features/comments/debates_spec.rb b/spec/features/comments/debates_spec.rb index 4b8b23ce8..1fad7affe 100644 --- a/spec/features/comments/debates_spec.rb +++ b/spec/features/comments/debates_spec.rb @@ -193,6 +193,18 @@ feature 'Commenting debates' do end end + scenario "Erasing a comment's author" do + debate = create(:debate) + comment = create(:comment, commentable: debate, body: 'this should be visible') + comment.user.erase + + visit debate_path(debate) + within "#comment_#{comment.id}" do + expect(page).to have_content('Deleted user') + expect(page).to have_content('this should be visible') + end + end + feature "Moderators" do scenario "can create comment as a moderator", :js do moderator = create(:moderator) diff --git a/spec/features/comments/proposals_spec.rb b/spec/features/comments/proposals_spec.rb index 9c6b99a6a..ad3c26be9 100644 --- a/spec/features/comments/proposals_spec.rb +++ b/spec/features/comments/proposals_spec.rb @@ -193,6 +193,18 @@ feature 'Commenting proposals' do end end + scenario "Erasing a comment's author" do + proposal = create(:proposal) + comment = create(:comment, commentable: proposal, body: "this should be visible") + comment.user.erase + + visit proposal_path(proposal) + within "#comment_#{comment.id}" do + expect(page).to have_content('Deleted user') + expect(page).to have_content('this should be visible') + end + end + feature "Moderators" do scenario "can create comment as a moderator", :js do moderator = create(:moderator) diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index c633f1b2f..717f02c20 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -523,4 +523,16 @@ feature 'Debates' do visit debate_path(good_debate) expect(page).to_not have_content "This debate has been flag as innapropiate for some users." end + + scenario 'Erased author' do + user = create(:user) + debate = create(:debate, author: user) + user.erase + + visit debates_path + expect(page).to have_content('Deleted user') + + visit debate_path(debate) + expect(page).to have_content('Deleted user') + end end diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 7bb1146ec..d15ade63b 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -605,4 +605,16 @@ feature 'Proposals' do expect(Flag.flagged?(user, proposal)).to_not be end + + scenario 'Erased author' do + user = create(:user) + proposal = create(:proposal, author: user) + user.erase + + visit proposals_path + expect(page).to have_content('Deleted user') + + visit proposal_path(proposal) + expect(page).to have_content('Deleted user') + end end diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb index fdb632986..6d37eb71b 100644 --- a/spec/models/comment_spec.rb +++ b/spec/models/comment_spec.rb @@ -57,6 +57,11 @@ describe Comment do .to change { [comment.reload.updated_at, comment.author.updated_at] } end + it "expires cache when the author is erased" do + expect { comment.user.erase } + .to change { [comment.reload.updated_at, comment.author.updated_at] } + end + it "expires cache when the author changes" do expect { comment.user.update(username: "Isabel") } .to change { [comment.reload.updated_at, comment.author.updated_at] } diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index a9ef3892a..159ebdbb1 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -380,6 +380,11 @@ describe Debate do .to change { [debate.reload.updated_at, debate.author.updated_at] } end + it "should expire cache when the author is erased" do + expect { debate.author.erase } + .to change { [debate.reload.updated_at, debate.author.updated_at] } + end + it "should expire cache when its author changes" do expect { debate.author.update(username: "Eva") } .to change { [debate.reload.updated_at, debate.author.updated_at] } diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index 964f8f057..bb13f0769 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -304,4 +304,55 @@ describe Proposal do end end + + describe "cache" do + let(:proposal) { create(:proposal) } + + it "should expire cache when it has a new comment" do + expect { create(:comment, commentable: proposal) } + .to change { proposal.updated_at } + end + + it "should expire cache when it has a new vote" do + expect { create(:vote, votable: proposal) } + .to change { proposal.updated_at } + end + + it "should expire cache when it has a new flag" do + expect { create(:flag, flaggable: proposal) } + .to change { proposal.reload.updated_at } + end + + it "should expire cache when it has a new tag" do + expect { proposal.update(tag_list: "new tag") } + .to change { proposal.updated_at } + end + + it "should expire cache when hidden" do + expect { proposal.hide } + .to change { proposal.updated_at } + end + + it "should expire cache when the author is hidden" do + expect { proposal.author.hide } + .to change { [proposal.reload.updated_at, proposal.author.updated_at] } + end + + it "should expire cache when the author is erased" do + expect { proposal.author.erase } + .to change { [proposal.reload.updated_at, proposal.author.updated_at] } + end + + it "should expire cache when its author changes" do + expect { proposal.author.update(username: "Eva") } + .to change { [proposal.reload.updated_at, proposal.author.updated_at] } + end + + it "should expire cache when the author's organization get verified" do + create(:organization, user: proposal.author) + expect { proposal.author.organization.verify } + .to change { [proposal.reload.updated_at, proposal.author.updated_at] } + end + end + end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 2e92ced35..9b045a7ed 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -317,7 +317,7 @@ describe User do user.reload expect(user.erase_reason).to eq('a test') - expect(user.hidden_at).to be + expect(user.erased_at).to be expect(user.username).to be_nil