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