fix undefined method 'catch_after' in Q.for

Phillip Davis created

problem was that AvailableNumber.for sometimes returned a promise,
sometimes not, causing us to try to call `catch_after` on a Tn

Change summary

lib/tel_selections.rb       | 13 ++++++++-----
test/test_tel_selections.rb | 31 +++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 5 deletions(-)

Detailed changes

lib/tel_selections.rb 🔗

@@ -127,16 +127,19 @@ class TelSelections
 		end
 
 		class AvailableNumber
+			# @return [EMPromise]
+			# @note You should assume that this method will throw an NPE
+			#	or another error of similar severity if it returns a non-promise
 			def self.for(form, **kwargs)
 				qs = form.field("q")&.value.to_s.strip
-				return Tn.for_pending_value(qs) if qs =~ /\A\+1\d{10}\Z/
+				if qs =~ /\A\+1\d{10}\Z/
+					return EMPromise.resolve(Tn.for_pending_value(qs))
+				end
 
 				Q.for(feelinglucky(qs, form), **kwargs).then do |q|
 					new(
-						q.iris_query
-						&.merge(enableTNDetail: true, LCA: false),
-						q.sql_query, Quantity.for(form),
-						fallback: q.fallback, **kwargs
+						q.iris_query&.merge(enableTNDetail: true, LCA: false),
+						q.sql_query, Quantity.for(form), fallback: q.fallback, **kwargs
 					)
 				end
 			end

test/test_tel_selections.rb 🔗

@@ -175,6 +175,37 @@ class TelSelectionsTest < Minitest::Test
 			)
 		end
 		em :test_local_inventory
+
+		def test_local_inventory_whole_number_query
+			stub_request(
+				:get,
+				"https://dashboard.bandwidth.com/v1.0/accounts//availableNumbers" \
+					"?city=Kitchener-Waterloo&enableTNDetail=true&lCA=false&" \
+					"quantity=10&state=ON"
+			).to_return(status: 200, body: "")
+
+			db = FakeDB.new(
+				["ON", "Kitchener-Waterloo"] => [{
+					"tel" => "+122655512345",
+					"region" => "ON",
+					"locality" => "Kitchener-Waterloo"
+				}]
+			)
+			form = Blather::Stanza::X.new
+			form.fields = [{ var: "q", value: "+12265551234" }]
+			tn = execute_command do
+				TelSelections::ChooseTel::AvailableNumber
+					.for(
+						form,
+						redis: FakeRedis.new, db: db, memcache: FakeMemcache.new
+					).sync
+			end
+			assert_equal(
+				"+12265551234",
+				tn.tel
+			)
+		end
+		em :test_local_inventory_whole_number_query
 	end
 
 	class TnOptionTest < Minitest::Test