# frozen_string_literal: true require "test_helper" require "customer" Customer::BLATHER = Minitest::Mock.new Customer::BRAINTREE = Minitest::Mock.new Customer::REDIS = Minitest::Mock.new Customer::DB = Minitest::Mock.new CustomerPlan::DB = Minitest::Mock.new CustomerUsage::REDIS = Minitest::Mock.new CustomerUsage::DB = Minitest::Mock.new class SipAccount public :username, :url class New public :username end end class CustomerTest < Minitest::Test def test_for_jid Customer::REDIS.expect( :get, EMPromise.resolve(1), ["jmp_customer_id-test@example.com"] ) Customer::DB.expect( :query_defer, EMPromise.resolve([{ balance: 1234, plan_name: "test_usd" }]), [String, [1]] ) customer = Customer.for_jid("test@example.com").sync assert_kind_of Customer, customer assert_equal 1234, customer.balance assert_equal "merchant_usd", customer.merchant_account end em :test_for_jid def test_for_jid_not_found Customer::REDIS.expect( :get, EMPromise.resolve(nil), ["jmp_customer_id-test2@example.com"] ) assert_raises do Customer.for_jid("test2@example.com").sync end end em :test_for_jid_not_found def test_for_customer_id_not_found Customer::DB.expect( :query_defer, EMPromise.resolve([]), [String, [7357]] ) customer = Customer.for_customer_id(7357).sync assert_equal BigDecimal.new(0), customer.balance end em :test_for_customer_id_not_found def test_create braintree_customer = Minitest::Mock.new Customer::BRAINTREE.expect(:customer, braintree_customer) braintree_customer.expect(:create, EMPromise.resolve( OpenStruct.new(success?: true, customer: OpenStruct.new(id: "test")) )) Customer::REDIS.expect( :msetnx, EMPromise.resolve(1), [ "jmp_customer_id-test@example.com", "test", "jmp_customer_jid-test", "test@example.com" ] ) assert_kind_of Customer, Customer.create("test@example.com").sync braintree_customer.verify Customer::REDIS.verify end em :test_create def test_bill_plan_activate CustomerPlan::DB.expect(:transaction, nil) do |&block| block.call true end CustomerPlan::DB.expect( :exec, nil, [ String, Matching.new do |params| params[0] == "test" && params[1].is_a?(String) && BigDecimal.new(-1) == params[2] end ] ) CustomerPlan::DB.expect( :exec, OpenStruct.new(cmd_tuples: 1), [String, ["test", "test_usd"]] ) Customer.new("test", plan_name: "test_usd").bill_plan.sync CustomerPlan::DB.verify end em :test_bill_plan_activate def test_bill_plan_update CustomerPlan::DB.expect(:transaction, nil) do |&block| block.call true end CustomerPlan::DB.expect( :exec, nil, [ String, Matching.new do |params| params[0] == "test" && params[1].is_a?(String) && BigDecimal.new(-1) == params[2] end ] ) CustomerPlan::DB.expect( :exec, OpenStruct.new(cmd_tuples: 0), [String, ["test", "test_usd"]] ) CustomerPlan::DB.expect(:exec, nil, [String, ["test"]]) Customer.new("test", plan_name: "test_usd").bill_plan.sync CustomerPlan::DB.verify end em :test_bill_plan_update def test_jid Customer::REDIS.expect( :get, EMPromise.resolve("test@example.com"), ["jmp_customer_jid-test"] ) jid = Customer.new("test").jid.sync assert_kind_of Blather::JID, jid assert_equal "test@example.com", jid.to_s Customer::REDIS.verify end em :test_jid def test_stanza_to Customer::REDIS.expect( :get, EMPromise.resolve("test@example.com"), ["jmp_customer_jid-test"] ) Customer::BLATHER.expect( :<<, nil, [Matching.new do |stanza| assert_equal "+15555550000@component/a", stanza.from.to_s assert_equal "test@example.com/b", stanza.to.to_s end] ) m = Blather::Stanza::Message.new m.from = "+15555550000@sgx/a" m.to = "customer_test@component/b" Customer.new("test").stanza_to(m).sync Customer::BLATHER.verify end em :test_stanza_to def test_stanza_from Customer::BLATHER.expect( :<<, nil, [Matching.new do |stanza| assert_equal "customer_test@component/a", stanza.from.to_s assert_equal "+15555550000@sgx/b", stanza.to.to_s end] ) m = Blather::Stanza::Message.new m.from = "test@example.com/a" m.to = "+15555550000@component/b" Customer.new("test").stanza_from(m) Customer::BLATHER.verify end def test_customer_usage_report report_for = (Date.today..(Date.today - 1)) report_for.first.downto(report_for.last).each.with_index do |day, idx| CustomerUsage::REDIS.expect( :zscore, EMPromise.resolve(idx), ["jmp_customer_outbound_messages-test", day.strftime("%Y%m%d")] ) end CustomerUsage::DB.expect( :query_defer, EMPromise.resolve([{ "day" => report_for.first, "minutes" => 123 }]), [String, ["test", report_for.first, report_for.last]] ) assert_equal( UsageReport.new( report_for, { Date.today => 0, (Date.today - 1) => 1 }, Date.today => 123 ), Customer.new("test").usage_report(report_for).sync ) end em :test_customer_usage_report def test_sip_account_new req = stub_request( :get, "https://api.catapult.inetwork.com/v1/users/" \ "catapult_user/domains/catapult_domain/endpoints?page=0&size=1000" ).with( headers: { "Authorization" => "Basic Y2F0YXB1bHRfdG9rZW46Y2F0YXB1bHRfc2VjcmV0" } ).to_return(status: 404) sip = Customer.new("test").sip_account.sync assert_kind_of SipAccount::New, sip assert_equal "test", sip.username assert_requested req end em :test_sip_account_new def test_sip_account_existing req1 = stub_request( :get, "https://api.catapult.inetwork.com/v1/users/" \ "catapult_user/domains/catapult_domain/endpoints?page=0&size=1000" ).with( headers: { "Authorization" => "Basic Y2F0YXB1bHRfdG9rZW46Y2F0YXB1bHRfc2VjcmV0" } ).to_return(status: 200, body: [ { name: "NOTtest", domainId: "domain", id: "endpoint" } ].to_json) req2 = stub_request( :get, "https://api.catapult.inetwork.com/v1/users/" \ "catapult_user/domains/catapult_domain/endpoints?page=1&size=1000" ).with( headers: { "Authorization" => "Basic Y2F0YXB1bHRfdG9rZW46Y2F0YXB1bHRfc2VjcmV0" } ).to_return(status: 200, body: [ { name: "test", domainId: "domain", id: "endpoint" } ].to_json) sip = Customer.new("test").sip_account.sync assert_kind_of SipAccount, sip assert_equal "test", sip.username assert_equal( "https://api.catapult.inetwork.com/v1/users/" \ "catapult_user/domains/domain/endpoints/endpoint", sip.url ) assert_requested req1 assert_requested req2 end em :test_sip_account_existing def test_sip_account_error stub_request( :get, "https://api.catapult.inetwork.com/v1/users/" \ "catapult_user/domains/catapult_domain/endpoints?page=0&size=1000" ).to_return(status: 400) assert_raises(RuntimeError) do Customer.new("test").sip_account.sync end end em :test_sip_account_error def test_btc_addresses Customer::REDIS.expect( :smembers, EMPromise.resolve(["testaddr"]), ["jmp_customer_btc_addresses-test"] ) assert_equal ["testaddr"], Customer.new("test").btc_addresses.sync assert_mock Customer::REDIS end em :test_btc_addresses def test_add_btc_address Customer::REDIS.expect( :spopsadd, EMPromise.resolve("testaddr"), [["jmp_available_btc_addresses", "jmp_customer_btc_addresses-test"]] ) assert_equal "testaddr", Customer.new("test").add_btc_address.sync assert_mock Customer::REDIS end em :test_add_btc_address end