|
|
@@ -0,0 +1,64 @@
|
|
|
+require 'mqtt'
|
|
|
+require 'api_client'
|
|
|
+
|
|
|
+RSpec.describe 'State' do
|
|
|
+ before(:all) do
|
|
|
+ @client = ApiClient.new(ENV.fetch('ESPMH_HOSTNAME'), ENV.fetch('ESPMH_TEST_DEVICE_ID_BASE'))
|
|
|
+ @client.upload_json('/settings', 'settings.json')
|
|
|
+
|
|
|
+ @client.put(
|
|
|
+ '/settings',
|
|
|
+ mqtt_server: ENV.fetch('ESPMH_MQTT_SERVER'),
|
|
|
+ mqtt_username: ENV.fetch('ESPMH_MQTT_USERNAME'),
|
|
|
+ mqtt_password: ENV.fetch('ESPMH_MQTT_PASSWORD'),
|
|
|
+ )
|
|
|
+
|
|
|
+ @topic_prefix = ENV.fetch('ESPMH_MQTT_TOPIC_PREFIX')
|
|
|
+ end
|
|
|
+
|
|
|
+ context 'birth and LWT' do
|
|
|
+ it 'should send birth and LWT messages when configured' do
|
|
|
+ lwt_topic = "#{@topic_prefix}lwt"
|
|
|
+ birth_topic = "#{@topic_prefix}birth"
|
|
|
+
|
|
|
+ seen_birth = false
|
|
|
+ seen_lwt = false
|
|
|
+
|
|
|
+ MQTT::Client.connect("mqtt://#{ENV.fetch('ESPMH_MQTT_USERNAME')}:#{ENV.fetch('ESPMH_MQTT_PASSWORD')}@#{ENV.fetch('ESPMH_MQTT_SERVER')}") do |c|
|
|
|
+ birth_listen_thread = Thread.new do
|
|
|
+ begin
|
|
|
+ Timeout.timeout(10) do
|
|
|
+ c.get(birth_topic)
|
|
|
+ seen_birth = true
|
|
|
+ end
|
|
|
+ rescue Timeout::Error
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ lwt_listen_thread = Thread.new do
|
|
|
+ begin
|
|
|
+ Timeout.timeout(10) do
|
|
|
+ c.get(lwt_topic)
|
|
|
+ seen_lwt = true
|
|
|
+ end
|
|
|
+ rescue Timeout::Error
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ @client.put(
|
|
|
+ '/settings',
|
|
|
+ mqtt_lwt_topic: lwt_topic,
|
|
|
+ mqtt_lwt_message: 'disconnected',
|
|
|
+ mqtt_birth_topic: birth_topic
|
|
|
+ )
|
|
|
+ @client.post('/system', command: 'restart')
|
|
|
+
|
|
|
+ lwt_listen_thread.join
|
|
|
+ birth_listen_thread.join
|
|
|
+ end
|
|
|
+
|
|
|
+ expect(seen_birth).to be(true)
|
|
|
+ expect(seen_lwt).to be(true)
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|