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_for_feelinglucky
60 form = Blather::Stanza::X.new
61 form.fields = [
62 { var: "q", value: "" },
63 {
64 var: "http://jabber.org/protocol/commands#actions",
65 value: "feelinglucky"
66 }
67 ]
68 iris_query = TelSelections::ChooseTel::AvailableNumber
69 .for(form, db: FakeDB.new, memcache: FakeMemcache.new)
70 .instance_variable_get(:@iris_query)
71 assert_equal(
72 { areaCode: "810", enableTNDetail: true, LCA: false, quantity: 10 },
73 iris_query
74 )
75 end
76
77 def test_fallback
78 stub_request(
79 :get,
80 "https://dashboard.bandwidth.com/v1.0/accounts//availableNumbers" \
81 "?city=Kitchener-Waterloo&enableTNDetail=true&lCA=false&" \
82 "quantity=10&state=ON"
83 ).to_return(status: 200, body: "")
84
85 stub_request(
86 :get,
87 "https://geocoder.ca/?json=1&locate=Kitchener-Waterloo,%20ON"
88 ).to_return(status: 200, body: {
89 postal: "N2H", longt: 0, latt: 0
90 }.to_json)
91
92 stub_request(
93 :get,
94 "https://dashboard.bandwidth.com/v1.0/accounts//availableNumbers" \
95 "?areaCode=226&enableTNDetail=true&quantity=10"
96 ).to_return(status: 200, body: <<~XML)
97 <SearchResult>
98 <TelephoneNumberList>
99 <TelephoneNumber>
100 <FullNumber>22655512345</FullNumber>
101 <City>Somewhere</City>
102 <State>ON</State>
103 </TelephoneNumber>
104 </TelephoneNumberList>
105 </SearchResult>
106 XML
107
108 db = FakeDB.new(
109 ["CA", "POINT(0.0000000000 0.0000000000)", 3] =>
110 [{ "area_code" => "226" }]
111 )
112 form = Blather::Stanza::X.new
113 form.fields = [{ var: "q", value: "Kitchener, ON" }]
114 tns = execute_command do
115 TelSelections::ChooseTel::AvailableNumber
116 .for(form, db: db, memcache: FakeMemcache.new)
117 .tns
118 end
119 assert_equal(
120 ["(226) 555-12345 (Somewhere, ON)"],
121 tns.map(&:to_s)
122 )
123 end
124 em :test_fallback
125 end
126
127 class TnTest < Minitest::Test
128 def setup
129 @tn = TelSelections::ChooseTel::Tn.new(
130 full_number: "5551234567",
131 city: "Toronto",
132 state: "ON",
133 garbage: "stuff"
134 )
135 end
136
137 def test_to_s
138 assert_equal "(555) 123-4567 (Toronto, ON)", @tn.to_s
139 end
140
141 def test_tel
142 assert_equal "+15551234567", @tn.tel
143 end
144
145 def test_option
146 assert_equal(
147 Blather::Stanza::X::Field::Option.new(
148 label: "(555) 123-4567 (Toronto, ON)",
149 value: "+15551234567"
150 ),
151 @tn.option
152 )
153 end
154
155 def test_option_reference
156 ref = @tn.option.find("ns:reference", ns: "urn:xmpp:reference:0").first
157 assert_equal(
158 @tn.formatted_tel,
159 @tn.option.label[ref["begin"].to_i..ref["end"].to_i]
160 )
161 assert_equal "tel:+15551234567", ref["uri"]
162 end
163 end
164
165 class QTest < Minitest::Test
166 def test_for_area_code
167 q = TelSelections::ChooseTel::Q.for("226")
168 assert_equal({ areaCode: "226" }, q.iris_query)
169 end
170
171 def test_for_area_code_sql
172 q = TelSelections::ChooseTel::Q.for("226")
173 assert_equal(
174 ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+1226%"],
175 q.sql_query
176 )
177 end
178
179 def test_for_npanxx
180 q = TelSelections::ChooseTel::Q.for("226666")
181 assert_equal({ npaNxx: "226666" }, q.iris_query)
182 end
183
184 def test_for_npanxx_sql
185 q = TelSelections::ChooseTel::Q.for("226666")
186 assert_equal(
187 ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+1226666%"],
188 q.sql_query
189 )
190 end
191
192 def test_for_npanxxx
193 q = TelSelections::ChooseTel::Q.for("2266667")
194 assert_equal({ npaNxxx: "2266667" }, q.iris_query)
195 end
196
197 def test_for_npanxxx_sql
198 q = TelSelections::ChooseTel::Q.for("2266667")
199 assert_equal(
200 ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "+12266667%"],
201 q.sql_query
202 )
203 end
204
205 def test_for_zip
206 q = TelSelections::ChooseTel::Q.for("90210")
207 assert_equal({ zip: "90210" }, q.iris_query)
208 end
209
210 def test_for_zip_sql
211 q = TelSelections::ChooseTel::Q.for("90210")
212 refute q.sql_query
213 end
214
215 def test_for_localvanity
216 q = TelSelections::ChooseTel::Q.for("~mboa")
217 assert_equal({ localVanity: "mboa" }, q.iris_query)
218 end
219
220 def test_for_localvanity_sql
221 q = TelSelections::ChooseTel::Q.for("~mboa")
222 assert_equal(
223 ["SELECT * FROM tel_inventory WHERE tel LIKE ?", "%6262%"],
224 q.sql_query
225 )
226 end
227
228 def test_for_state
229 q = TelSelections::ChooseTel::Q.for("ON")
230 assert_equal({ state: "ON" }, q.iris_query)
231 end
232
233 def test_for_state_sql
234 q = TelSelections::ChooseTel::Q.for("ON")
235 assert_equal(
236 ["SELECT * FROM tel_inventory WHERE region = ?", "ON"],
237 q.sql_query
238 )
239 end
240
241 def test_for_state_name
242 q = TelSelections::ChooseTel::Q.for("ontario")
243 assert_equal({ state: "ON" }, q.iris_query)
244 end
245
246 def test_for_state_name_sql
247 q = TelSelections::ChooseTel::Q.for("ontario")
248 assert_equal(
249 ["SELECT * FROM tel_inventory WHERE region = ?", "ON"],
250 q.sql_query
251 )
252 end
253
254 def test_for_new_york
255 q = TelSelections::ChooseTel::Q.for("New York")
256 assert_equal({ state: "NY" }, q.iris_query)
257 end
258
259 def test_for_new_york_sql
260 q = TelSelections::ChooseTel::Q.for("New York")
261 assert_equal(
262 ["SELECT * FROM tel_inventory WHERE region = ?", "NY"],
263 q.sql_query
264 )
265 end
266
267 def test_for_new_york_ny
268 q = TelSelections::ChooseTel::Q.for(
269 "New York, NY",
270 db: FakeDB.new,
271 memcache: FakeMemcache.new
272 )
273 assert_equal({ city: "New York City", state: "NY" }, q.iris_query)
274 end
275
276 def test_for_new_york_ny_sql
277 q = TelSelections::ChooseTel::Q.for(
278 "New York, NY",
279 db: FakeDB.new,
280 memcache: FakeMemcache.new
281 )
282 assert_equal(
283 [
284 "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?",
285 "NY", "New York City"
286 ],
287 q.sql_query
288 )
289 end
290
291 def test_for_new_york_new_york
292 q = TelSelections::ChooseTel::Q.for(
293 "New York, New York",
294 db: FakeDB.new,
295 memcache: FakeMemcache.new
296 )
297 assert_equal({ city: "New York City", state: "NY" }, q.iris_query)
298 end
299
300 def test_for_new_york_new_york_sql
301 q = TelSelections::ChooseTel::Q.for(
302 "New York, New York",
303 db: FakeDB.new,
304 memcache: FakeMemcache.new
305 )
306 assert_equal(
307 [
308 "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?",
309 "NY", "New York City"
310 ],
311 q.sql_query
312 )
313 end
314
315 def test_for_citystate
316 q = TelSelections::ChooseTel::Q.for(
317 "Toronto, ON",
318 db: FakeDB.new,
319 memcache: FakeMemcache.new
320 )
321 assert_equal({ city: "Toronto", state: "ON" }, q.iris_query)
322 end
323
324 def test_for_citystate_sql
325 q = TelSelections::ChooseTel::Q.for(
326 "Toronto, ON",
327 db: FakeDB.new,
328 memcache: FakeMemcache.new
329 )
330 assert_equal(
331 [
332 "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?",
333 "ON", "Toronto"
334 ],
335 q.sql_query
336 )
337 end
338
339 def test_for_citystate_name
340 q = TelSelections::ChooseTel::Q.for(
341 "Toronto, Ontario",
342 db: FakeDB.new,
343 memcache: FakeMemcache.new
344 )
345 assert_equal({ city: "Toronto", state: "ON" }, q.iris_query)
346 end
347
348 def test_for_citystate_name_sql
349 q = TelSelections::ChooseTel::Q.for(
350 "Toronto, Ontario",
351 db: FakeDB.new,
352 memcache: FakeMemcache.new
353 )
354 assert_equal(
355 [
356 "SELECT * FROM tel_inventory WHERE region = ? AND locality = ?",
357 "ON", "Toronto"
358 ],
359 q.sql_query
360 )
361 end
362
363 def test_for_garbage
364 assert_raises { TelSelections::ChooseTel::Q.for("garbage") }
365 end
366 end
367end