From d4d2317f5c7f836ce0a7a31d7bd0ec905359dc9a Mon Sep 17 00:00:00 2001 From: Karl Lingiah Date: Fri, 8 Dec 2023 17:20:50 +0000 Subject: [PATCH] DEVX-7324: Add Number Insight v2 (#299) * Implementing NumberInsight2 --- lib/vonage/client.rb | 7 ++++ lib/vonage/number_insight_2.rb | 36 ++++++++++++++++ lib/vonage/verify2.rb | 6 +-- test/vonage/client_test.rb | 4 ++ test/vonage/number_insight_2_test.rb | 63 ++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 lib/vonage/number_insight_2.rb create mode 100644 test/vonage/number_insight_2_test.rb diff --git a/lib/vonage/client.rb b/lib/vonage/client.rb index 199fd77a..e42042c0 100644 --- a/lib/vonage/client.rb +++ b/lib/vonage/client.rb @@ -89,6 +89,13 @@ def number_insight @number_insight ||= T.let(NumberInsight.new(config), T.nilable(Vonage::NumberInsight)) end + # @return [NumberInsight2] + # + sig { returns(T.nilable(Vonage::NumberInsight2)) } + def number_insight_2 + @number_insight_2 ||= T.let(NumberInsight2.new(config), T.nilable(Vonage::NumberInsight2)) + end + # @return [Numbers] # sig { returns(T.nilable(Vonage::Numbers)) } diff --git a/lib/vonage/number_insight_2.rb b/lib/vonage/number_insight_2.rb new file mode 100644 index 00000000..d80536cc --- /dev/null +++ b/lib/vonage/number_insight_2.rb @@ -0,0 +1,36 @@ +# typed: strict +# frozen_string_literal: true + +module Vonage + class NumberInsight2 < Namespace + extend T::Sig + + self.authentication = Basic + + self.request_body = JSON + + # Make fraud check requests with a phone number by looking up fraud score and/or by checking sim swap status. + # + # @example + # response = client.number_insight_2.fraud_check(type: 'phone', phone: '447900000000', insights: ['fraud_score']) + # + # @param [required, String] :type The type of number to check. + # Accepted value is “phone” when a phone number is provided. + # + # @param [required, String] :phone A single phone number that you need insight about in the E.164 format. + # + # @param [required, Array] :insights An array of strings indicating the fraud check insights required for the number. + # Must be least one of: `fraud_score`, `sim_swap` + # + # @return [Response] + # + # @see https://developer.vonage.com/en/api/number-insight.v2#fraud_check + # + sig { params(type: String, phone: String, insights: T::Array[String]).returns(Vonage::Response) } + def fraud_check(type:, phone:, insights:) + raise ArgumentError.new("`insights` must not be an empty") if insights.empty? + + request('/v2/ni', params: {type: type, phone: phone, insights: insights}, type: Post) + end + end +end diff --git a/lib/vonage/verify2.rb b/lib/vonage/verify2.rb index 60e81891..a383f567 100644 --- a/lib/vonage/verify2.rb +++ b/lib/vonage/verify2.rb @@ -10,7 +10,7 @@ class Verify2 < Namespace # Request a verification be sent to a user. # # @example - # verification_request = verify.start_verification( + # verification_request = client.verify2.start_verification( # brand: 'Acme', # workflow: [{channel: 'sms', to: '447000000000'}], # code_length: 6 @@ -41,7 +41,7 @@ def start_verification(brand:, workflow:, **opts) # Check a supplied code against a request to see if it is valid. # # @example - # code_check = verify.check_code(request_id: '7e8c5965-0a3f-44df-8a14-f1486209d8a2', code: '1234') + # code_check = client.verify2.check_code(request_id: '7e8c5965-0a3f-44df-8a14-f1486209d8a2', code: '1234') # # @param [required, String] :request_id The request_id of the verification request being checked # @@ -56,7 +56,7 @@ def check_code(request_id:, code:) # Cancel a verifiction. If a verification request is still active, calling this method aborts the workflow. # # @example - # verify.cancel_verification_request(request_id: '7e8c5965-0a3f-44df-8a14-f1486209d8a2') + # client.verify2.cancel_verification_request(request_id: '7e8c5965-0a3f-44df-8a14-f1486209d8a2') # # @param [required, String] :request_id The request_id of the verification request to be cancelled # diff --git a/test/vonage/client_test.rb b/test/vonage/client_test.rb index 29e38b31..819eb897 100644 --- a/test/vonage/client_test.rb +++ b/test/vonage/client_test.rb @@ -54,6 +54,10 @@ def test_number_insight_method assert_kind_of Vonage::NumberInsight, client.number_insight end + def test_number_insight_2_method + assert_kind_of Vonage::NumberInsight2, client.number_insight_2 + end + def test_numbers_method assert_kind_of Vonage::Numbers, client.numbers end diff --git a/test/vonage/number_insight_2_test.rb b/test/vonage/number_insight_2_test.rb new file mode 100644 index 00000000..f40e26d1 --- /dev/null +++ b/test/vonage/number_insight_2_test.rb @@ -0,0 +1,63 @@ +# typed: false +require_relative './test' + +class Vonage::NumberInsight2Test < Vonage::Test + def number_insight_2 + Vonage::NumberInsight2.new(config) + end + + def uri + 'https://api.nexmo.com/v2/ni' + end + + def number + '447700900000' + end + + def test_fraud_check_method + params = {type: 'phone', phone: number, insights: ['fraud_score', 'sim_swap']} + stub_request(:post, uri).with(body: params).to_return(response) + + assert_kind_of Vonage::Response, number_insight_2.fraud_check(**params) + end + + def test_fraud_check_method_without_type + params = {phone: number, insights: ['fraud_score', 'sim_swap']} + + assert_raises ArgumentError do + number_insight_2.fraud_check(**params) + end + end + + def test_fraud_check_method_without_phone + params = {type: 'phone', insights: ['fraud_score', 'sim_swap']} + + assert_raises ArgumentError do + number_insight_2.fraud_check(**params) + end + end + + def test_fraud_check_method_without_insights + params = {type: 'phone', phone: number} + + assert_raises ArgumentError do + number_insight_2.fraud_check(**params) + end + end + + def test_fraud_check_method_with_insights_not_an_array + params = {type: 'phone', phone: number, insights: 'fraud_score'} + + assert_raises TypeError do + number_insight_2.fraud_check(**params) + end + end + + def test_fraud_check_method_with_insights_an_empty_array + params = {type: 'phone', phone: number, insights: []} + + assert_raises ArgumentError do + number_insight_2.fraud_check(**params) + end + end +end