Files
arduino-home-assistant/tests/DeviceTrackerTest/DeviceTrackerTest.ino
T
alex 7d5d70d525 Modernize MQTT discovery compatibility and runtime refreshes.
Align ArduinoHA with current Home Assistant MQTT discovery expectations by adding default entity IDs, device discovery support, safer runtime discovery refresh behavior, expanded entity category coverage, and the tests/docs needed to support the migration away from legacy object_id payloads.
2026-04-16 19:49:50 +10:00

373 lines
9.5 KiB
Arduino

#include <AUnit.h>
#include <ArduinoHA.h>
using aunit::TestRunner;
static const char* testDeviceId = "testDevice";
static const char* testUniqueId = "uniqueTracker";
const char ConfigTopic[] PROGMEM = {
"homeassistant/device_tracker/testDevice/uniqueTracker/config"
};
const char DeviceConfigTopic[] PROGMEM = {"homeassistant/device/testDevice/config"};
const char StateTopic[] PROGMEM = {"testData/testDevice/uniqueTracker/stat_t"};
AHA_TEST(DeviceTrackerTest, invalid_unique_id) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(nullptr);
tracker.buildSerializerTest();
HASerializer* serializer = tracker.getSerializer();
assertTrue(serializer == nullptr);
}
AHA_TEST(DeviceTrackerTest, default_params) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, extended_unique_id) {
initMqttTest(testDeviceId)
device.enableExtendedUniqueIds();
HADeviceTracker tracker(testUniqueId);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"testDevice_uniqueTracker\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, device_discovery_payload) {
initMqttTest(testDeviceId)
mqtt.enableDeviceDiscovery();
HADeviceTracker tracker(testUniqueId);
mqtt.loop();
assertSingleMqttMessage(
AHATOFSTR(DeviceConfigTopic),
(
"{"
"\"dev\":{\"ids\":\"testDevice\"},"
"\"o\":{\"name\":\"ArduinoHA\",\"sw\":\"2.1.0\"},"
"\"cmps\":{"
"\"uniqueTracker\":{"
"\"p\":\"device_tracker\","
"\"uniq_id\":\"uniqueTracker\","
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
"}"
"}"
),
true
)
}
AHA_TEST(DeviceTrackerTest, source_type_gps) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setSourceType(HADeviceTracker::SourceTypeGPS);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"src_type\":\"gps\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, source_type_router) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setSourceType(HADeviceTracker::SourceTypeRouter);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"src_type\":\"router\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, source_type_bluetooth) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setSourceType(HADeviceTracker::SourceTypeBluetooth);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"src_type\":\"bluetooth\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, source_type_bluetooth_le) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setSourceType(HADeviceTracker::SourceTypeBluetoothLE);
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"src_type\":\"bluetooth_le\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, availability) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setAvailability(true);
mqtt.loop();
// availability is published after config in HADeviceTracker
assertMqttMessage(
1,
F("testData/testDevice/uniqueTracker/avty_t"),
"online",
true
)
}
AHA_TEST(DeviceTrackerTest, publish_initial_state) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setCurrentState(HADeviceTracker::StateHome);
mqtt.loop();
assertMqttMessage(1, AHATOFSTR(StateTopic), "home", true)
}
AHA_TEST(DeviceTrackerTest, name_setter) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setName("testName");
assertEntityConfig(
mock,
tracker,
(
"{"
"\"name\":\"testName\","
"\"uniq_id\":\"uniqueTracker\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, object_id_setter) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setObjectId("testId");
assertEntityConfig(
mock,
tracker,
(
"{"
"\"obj_id\":\"testId\","
"\"uniq_id\":\"uniqueTracker\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, default_entity_id_setter) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setDefaultEntityId("device_tracker.test_tracker");
assertEntityConfig(
mock,
tracker,
(
"{"
"\"def_ent_id\":\"device_tracker.test_tracker\","
"\"uniq_id\":\"uniqueTracker\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, entity_category_setter) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setEntityCategory("diagnostic");
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"ent_cat\":\"diagnostic\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, icon_setter) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setIcon("testIcon");
assertEntityConfig(
mock,
tracker,
(
"{"
"\"uniq_id\":\"uniqueTracker\","
"\"ic\":\"testIcon\","
"\"dev\":{\"ids\":\"testDevice\"},"
"\"stat_t\":\"testData/testDevice/uniqueTracker/stat_t\""
"}"
)
)
}
AHA_TEST(DeviceTrackerTest, default_state_unknown) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
assertEqual(HADeviceTracker::StateUnknown, tracker.getState());
}
AHA_TEST(DeviceTrackerTest, default_state) {
initMqttTest(testDeviceId)
HADeviceTracker tracker(testUniqueId);
tracker.setCurrentState(HADeviceTracker::StateNotAvailable);
assertEqual(HADeviceTracker::StateNotAvailable, tracker.getState());
}
AHA_TEST(DeviceTrackerTest, publish_state_home) {
initMqttTest(testDeviceId)
mock->connectDummy();
HADeviceTracker tracker(testUniqueId);
bool result = tracker.setState(HADeviceTracker::StateHome);
assertSingleMqttMessage(AHATOFSTR(StateTopic), "home", true)
assertTrue(result);
}
AHA_TEST(DeviceTrackerTest, publish_state_not_home) {
initMqttTest(testDeviceId)
mock->connectDummy();
HADeviceTracker tracker(testUniqueId);
bool result = tracker.setState(HADeviceTracker::StateNotHome);
assertSingleMqttMessage(AHATOFSTR(StateTopic), "not_home", true)
assertTrue(result);
}
AHA_TEST(DeviceTrackerTest, publish_state_not_available) {
initMqttTest(testDeviceId)
mock->connectDummy();
HADeviceTracker tracker(testUniqueId);
bool result = tracker.setState(HADeviceTracker::StateNotAvailable);
assertSingleMqttMessage(AHATOFSTR(StateTopic), "offline", true)
assertTrue(result);
}
AHA_TEST(DeviceTrackerTest, publish_state_debounce) {
initMqttTest(testDeviceId)
mock->connectDummy();
HADeviceTracker tracker(testUniqueId);
tracker.setCurrentState(HADeviceTracker::StateHome);
bool result = tracker.setState(HADeviceTracker::StateHome);
// it shouldn't publish data if state doesn't change
assertEqual(mock->getFlushedMessagesNb(), 0);
assertTrue(result);
}
AHA_TEST(DeviceTrackerTest, publish_state_debounce_skip) {
initMqttTest(testDeviceId)
mock->connectDummy();
HADeviceTracker tracker(testUniqueId);
tracker.setCurrentState(HADeviceTracker::StateHome);
bool result = tracker.setState(HADeviceTracker::StateHome, true);
assertSingleMqttMessage(AHATOFSTR(StateTopic), "home", true)
assertTrue(result);
}
void setup()
{
delay(1000);
Serial.begin(115200);
while (!Serial);
}
void loop()
{
TestRunner::run();
delay(1);
}