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			words = array(range(1, 6)) { sized(range(3, 10)) { string(:alnum) } }
57			guard(words.none? { |w| BADWORD_LIST.include?(w.downcase) })
58			body = words.join(" ")
59
60			dest = nanpa_phone
61			[body, dest]
62		}.check { |body, dest|
63			reset_stanzas!
64			reset_redis!
65
66			stub_request(:post, BW_MESSAGES_URL).to_return(
67				status: 201,
68				body: JSON.dump(id: "bw-msg-stub")
69			)
70
71			m = Blather::Stanza::Message.new("#{dest}@component", body)
72			m.from = "test@example.com"
73			process_stanza(m)
74
75			written.each do |response|
76				stanza = Blather::XMPPNode.parse(response.to_xml)
77				next unless stanza.error?
78
79				error = stanza.find_first("error")
80				msg = "Clean message rejected as " \
81					"recipient-unavailable: #{body.inspect}"
82				refute_equal "recipient-unavailable",
83				             xmpp_error_name(error), msg
84			end
85		}
86	end
87	em :test_message_without_badwords_is_not_rejected_as_unavailable
88end