diff --git a/plugin.rb b/plugin.rb index ec4964b..0f392b7 100755 --- a/plugin.rb +++ b/plugin.rb @@ -33,7 +33,7 @@ class Engine < ::Rails::Engine load File.expand_path('../lib/discourse_topic_voting/topic_extension.rb', __FILE__) load File.expand_path('../lib/discourse_topic_voting/user_extension.rb', __FILE__) - reloadable_patch do |plugin| + reloadable_patch do CategoriesController.class_eval { prepend DiscourseTopicVoting::CategoriesControllerExtension } Category.class_eval { prepend DiscourseTopicVoting::CategoryExtension } Topic.class_eval { prepend DiscourseTopicVoting::TopicExtension } @@ -102,6 +102,8 @@ def user_voted add_to_serializer(:topic_list_item, :include_vote_count?) { object.can_vote? } add_to_serializer(:topic_list_item, :include_can_vote?) { SiteSetting.voting_enabled && object.regular? } add_to_serializer(:topic_list_item, :include_user_voted?) { object.can_vote? } + # this always evaluates to true because + # include_can_vote? returns false if voting is not enabled add_to_serializer(:basic_category, :can_vote, false) { SiteSetting.voting_enabled } add_to_serializer(:basic_category, :include_can_vote?) { Category.can_vote?(object.id) } diff --git a/spec/fabricators/topic_vote_count_fabricator.rb b/spec/fabricators/topic_vote_count_fabricator.rb new file mode 100644 index 0000000..409ece0 --- /dev/null +++ b/spec/fabricators/topic_vote_count_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:topic_voting_vote_count, class_name: 'DiscourseTopicVoting::TopicVoteCount') do + topic + votes_count 1 +end diff --git a/spec/fabricators/vote_fabricator.rb b/spec/fabricators/vote_fabricator.rb new file mode 100644 index 0000000..57df217 --- /dev/null +++ b/spec/fabricators/vote_fabricator.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +Fabricator(:topic_voting_votes, class_name: 'DiscourseTopicVoting::Vote') do + user + topic +end diff --git a/spec/serializers/basic_category_serializer_spec.rb b/spec/serializers/basic_category_serializer_spec.rb new file mode 100644 index 0000000..ee70f27 --- /dev/null +++ b/spec/serializers/basic_category_serializer_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe BasicCategorySerializer do + fab!(:category) { Fabricate(:category) } + + it 'does not return can_vote when voting disabled' do + SiteSetting.voting_enabled = false + + json = BasicCategorySerializer.new(category, root: false).as_json + + expect(json[:can_vote]).to eq(nil) + end + + it 'does not return can_vote when voting disabled' do + SiteSetting.voting_enabled = true + DiscourseTopicVoting::CategorySetting.create!(category: category) + + json = BasicCategorySerializer.new(category, root: false).as_json + + expect(json[:can_vote]).to eq(true) + end +end diff --git a/spec/serializers/topic_list_item_serializer_spec.rb b/spec/serializers/topic_list_item_serializer_spec.rb new file mode 100644 index 0000000..9a284fd --- /dev/null +++ b/spec/serializers/topic_list_item_serializer_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +describe TopicListItemSerializer do + let(:user) { Fabricate(:user) } + let(:category) { Fabricate(:category) } + let(:topic) { Fabricate(:topic, category_id: category.id) } + let(:guardian) { Guardian.new(user) } + + it 'excludes properties when voting disabled' do + SiteSetting.voting_enabled = false + + json = TopicListItemSerializer.new(topic, scope: guardian, root: false).as_json + + expect(json[:vote_count]).to eq nil + expect(json[:user_voted]).to eq nil + expect(json[:can_vote]).to eq nil + end + + it 'adds can_vote when enabled' do + SiteSetting.voting_enabled = true + json = TopicListItemSerializer.new(topic, scope: guardian, root: false).as_json + + expect(json[:vote_count]).to eq nil + expect(json[:user_voted]).to eq nil + expect(json[:can_vote]).to eq false + end + + it 'updates vote count to 0 when topic is votable' do + SiteSetting.voting_enabled = true + DiscourseTopicVoting::CategorySetting.create!(category: category) + json = TopicListItemSerializer.new(topic, scope: guardian, root: false).as_json + + expect(json[:vote_count]).to eq 0 + expect(json[:user_voted]).to eq false + expect(json[:can_vote]).to eq true + end + + it "returns all the values" do + SiteSetting.voting_enabled = true + DiscourseTopicVoting::CategorySetting.create!(category: category) + Fabricate(:topic_voting_votes, user: user, topic: topic) + Fabricate(:topic_voting_vote_count, topic: topic) + json = TopicListItemSerializer.new(topic, scope: guardian, root: false).as_json + + expect(json[:vote_count]).to eq 1 + expect(json[:user_voted]).to eq true + expect(json[:can_vote]).to eq true + end +end diff --git a/spec/serializers/topic_view_serializer_spec.rb b/spec/serializers/topic_view_serializer_spec.rb new file mode 100644 index 0000000..0a78323 --- /dev/null +++ b/spec/serializers/topic_view_serializer_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe TopicViewSerializer do + let(:user) { Fabricate(:user) } + let(:category) { Fabricate(:category) } + let(:topic) { Fabricate(:topic, category_id: category.id) } + let(:topic_view) { TopicView.new(topic, user) } + let(:guardian) { Guardian.new(user) } + + it 'returns false when voting disabled' do + SiteSetting.voting_enabled = false + DiscourseTopicVoting::CategorySetting.create!(category: category) + + json = TopicViewSerializer.new(topic_view, scope: guardian, root: false).as_json + + expect(json[:can_vote]).to eq(false) + end + + it 'returns false when topic not in category' do + SiteSetting.voting_enabled = true + + json = TopicViewSerializer.new(topic_view, scope: guardian, root: false).as_json + + expect(json[:can_vote]).to eq(false) + end + + it 'returns false when voting disabled and topic not in category' do + json = TopicViewSerializer.new(topic_view, scope: guardian, root: false).as_json + + expect(json[:can_vote]).to eq(false) + end + + it 'returns true when voting enabled and topic in category' do + SiteSetting.voting_enabled = true + DiscourseTopicVoting::CategorySetting.create!(category: category) + + json = TopicViewSerializer.new(topic_view, scope: guardian, root: false).as_json + + expect(json[:can_vote]).to eq(true) + end +end