diff --git a/sgx-bwmsgsv2.rb b/sgx-bwmsgsv2.rb index 5a86b2292a547a7a33d5992beaaaacfde19844da..d6d9caf9998ab0fe0854b5f9b0f30eb7d0df4c33 100755 --- a/sgx-bwmsgsv2.rb +++ b/sgx-bwmsgsv2.rb @@ -493,7 +493,7 @@ module SGXbwmsgsv2 ) )), {'Content-Type' => 'application/json'}, - [201] + [201, 202] ).then { |response| parsed = JSON.parse(response) rescue {} MessageEvent::Out.new( diff --git a/test/property/rantly_extensions/data_extensions.rb b/test/property/rantly_extensions/data_extensions.rb index 0ec846a50331fe2d58c5713f837d8aa04be13b07..e4cc7a8c7e1acbe7cb8bf75d21768982d20f1b8b 100644 --- a/test/property/rantly_extensions/data_extensions.rb +++ b/test/property/rantly_extensions/data_extensions.rb @@ -90,6 +90,19 @@ class Rantly range(10000, 999999).to_s end + # @return [Array] + HTTP_ESCAPABLE = " &=?/+@#".chars.freeze + + # @return [String] + def maybe_http_escapable_string + base = sized(range(3, 8)) { string(:alnum) } + choose( + base, + base + choose(*HTTP_ESCAPABLE) + + sized(range(1, 5)) { string(:alnum) } + ) + end + # @return [String] def media_url user_id = sized(range(3, 10)) { string(:alnum) } diff --git a/test/property/test_to_catapult.rb b/test/property/test_to_catapult.rb new file mode 100644 index 0000000000000000000000000000000000000000..4d65eec1cd187e6f4c85ecb4fc659d43adbd8e68 --- /dev/null +++ b/test/property/test_to_catapult.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require "test_helper" +require_relative "../../sgx-bwmsgsv2" +require "rantly/minitest_extensions" +require_relative "rantly_extensions/data_extensions" + +class ToCatapultPropertyTest < Minitest::Test + def test_accepts_201_and_202_with_escaped_tag + property_of { + dest = nanpa_phone + guard(dest != "+15550000000") + + words = array(range(1, 4)) { sized(range(3, 8)) { string(:alnum) } } + guard(words.none? { |w| BADWORD_LIST.include?(w.downcase) }) + body = words.join(" ") + + stanza_id = maybe_http_escapable_string + resource = maybe_http_escapable_string + status = choose(201, 202) + + [dest, body, stanza_id, resource, status] + }.check { |dest, body, stanza_id, resource, status| + reset_stanzas! + reset_redis! + WebMock.reset! + + bw_request_body = nil + bw_req = stub_request(:post, BW_MESSAGES_URL).to_return { |request| + bw_request_body = JSON.parse(request.body) + { + status: status, + body: JSON.dump(id: "bw-msg-id", time: Time.now.iso8601) + } + } + + m = Blather::Stanza::Message.new("#{dest}@component", body) + m.from = "test@example.com/#{resource}" + m.id = stanza_id + + process_stanza(m) + + expected_tag = WEBrick::HTTPUtils.escape(stanza_id) + + " " + + WEBrick::HTTPUtils.escape(resource) + assert_equal expected_tag, bw_request_body["tag"], + "Tag should be HTTP-escaped (status=#{status})" + + assert_requested bw_req + + written.each do |response| + stanza = Blather::XMPPNode.parse(response.to_xml) + refute stanza.error?, + "Expected success for status #{status} but got error" + end + } + end + em :test_accepts_201_and_202_with_escaped_tag +end