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_npanxx
172 q = TelSelections::ChooseTel::Q.for("226666")
173 assert_equal({ npaNxx: "226666" }, q.iris_query)
174 end
175
176 def test_for_npanxxx
177 q = TelSelections::ChooseTel::Q.for("2266667")
178 assert_equal({ npaNxxx: "2266667" }, q.iris_query)
179 end
180
181 def test_for_zip
182 q = TelSelections::ChooseTel::Q.for("90210")
183 assert_equal({ zip: "90210" }, q.iris_query)
184 end
185
186 def test_for_localvanity
187 q = TelSelections::ChooseTel::Q.for("~mboa")
188 assert_equal({ localVanity: "mboa" }, q.iris_query)
189 end
190
191 def test_for_state
192 q = TelSelections::ChooseTel::Q.for("ON")
193 assert_equal({ state: "ON" }, q.iris_query)
194 end
195
196 def test_for_state_name
197 q = TelSelections::ChooseTel::Q.for("ontario")
198 assert_equal({ state: "ON" }, q.iris_query)
199 end
200
201 def test_for_new_york
202 q = TelSelections::ChooseTel::Q.for("New York")
203 assert_equal({ state: "NY" }, q.iris_query)
204 end
205
206 def test_for_new_york_ny
207 q = TelSelections::ChooseTel::Q.for(
208 "New York, NY",
209 db: FakeDB.new,
210 memcache: FakeMemcache.new
211 )
212 assert_equal({ city: "New York City", state: "NY" }, q.iris_query)
213 end
214
215 def test_for_new_york_new_york
216 q = TelSelections::ChooseTel::Q.for(
217 "New York, New York",
218 db: FakeDB.new,
219 memcache: FakeMemcache.new
220 )
221 assert_equal({ city: "New York City", state: "NY" }, q.iris_query)
222 end
223
224 def test_for_citystate
225 q = TelSelections::ChooseTel::Q.for(
226 "Toronto, ON",
227 db: FakeDB.new,
228 memcache: FakeMemcache.new
229 )
230 assert_equal({ city: "Toronto", state: "ON" }, q.iris_query)
231 end
232
233 def test_for_citystate_name
234 q = TelSelections::ChooseTel::Q.for(
235 "Toronto, Ontario",
236 db: FakeDB.new,
237 memcache: FakeMemcache.new
238 )
239 assert_equal({ city: "Toronto", state: "ON" }, q.iris_query)
240 end
241
242 def test_for_garbage
243 assert_raises { TelSelections::ChooseTel::Q.for("garbage") }
244 end
245 end
246end