diff --git a/lib/gamification_plugin.rb b/lib/gamification_plugin.rb index d930925..26c3fc1 100644 --- a/lib/gamification_plugin.rb +++ b/lib/gamification_plugin.rb @@ -14,6 +14,19 @@ class GamificationPlugin < Noosfero::Plugin end end + # Override initial rules with environment specific rules + def self.gamification_set_rules(environment) + Merit::AppPointRules.clear + Merit::AppPointRules.merge!(Merit::PointRules.new(environment).defined_rules) + end + + def application_controller_filters + [{ + :type => 'before_filter', :method_name => 'gamification_set_rules', + :options => {}, :block => proc { GamificationPlugin.gamification_set_rules(environment) } + }] + end + Merit.setup do |config| config.checks_on_each_request = false config.user_model_name = 'Profile' diff --git a/lib/merit/point_rules.rb b/lib/merit/point_rules.rb index d940faa..7b9b6a1 100644 --- a/lib/merit/point_rules.rb +++ b/lib/merit/point_rules.rb @@ -1,13 +1,3 @@ -# Be sure to restart your server when you modify this file. -# -# Points are a simple integer value which are given to "meritable" resources -# according to rules in +app/models/merit/point_rules.rb+. They are given on -# actions-triggered, either to the action user or to the method (or array of -# methods) defined in the +:to+ option. -# -# 'score' method may accept a block which evaluates to boolean -# (recieves the object as parameter) - module Merit class PointRules include Merit::PointRulesMethods @@ -47,7 +37,8 @@ module Merit # FIXME get value from environment def weight(category) - AVAILABLE_RULES[category][:default_weight] + settings = Noosfero::Plugin::Settings.new(@environment, GamificationPlugin) + settings.settings.fetch(:point_rules, {}).fetch(category.to_s, {}).fetch('weight', AVAILABLE_RULES[category][:default_weight]).to_i end def calculate_score(target, category, value) @@ -55,8 +46,10 @@ module Merit weight(category) * value end - # TODO receive environment parameter - def initialize + def initialize(environment=nil) + return if environment.nil? + @environment = environment + AVAILABLE_RULES.each do |category, setting| [setting[:action], setting[:undo_action]].compact.zip([1, -1]).each do |action, signal| score lambda {|target| signal * calculate_score(target, category, setting[:value])}, :on => action, :to => setting[:to], :category => category diff --git a/test/functional/application_controller_test.rb b/test/functional/application_controller_test.rb new file mode 100644 index 0000000..47d84fc --- /dev/null +++ b/test/functional/application_controller_test.rb @@ -0,0 +1,20 @@ +require_relative '../test_helper' +require 'test_controller' + +class TestController; def rescue_action(e) raise e end; end + +class ApplicationControllerTest < ActionController::TestCase + + def setup + @environment = Environment.default + @environment.enable_plugin(GamificationPlugin) + @controller = TestController.new + @controller.stubs(:environment).returns(@environment) + end + + should 'redefine rules in before filter' do + get :index + assert Merit::AppPointRules.present? + end + +end diff --git a/test/unit/article_test.rb b/test/unit/article_test.rb index d594669..3a8e019 100644 --- a/test/unit/article_test.rb +++ b/test/unit/article_test.rb @@ -4,6 +4,7 @@ class ArticleTest < ActiveSupport::TestCase def setup @person = create_user('testuser').person + GamificationPlugin.gamification_set_rules(Environment.default) end attr_accessor :person diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb index c82190b..6d57062 100644 --- a/test/unit/comment_test.rb +++ b/test/unit/comment_test.rb @@ -5,6 +5,7 @@ class CommentTest < ActiveSupport::TestCase def setup @person = create_user('testuser').person @article = create(TextileArticle, :profile_id => person.id) + GamificationPlugin.gamification_set_rules(Environment.default) end attr_accessor :person, :article diff --git a/test/unit/point_rules_test.rb b/test/unit/point_rules_test.rb new file mode 100644 index 0000000..7553195 --- /dev/null +++ b/test/unit/point_rules_test.rb @@ -0,0 +1,34 @@ +require_relative "../test_helper" + +class PointRulesTest < ActiveSupport::TestCase + + def setup + @environment = Environment.default + @point_rules = Merit::PointRules.new(@environment) + end + + attr_accessor :environment, :point_rules + + should 'not define rules when environment is nil' do + point_rules = Merit::PointRules.new + assert point_rules.defined_rules.blank? + end + + should 'define rules when environment is present' do + assert point_rules.defined_rules.present? + end + + should 'weight returns the default value when value is not setted in environment' do + Merit::PointRules::AVAILABLE_RULES.each do |category, setting| + assert_equal setting[:default_weight], point_rules.weight(category) + end + end + + should 'weight returns value from environment when it is setted' do + settings = Noosfero::Plugin::Settings.new(environment, GamificationPlugin, {}) + settings.set_setting(:point_rules, {'comment_author' => {'weight' => '500'}}) + settings.save! + assert_equal 500, point_rules.weight(:comment_author) + end + +end -- libgit2 0.21.2