Merge branch 'incorporate-first-round-of-hotfixes' of https://git.secluded.site/sgx-bwmsgsv2

Stephen Paul Weber created

* 'incorporate-first-round-of-hotfixes' of https://git.secluded.site/sgx-bwmsgsv2:
  fix: make sure ARGV[0] is set for all tests
  fix: don't call `from=` on StanzaError
  fix: Message::Base.media_urls is always an array
  fix: correct for dedup in message event
  fix: webhook tests need to stub component's `write`
  fix: webhooks expect top-level 'to'
  fix: response_handler wants unescaped strings
  fix: don't stop reactor if test

Change summary

lib/message_event.rb   |  2 +-
sgx-bwmsgsv2.rb        |  8 +++++---
test/test_component.rb | 43 ++++++++++++++++++++++++++++---------------
test/test_helper.rb    |  1 -
4 files changed, 34 insertions(+), 20 deletions(-)

Detailed changes

lib/message_event.rb 🔗

@@ -76,7 +76,7 @@ module MessageEvent
 			)
 			fields["body"] = @body unless @body.nil?
 			fields["bandwidth_id"] = @bandwidth_id
-			fields["media_urls"] = JSON.dump(@media_urls) unless @media_urls.empty?
+			fields["media_urls"] = JSON.dump(@media_urls)
 			fields
 		end
 	end

sgx-bwmsgsv2.rb 🔗

@@ -1190,7 +1190,9 @@ class WebhookHandler < Goliath::API
 			puts "RESPONSE4: #{msg.inspect}"
 		end
 
-		msg.from = others_num + '@' + ARGV[0]
+		# if message-failed, we already set msg.from
+		# moreover, we said `msg = msg.as_error`, and StanzaError
+		msg.from = others_num + '@' + ARGV[0] if msg.respond_to?(:from=)
 		SGXbwmsgsv2.write(msg)
 
 		# Emit event to messages stream
@@ -1202,7 +1204,7 @@ class WebhookHandler < Goliath::API
 			MessageEvent::In.new(
 				timestamp: jparams['time'],
 				from: jparams['from'],
-				to: jparams['to'],
+				to: jparams['to'] << users_num,
 				owner: jparams['owner'],
 				bandwidth_id: jparams['id'],
 				body: jparams['text'].to_s,
@@ -1234,7 +1236,7 @@ class WebhookHandler < Goliath::API
 		puts 'Shutting down gateway due to exception 013: ' + e.message
 		SGXbwmsgsv2.shutdown
 		puts 'Gateway has terminated.'
-		EM.stop
+		EM.stop unless ENV['ENV'] == 'test'
 	end
 end
 

test/test_component.rb 🔗

@@ -9,6 +9,7 @@ end
 
 class ComponentTest < Minitest::Test
 	def setup
+		ARGV[0] = 'component'
 		SGXbwmsgsv2.instance_variable_set(:@written, [])
 
 		def SGXbwmsgsv2.write_to_stream(s)
@@ -582,25 +583,34 @@ class ComponentTest < Minitest::Test
 	em :test_passthrough_message_emits_to_stream
 
 	def invoke_webhook(payload)
-		handler = WebhookHandler.new
-		env = {
-			"REQUEST_URI" => "/",
-			"REQUEST_METHOD" => "POST",
-			"params" => {"_json" => [payload]}
-		}
-		handler.instance_variable_set(:@env, env)
-		def handler.params
-			@env["params"]
-		end
+		with_stubs([
+			[
+				SGXbwmsgsv2,
+				:write,
+				->(data) { SGXbwmsgsv2.write_to_stream(data) }
+			]
+		]) do
+			handler = WebhookHandler.new
+			env = {
+				"REQUEST_URI" => "/",
+				"REQUEST_METHOD" => "POST",
+				"params" => {"_json" => [payload]}
+			}
+			handler.instance_variable_set(:@env, env)
+			def handler.params
+				@env["params"]
+			end
 
-		EMPromise.resolve(nil).then {
-			handler.response(env)
-		}.sync
+			EMPromise.resolve(nil).then {
+				handler.response(env)
+			}.sync
+		end
 	end
 
 	def test_inbound_sms_emits_to_stream
 		payload = {
 			"type" => "message-received",
+			"to" => "+15550000000",
 			"message" => {
 				"id" => "bw-in-123",
 				"direction" => "in",
@@ -631,6 +641,7 @@ class ComponentTest < Minitest::Test
 	def test_inbound_mms_emits_to_stream_and_filters_smil
 		payload = {
 			"type" => "message-received",
+			"to" => "+15550000000",
 			"message" => {
 				"id" => "bw-mms-456",
 				"direction" => "in",
@@ -662,6 +673,7 @@ class ComponentTest < Minitest::Test
 	def test_message_delivered_emits_to_stream
 		payload = {
 			"type" => "message-delivered",
+			"to" => "+15550000000",
 			"message" => {
 				"id" => "bw-out-789",
 				"direction" => "out",
@@ -669,7 +681,7 @@ class ComponentTest < Minitest::Test
 				"from" => "+15550000000",
 				"to" => ["+15551234567"],
 				"time" => "2025-01-13T10:10:00Z",
-				"tag" => "stanza-id-abc%20extra-data"
+				"tag" => "stanza-id-abc extra-data"
 			}
 		}
 
@@ -689,6 +701,7 @@ class ComponentTest < Minitest::Test
 	def test_message_failed_emits_to_stream
 		payload = {
 			"type" => "message-failed",
+			"to" => "+15551234567",
 			"message" => {
 				"id" => "bw-out-999",
 				"direction" => "out",
@@ -696,7 +709,7 @@ class ComponentTest < Minitest::Test
 				"from" => "+15550000000",
 				"to" => ["+15551234567"],
 				"time" => "2025-01-13T10:15:00Z",
-				"tag" => "failed-stanza-xyz%20extra",
+				"tag" => "failed-stanza-xyz extra",
 				"errorCode" => 4720,
 				"description" => "Carrier rejected message"
 			}

test/test_helper.rb 🔗

@@ -32,7 +32,6 @@ rescue LoadError, NameError
 end
 
 $VERBOSE = nil
-ARGV[0] = "component"
 
 class FakeRedis
 	def initialize(values={})