@@ -135,8 +135,12 @@ protected
def invalid_code(customer_id, code)
@redis.incr("jmp_invite_tries-#{customer_id}").then {
@redis.expire("jmp_invite_tries-#{customer_id}", 60 * 60)
- }.then do
+ }.then {
+ @redis.hexists("jmp_group_codes", code)
+ }.then { |is_group|
+ raise Invalid, "#{code} is a post-payment referral" if is_group.to_i == 1
+
raise Invalid, "Not a valid invite code: #{code}"
- end
+ }
end
end
@@ -257,6 +257,10 @@ class FakeRedis
@values.dig(key, field)
end
+ def hexists(key, field)
+ hget(key, field).nil? ? 0 : 1
+ end
+
def hincrby(key, field, incrby)
@values[key] ||= {}
@values[key][field] ||= 0
@@ -736,6 +736,11 @@ class RegistrationTest < Minitest::Test
EMPromise.resolve(nil),
["jmp_invite_tries-test", 60 * 60]
)
+ Registration::Payment::InviteCode::REDIS.expect(
+ :hexists,
+ EMPromise.resolve(0),
+ ["jmp_group_codes", "abc"]
+ )
Command::COMMAND_MANAGER.expect(
:write,
EMPromise.resolve(
@@ -772,6 +777,74 @@ class RegistrationTest < Minitest::Test
end
em :test_write_bad_code
+ def test_write_group_code
+ result = execute_command do
+ customer = customer(plan_name: "test_usd")
+ Registration::Payment::InviteCode::REDIS.expect(
+ :get,
+ EMPromise.resolve(0),
+ ["jmp_invite_tries-test"]
+ )
+ Registration::Payment::InviteCode::DB.expect(
+ :transaction,
+ []
+ ) { |&blk| blk.call }
+ Registration::Payment::InviteCode::DB.expect(
+ :exec,
+ OpenStruct.new(cmd_tuples: 0),
+ [String, ["test", "abc"]]
+ )
+ Registration::Payment::InviteCode::REDIS.expect(
+ :incr,
+ EMPromise.resolve(nil),
+ ["jmp_invite_tries-test"]
+ )
+ Registration::Payment::InviteCode::REDIS.expect(
+ :expire,
+ EMPromise.resolve(nil),
+ ["jmp_invite_tries-test", 60 * 60]
+ )
+ Registration::Payment::InviteCode::REDIS.expect(
+ :hexists,
+ EMPromise.resolve(1),
+ ["jmp_group_codes", "abc"]
+ )
+ Command::COMMAND_MANAGER.expect(
+ :write,
+ EMPromise.resolve(
+ Blather::Stanza::Iq::Command.new.tap { |iq|
+ iq.form.fields = [{ var: "code", value: "abc" }]
+ }
+ ),
+ [Matching.new do |reply|
+ assert_equal :form, reply.form.type
+ assert_nil reply.form.instructions
+ end]
+ )
+ Command::COMMAND_MANAGER.expect(
+ :write,
+ EMPromise.reject(:test_result),
+ [Matching.new do |reply|
+ assert_equal :form, reply.form.type
+ assert_equal(
+ "abc is a post-payment referral",
+ reply.form.instructions
+ )
+ end]
+ )
+
+ Registration::Payment::InviteCode.new(
+ customer,
+ "+15555550000"
+ ).write.catch { |e| e }
+ end
+ assert_equal :test_result, result
+ assert_mock Command::COMMAND_MANAGER
+ assert_mock Registration::Payment::InviteCode::DB
+ assert_mock Registration::Payment::InviteCode::REDIS
+ end
+ em :test_write_group_code
+
def test_write_bad_code_over_limit
result = execute_command do
customer = customer(plan_name: "test_usd")