From 82a33300818dd8f6e06856944fe7c658746efca1 Mon Sep 17 00:00:00 2001 From: ankonym Date: Fri, 2 Oct 2015 16:51:57 +0200 Subject: 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. --- app/models/invite_code.rb | 2 ++ app/models/invite_code_validator.rb | 13 ++++++++++--- 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 -- cgit v1.2.3 From 6f09343e85ab23c4d81f827bbd47a720f3e2cf7b Mon Sep 17 00:00:00 2001 From: ankonym Date: Fri, 2 Oct 2015 20:58:29 +0200 Subject: Update rake task to allow generation of multi-use invites The rake task now takes a second (optional) argument that sets the number of uses per invite code. If this is omitted, the default number of uses is 1. (This commit also contains some minor code cleanup that removes some stuff that I'd commented out but not removed.) --- app/models/invite_code_validator.rb | 8 +------- lib/tasks/invite_code.rake | 21 +++++++++++++++------ test/unit/invite_code_test.rb | 17 ----------------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/app/models/invite_code_validator.rb b/app/models/invite_code_validator.rb index d52e698..9dfe6fa 100644 --- a/app/models/invite_code_validator.rb +++ b/app/models/invite_code_validator.rb @@ -1,4 +1,5 @@ class InviteCodeValidator < ActiveModel::Validator + def validate(user) user_invite_code = InviteCode.find_by_invite_code user.invite_code @@ -8,9 +9,6 @@ class InviteCodeValidator < ActiveModel::Validator 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 @@ -23,10 +21,6 @@ class InviteCodeValidator < ActiveModel::Validator 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/lib/tasks/invite_code.rake b/lib/tasks/invite_code.rake index f3bafac..6623640 100644 --- a/lib/tasks/invite_code.rake +++ b/lib/tasks/invite_code.rake @@ -1,16 +1,25 @@ desc "Generate a batch of invite codes" -task :generate_invites, [:n] => :environment do |task, args| +task :generate_invites, [:n, :u] => :environment do |task, args| - codes = args.n - codes = codes.to_i + codes = args.n + codes = codes.to_i - codes.times do |x| + if args.u == nil + max_uses = 1 + + elsif + max_uses = args.u + max_uses = max_uses.to_i + end + + codes.times do |x| x = InviteCode.new + x.invite_max_uses = max_uses x.save - puts "#{x.invite_code} Code generated." - + puts "#{x.invite_code} Code generated with #{x.invite_max_uses} uses." end + end diff --git a/test/unit/invite_code_test.rb b/test/unit/invite_code_test.rb index 7e14a03..adaf397 100644 --- a/test/unit/invite_code_test.rb +++ b/test/unit/invite_code_test.rb @@ -20,23 +20,6 @@ class InviteCodeTest < ActiveSupport::TestCase assert_equal code1.invite_count, 0 end - - # 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 -- cgit v1.2.3 From da9608a906d4369afb70e042069e219bc2e2d282 Mon Sep 17 00:00:00 2001 From: ankonym Date: Tue, 6 Oct 2015 13:27:32 +0200 Subject: Integrated feedback on multi-invite codes Removing some superfluous code, mostly, and structuring tests better. --- app/models/invite_code.rb | 3 +- app/models/invite_code_validator.rb | 2 +- test/unit/invite_code_test.rb | 57 --------------------------------- test/unit/invite_code_validator_test.rb | 56 ++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 60 deletions(-) diff --git a/app/models/invite_code.rb b/app/models/invite_code.rb index 0086804..13c3a39 100644 --- a/app/models/invite_code.rb +++ b/app/models/invite_code.rb @@ -4,14 +4,13 @@ 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 + property :max_uses, Integer, :default => 1 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 9dfe6fa..676e4fa 100644 --- a/app/models/invite_code_validator.rb +++ b/app/models/invite_code_validator.rb @@ -18,7 +18,7 @@ class InviteCodeValidator < ActiveModel::Validator end def has_no_uses_left?(code) - code.invite_count >= code.invite_max_uses + code.invite_count >= code.max_uses end def add_error_to_user(error, user) diff --git a/test/unit/invite_code_test.rb b/test/unit/invite_code_test.rb index adaf397..fd93f2f 100644 --- a/test/unit/invite_code_test.rb +++ b/test/unit/invite_code_test.rb @@ -20,63 +20,6 @@ class InviteCodeTest < ActiveSupport::TestCase assert_equal code1.invite_count, 0 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 - 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 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 - - user_code = InviteCode.create - - user = FactoryGirl.build :user - user.invite_code = user_code.invite_code - - validator.validate(user) - - assert_equal [], user.errors[:invite_code] - end - - test "There is an error message if the invite code does not exist" do - validator = InviteCodeValidator.new nil - - user = FactoryGirl.build :user - user.invite_code = "wrongcode" - - validator.validate(user) - - assert_equal ["This is not a valid code"], user.errors[:invite_code] - - end end diff --git a/test/unit/invite_code_validator_test.rb b/test/unit/invite_code_validator_test.rb index ee8f1b3..62eeae6 100644 --- a/test/unit/invite_code_validator_test.rb +++ b/test/unit/invite_code_validator_test.rb @@ -27,4 +27,60 @@ class InviteCodeValidatorTest < ActiveSupport::TestCase assert_equal errors, invalid_user.errors.messages end 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.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 accepted for new account signup" do + validator = InviteCodeValidator.new nil + + user_code = InviteCode.create + 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 + + user_code = InviteCode.create + + user = FactoryGirl.build :user + user.invite_code = user_code.invite_code + + validator.validate(user) + + assert_equal [], user.errors[:invite_code] + end + + test "There is an error message if the invite code does not exist" do + validator = InviteCodeValidator.new nil + + user = FactoryGirl.build :user + user.invite_code = "wrongcode" + + validator.validate(user) + + assert_equal ["This is not a valid code"], user.errors[:invite_code] + end + end \ No newline at end of file -- cgit v1.2.3 From be79269c15a8f9f936f598210ab10baf0c992587 Mon Sep 17 00:00:00 2001 From: ankonym Date: Tue, 6 Oct 2015 14:25:40 +0200 Subject: Adjust rake task with renamed max_uses --- lib/tasks/invite_code.rake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/tasks/invite_code.rake b/lib/tasks/invite_code.rake index 6623640..71950b9 100644 --- a/lib/tasks/invite_code.rake +++ b/lib/tasks/invite_code.rake @@ -16,9 +16,9 @@ task :generate_invites, [:n, :u] => :environment do |task, args| codes.times do |x| x = InviteCode.new - x.invite_max_uses = max_uses + x.max_uses = max_uses x.save - puts "#{x.invite_code} Code generated with #{x.invite_max_uses} uses." + puts "#{x.invite_code} Code generated with #{x.max_uses} uses." end end -- cgit v1.2.3 From 0ef9035c62358ec3f74de3591a9580e5bd426422 Mon Sep 17 00:00:00 2001 From: ankonym Date: Tue, 6 Oct 2015 17:33:03 +0200 Subject: Cleaned up invite code output for platform tests This still had some test output that gets in the way of easy printing and a LEAP platform test --- lib/tasks/invite_code.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/invite_code.rake b/lib/tasks/invite_code.rake index 71950b9..0404764 100644 --- a/lib/tasks/invite_code.rake +++ b/lib/tasks/invite_code.rake @@ -18,7 +18,7 @@ task :generate_invites, [:n, :u] => :environment do |task, args| x = InviteCode.new x.max_uses = max_uses x.save - puts "#{x.invite_code} Code generated with #{x.max_uses} uses." + puts "#{x.invite_code}" end end -- cgit v1.2.3 From d1b16b0dbc868e45f4910b1b3365679b6f18562f Mon Sep 17 00:00:00 2001 From: ankonym Date: Tue, 6 Oct 2015 18:40:14 +0200 Subject: Small code cleanup in the rake task --- lib/tasks/invite_code.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/invite_code.rake b/lib/tasks/invite_code.rake index 0404764..53c39b9 100644 --- a/lib/tasks/invite_code.rake +++ b/lib/tasks/invite_code.rake @@ -18,7 +18,7 @@ task :generate_invites, [:n, :u] => :environment do |task, args| x = InviteCode.new x.max_uses = max_uses x.save - puts "#{x.invite_code}" + puts x.invite_code end end -- cgit v1.2.3 From cb89699283aeb1ef4195a5c99d0319f3232f5db7 Mon Sep 17 00:00:00 2001 From: ankonym Date: Mon, 12 Oct 2015 10:58:46 +0200 Subject: Adjusted the rake task with comments by @azul Basically made the code a bit prettier :) --- lib/tasks/invite_code.rake | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/tasks/invite_code.rake b/lib/tasks/invite_code.rake index 53c39b9..d6e2b49 100644 --- a/lib/tasks/invite_code.rake +++ b/lib/tasks/invite_code.rake @@ -6,12 +6,8 @@ task :generate_invites, [:n, :u] => :environment do |task, args| codes = args.n codes = codes.to_i - if args.u == nil - max_uses = 1 - - elsif + if args.u != nil max_uses = args.u - max_uses = max_uses.to_i end codes.times do |x| -- cgit v1.2.3