瀏覽代碼

Restructure ruby MQTT client for tests. Listen on wildcard topic, match on parsed parameters rather than listening on bound topic

Christopher Mullins 6 年之前
父節點
當前提交
22bdd6af1d
共有 3 個文件被更改,包括 17 次插入16 次删除
  1. 14 13
      test/remote/lib/mqtt_client.rb
  2. 1 1
      test/remote/spec/mqtt_spec.rb
  3. 2 2
      test/remote/spec/udp_spec.rb

+ 14 - 13
test/remote/lib/mqtt_client.rb

@@ -48,24 +48,25 @@ class MqttClient
   end
 
   def on_id_message(path, id_params, timeout, &block)
-    sub_topic = "#{@topic_prefix}#{path}/#{id_topic_suffix(id_params)}"
+    sub_topic = "#{@topic_prefix}#{path}/#{id_topic_suffix(nil)}"
 
     on_message(sub_topic, timeout) do |topic, message|
       topic_parts = topic.split('/')
+      topic_id_params = {
+        id: topic_parts[2].to_i(16),
+        type: topic_parts[3],
+        group_id: topic_parts[4].to_i,
+        unparsed_id: topic_parts[2]
+      }
+
+      if !id_params || %w(id type group_id).all? { |k| k=k.to_sym; topic_id_params[k] == id_params[k] }
+        begin
+          message = JSON.parse(message)
+        rescue JSON::ParserError => e
+        end
 
-      begin
-        message = JSON.parse(message)
-      rescue JSON::ParserError => e
+        yield( topic_id_params, message )
       end
-
-      yield(
-        {
-          id: topic_parts[2].to_i(16),
-          type: topic_parts[3],
-          group_id: topic_parts[4].to_i
-        },
-        message
-      )
     end
   end
 

+ 1 - 1
test/remote/spec/mqtt_spec.rb

@@ -122,7 +122,7 @@ RSpec.describe 'MQTT' do
       @client.patch_state({status: 'off'}, @id_params)
 
       @mqtt_client.on_state(@id_params) do |id, message|
-        seen_state = (id == @id_params && desired_state.all? { |k,v| v == message[k] })
+        seen_state = desired_state.all? { |k,v| v == message[k] }
       end
 
       @mqtt_client.patch_state(@id_params, desired_state)

+ 2 - 2
test/remote/spec/udp_spec.rb

@@ -73,7 +73,7 @@ RSpec.describe 'UDP servers' do
       seen_state = false
 
       @mqtt_client.on_state(@id_params) do |id, message|
-        seen_state = (id == @id_params && desired_state.all? { |k,v| v == message[k] })
+        seen_state = desired_state.all? { |k,v| v == message[k] }
       end
       @udp_client.group(@id_params[:group_id]).on.brightness(48)
       @mqtt_client.wait_for_listeners
@@ -92,7 +92,7 @@ RSpec.describe 'UDP servers' do
       seen_state = false
 
       @mqtt_client.on_state(@id_params) do |id, message|
-        seen_state = (id == @id_params && desired_state.all? { |k,v| v == message[k] })
+        seen_state = desired_state.all? { |k,v| v == message[k] }
       end
 
       @udp_client.group(@id_params[:group_id])