# frozen_string_literal: true

require "test_helper"
require_relative "../../sgx-bwmsgsv2"
require "rantly/minitest_extensions"
require_relative "rantly_extensions/data_extensions"

class WhisperDisabledPropertyTest < Minitest::Test
	REGEXP_EXAMPLES_OPTS = {
		max_group_results: 10,
		max_repeater_variance: 10
	}.freeze

	def setup
		reset_stanzas!
		reset_redis!
	end

	def test_message_from_whisper_number_is_rejected
		property_of {
			words = array(range(1, 6)) { sized(range(3, 10)) { string(:alnum) } }
			guard(words.none? { |w| BADWORD_LIST.include?(w.downcase) })
			body = words.join(" ")

			usern = WHISPER_NUMBER.random_example(**REGEXP_EXAMPLES_OPTS)
			dest = nanpa_phone
			[body, dest, usern]
		}.check { |body, dest, usern|
			reset_stanzas!
			reset_redis!(tn: usern)
			WebMock.reset!

			process_stanza(build_outbound_message(body, dest))

			assert_equal 1, written.length,
			             "Expected exactly one error stanza for usern: #{usern.inspect}"

			stanza = Blather::XMPPNode.parse(written.first.to_xml)
			assert stanza.error?,
			       "Expected error stanza for usern: #{usern.inspect}"

			error = stanza.find_first("error")
			assert_equal "cancel", error["type"],
			             "Expected error type 'cancel' for usern: #{usern.inspect}"
			assert_equal "recipient-unavailable", xmpp_error_name(error),
			             "Expected 'recipient-unavailable' for usern: #{usern.inspect}"
		}
	end
	em :test_message_from_whisper_number_is_rejected

	def test_message_from_non_whisper_number_is_not_rejected_as_whisper
		property_of {
			words = array(range(1, 6)) { sized(range(3, 10)) { string(:alnum) } }
			guard(words.none? { |w| BADWORD_LIST.include?(w.downcase) })
			body = words.join(" ")

			dest = nanpa_phone
			[body, dest]
		}.check { |body, dest|
			reset_stanzas!
			reset_redis!
			WebMock.reset!

			bw_req = stub_request(:post, BW_MESSAGES_URL).with(
				body: hash_including(
					to: dest,
					text: body
				)
			).to_return(
				status: 201,
				body: JSON.dump(id: "bw-msg-stub")
			)

			m = Blather::Stanza::Message.new("#{dest}@component", body)
			m.from = "test@example.com"
			process_stanza(m)

			assert_requested bw_req
			assert_empty written
		}
	end
	em :test_message_from_non_whisper_number_is_not_rejected_as_whisper
end
