1# frozen_string_literal: true
2
3require "test_helper"
4require_relative "../../sgx-bwmsgsv2"
5require "rantly/minitest_extensions"
6require_relative "generators/port_out_pin_cmd"
7
8def panic(e)
9 $panic = e
10end
11
12class PortOutPinPropertyTest < Minitest::Test
13 def setup
14 reset_stanzas!
15 reset_redis!
16 end
17
18 def test_execute_returns_form_for_registered_user
19 property_of {
20 PortOutPinExecuteCmd.new(REDIS).generate
21 }.check { |_metadata, example|
22 process_stanza(example['stanza'])
23
24 assert_equal 1, written.length
25 reply = written.shift
26
27 assert_equal example['jid'], reply.to.to_s
28 assert_equal :executing, reply.status
29 assert_equal 'set-port-out-pin', reply.node
30
31 vars = reply.form.fields.map(&:var)
32 assert_includes vars, 'pin'
33 assert_includes vars, 'confirm_pin'
34 }
35 end
36 em :test_execute_returns_form_for_registered_user
37
38 def test_execute_rejects_unregistered_user
39 property_of {
40 PortOutPinExecuteCmd
41 .new(REDIS)
42 .redis_state { |_jid, _phone| @redis.reset! }
43 .generate
44 }.check { |_metadata, example|
45 process_stanza(example['stanza'])
46
47 assert_equal 1, written.length
48 reply = written.shift
49 assert_kind_of Blather::StanzaError, reply
50 assert_equal :auth, reply.type
51 assert_equal :registration_required, reply.name
52 }
53 end
54 em :test_execute_rejects_unregistered_user
55
56 def test_complete_success_sets_pin
57 property_of {
58 PortOutPinCompleteCmd.new(REDIS).generate
59 }.check { |_metadata, example|
60 BandwidthTNOptions.stub(
61 :set_port_out_pin,
62 EMPromise.resolve(nil)
63 ) do
64 process_stanza(example['stanza'])
65 end
66
67 assert_equal 1, written.length
68 reply = written.shift
69
70 assert_equal example['jid'], reply.to.to_s
71 assert_equal :completed, reply.status
72 assert_equal 'set-port-out-pin', reply.node
73 ns = 'http://jabber.org/protocol/commands'
74 note = reply.find('.//ns:note', ns: ns).first
75 assert_equal 'info', note[:type]
76 assert_equal 'Port-out PIN has been set successfully.', note.content
77 }
78 end
79 em :test_complete_success_sets_pin
80
81 def test_complete_nil_pin_returns_error
82 property_of {
83 PortOutPinCompleteCmd
84 .new(REDIS)
85 .pin {
86 choose(true, false) ? nil : sized(range(4, 10)) { string(:alnum) }
87 }
88 .confirm_pin { |pin|
89 pin.nil? ? choose(nil, sized(range(4, 10)) { string(:alnum) }) : nil
90 }
91 .stanza { |jid, sid, pin, cpin|
92 cmd = Blather::Stanza::Iq::Command.new
93 cmd.type = :set
94 cmd.to = 'component'
95 cmd.node = 'set-port-out-pin'
96 cmd.sessionid = sid
97 cmd.action = :complete
98 cmd.from = jid
99 cmd.form.type = :submit
100
101 fields = []
102 if pin
103 fields << { var: 'pin', value: pin }
104 elsif choose(true, false)
105 fields << { var: 'pin', value: nil }
106 end
107 if cpin
108 fields << { var: 'confirm_pin', value: cpin }
109 elsif choose(true, false)
110 fields << { var: 'confirm_pin', value: nil }
111 end
112 cmd.form.fields = fields unless fields.empty?
113 cmd
114 }
115 .generate
116 }.check { |_metadata, example|
117 process_stanza(example['stanza'])
118
119 assert_equal 1, written.length
120 reply = written.shift
121 assert_kind_of Blather::StanzaError, reply
122 assert_equal :modify, reply.type
123 assert_equal :bad_request, reply.name
124 }
125 end
126 em :test_complete_nil_pin_returns_error
127
128 def test_complete_mismatched_pins_returns_error
129 property_of {
130 PortOutPinCompleteCmd
131 .new(REDIS)
132 .confirm_pin { |_pin|
133 sized(range(4, 10)) { string(:alnum) } + "X"
134 }
135 .generate
136 }.check { |_metadata, example|
137 process_stanza(example['stanza'])
138
139 assert_equal 1, written.length
140 reply = written.shift
141 assert_kind_of Blather::StanzaError, reply
142 assert_equal :modify, reply.type
143 assert_equal :bad_request, reply.name
144 }
145 end
146 em :test_complete_mismatched_pins_returns_error
147
148 def test_complete_invalid_pin_format_returns_error
149 property_of {
150 PortOutPinCompleteCmd
151 .new(REDIS)
152 .pin { choose("ab", "a" * 11, "pin!@#") }
153 .confirm_pin { |pin| pin }
154 .generate
155 }.check { |_metadata, example|
156 process_stanza(example['stanza'])
157
158 assert_equal 1, written.length
159 reply = written.shift
160 assert_kind_of Blather::StanzaError, reply
161 assert_equal :modify, reply.type
162 assert_equal :bad_request, reply.name
163 }
164 end
165 em :test_complete_invalid_pin_format_returns_error
166end