Extract component to render avatars in comments
This way it'll be easier to add tests for it and refactor it.
This commit is contained in:
13
app/components/comments/avatar_component.html.erb
Normal file
13
app/components/comments/avatar_component.html.erb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<% if comment.as_administrator? %>
|
||||||
|
<%= image_tag("avatar_admin.png", size: 32, class: "admin-avatar float-left") %>
|
||||||
|
<% elsif comment.as_moderator? %>
|
||||||
|
<%= image_tag("avatar_moderator.png", size: 32, class: "moderator-avatar float-left") %>
|
||||||
|
<% else %>
|
||||||
|
<% if comment.user.hidden? || comment.user.erased? %>
|
||||||
|
<span class="icon-deleted user-deleted"></span>
|
||||||
|
<% elsif comment.user.organization? %>
|
||||||
|
<%= image_tag("avatar_collective.png", size: 32, class: "avatar float-left") %>
|
||||||
|
<% else %>
|
||||||
|
<%= render Shared::AvatarComponent.new(comment.user, size: 32, class: "float-left") %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
7
app/components/comments/avatar_component.rb
Normal file
7
app/components/comments/avatar_component.rb
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
class Comments::AvatarComponent < ApplicationComponent
|
||||||
|
attr_reader :comment
|
||||||
|
|
||||||
|
def initialize(comment)
|
||||||
|
@comment = comment
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -9,19 +9,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<% if comment.as_administrator? %>
|
<%= render Comments::AvatarComponent.new(comment) %>
|
||||||
<%= image_tag("avatar_admin.png", size: 32, class: "admin-avatar float-left") %>
|
|
||||||
<% elsif comment.as_moderator? %>
|
|
||||||
<%= image_tag("avatar_moderator.png", size: 32, class: "moderator-avatar float-left") %>
|
|
||||||
<% else %>
|
|
||||||
<% if comment.user.hidden? || comment.user.erased? %>
|
|
||||||
<span class="icon-deleted user-deleted"></span>
|
|
||||||
<% elsif comment.user.organization? %>
|
|
||||||
<%= image_tag("avatar_collective.png", size: 32, class: "avatar float-left") %>
|
|
||||||
<% else %>
|
|
||||||
<%= render Shared::AvatarComponent.new(comment.user, size: 32, class: "float-left") %>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<div class="comment-info">
|
<div class="comment-info">
|
||||||
|
|
||||||
|
|||||||
56
spec/components/comments/avatar_component_spec.rb
Normal file
56
spec/components/comments/avatar_component_spec.rb
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
describe Comments::AvatarComponent do
|
||||||
|
it "displays a regular avatar for regular comments" do
|
||||||
|
comment = create(:comment, user: create(:user, username: "Oscar Wilde"))
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_avatar "O"
|
||||||
|
expect(page).not_to have_css "img"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the admin avatar for admin comments" do
|
||||||
|
admin = create(:administrator)
|
||||||
|
comment = create(:comment, user: admin.user, administrator_id: admin.id)
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_css "img.admin-avatar"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the moderator avatar for moderator comments" do
|
||||||
|
moderator = create(:moderator)
|
||||||
|
comment = create(:comment, user: moderator.user, moderator_id: moderator.id)
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_css "img.moderator-avatar"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays the organization avatar for organization comments" do
|
||||||
|
comment = create(:comment, user: create(:organization).user)
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_css "img.avatar"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays an empty icon for comments by hidden users" do
|
||||||
|
comment = create(:comment, user: create(:user, :hidden))
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_css ".user-deleted"
|
||||||
|
expect(page).not_to have_css "img"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "displays an empty icon for comments by erased users" do
|
||||||
|
comment = create(:comment, user: create(:user, erased_at: Time.current))
|
||||||
|
|
||||||
|
render_inline Comments::AvatarComponent.new(comment)
|
||||||
|
|
||||||
|
expect(page).to have_css ".user-deleted"
|
||||||
|
expect(page).not_to have_css "img"
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
RSpec::Matchers.define :have_avatar do |text, **options|
|
RSpec::Matchers.define :have_avatar do |text, **options|
|
||||||
match do
|
match do |page|
|
||||||
has_css?("svg.initialjs-avatar", **{ exact_text: text }.merge(options))
|
page.has_css?("svg.initialjs-avatar", **{ exact_text: text }.merge(options))
|
||||||
end
|
end
|
||||||
|
|
||||||
failure_message do
|
failure_message do
|
||||||
|
|||||||
Reference in New Issue
Block a user