diff options
author | ankonym <ankonym@gmail.com> | 2015-10-02 16:51:57 +0200 |
---|---|---|
committer | ankonym <ankonym@gmail.com> | 2015-10-02 16:51:57 +0200 |
commit | 82a33300818dd8f6e06856944fe7c658746efca1 (patch) | |
tree | a38234fa3a6e4cca22ad1f7b7a42743a19ec96d4 | |
parent | d45f6c61f6a13be06f1977b857e0cb31e79c5317 (diff) |
Allow multi-use invite codes
Introduce a invite_max_uses property to invite codes to allow admins to set a maximum number of uses for invite codes.
-rw-r--r-- | app/models/invite_code.rb | 2 | ||||
-rw-r--r-- | app/models/invite_code_validator.rb | 13 | ||||
-rw-r--r-- | test/unit/invite_code_test.rb | 36 |
3 files changed, 46 insertions, 5 deletions
diff --git a/app/models/invite_code.rb b/app/models/invite_code.rb index 30a6498..0086804 100644 --- a/app/models/invite_code.rb +++ b/app/models/invite_code.rb @@ -4,12 +4,14 @@ class InviteCode < CouchRest::Model::Base use_database 'invite_codes' property :invite_code, String, :read_only => true property :invite_count, Integer, :default => 0, :accessible => true + property :invite_max_uses, Integer, :default => 1, :accessible => true timestamps! design do view :by_invite_code view :by_invite_count + view :by_invite_max_uses end def initialize(attributes = {}, options = {}) diff --git a/app/models/invite_code_validator.rb b/app/models/invite_code_validator.rb index f96ca4a..d52e698 100644 --- a/app/models/invite_code_validator.rb +++ b/app/models/invite_code_validator.rb @@ -6,8 +6,11 @@ class InviteCodeValidator < ActiveModel::Validator if not_existent?(user_invite_code) add_error_to_user("This is not a valid code", user) - elsif count_greater_than_zero?(user_invite_code) + elsif has_no_uses_left?(user_invite_code) add_error_to_user("This code has already been used", user) + + # elsif count_greater_than_zero?(user_invite_code) + # add_error_to_user("This code has already been used", user) end end @@ -16,10 +19,14 @@ class InviteCodeValidator < ActiveModel::Validator code == nil end - def count_greater_than_zero?(code) - code.invite_count > 0 + def has_no_uses_left?(code) + code.invite_count >= code.invite_max_uses end + # def count_greater_than_zero?(code) + # code.invite_count > 0 + # end + def add_error_to_user(error, user) user.errors[:invite_code] << error end diff --git a/test/unit/invite_code_test.rb b/test/unit/invite_code_test.rb index b17d1bc..7e14a03 100644 --- a/test/unit/invite_code_test.rb +++ b/test/unit/invite_code_test.rb @@ -21,11 +21,28 @@ class InviteCodeTest < ActiveSupport::TestCase end - test "Invite count >0 is not accepted for new account signup" do + # test "Invite count >0 is not accepted for new account signup" do + # validator = InviteCodeValidator.new nil + # + # user_code = InviteCode.new + # user_code.invite_count = 1 + # user_code.save + # + # user = FactoryGirl.build :user + # user.invite_code = user_code.invite_code + # + # validator.validate(user) + # + # assert_equal ["This code has already been used"], user.errors[:invite_code] + # + # end + + test "Invite count >= invite max uses is not accepted for new account signup" do validator = InviteCodeValidator.new nil user_code = InviteCode.new user_code.invite_count = 1 + user_code.invite_max_uses = 1 user_code.save user = FactoryGirl.build :user @@ -37,6 +54,22 @@ class InviteCodeTest < ActiveSupport::TestCase end + test "Invite count < invite max uses is accepted for new account signup" do + validator = InviteCodeValidator.new nil + + user_code = InviteCode.create + user_code.invite_count = 0 + user_code.invite_max_uses = 1 + user_code.save + + user = FactoryGirl.build :user + user.invite_code = user_code.invite_code + + validator.validate(user) + + assert_equal [], user.errors[:invite_code] + end + test "Invite count 0 is accepted for new account signup" do validator = InviteCodeValidator.new nil @@ -62,6 +95,5 @@ class InviteCodeTest < ActiveSupport::TestCase end - end |