@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+require "jennifer"
+require_relative "../rantly_extensions/data_extensions"
+
+class PortOutPinExecuteCmd
+ # @param redis [FakeRedis]
+ def initialize(redis)
+ @redis = redis
+ end
+
+ include Jennifer.rant(self) {
+ jid { bare_jid }
+ phone(transient: true) { nanpa_phone }
+
+ stanza derived_from(:jid) do |jid|
+ cmd = Blather::Stanza::Iq::Command.new
+ cmd.type = :set
+ cmd.to = 'component'
+ cmd.node = 'set-port-out-pin'
+ cmd.action = :execute
+ cmd.from = jid
+ cmd
+ end
+
+ redis_state derived_from(:jid, :phone), transient: true do |jid, phone|
+ @redis.reset!
+ @redis.rpush("catapult_cred-#{jid}", 'acct', 'token', 'secret', phone)
+ end
+
+ written_state(transient: true) {
+ SGXbwmsgsv2.instance_variable_set(:@written, [])
+ }
+ }
+end
+
+class PortOutPinCompleteCmd
+ # @param redis [FakeRedis]
+ def initialize(redis)
+ @redis = redis
+ end
+
+ include Jennifer.rant(self) {
+ jid { bare_jid }
+ phone(transient: true) { nanpa_phone }
+ pin { sized(range(4, 10)) { string(:alnum) } }
+ confirm_pin derived_from(:pin) { |pin| pin }
+ sessionid { SecureRandom.uuid }
+
+ stanza derived_from(:jid, :sessionid, :pin, :confirm_pin) do |jid, sid, pin, cpin|
+ cmd = Blather::Stanza::Iq::Command.new
+ cmd.type = :set
+ cmd.to = 'component'
+ cmd.node = 'set-port-out-pin'
+ cmd.sessionid = sid
+ cmd.action = :complete
+ cmd.from = jid
+ cmd.form.type = :submit
+ cmd.form.fields = [
+ { var: 'pin', value: pin },
+ { var: 'confirm_pin', value: cpin }
+ ]
+ cmd
+ end
+
+ redis_state derived_from(:jid, :phone), transient: true do |jid, phone|
+ @redis.reset!
+ @redis.rpush("catapult_cred-#{jid}", 'acct', 'token', 'secret', phone)
+ end
+
+ written_state(transient: true) {
+ SGXbwmsgsv2.instance_variable_set(:@written, [])
+ }
+ }
+end
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require "test_helper"
+require_relative "../../sgx-bwmsgsv2"
+require "rantly/minitest_extensions"
+require_relative "generators/port_out_pin_cmd"
+
+def panic(e)
+ $panic = e
+end
+
+class PortOutPinPropertyTest < Minitest::Test
+ def setup
+ reset_stanzas!
+ reset_redis!
+ end
+
+ def test_execute_returns_form_for_registered_user
+ property_of {
+ PortOutPinExecuteCmd.new(REDIS).generate
+ }.check { |_metadata, example|
+ process_stanza(example['stanza'])
+
+ assert_equal 1, written.length
+ reply = written.shift
+
+ assert_equal example['jid'], reply.to.to_s
+ assert_equal :executing, reply.status
+ assert_equal 'set-port-out-pin', reply.node
+
+ vars = reply.form.fields.map(&:var)
+ assert_includes vars, 'pin'
+ assert_includes vars, 'confirm_pin'
+ }
+ end
+ em :test_execute_returns_form_for_registered_user
+end