test_badwords.rb

 1# frozen_string_literal: true
 2
 3require "test_helper"
 4require_relative "../../sgx-bwmsgsv2"
 5require "rantly/minitest_extensions"
 6require_relative "rantly_extensions/data_extensions"
 7
 8class BadwordsPropertyTest < Minitest::Test
 9	def setup
10		reset_stanzas!
11		reset_redis!
12	end
13
14	def test_message_containing_badword_is_rejected
15		property_of {
16			bad_word = choose(*BADWORD_LIST)
17			cased = choose(bad_word.downcase, bad_word.upcase, bad_word.capitalize)
18
19			prefix = array(range(0, 4)) { sized(range(3, 8)) { string(:alnum) } }
20			suffix = array(range(0, 4)) { sized(range(3, 8)) { string(:alnum) } }
21			body = (prefix + [cased] + suffix).join(" ")
22
23			dest = nanpa_phone
24			[body, dest]
25		}.check { |body, dest|
26			reset_stanzas!
27			reset_redis!
28
29			stub_request(:post, BW_MESSAGES_URL).to_return(
30				status: 201,
31				body: JSON.dump(id: "bw-msg-stub")
32			)
33
34			m = Blather::Stanza::Message.new("#{dest}@component", body)
35			m.from = "test@example.com"
36			process_stanza(m)
37
38			assert_equal 1, written.length,
39			             "Expected exactly one error stanza for body: #{body.inspect}"
40
41			stanza = Blather::XMPPNode.parse(written.first.to_xml)
42			assert stanza.error?,
43			       "Expected error stanza for body: #{body.inspect}"
44
45			error = stanza.find_first("error")
46			assert_equal "wait", error["type"],
47			             "Expected error type 'wait' for body: #{body.inspect}"
48			assert_equal "recipient-unavailable", xmpp_error_name(error),
49			             "Expected 'recipient-unavailable' for body: #{body.inspect}"
50		}
51	end
52	em :test_message_containing_badword_is_rejected
53
54	def test_message_without_badwords_is_not_rejected_as_unavailable
55		property_of {
56			dest = nanpa_phone
57			[message_body, dest]
58		}.check { |body, dest|
59			reset_stanzas!
60			reset_redis!
61
62			stub_request(:post, BW_MESSAGES_URL).to_return(
63				status: 201,
64				body: JSON.dump(id: "bw-msg-stub")
65			)
66
67			m = Blather::Stanza::Message.new("#{dest}@component", body)
68			m.from = "test@example.com"
69			process_stanza(m)
70
71			written.each do |response|
72				stanza = Blather::XMPPNode.parse(response.to_xml)
73				next unless stanza.error?
74
75				error = stanza.find_first("error")
76				msg = "Clean message rejected as " \
77					"recipient-unavailable: #{body.inspect}"
78				refute_equal "recipient-unavailable",
79				             xmpp_error_name(error), msg
80			end
81		}
82	end
83	em :test_message_without_badwords_is_not_rejected_as_unavailable
84end