nodeDetails="Saves entity attributes based on configurable scope parameter. Expects messages with 'POST_ATTRIBUTES_REQUEST' message type. "+
"If upsert(update/insert) operation is completed successfully rule node will send the incoming message via <b>Success</b> chain, otherwise, <b>Failure</b> chain is used. "+
assertThat(upgradeResult.getFirst()).as("upgrade result has changes").isTrue();
assertThat(resultNode.has(updateAttributesOnlyOnValueChangeKey)).as("upgrade result has key "+updateAttributesOnlyOnValueChangeKey).isTrue();
assertThat(resultNode.get(updateAttributesOnlyOnValueChangeKey).asBoolean()).as("upgrade result value [false] for key "+updateAttributesOnlyOnValueChangeKey).isFalse();
assertThat(upgradedConfig.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("upgrade result has key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(upgradedConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("upgrade result value [false] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isFalse();
assertThat(jsonNode.has(updateAttributesOnlyOnValueChangeKey)).as("pre condition has no "+updateAttributesOnlyOnValueChangeKey).isTrue();
assertThat(jsonNode.get(updateAttributesOnlyOnValueChangeKey).asBoolean()).as("pre condition has [true] for key "+updateAttributesOnlyOnValueChangeKey).isTrue();
assertThat(jsonNode.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("pre condition has no "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(jsonNode.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("pre condition has [true] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(upgradeResult.getFirst()).as("upgrade result has changes").isFalse();
assertThat(resultNode.has(updateAttributesOnlyOnValueChangeKey)).as("upgrade result has key "+updateAttributesOnlyOnValueChangeKey).isTrue();
assertThat(resultNode.get(updateAttributesOnlyOnValueChangeKey).asBoolean()).as("upgrade result value [true] for key "+updateAttributesOnlyOnValueChangeKey).isTrue();
assertThat(upgradedConfig.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("upgrade result has key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(upgradedConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("upgrade result value [true] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(defaultConfig.has(NOTIFY_DEVICE_KEY)).as("pre condition has no"+NOTIFY_DEVICE_KEY).isTrue();
assertThat(defaultConfig.has(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY)).as("pre condition has no"+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isTrue();
assertThat(defaultConfig.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("pre condition has no"+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(defaultConfig.get(NOTIFY_DEVICE_KEY).asBoolean()).as("pre condition has [true] for key "+NOTIFY_DEVICE_KEY).isFalse();
assertThat(defaultConfig.get(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).asBoolean()).as("pre condition has [true] for key "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isFalse();
assertThat(defaultConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("pre condition has [false] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(defaultConfig.has(NOTIFY_DEVICE_KEY)).as("pre condition has "+NOTIFY_DEVICE_KEY).isFalse();
assertThat(defaultConfig.has(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY)).as("pre condition has "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isFalse();
assertThat(defaultConfig.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("pre condition has "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isFalse();
assertThat(upgradedConfig.get(NOTIFY_DEVICE_KEY).asBoolean()).as("pre condition has [false] for key "+NOTIFY_DEVICE_KEY).isTrue();
assertThat(upgradedConfig.get(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).asBoolean()).as("pre condition has [true] for key "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isFalse();
assertThat(upgradedConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("pre condition has [true] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isFalse();
assertThat(defaultConfig.has(NOTIFY_DEVICE_KEY)).as("pre condition has no "+NOTIFY_DEVICE_KEY).isTrue();
assertThat(defaultConfig.has(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY)).as("pre condition has no "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isTrue();
assertThat(defaultConfig.has(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY)).as("pre condition has no "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();
assertThat(defaultConfig.get(NOTIFY_DEVICE_KEY).isTextual()).as("pre condition "+NOTIFY_DEVICE_KEY+" is not textual").isTrue();
assertThat(defaultConfig.get(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isTextual()).as("pre condition "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY+" is not textual").isTrue();
assertThat(defaultConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTextual()).as("pre condition "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY+" is not textual").isTrue();
assertThat(upgradedConfig.get(NOTIFY_DEVICE_KEY).isBoolean()).as("pre condition "+NOTIFY_DEVICE_KEY+" is not boolean").isTrue();
assertThat(upgradedConfig.get(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isBoolean()).as("pre condition "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY+" is not boolean").isTrue();
assertThat(upgradedConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isBoolean()).as("pre condition "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY+" is not boolean").isTrue();
assertThat(upgradedConfig.get(NOTIFY_DEVICE_KEY).asBoolean()).as("pre condition has [true] for key "+NOTIFY_DEVICE_KEY).isFalse();
assertThat(upgradedConfig.get(SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).asBoolean()).as("pre condition has [true] for key "+SEND_ATTRIBUTES_UPDATED_NOTIFICATION_KEY).isFalse();
assertThat(upgradedConfig.get(UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).asBoolean()).as("pre condition has [false] for key "+UPDATE_ATTRIBUTES_ONLY_ON_VALUE_CHANGE_KEY).isTrue();