From 1ea7964a508463391f3c55f072750a850e248327 Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Thu, 5 Feb 2026 09:13:25 -0500 Subject: [PATCH 1/8] fix: don't stop reactor if test each test runs on its own reactor. stopping it means that `assert`s are never called, which meant that gateway shutdown was counted as test success. no bueno! --- sgx-bwmsgsv2.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sgx-bwmsgsv2.rb b/sgx-bwmsgsv2.rb index 1cdddcf9a30a8af47c0f80a5dd7bcabd143fffe4..9c646fcf9b4a095493e3411d205162f11ee17f7b 100755 --- a/sgx-bwmsgsv2.rb +++ b/sgx-bwmsgsv2.rb @@ -1234,7 +1234,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 From d49eae18aa2eb0c1782314992ef3c85fb87bafaf Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Wed, 4 Feb 2026 13:05:37 -0500 Subject: [PATCH 2/8] fix: response_handler wants unescaped strings except we also unescape each individual tag part? --- test/test_component.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_component.rb b/test/test_component.rb index 5c5c0408c27e6cfb0b21fdbb402535c92761b5e0..95561713218b16d355aa576ab4d9e75007966e2a 100644 --- a/test/test_component.rb +++ b/test/test_component.rb @@ -669,7 +669,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" } } @@ -696,7 +696,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" } From e87a1cce18256f447f53da70b1a6c3b0001ce1cb Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Wed, 4 Feb 2026 13:26:17 -0500 Subject: [PATCH 3/8] fix: webhooks expect top-level 'to' --- test/test_component.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test_component.rb b/test/test_component.rb index 95561713218b16d355aa576ab4d9e75007966e2a..314e5619abfe2f07b684e155f261a0f00023239e 100644 --- a/test/test_component.rb +++ b/test/test_component.rb @@ -601,6 +601,7 @@ class ComponentTest < Minitest::Test def test_inbound_sms_emits_to_stream payload = { "type" => "message-received", + "to" => "+15550000000", "message" => { "id" => "bw-in-123", "direction" => "in", @@ -631,6 +632,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 +664,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", @@ -689,6 +692,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", From 234b65f59fcf74586c22e22b790d9e36835b1395 Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Wed, 4 Feb 2026 13:55:08 -0500 Subject: [PATCH 4/8] fix: webhook tests need to stub component's `write` --- test/test_component.rb | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/test/test_component.rb b/test/test_component.rb index 314e5619abfe2f07b684e155f261a0f00023239e..fdbb1ab1d16f0b118408e7d06b06fc5f1e8ca328 100644 --- a/test/test_component.rb +++ b/test/test_component.rb @@ -582,20 +582,28 @@ 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 From 851699e8631a40979b06bf05cf9d02e10aa244d9 Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Thu, 5 Feb 2026 09:00:14 -0500 Subject: [PATCH 5/8] fix: correct for dedup in message event --- sgx-bwmsgsv2.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sgx-bwmsgsv2.rb b/sgx-bwmsgsv2.rb index 9c646fcf9b4a095493e3411d205162f11ee17f7b..60eb115e3e7a3f11727d30d89d31364a02c4bec0 100755 --- a/sgx-bwmsgsv2.rb +++ b/sgx-bwmsgsv2.rb @@ -1202,7 +1202,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, From 78c4b9cc56d389d05ea196e266740ff5ac8d8ef0 Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Thu, 5 Feb 2026 09:00:33 -0500 Subject: [PATCH 6/8] fix: Message::Base.media_urls is always an array --- lib/message_event.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/message_event.rb b/lib/message_event.rb index 55a8229afcfda9ab805b4a80193ceb4eacf38d65..bf2e7b43d41e7d15e5322a431d797f414aecfb6c 100644 --- a/lib/message_event.rb +++ b/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 From b773ad322bb9d5393162d6962ac3264279aa109c Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Thu, 5 Feb 2026 11:40:45 -0500 Subject: [PATCH 7/8] fix: don't call `from=` on StanzaError --- sgx-bwmsgsv2.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sgx-bwmsgsv2.rb b/sgx-bwmsgsv2.rb index 60eb115e3e7a3f11727d30d89d31364a02c4bec0..f3069e9b529b2be8e2f4b4bc52a38fe566951041 100755 --- a/sgx-bwmsgsv2.rb +++ b/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 From 980b24ad941bcc1daa3e99ac0c3fb7abc5b052c6 Mon Sep 17 00:00:00 2001 From: Phillip Davis Date: Thu, 5 Feb 2026 13:30:28 -0500 Subject: [PATCH 8/8] fix: make sure ARGV[0] is set for all tests --- test/test_component.rb | 1 + test/test_helper.rb | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_component.rb b/test/test_component.rb index fdbb1ab1d16f0b118408e7d06b06fc5f1e8ca328..3bfecab7cc45e68cf00a6f8b7790075e28fa50d4 100644 --- a/test/test_component.rb +++ b/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) diff --git a/test/test_helper.rb b/test/test_helper.rb index a0e8e19856cb1141c554cc0a6acb4498630a7c62..e99ebf3a23e908b5cb8c37c1562fcfdf3a186412 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -32,7 +32,6 @@ rescue LoadError, NameError end $VERBOSE = nil -ARGV[0] = "component" class FakeRedis def initialize(values={})