@@ -1105,6 +1105,17 @@ class WebhookHandler < Goliath::API
next unless text&.empty?
next unless jparams['to'].length > 1
+ MessageEvent::In.new(
+ timestamp: jparams['time'],
+ from: jparams['from'],
+ to: jparams['to'],
+ owner: jparams['owner'],
+ bandwidth_id: jparams['id'],
+ body: jparams['text'].to_s,
+ media_urls: media_urls
+ ).emit(REDIS)
+
+
next [200, {}, "OK"]
}
@@ -242,4 +242,51 @@ class WebhookPropertyTest < Minitest::Test
}
end
em :test_failed_emits_correct_stream_event
+
+ def test_inbound_received_emits_correct_in_stream_event
+ property_of {
+ Webhook
+ .new(REDIS)
+ .message { |registered, jid, dir, top_level_to|
+ Message
+ .new(REDIS)
+ .to {
+ array(integer(2)) { nanpa_phone } +
+ [top_level_to] +
+ array(integer(2)) { nanpa_phone }
+ }
+ .generate(registered, jid, dir)
+ }
+ .type { "message-received" }
+ .generate
+ }.check { |metadata, example|
+ result = invoke_webhook(example)
+ assert_equal 200, result[0]
+
+ entries = REDIS.stream_entries("messages").sync
+ assert_equal 1, entries.length
+
+ fields = entries.first[:fields]
+ expected_keys = %w[
+ event source timestamp owner from to
+ bandwidth_id body media_urls
+ ].sort
+ assert_equal expected_keys, fields.keys.sort
+
+ assert_equal "in", fields["event"]
+ assert_equal "bwmsgsv2", fields["source"]
+ assert_equal example["message"]["time"], fields["timestamp"]
+ assert_equal example["message"]["owner"], fields["owner"]
+ assert_equal example["message"]["from"], fields["from"]
+ assert_equal JSON.dump(example["message"]["to"]), fields["to"]
+ assert_equal example["message"]["id"], fields["bandwidth_id"]
+ assert_equal example["message"]["text"].to_s, fields["body"]
+
+ expected_media = Array(example["message"]["media"]).reject { |u|
+ u.end_with?(".smil", ".txt", ".xml")
+ }
+ assert_equal JSON.dump(expected_media), fields["media_urls"]
+ }
+ end
+ em :test_inbound_received_emits_correct_in_stream_event
end