diff --git a/plugins/organization_ratings/features/rate_community.feature b/plugins/organization_ratings/features/rate_community.feature index 9b0712b..1356c03 100644 --- a/plugins/organization_ratings/features/rate_community.feature +++ b/plugins/organization_ratings/features/rate_community.feature @@ -19,7 +19,7 @@ Feature: rate_community And I am logged in as "joaosilva" @selenium - Scenario: display rate button inside average block + Scenario: display rate button and total ratings inside average block Given I am on mycommunity's homepage Then I should see "Rate this Community" within ".average-rating-block" And I should see "Be the first to rate" within ".average-rating-block" @@ -34,3 +34,9 @@ Feature: rate_community When I follow "Rate this Community" Then I should see "Joao Silva" within ".star-profile-name" And I should see Joao Silva's profile image + + Scenario: display total ratings inside average block + Given I am on mycommunity's homepage + When I follow "Rate this Community" + Then I follow "Save" + Then I should see "(1)" within ".total-ratings" diff --git a/plugins/organization_ratings/lib/organization_rating.rb b/plugins/organization_ratings/lib/organization_rating.rb index 5ac64e6..d19d969 100644 --- a/plugins/organization_ratings/lib/organization_rating.rb +++ b/plugins/organization_ratings/lib/organization_rating.rb @@ -13,25 +13,26 @@ class OrganizationRating < ApplicationRecord validates :organization_id, :person_id, :presence => true - def display_moderation_message person - if person.present? - task_active? && (person.is_admin? || person == self.person || + def display_full_info_to? person + (person.is_admin? || person == self.person || self.organization.is_admin?(person)) - end end - def task_active? - tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id, - :status => Task::Status::ACTIVE) - tasks.detect {|t| t.organization_rating_id == self.id}.present? + def task_status + tasks = CreateOrganizationRatingComment.where(:target_id => self.organization.id, :requestor_id => self.person.id) + task = tasks.detect{ |t| t.organization_rating_id == self.id } + task.status if task.present? end - def self.average_rating organization_id - average = OrganizationRating.where(organization_id: organization_id).average(:value) + def self.statistics_for_profile organization + ratings = OrganizationRating.where(organization_id: organization) + average = ratings.average(:value) + total = ratings.size if average - (average - average.truncate) >= 0.5 ? average.ceil : average.floor + average = (average - average.truncate) >= 0.5 ? average.ceil : average.floor end + { average: average, total: total } end end diff --git a/plugins/organization_ratings/lib/ratings_helper.rb b/plugins/organization_ratings/lib/ratings_helper.rb index c915341..175a1ca 100644 --- a/plugins/organization_ratings/lib/ratings_helper.rb +++ b/plugins/organization_ratings/lib/ratings_helper.rb @@ -12,4 +12,14 @@ module RatingsHelper ratings = OrganizationRating.where(organization_id: profile_id).order("created_at DESC") end end -end \ No newline at end of file + + def status_message_for(person, rating) + if person.present? && rating.display_full_info_to?(person) + if(rating.task_status == Task::Status::ACTIVE) + content_tag(:p, _("Report waiting for approval"), class: "moderation-msg") + elsif(rating.task_status == Task::Status::CANCELLED) + content_tag(:p, _("Report rejected"), class: "rejected-msg") + end + end + end +end diff --git a/plugins/organization_ratings/public/style.css b/plugins/organization_ratings/public/style.css index 3fa7c8e..78de778 100644 --- a/plugins/organization_ratings/public/style.css +++ b/plugins/organization_ratings/public/style.css @@ -1,6 +1,6 @@ .star-container { width: 100%; - height: 20px; + height: 22px; } .star-negative, .star-positive { @@ -80,7 +80,16 @@ .organization-average-rating-container .star-container { float: left; - width: 120px; + display: inline-flex; + width: auto; + max-width: 190px; + +} + +.total-ratings { + font-size: 16px; + margin-left: 5px; + margin-right: 5px; } .organization-average-rating-container .rate-this-organization { diff --git a/plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb b/plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb index 721abf5..77c6111 100644 --- a/plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb +++ b/plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb @@ -188,4 +188,24 @@ class OrganizationRatingsPluginProfileControllerTest < ActionController::TestCas assert_no_tag :tag => 'p', :content => /Report waiting for approva/, :attributes => {:class =>/comment-rejected-msg/} assert_tag :tag => 'p', :content => /comment accepted/, :attributes => {:class =>/comment-body/} end + + test "should display ratings count in average block" do + average_block = AverageRatingBlock.new + average_block.box = @community.boxes.find_by_position(1) + average_block.save! + + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 42}) + get :new_rating, profile: @community.identifier + assert_tag :tag => 'a', :content => /\(42\)/ + end + + test "should display maximum ratings count in average block" do + average_block = AverageRatingBlock.new + average_block.box = @community.boxes.find_by_position(1) + average_block.save! + + OrganizationRating.stubs(:statistics_for_profile).returns({:average => 5, :total => 999000}) + get :new_rating, profile: @community.identifier + assert_tag :tag => 'a', :content => /\(10000\+\)/ + end end diff --git a/plugins/organization_ratings/test/unit/organization_rating_test.rb b/plugins/organization_ratings/test/unit/organization_rating_test.rb index b01cdab..fcf169a 100644 --- a/plugins/organization_ratings/test/unit/organization_rating_test.rb +++ b/plugins/organization_ratings/test/unit/organization_rating_test.rb @@ -35,55 +35,36 @@ class OrganizationRatingTest < ActiveSupport::TestCase assert_equal false, organization_rating2.errors[:value].include?("must be between 1 and 5") end - test "false return when no active tasks for an Organization Rating" do - assert_not @rating.task_active? - end - - test "true return when an active task exists for an Organization Rating" do + test "return rating task status" do CreateOrganizationRatingComment.create!( :organization_rating_id => @rating.id, :target => @community, :requestor => @person) - assert_equal Task::Status::ACTIVE, CreateOrganizationRatingComment.last.status - assert @rating.task_active? + assert_equal Task::Status::ACTIVE, @rating.task_status end - test "return false when an cancelled task exists for an Organization Rating" do + test "return rating task status when task is cancelled" do CreateOrganizationRatingComment.create!( :organization_rating_id => @rating.id, :target => @community, :requestor => @person) CreateOrganizationRatingComment.last.cancel - assert_not @rating.task_active? + assert_equal Task::Status::CANCELLED, @rating.task_status end - test "display report moderation message to community admin" do - moderator = create_user('moderator') - @community.add_admin(moderator.person) - @rating.stubs(:task_active?).returns(true) - assert @rating.display_moderation_message(@adminuser) + test "should display full info to admin" do + @person.stubs(:is_admin?).returns(true) + assert @rating.display_full_info_to?(@person) end - test "display report moderation message to owner" do - @rating.stubs(:task_active?).returns(true) - assert @rating.display_moderation_message(@person) + test "should display full info to owner" do + assert @rating.display_full_info_to?(@person) end - test "do not display report moderation message to regular user" do + test "should not display full info to regular user" do regular_person = fast_create(Person) - @rating.stubs(:task_active?).returns(true) - assert_not @rating.display_moderation_message(regular_person) - end - - test "do not display report moderation message to not logged user" do - @rating.stubs(:task_active?).returns(true) - assert_not @rating.display_moderation_message(nil) - end - - test "do not display report moderation message no active task exists" do - @rating.stubs(:task_active?).returns(false) - assert_not @rating.display_moderation_message(@person) + assert_not @rating.display_full_info_to?(regular_person) end test "Create task for create a rating comment" do @@ -109,7 +90,7 @@ class OrganizationRatingTest < ActiveSupport::TestCase assert community.tasks.include?(create_organization_rating_comment) end - test "Should calculate community's rating average" do + test "Should calculate community's rating statistics" do community = fast_create Community p1 = fast_create Person, :name=>"Person 1" p2 = fast_create Person, :name=>"Person 2" @@ -119,11 +100,13 @@ class OrganizationRatingTest < ActiveSupport::TestCase OrganizationRating.create! :value => 3, :organization => community, :person => p2 OrganizationRating.create! :value => 5, :organization => community, :person => p3 - assert_equal 3, OrganizationRating.average_rating(community) + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:average] + assert_equal 3, OrganizationRating.statistics_for_profile(community)[:total] p4 = fast_create Person, :name=>"Person 4" OrganizationRating.create! :value => 4, :organization => community, :person => p4 - assert_equal 4, OrganizationRating.average_rating(community) + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:average] + assert_equal 4, OrganizationRating.statistics_for_profile(community)[:total] end end diff --git a/plugins/organization_ratings/test/unit/ratings_helper_test.rb b/plugins/organization_ratings/test/unit/ratings_helper_test.rb index b408309..bcc04b1 100644 --- a/plugins/organization_ratings/test/unit/ratings_helper_test.rb +++ b/plugins/organization_ratings/test/unit/ratings_helper_test.rb @@ -3,6 +3,7 @@ require 'ratings_helper' class RatingsHelperTest < ActiveSupport::TestCase include RatingsHelper + include ActionView::Helpers::TagHelper def setup @@ -12,6 +13,12 @@ class RatingsHelperTest < ActiveSupport::TestCase @person = create_user('testuser').person @community = Community.create(:name => "TestCommunity") @organization_ratings_config = OrganizationRatingsConfig.instance + @rating = fast_create(OrganizationRating, {:value => 1, + :person_id => @person.id, + :organization_id => @community.id, + :created_at => DateTime.now, + :updated_at => DateTime.now, + }) end should "get the ratings of a community ordered by most recent ratings" do @@ -32,6 +39,7 @@ class RatingsHelperTest < ActiveSupport::TestCase ratings_array << most_recent_rating ratings_array << first_rating + ratings_array << @rating assert_equal @organization_ratings_config.order, "recent" assert_equal ratings_array, get_ratings(@community.id) @@ -57,7 +65,42 @@ class RatingsHelperTest < ActiveSupport::TestCase ratings_array << second_rating ratings_array << first_rating + ratings_array << @rating assert_equal ratings_array, get_ratings(@community.id) end + + test "display report moderation message to community admin" do + @moderator = create_user('moderator').person + @community.add_admin(@moderator) + @rating.stubs(:task_status).returns(Task::Status::ACTIVE) + assert status_message_for(@moderator, @rating).include?("Report waiting for approval") + end + + test "display report moderation message to owner" do + @rating.stubs(:task_status).returns(Task::Status::ACTIVE) + assert status_message_for(@person, @rating).include?("Report waiting for approval") + end + + test "display report rejected message to owner" do + @rating.stubs(:task_status).returns(Task::Status::CANCELLED) + assert status_message_for(@person, @rating).include?("Report rejected") + end + + test "do not display report moderation message to regular user" do + @regular_person = fast_create(Person) + @rating.stubs(:task_status).returns(Task::Status::ACTIVE) + assert_nil status_message_for(@regular_person, @rating) + end + + test "return empty status message to not logged user" do + @rating.stubs(:task_status).returns(Task::Status::ACTIVE) + assert_nil status_message_for(nil, @rating) + end + + test "do not display status message if report task is finished" do + @rating.stubs(:task_status).returns(Task::Status::FINISHED) + assert_nil status_message_for(@person, @rating) + end + end diff --git a/plugins/organization_ratings/views/blocks/average_rating.html.erb b/plugins/organization_ratings/views/blocks/average_rating.html.erb index f44c3d2..a1dd025 100644 --- a/plugins/organization_ratings/views/blocks/average_rating.html.erb +++ b/plugins/organization_ratings/views/blocks/average_rating.html.erb @@ -1,19 +1,28 @@ -<% average_rating = OrganizationRating.average_rating block.owner.id %> +<% statistics = OrganizationRating.statistics_for_profile block.owner %>
diff --git a/plugins/organization_ratings/views/blocks/organization_ratings.html.erb b/plugins/organization_ratings/views/blocks/organization_ratings.html.erb index 906263a..819e1fb 100644 --- a/plugins/organization_ratings/views/blocks/organization_ratings.html.erb +++ b/plugins/organization_ratings/views/blocks/organization_ratings.html.erb @@ -14,7 +14,7 @@ <%= render :partial => 'shared/make_report_block' %>