test_tel_selections.rb

  1# frozen_string_literal: true
  2
  3require "test_helper"
  4require "tel_selections"
  5
  6class TelSelectionsTest < Minitest::Test
  7	def setup
  8		@manager = TelSelections.new(
  9			redis: FakeRedis.new,
 10			db: FakeDB.new,
 11			memcache: FakeMemcache.new
 12		)
 13	end
 14
 15	def test_set_get
 16		assert_kind_of TelSelections::ChooseTel, @manager["jid@example.com"].sync
 17		@manager.set("jid@example.com", "+15555550000").sync
 18		assert_kind_of TelSelections::HaveTel, @manager["jid@example.com"].sync
 19	end
 20	em :test_set_get
 21
 22	def test_choose_tel_have_tel
 23		jid = "jid@example.com"
 24		@manager.set(jid, "+15555550000").sync
 25		assert_equal "+15555550000", @manager[jid].then(&:choose_tel).sync
 26	end
 27	em :test_choose_tel_have_tel
 28
 29	class AvailableNumberTest < Minitest::Test
 30		def test_for_no_rsm
 31			form = Blather::Stanza::X.new
 32			form.fields = [{ var: "q", value: "226" }]
 33			iris_query = TelSelections::ChooseTel::AvailableNumber
 34				.for(form, db: FakeDB.new, memcache: FakeMemcache.new)
 35				.instance_variable_get(:@iris_query)
 36			assert_equal(
 37				{ areaCode: "226", enableTNDetail: true, LCA: false, quantity: 10 },
 38				iris_query
 39			)
 40		end
 41
 42		def test_for_rsm
 43			form = Blather::Stanza::X.new
 44			form.fields = [{ var: "q", value: "226" }]
 45			Nokogiri::XML::Builder.with(form) do
 46				set(xmlns: "http://jabber.org/protocol/rsm") do
 47					max 500
 48				end
 49			end
 50			iris_query = TelSelections::ChooseTel::AvailableNumber
 51				.for(form, db: FakeDB.new, memcache: FakeMemcache.new)
 52				.instance_variable_get(:@iris_query)
 53			assert_equal(
 54				{ areaCode: "226", enableTNDetail: true, LCA: false, quantity: 500 },
 55				iris_query
 56			)
 57		end
 58
 59		def test_fallback
 60			stub_request(
 61				:get,
 62				"https://dashboard.bandwidth.com/v1.0/accounts//availableNumbers" \
 63				"?city=Kitchener-Waterloo&enableTNDetail=true&lCA=false&" \
 64				"quantity=10&state=ON"
 65			).to_return(status: 200, body: "")
 66
 67			stub_request(
 68				:get,
 69				"https://geocoder.ca/?json=1&locate=Kitchener-Waterloo,%20ON"
 70			).to_return(status: 200, body: {
 71				postal: "N2H", longt: 0, latt: 0
 72			}.to_json)
 73
 74			stub_request(
 75				:get,
 76				"https://dashboard.bandwidth.com/v1.0/accounts//availableNumbers" \
 77				"?areaCode=226&enableTNDetail=true&quantity=10"
 78			).to_return(status: 200, body: <<~XML)
 79				<SearchResult>
 80					<TelephoneNumberList>
 81						<TelephoneNumber>
 82							<FullNumber>22655512345</FullNumber>
 83							<City>Somewhere</City>
 84							<State>ON</State>
 85						</TelephoneNumber>
 86					</TelephoneNumberList>
 87				</SearchResult>
 88			XML
 89
 90			db = FakeDB.new(
 91				["CA", "POINT(0.0000000000 0.0000000000)", 3] =>
 92					[{ "area_code" => "226" }]
 93			)
 94			form = Blather::Stanza::X.new
 95			form.fields = [{ var: "q", value: "Kitchener, ON" }]
 96			tns = execute_command do
 97				TelSelections::ChooseTel::AvailableNumber
 98					.for(form, db: db, memcache: FakeMemcache.new)
 99					.tns
100			end
101			assert_equal(
102				["(226) 555-12345 (Somewhere, ON)"],
103				tns.map(&:to_s)
104			)
105		end
106		em :test_fallback
107	end
108
109	class TnTest < Minitest::Test
110		def setup
111			@tn = TelSelections::ChooseTel::Tn.new(
112				full_number: "5551234567",
113				city: "Toronto",
114				state: "ON",
115				garbage: "stuff"
116			)
117		end
118
119		def test_to_s
120			assert_equal "(555) 123-4567 (Toronto, ON)", @tn.to_s
121		end
122
123		def test_tel
124			assert_equal "+15551234567", @tn.tel
125		end
126
127		def test_option
128			assert_equal(
129				Blather::Stanza::X::Field::Option.new(
130					label: "(555) 123-4567 (Toronto, ON)",
131					value: "+15551234567"
132				),
133				@tn.option
134			)
135		end
136
137		def test_option_reference
138			ref = @tn.option.find("ns:reference", ns: "urn:xmpp:reference:0").first
139			assert_equal(
140				@tn.formatted_tel,
141				@tn.option.label[ref["begin"].to_i..ref["end"].to_i]
142			)
143			assert_equal "tel:+15551234567", ref["uri"]
144		end
145	end
146
147	class QTest < Minitest::Test
148		def test_for_area_code
149			q = TelSelections::ChooseTel::Q.for("226")
150			assert_equal({ areaCode: "226" }, q.iris_query)
151		end
152
153		def test_for_npanxx
154			q = TelSelections::ChooseTel::Q.for("226666")
155			assert_equal({ npaNxx: "226666" }, q.iris_query)
156		end
157
158		def test_for_npanxxx
159			q = TelSelections::ChooseTel::Q.for("2266667")
160			assert_equal({ npaNxxx: "2266667" }, q.iris_query)
161		end
162
163		def test_for_zip
164			q = TelSelections::ChooseTel::Q.for("90210")
165			assert_equal({ zip: "90210" }, q.iris_query)
166		end
167
168		def test_for_localvanity
169			q = TelSelections::ChooseTel::Q.for("~mboa")
170			assert_equal({ localVanity: "mboa" }, q.iris_query)
171		end
172
173		def test_for_state
174			q = TelSelections::ChooseTel::Q.for("ON")
175			assert_equal({ state: "ON" }, q.iris_query)
176		end
177
178		def test_for_citystate
179			q = TelSelections::ChooseTel::Q.for(
180				"Toronto, ON",
181				db: FakeDB.new,
182				memcache: FakeMemcache.new
183			)
184			assert_equal({ city: "Toronto", state: "ON" }, q.iris_query)
185		end
186
187		def test_for_garbage
188			assert_raises { TelSelections::ChooseTel::Q.for("garbage") }
189		end
190	end
191end