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