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