Commit c30065be6679c968b9c9edfca2bd60e428588a1e

Authored by Tallys Martins
Committed by Gabriel Silva
1 parent 4314409d

Organization Ratings improvements

- adds rejected status message for ratings
- adds ratings count to be displayed on average ratings block
- adds tests to new features and fixed old ones

Signed-off-by: Tallys Martins <tallysmartins@gmail.com>
Signed-off-by: Gabriel Silva <grabriel93.silva@gmail.com>
plugins/organization_ratings/features/rate_community.feature
... ... @@ -19,7 +19,7 @@ Feature: rate_community
19 19 And I am logged in as "joaosilva"
20 20  
21 21 @selenium
22   - Scenario: display rate button inside average block
  22 + Scenario: display rate button and total ratings inside average block
23 23 Given I am on mycommunity's homepage
24 24 Then I should see "Rate this Community" within ".average-rating-block"
25 25 And I should see "Be the first to rate" within ".average-rating-block"
... ... @@ -34,3 +34,9 @@ Feature: rate_community
34 34 When I follow "Rate this Community"
35 35 Then I should see "Joao Silva" within ".star-profile-name"
36 36 And I should see Joao Silva's profile image
  37 +
  38 + Scenario: display total ratings inside average block
  39 + Given I am on mycommunity's homepage
  40 + When I follow "Rate this Community"
  41 + Then I follow "Save"
  42 + Then I should see "(1)" within ".total-ratings"
... ...
plugins/organization_ratings/lib/organization_rating.rb
... ... @@ -13,25 +13,26 @@ class OrganizationRating &lt; ApplicationRecord
13 13 validates :organization_id, :person_id,
14 14 :presence => true
15 15  
16   - def display_moderation_message person
17   - if person.present?
18   - task_active? && (person.is_admin? || person == self.person ||
  16 + def display_full_info_to? person
  17 + (person.is_admin? || person == self.person ||
19 18 self.organization.is_admin?(person))
20   - end
21 19 end
22 20  
23   - def task_active?
24   - tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id,
25   - :status => Task::Status::ACTIVE)
26   - tasks.detect {|t| t.organization_rating_id == self.id}.present?
  21 + def task_status
  22 + tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id, :requestor_id => self.person.id)
  23 + task = tasks.detect{ |t| t.organization_rating_id == self.id }
  24 + task.status if task.present?
27 25 end
28 26  
29   - def self.average_rating organization_id
30   - average = OrganizationRating.where(organization_id: organization_id).average(:value)
  27 + def self.statistics_for_profile organization
  28 + ratings = OrganizationRating.where(organization_id: organization)
  29 + average = ratings.average(:value)
  30 + total = ratings.size
31 31  
32 32 if average
33   - (average - average.truncate) >= 0.5 ? average.ceil : average.floor
  33 + average = (average - average.truncate) >= 0.5 ? average.ceil : average.floor
34 34 end
  35 + { average: average, total: total }
35 36 end
36 37  
37 38 end
... ...
plugins/organization_ratings/lib/ratings_helper.rb
... ... @@ -12,4 +12,14 @@ module RatingsHelper
12 12 ratings = OrganizationRating.where(organization_id: profile_id).order("created_at DESC")
13 13 end
14 14 end
15   -end
16 15 \ No newline at end of file
  16 +
  17 + def status_message_for(person, rating)
  18 + if person.present? && rating.display_full_info_to?(person)
  19 + if(rating.task_status == Task::Status::ACTIVE)
  20 + content_tag(:p, _("Report waiting for approval"), class: "moderation-msg")
  21 + elsif(rating.task_status == Task::Status::CANCELLED)
  22 + content_tag(:p, _("Report rejected"), class: "rejected-msg")
  23 + end
  24 + end
  25 + end
  26 +end
... ...
plugins/organization_ratings/public/style.css
1 1 .star-container {
2 2 width: 100%;
3   - height: 20px;
  3 + height: 22px;
4 4 }
5 5  
6 6 .star-negative, .star-positive {
... ... @@ -80,7 +80,16 @@
80 80  
81 81 .organization-average-rating-container .star-container {
82 82 float: left;
83   - width: 120px;
  83 + display: inline-flex;
  84 + width: auto;
  85 + max-width: 190px;
  86 +
  87 +}
  88 +
  89 +.total-ratings {
  90 + font-size: 16px;
  91 + margin-left: 5px;
  92 + margin-right: 5px;
84 93 }
85 94  
86 95 .organization-average-rating-container .rate-this-organization {
... ...
plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb
... ... @@ -188,4 +188,24 @@ class OrganizationRatingsPluginProfileControllerTest &lt; ActionController::TestCas
188 188 assert_no_tag :tag => 'p', :content => /Report waiting for approva/, :attributes => {:class =>/comment-rejected-msg/}
189 189 assert_tag :tag => 'p', :content => /comment accepted/, :attributes => {:class =>/comment-body/}
190 190 end
  191 +
  192 + test "should display ratings count in average block" do
  193 + average_block = AverageRatingBlock.new
  194 + average_block.box = @community.boxes.find_by_position(1)
  195 + average_block.save!
  196 +
  197 + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 42})
  198 + get :new_rating, profile: @community.identifier
  199 + assert_tag :tag => 'a', :content => /\(42\)/
  200 + end
  201 +
  202 + test "should display maximum ratings count in average block" do
  203 + average_block = AverageRatingBlock.new
  204 + average_block.box = @community.boxes.find_by_position(1)
  205 + average_block.save!
  206 +
  207 + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 999000})
  208 + get :new_rating, profile: @community.identifier
  209 + assert_tag :tag => 'a', :content => /\(10000\+\)/
  210 + end
191 211 end
... ...
plugins/organization_ratings/test/unit/organization_rating_test.rb
... ... @@ -35,55 +35,36 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
35 35 assert_equal false, organization_rating2.errors[:value].include?("must be between 1 and 5")
36 36 end
37 37  
38   - test "false return when no active tasks for an Organization Rating" do
39   - assert_not @rating.task_active?
40   - end
41   -
42   - test "true return when an active task exists for an Organization Rating" do
  38 + test "return rating task status" do
43 39 CreateOrganizationRatingComment.create!(
44 40 :organization_rating_id => @rating.id,
45 41 :target => @community,
46 42 :requestor => @person)
47 43  
48   - assert_equal Task::Status::ACTIVE, CreateOrganizationRatingComment.last.status
49   - assert @rating.task_active?
  44 + assert_equal Task::Status::ACTIVE, @rating.task_status
50 45 end
51 46  
52   - test "return false when an cancelled task exists for an Organization Rating" do
  47 + test "return rating task status when task is cancelled" do
53 48 CreateOrganizationRatingComment.create!(
54 49 :organization_rating_id => @rating.id,
55 50 :target => @community,
56 51 :requestor => @person)
57 52 CreateOrganizationRatingComment.last.cancel
58   - assert_not @rating.task_active?
  53 + assert_equal Task::Status::CANCELLED, @rating.task_status
59 54 end
60 55  
61   - test "display report moderation message to community admin" do
62   - moderator = create_user('moderator')
63   - @community.add_admin(moderator.person)
64   - @rating.stubs(:task_active?).returns(true)
65   - assert @rating.display_moderation_message(@adminuser)
  56 + test "should display full info to admin" do
  57 + @person.stubs(:is_admin?).returns(true)
  58 + assert @rating.display_full_info_to?(@person)
66 59 end
67 60  
68   - test "display report moderation message to owner" do
69   - @rating.stubs(:task_active?).returns(true)
70   - assert @rating.display_moderation_message(@person)
  61 + test "should display full info to owner" do
  62 + assert @rating.display_full_info_to?(@person)
71 63 end
72 64  
73   - test "do not display report moderation message to regular user" do
  65 + test "should not display full info to regular user" do
74 66 regular_person = fast_create(Person)
75   - @rating.stubs(:task_active?).returns(true)
76   - assert_not @rating.display_moderation_message(regular_person)
77   - end
78   -
79   - test "do not display report moderation message to not logged user" do
80   - @rating.stubs(:task_active?).returns(true)
81   - assert_not @rating.display_moderation_message(nil)
82   - end
83   -
84   - test "do not display report moderation message no active task exists" do
85   - @rating.stubs(:task_active?).returns(false)
86   - assert_not @rating.display_moderation_message(@person)
  67 + assert_not @rating.display_full_info_to?(regular_person)
87 68 end
88 69  
89 70 test "Create task for create a rating comment" do
... ... @@ -109,7 +90,7 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
109 90 assert community.tasks.include?(create_organization_rating_comment)
110 91 end
111 92  
112   - test "Should calculate community's rating average" do
  93 + test "Should calculate community's rating statistics" do
113 94 community = fast_create Community
114 95 p1 = fast_create Person, :name=>"Person 1"
115 96 p2 = fast_create Person, :name=>"Person 2"
... ... @@ -119,11 +100,13 @@ class OrganizationRatingTest &lt; ActiveSupport::TestCase
119 100 OrganizationRating.create! :value => 3, :organization => community, :person => p2
120 101 OrganizationRating.create! :value => 5, :organization => community, :person => p3
121 102  
122   - assert_equal 3, OrganizationRating.average_rating(community)
  103 + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:average]
  104 + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:total]
123 105  
124 106 p4 = fast_create Person, :name=>"Person 4"
125 107 OrganizationRating.create! :value => 4, :organization => community, :person => p4
126 108  
127   - assert_equal 4, OrganizationRating.average_rating(community)
  109 + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:average]
  110 + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:total]
128 111 end
129 112 end
... ...
plugins/organization_ratings/test/unit/ratings_helper_test.rb
... ... @@ -3,6 +3,7 @@ require &#39;ratings_helper&#39;
3 3  
4 4 class RatingsHelperTest < ActiveSupport::TestCase
5 5 include RatingsHelper
  6 + include ActionView::Helpers::TagHelper
6 7  
7 8 def setup
8 9  
... ... @@ -12,6 +13,12 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
12 13 @person = create_user('testuser').person
13 14 @community = Community.create(:name => "TestCommunity")
14 15 @organization_ratings_config = OrganizationRatingsConfig.instance
  16 + @rating = fast_create(OrganizationRating, {:value => 1,
  17 + :person_id => @person.id,
  18 + :organization_id => @community.id,
  19 + :created_at => DateTime.now,
  20 + :updated_at => DateTime.now,
  21 + })
15 22 end
16 23  
17 24 should "get the ratings of a community ordered by most recent ratings" do
... ... @@ -32,6 +39,7 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
32 39  
33 40 ratings_array << most_recent_rating
34 41 ratings_array << first_rating
  42 + ratings_array << @rating
35 43  
36 44 assert_equal @organization_ratings_config.order, "recent"
37 45 assert_equal ratings_array, get_ratings(@community.id)
... ... @@ -57,7 +65,42 @@ class RatingsHelperTest &lt; ActiveSupport::TestCase
57 65  
58 66 ratings_array << second_rating
59 67 ratings_array << first_rating
  68 + ratings_array << @rating
60 69  
61 70 assert_equal ratings_array, get_ratings(@community.id)
62 71 end
  72 +
  73 + test "display report moderation message to community admin" do
  74 + @moderator = create_user('moderator').person
  75 + @community.add_admin(@moderator)
  76 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  77 + assert status_message_for(@moderator, @rating).include?("Report waiting for approval")
  78 + end
  79 +
  80 + test "display report moderation message to owner" do
  81 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  82 + assert status_message_for(@person, @rating).include?("Report waiting for approval")
  83 + end
  84 +
  85 + test "display report rejected message to owner" do
  86 + @rating.stubs(:task_status).returns(Task::Status::CANCELLED)
  87 + assert status_message_for(@person, @rating).include?("Report rejected")
  88 + end
  89 +
  90 + test "do not display report moderation message to regular user" do
  91 + @regular_person = fast_create(Person)
  92 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  93 + assert_nil status_message_for(@regular_person, @rating)
  94 + end
  95 +
  96 + test "return empty status message to not logged user" do
  97 + @rating.stubs(:task_status).returns(Task::Status::ACTIVE)
  98 + assert_nil status_message_for(nil, @rating)
  99 + end
  100 +
  101 + test "do not display status message if report task is finished" do
  102 + @rating.stubs(:task_status).returns(Task::Status::FINISHED)
  103 + assert_nil status_message_for(@person, @rating)
  104 + end
  105 +
63 106 end
... ...
plugins/organization_ratings/views/blocks/average_rating.html.erb
1   -<% average_rating = OrganizationRating.average_rating block.owner.id %>
  1 +<% statistics = OrganizationRating.statistics_for_profile block.owner %>
2 2  
3 3 <div class="organization-average-rating-container">
4   - <% if average_rating %>
  4 + <% if statistics[:average] %>
5 5 <div class="star-rate-text">
6 6 <%= _("Rating: ") %>
7 7 </div>
8 8  
9 9 <div class="star-container">
10 10 <% (1..5).each do |star_number| %>
11   - <% if star_number <= average_rating %>
  11 + <% if star_number <= statistics[:average] %>
12 12 <div class="medium-star-positive"></div>
13 13 <% else %>
14 14 <div class="medium-star-negative"></div>
15 15 <% end %>
16 16 <% end %>
  17 + <div class="total-ratings">
  18 + <%= link_to url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating', :anchor => 'ratings-list') do %>
  19 + <% if(statistics[:total] > 10000) %>
  20 + <%= "(10000+)" %>
  21 + <% else %>
  22 + <%= "(#{statistics[:total]})" %>
  23 + <% end %>
  24 + <% end %>
  25 + </div>
17 26 </div>
18 27 <% else %>
19 28 <div class="rating-invitation">
... ... @@ -24,4 +33,4 @@
24 33 <div class="rate-this-organization">
25 34 <%= link_to _("Rate this %s") % _(block.owner.class.name), url_for(:controller => "organization_ratings_plugin_profile", :action => "new_rating", :profile => block.owner.identifier) %>
26 35 </div>
27   -</div>
28 36 \ No newline at end of file
  37 +</div>
... ...
plugins/organization_ratings/views/blocks/organization_ratings.html.erb
... ... @@ -14,7 +14,7 @@
14 14 <%= render :partial => 'shared/make_report_block' %>
15 15  
16 16 <div class="see-more">
17   - <%= link_to _('See more'), url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating'), :class => 'icon-arrow-right-p' %>
  17 + <%= link_to _('See more'), url_for(:controller => 'organization_ratings_plugin_profile', :action => 'new_rating', :anchor => 'ratings-list'), :class => 'icon-arrow-right-p' %>
18 18 </div>
19 19 </div>
20 20 <% end %>
... ...
plugins/organization_ratings/views/organization_ratings_plugin_profile/new_rating.html.erb
... ... @@ -9,7 +9,7 @@
9 9 </div>
10 10 <% end %>
11 11  
12   -<div class="ratings-list">
  12 +<div class="ratings-list" id="ratings-list">
13 13 <% @users_ratings.each do |user_rate| %>
14 14 <%= render :partial => "shared/user_rating_container", :locals => {:user_rate => user_rate} %>
15 15 <% end %>
... ...
plugins/organization_ratings/views/shared/_user_rating_container.html.erb
  1 +<% extend RatingsHelper %>
1 2 <div class="user-rating-block">
2 3 <div class="star-profile-information">
3 4 <div class="star-profile-image">
... ... @@ -25,9 +26,7 @@
25 26 </div>
26 27  
27 28 <div class="user-testimony">
28   - <% if user_rate.display_moderation_message(user) %>
29   - <p class="moderation-msg"><%= _("Report waiting for approval") %></p>
30   - <% end %>
  29 + <%= status_message_for(user, user_rate) %>
31 30 <% if user_rate.comment.present? %>
32 31 <p class="comment-body"> <%= user_rate.comment.body %> </p>
33 32 <% end %>
... ...