mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 05:07:41 +00:00
Add sensors for attribute points (str, int, per, con) to Habitica (#130186)
This commit is contained in:
parent
e6d16f06fc
commit
c10f078f2a
@ -51,12 +51,17 @@ class HabiticaDataUpdateCoordinator(DataUpdateCoordinator[HabiticaData]):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
self.api = habitipy
|
self.api = habitipy
|
||||||
|
self.content: dict[str, Any] = {}
|
||||||
|
|
||||||
async def _async_update_data(self) -> HabiticaData:
|
async def _async_update_data(self) -> HabiticaData:
|
||||||
try:
|
try:
|
||||||
user_response = await self.api.user.get()
|
user_response = await self.api.user.get()
|
||||||
tasks_response = await self.api.tasks.user.get()
|
tasks_response = await self.api.tasks.user.get()
|
||||||
tasks_response.extend(await self.api.tasks.user.get(type="completedTodos"))
|
tasks_response.extend(await self.api.tasks.user.get(type="completedTodos"))
|
||||||
|
if not self.content:
|
||||||
|
self.content = await self.api.content.get(
|
||||||
|
language=user_response["preferences"]["language"]
|
||||||
|
)
|
||||||
except ClientResponseError as error:
|
except ClientResponseError as error:
|
||||||
if error.status == HTTPStatus.TOO_MANY_REQUESTS:
|
if error.status == HTTPStatus.TOO_MANY_REQUESTS:
|
||||||
_LOGGER.debug("Rate limit exceeded, will try again later")
|
_LOGGER.debug("Rate limit exceeded, will try again later")
|
||||||
|
@ -126,6 +126,18 @@
|
|||||||
},
|
},
|
||||||
"rewards": {
|
"rewards": {
|
||||||
"default": "mdi:treasure-chest"
|
"default": "mdi:treasure-chest"
|
||||||
|
},
|
||||||
|
"strength": {
|
||||||
|
"default": "mdi:arm-flex-outline"
|
||||||
|
},
|
||||||
|
"intelligence": {
|
||||||
|
"default": "mdi:head-snowflake-outline"
|
||||||
|
},
|
||||||
|
"perception": {
|
||||||
|
"default": "mdi:eye-outline"
|
||||||
|
},
|
||||||
|
"constitution": {
|
||||||
|
"default": "mdi:run-fast"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"switch": {
|
"switch": {
|
||||||
|
@ -27,7 +27,7 @@ from homeassistant.helpers.typing import StateType
|
|||||||
from .const import DOMAIN, UNIT_TASKS
|
from .const import DOMAIN, UNIT_TASKS
|
||||||
from .entity import HabiticaBase
|
from .entity import HabiticaBase
|
||||||
from .types import HabiticaConfigEntry
|
from .types import HabiticaConfigEntry
|
||||||
from .util import entity_used_in
|
from .util import entity_used_in, get_attribute_points, get_attributes_total
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -36,7 +36,10 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
class HabitipySensorEntityDescription(SensorEntityDescription):
|
class HabitipySensorEntityDescription(SensorEntityDescription):
|
||||||
"""Habitipy Sensor Description."""
|
"""Habitipy Sensor Description."""
|
||||||
|
|
||||||
value_fn: Callable[[dict[str, Any]], StateType]
|
value_fn: Callable[[dict[str, Any], dict[str, Any]], StateType]
|
||||||
|
attributes_fn: (
|
||||||
|
Callable[[dict[str, Any], dict[str, Any]], dict[str, Any] | None] | None
|
||||||
|
) = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass(kw_only=True, frozen=True)
|
@dataclass(kw_only=True, frozen=True)
|
||||||
@ -65,76 +68,80 @@ class HabitipySensorEntity(StrEnum):
|
|||||||
REWARDS = "rewards"
|
REWARDS = "rewards"
|
||||||
GEMS = "gems"
|
GEMS = "gems"
|
||||||
TRINKETS = "trinkets"
|
TRINKETS = "trinkets"
|
||||||
|
STRENGTH = "strength"
|
||||||
|
INTELLIGENCE = "intelligence"
|
||||||
|
CONSTITUTION = "constitution"
|
||||||
|
PERCEPTION = "perception"
|
||||||
|
|
||||||
|
|
||||||
SENSOR_DESCRIPTIONS: tuple[HabitipySensorEntityDescription, ...] = (
|
SENSOR_DESCRIPTIONS: tuple[HabitipySensorEntityDescription, ...] = (
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.DISPLAY_NAME,
|
key=HabitipySensorEntity.DISPLAY_NAME,
|
||||||
translation_key=HabitipySensorEntity.DISPLAY_NAME,
|
translation_key=HabitipySensorEntity.DISPLAY_NAME,
|
||||||
value_fn=lambda user: user.get("profile", {}).get("name"),
|
value_fn=lambda user, _: user.get("profile", {}).get("name"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.HEALTH,
|
key=HabitipySensorEntity.HEALTH,
|
||||||
translation_key=HabitipySensorEntity.HEALTH,
|
translation_key=HabitipySensorEntity.HEALTH,
|
||||||
native_unit_of_measurement="HP",
|
native_unit_of_measurement="HP",
|
||||||
suggested_display_precision=0,
|
suggested_display_precision=0,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("hp"),
|
value_fn=lambda user, _: user.get("stats", {}).get("hp"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.HEALTH_MAX,
|
key=HabitipySensorEntity.HEALTH_MAX,
|
||||||
translation_key=HabitipySensorEntity.HEALTH_MAX,
|
translation_key=HabitipySensorEntity.HEALTH_MAX,
|
||||||
native_unit_of_measurement="HP",
|
native_unit_of_measurement="HP",
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("maxHealth"),
|
value_fn=lambda user, _: user.get("stats", {}).get("maxHealth"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.MANA,
|
key=HabitipySensorEntity.MANA,
|
||||||
translation_key=HabitipySensorEntity.MANA,
|
translation_key=HabitipySensorEntity.MANA,
|
||||||
native_unit_of_measurement="MP",
|
native_unit_of_measurement="MP",
|
||||||
suggested_display_precision=0,
|
suggested_display_precision=0,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("mp"),
|
value_fn=lambda user, _: user.get("stats", {}).get("mp"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.MANA_MAX,
|
key=HabitipySensorEntity.MANA_MAX,
|
||||||
translation_key=HabitipySensorEntity.MANA_MAX,
|
translation_key=HabitipySensorEntity.MANA_MAX,
|
||||||
native_unit_of_measurement="MP",
|
native_unit_of_measurement="MP",
|
||||||
value_fn=lambda user: user.get("stats", {}).get("maxMP"),
|
value_fn=lambda user, _: user.get("stats", {}).get("maxMP"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.EXPERIENCE,
|
key=HabitipySensorEntity.EXPERIENCE,
|
||||||
translation_key=HabitipySensorEntity.EXPERIENCE,
|
translation_key=HabitipySensorEntity.EXPERIENCE,
|
||||||
native_unit_of_measurement="XP",
|
native_unit_of_measurement="XP",
|
||||||
value_fn=lambda user: user.get("stats", {}).get("exp"),
|
value_fn=lambda user, _: user.get("stats", {}).get("exp"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.EXPERIENCE_MAX,
|
key=HabitipySensorEntity.EXPERIENCE_MAX,
|
||||||
translation_key=HabitipySensorEntity.EXPERIENCE_MAX,
|
translation_key=HabitipySensorEntity.EXPERIENCE_MAX,
|
||||||
native_unit_of_measurement="XP",
|
native_unit_of_measurement="XP",
|
||||||
value_fn=lambda user: user.get("stats", {}).get("toNextLevel"),
|
value_fn=lambda user, _: user.get("stats", {}).get("toNextLevel"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.LEVEL,
|
key=HabitipySensorEntity.LEVEL,
|
||||||
translation_key=HabitipySensorEntity.LEVEL,
|
translation_key=HabitipySensorEntity.LEVEL,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("lvl"),
|
value_fn=lambda user, _: user.get("stats", {}).get("lvl"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.GOLD,
|
key=HabitipySensorEntity.GOLD,
|
||||||
translation_key=HabitipySensorEntity.GOLD,
|
translation_key=HabitipySensorEntity.GOLD,
|
||||||
native_unit_of_measurement="GP",
|
native_unit_of_measurement="GP",
|
||||||
suggested_display_precision=2,
|
suggested_display_precision=2,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("gp"),
|
value_fn=lambda user, _: user.get("stats", {}).get("gp"),
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.CLASS,
|
key=HabitipySensorEntity.CLASS,
|
||||||
translation_key=HabitipySensorEntity.CLASS,
|
translation_key=HabitipySensorEntity.CLASS,
|
||||||
value_fn=lambda user: user.get("stats", {}).get("class"),
|
value_fn=lambda user, _: user.get("stats", {}).get("class"),
|
||||||
device_class=SensorDeviceClass.ENUM,
|
device_class=SensorDeviceClass.ENUM,
|
||||||
options=["warrior", "healer", "wizard", "rogue"],
|
options=["warrior", "healer", "wizard", "rogue"],
|
||||||
),
|
),
|
||||||
HabitipySensorEntityDescription(
|
HabitipySensorEntityDescription(
|
||||||
key=HabitipySensorEntity.GEMS,
|
key=HabitipySensorEntity.GEMS,
|
||||||
translation_key=HabitipySensorEntity.GEMS,
|
translation_key=HabitipySensorEntity.GEMS,
|
||||||
value_fn=lambda user: user.get("balance", 0) * 4,
|
value_fn=lambda user, _: user.get("balance", 0) * 4,
|
||||||
suggested_display_precision=0,
|
suggested_display_precision=0,
|
||||||
native_unit_of_measurement="gems",
|
native_unit_of_measurement="gems",
|
||||||
),
|
),
|
||||||
@ -142,7 +149,7 @@ SENSOR_DESCRIPTIONS: tuple[HabitipySensorEntityDescription, ...] = (
|
|||||||
key=HabitipySensorEntity.TRINKETS,
|
key=HabitipySensorEntity.TRINKETS,
|
||||||
translation_key=HabitipySensorEntity.TRINKETS,
|
translation_key=HabitipySensorEntity.TRINKETS,
|
||||||
value_fn=(
|
value_fn=(
|
||||||
lambda user: user.get("purchased", {})
|
lambda user, _: user.get("purchased", {})
|
||||||
.get("plan", {})
|
.get("plan", {})
|
||||||
.get("consecutive", {})
|
.get("consecutive", {})
|
||||||
.get("trinkets", 0)
|
.get("trinkets", 0)
|
||||||
@ -150,6 +157,38 @@ SENSOR_DESCRIPTIONS: tuple[HabitipySensorEntityDescription, ...] = (
|
|||||||
suggested_display_precision=0,
|
suggested_display_precision=0,
|
||||||
native_unit_of_measurement="⧖",
|
native_unit_of_measurement="⧖",
|
||||||
),
|
),
|
||||||
|
HabitipySensorEntityDescription(
|
||||||
|
key=HabitipySensorEntity.STRENGTH,
|
||||||
|
translation_key=HabitipySensorEntity.STRENGTH,
|
||||||
|
value_fn=lambda user, content: get_attributes_total(user, content, "str"),
|
||||||
|
attributes_fn=lambda user, content: get_attribute_points(user, content, "str"),
|
||||||
|
suggested_display_precision=0,
|
||||||
|
native_unit_of_measurement="STR",
|
||||||
|
),
|
||||||
|
HabitipySensorEntityDescription(
|
||||||
|
key=HabitipySensorEntity.INTELLIGENCE,
|
||||||
|
translation_key=HabitipySensorEntity.INTELLIGENCE,
|
||||||
|
value_fn=lambda user, content: get_attributes_total(user, content, "int"),
|
||||||
|
attributes_fn=lambda user, content: get_attribute_points(user, content, "int"),
|
||||||
|
suggested_display_precision=0,
|
||||||
|
native_unit_of_measurement="INT",
|
||||||
|
),
|
||||||
|
HabitipySensorEntityDescription(
|
||||||
|
key=HabitipySensorEntity.PERCEPTION,
|
||||||
|
translation_key=HabitipySensorEntity.PERCEPTION,
|
||||||
|
value_fn=lambda user, content: get_attributes_total(user, content, "per"),
|
||||||
|
attributes_fn=lambda user, content: get_attribute_points(user, content, "per"),
|
||||||
|
suggested_display_precision=0,
|
||||||
|
native_unit_of_measurement="PER",
|
||||||
|
),
|
||||||
|
HabitipySensorEntityDescription(
|
||||||
|
key=HabitipySensorEntity.CONSTITUTION,
|
||||||
|
translation_key=HabitipySensorEntity.CONSTITUTION,
|
||||||
|
value_fn=lambda user, content: get_attributes_total(user, content, "con"),
|
||||||
|
attributes_fn=lambda user, content: get_attribute_points(user, content, "con"),
|
||||||
|
suggested_display_precision=0,
|
||||||
|
native_unit_of_measurement="CON",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -243,7 +282,16 @@ class HabitipySensor(HabiticaBase, SensorEntity):
|
|||||||
def native_value(self) -> StateType:
|
def native_value(self) -> StateType:
|
||||||
"""Return the state of the device."""
|
"""Return the state of the device."""
|
||||||
|
|
||||||
return self.entity_description.value_fn(self.coordinator.data.user)
|
return self.entity_description.value_fn(
|
||||||
|
self.coordinator.data.user, self.coordinator.content
|
||||||
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def extra_state_attributes(self) -> dict[str, float | None] | None:
|
||||||
|
"""Return entity specific state attributes."""
|
||||||
|
if func := self.entity_description.attributes_fn:
|
||||||
|
return func(self.coordinator.data.user, self.coordinator.content)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class HabitipyTaskSensor(HabiticaBase, SensorEntity):
|
class HabitipyTaskSensor(HabiticaBase, SensorEntity):
|
||||||
|
@ -164,6 +164,86 @@
|
|||||||
},
|
},
|
||||||
"rewards": {
|
"rewards": {
|
||||||
"name": "Rewards"
|
"name": "Rewards"
|
||||||
|
},
|
||||||
|
"strength": {
|
||||||
|
"name": "Strength",
|
||||||
|
"state_attributes": {
|
||||||
|
"level": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::level::name%]"
|
||||||
|
},
|
||||||
|
"equipment": {
|
||||||
|
"name": "Battle gear"
|
||||||
|
},
|
||||||
|
"class": {
|
||||||
|
"name": "Class equip bonus"
|
||||||
|
},
|
||||||
|
"allocated": {
|
||||||
|
"name": "Allocated attribute points"
|
||||||
|
},
|
||||||
|
"buffs": {
|
||||||
|
"name": "Buffs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"intelligence": {
|
||||||
|
"name": "Intelligence",
|
||||||
|
"state_attributes": {
|
||||||
|
"level": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::level::name%]"
|
||||||
|
},
|
||||||
|
"equipment": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::equipment::name%]"
|
||||||
|
},
|
||||||
|
"class": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::class::name%]"
|
||||||
|
},
|
||||||
|
"allocated": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::allocated::name%]"
|
||||||
|
},
|
||||||
|
"buffs": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::buffs::name%]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"perception": {
|
||||||
|
"name": "Perception",
|
||||||
|
"state_attributes": {
|
||||||
|
"level": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::level::name%]"
|
||||||
|
},
|
||||||
|
"equipment": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::equipment::name%]"
|
||||||
|
},
|
||||||
|
"class": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::class::name%]"
|
||||||
|
},
|
||||||
|
"allocated": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::allocated::name%]"
|
||||||
|
},
|
||||||
|
"buffs": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::buffs::name%]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"constitution": {
|
||||||
|
"name": "Constitution",
|
||||||
|
"state_attributes": {
|
||||||
|
"level": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::level::name%]"
|
||||||
|
},
|
||||||
|
"equipment": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::equipment::name%]"
|
||||||
|
},
|
||||||
|
"class": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::class::name%]"
|
||||||
|
},
|
||||||
|
"allocated": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::allocated::name%]"
|
||||||
|
},
|
||||||
|
"buffs": {
|
||||||
|
"name": "[%key:component::habitica::entity::sensor::strength::state_attributes::buffs::name%]"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"switch": {
|
"switch": {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
from math import floor
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING, Any
|
||||||
|
|
||||||
from dateutil.rrule import (
|
from dateutil.rrule import (
|
||||||
@ -139,3 +140,52 @@ def get_recurrence_rule(recurrence: rrule) -> str:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
return str(recurrence).split("RRULE:")[1]
|
return str(recurrence).split("RRULE:")[1]
|
||||||
|
|
||||||
|
|
||||||
|
def get_attribute_points(
|
||||||
|
user: dict[str, Any], content: dict[str, Any], attribute: str
|
||||||
|
) -> dict[str, float]:
|
||||||
|
"""Get modifiers contributing to strength attribute."""
|
||||||
|
|
||||||
|
gear_set = {
|
||||||
|
"weapon",
|
||||||
|
"armor",
|
||||||
|
"head",
|
||||||
|
"shield",
|
||||||
|
"back",
|
||||||
|
"headAccessory",
|
||||||
|
"eyewear",
|
||||||
|
"body",
|
||||||
|
}
|
||||||
|
|
||||||
|
equipment = sum(
|
||||||
|
stats[attribute]
|
||||||
|
for gear in gear_set
|
||||||
|
if (equipped := user["items"]["gear"]["equipped"].get(gear))
|
||||||
|
and (stats := content["gear"]["flat"].get(equipped))
|
||||||
|
)
|
||||||
|
|
||||||
|
class_bonus = sum(
|
||||||
|
stats[attribute] / 2
|
||||||
|
for gear in gear_set
|
||||||
|
if (equipped := user["items"]["gear"]["equipped"].get(gear))
|
||||||
|
and (stats := content["gear"]["flat"].get(equipped))
|
||||||
|
and stats["klass"] == user["stats"]["class"]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"level": min(round(user["stats"]["lvl"] / 2), 50),
|
||||||
|
"equipment": equipment,
|
||||||
|
"class": class_bonus,
|
||||||
|
"allocated": user["stats"][attribute],
|
||||||
|
"buffs": user["stats"]["buffs"][attribute],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_attributes_total(
|
||||||
|
user: dict[str, Any], content: dict[str, Any], attribute: str
|
||||||
|
) -> int:
|
||||||
|
"""Get total attribute points."""
|
||||||
|
return floor(
|
||||||
|
sum(value for value in get_attribute_points(user, content, attribute).values())
|
||||||
|
)
|
||||||
|
@ -56,6 +56,11 @@ def mock_habitica(aioclient_mock: AiohttpClientMocker) -> AiohttpClientMocker:
|
|||||||
f"{DEFAULT_URL}/api/v3/tasks/user",
|
f"{DEFAULT_URL}/api/v3/tasks/user",
|
||||||
json=load_json_object_fixture("tasks.json", DOMAIN),
|
json=load_json_object_fixture("tasks.json", DOMAIN),
|
||||||
)
|
)
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{DEFAULT_URL}/api/v3/content",
|
||||||
|
params={"language": "en"},
|
||||||
|
json=load_json_object_fixture("content.json", DOMAIN),
|
||||||
|
)
|
||||||
|
|
||||||
return aioclient_mock
|
return aioclient_mock
|
||||||
|
|
||||||
|
@ -29,11 +29,26 @@
|
|||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_warrior_5",
|
||||||
|
"armor": "armor_warrior_5",
|
||||||
|
"head": "head_warrior_5",
|
||||||
|
"shield": "shield_warrior_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
287
tests/components/habitica/fixtures/content.json
Normal file
287
tests/components/habitica/fixtures/content.json
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"gear": {
|
||||||
|
"flat": {
|
||||||
|
"weapon_warrior_5": {
|
||||||
|
"text": "Ruby Sword",
|
||||||
|
"notes": "Weapon whose forge-glow never fades. Increases Strength by 15. ",
|
||||||
|
"str": 15,
|
||||||
|
"value": 90,
|
||||||
|
"type": "weapon",
|
||||||
|
"key": "weapon_warrior_5",
|
||||||
|
"set": "warrior-5",
|
||||||
|
"klass": "warrior",
|
||||||
|
"index": "5",
|
||||||
|
"int": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"armor_warrior_5": {
|
||||||
|
"text": "Golden Armor",
|
||||||
|
"notes": "Looks ceremonial, but no known blade can pierce it. Increases Constitution by 11.",
|
||||||
|
"con": 11,
|
||||||
|
"value": 120,
|
||||||
|
"last": true,
|
||||||
|
"type": "armor",
|
||||||
|
"key": "armor_warrior_5",
|
||||||
|
"set": "warrior-5",
|
||||||
|
"klass": "warrior",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"per": 0
|
||||||
|
},
|
||||||
|
"head_warrior_5": {
|
||||||
|
"text": "Golden Helm",
|
||||||
|
"notes": "Regal crown bound to shining armor. Increases Strength by 12.",
|
||||||
|
"str": 12,
|
||||||
|
"value": 80,
|
||||||
|
"last": true,
|
||||||
|
"type": "head",
|
||||||
|
"key": "head_warrior_5",
|
||||||
|
"set": "warrior-5",
|
||||||
|
"klass": "warrior",
|
||||||
|
"index": "5",
|
||||||
|
"int": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"shield_warrior_5": {
|
||||||
|
"text": "Golden Shield",
|
||||||
|
"notes": "Shining badge of the vanguard. Increases Constitution by 9.",
|
||||||
|
"con": 9,
|
||||||
|
"value": 90,
|
||||||
|
"last": true,
|
||||||
|
"type": "shield",
|
||||||
|
"key": "shield_warrior_5",
|
||||||
|
"set": "warrior-5",
|
||||||
|
"klass": "warrior",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"per": 0
|
||||||
|
},
|
||||||
|
"weapon_wizard_5": {
|
||||||
|
"twoHanded": true,
|
||||||
|
"text": "Archmage Staff",
|
||||||
|
"notes": "Assists in weaving the most complex of spells. Increases Intelligence by 15 and Perception by 7. Two-handed item.",
|
||||||
|
"int": 15,
|
||||||
|
"per": 7,
|
||||||
|
"value": 160,
|
||||||
|
"type": "weapon",
|
||||||
|
"key": "weapon_wizard_5",
|
||||||
|
"set": "wizard-5",
|
||||||
|
"klass": "wizard",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"armor_wizard_5": {
|
||||||
|
"text": "Royal Magus Robe",
|
||||||
|
"notes": "Symbol of the power behind the throne. Increases Intelligence by 12.",
|
||||||
|
"int": 12,
|
||||||
|
"value": 120,
|
||||||
|
"last": true,
|
||||||
|
"type": "armor",
|
||||||
|
"key": "armor_wizard_5",
|
||||||
|
"set": "wizard-5",
|
||||||
|
"klass": "wizard",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"head_wizard_5": {
|
||||||
|
"text": "Royal Magus Hat",
|
||||||
|
"notes": "Shows authority over fortune, weather, and lesser mages. Increases Perception by 10.",
|
||||||
|
"per": 10,
|
||||||
|
"value": 80,
|
||||||
|
"last": true,
|
||||||
|
"type": "head",
|
||||||
|
"key": "head_wizard_5",
|
||||||
|
"set": "wizard-5",
|
||||||
|
"klass": "wizard",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"weapon_healer_5": {
|
||||||
|
"text": "Royal Scepter",
|
||||||
|
"notes": "Fit to grace the hand of a monarch, or of one who stands at a monarch's right hand. Increases Intelligence by 9. ",
|
||||||
|
"int": 9,
|
||||||
|
"value": 90,
|
||||||
|
"type": "weapon",
|
||||||
|
"key": "weapon_healer_5",
|
||||||
|
"set": "healer-5",
|
||||||
|
"klass": "healer",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"armor_healer_5": {
|
||||||
|
"text": "Royal Mantle",
|
||||||
|
"notes": "Attire of those who have saved the lives of kings. Increases Constitution by 18.",
|
||||||
|
"con": 18,
|
||||||
|
"value": 120,
|
||||||
|
"last": true,
|
||||||
|
"type": "armor",
|
||||||
|
"key": "armor_healer_5",
|
||||||
|
"set": "healer-5",
|
||||||
|
"klass": "healer",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"per": 0
|
||||||
|
},
|
||||||
|
"head_healer_5": {
|
||||||
|
"text": "Royal Diadem",
|
||||||
|
"notes": "For king, queen, or miracle-worker. Increases Intelligence by 9.",
|
||||||
|
"int": 9,
|
||||||
|
"value": 80,
|
||||||
|
"last": true,
|
||||||
|
"type": "head",
|
||||||
|
"key": "head_healer_5",
|
||||||
|
"set": "healer-5",
|
||||||
|
"klass": "healer",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"shield_healer_5": {
|
||||||
|
"text": "Royal Shield",
|
||||||
|
"notes": "Bestowed upon those most dedicated to the kingdom's defense. Increases Constitution by 12.",
|
||||||
|
"con": 12,
|
||||||
|
"value": 90,
|
||||||
|
"last": true,
|
||||||
|
"type": "shield",
|
||||||
|
"key": "shield_healer_5",
|
||||||
|
"set": "healer-5",
|
||||||
|
"klass": "healer",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"per": 0
|
||||||
|
},
|
||||||
|
"weapon_rogue_5": {
|
||||||
|
"text": "Ninja-to",
|
||||||
|
"notes": "Sleek and deadly as the ninja themselves. Increases Strength by 8. ",
|
||||||
|
"str": 8,
|
||||||
|
"value": 90,
|
||||||
|
"type": "weapon",
|
||||||
|
"key": "weapon_rogue_5",
|
||||||
|
"set": "rogue-5",
|
||||||
|
"klass": "rogue",
|
||||||
|
"index": "5",
|
||||||
|
"int": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"armor_rogue_5": {
|
||||||
|
"text": "Umbral Armor",
|
||||||
|
"notes": "Allows stealth in the open in broad daylight. Increases Perception by 18.",
|
||||||
|
"per": 18,
|
||||||
|
"value": 120,
|
||||||
|
"last": true,
|
||||||
|
"type": "armor",
|
||||||
|
"key": "armor_rogue_5",
|
||||||
|
"set": "rogue-5",
|
||||||
|
"klass": "rogue",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"head_rogue_5": {
|
||||||
|
"text": "Umbral Hood",
|
||||||
|
"notes": "Conceals even thoughts from those who would probe them. Increases Perception by 12.",
|
||||||
|
"per": 12,
|
||||||
|
"value": 80,
|
||||||
|
"last": true,
|
||||||
|
"type": "head",
|
||||||
|
"key": "head_rogue_5",
|
||||||
|
"set": "rogue-5",
|
||||||
|
"klass": "rogue",
|
||||||
|
"index": "5",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"shield_rogue_5": {
|
||||||
|
"text": "Ninja-to",
|
||||||
|
"notes": "Sleek and deadly as the ninja themselves. Increases Strength by 8. ",
|
||||||
|
"str": 8,
|
||||||
|
"value": 90,
|
||||||
|
"type": "shield",
|
||||||
|
"key": "shield_rogue_5",
|
||||||
|
"set": "rogue-5",
|
||||||
|
"klass": "rogue",
|
||||||
|
"index": "5",
|
||||||
|
"int": 0,
|
||||||
|
"per": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"back_special_heroicAureole": {
|
||||||
|
"text": "Heroic Aureole",
|
||||||
|
"notes": "The gems on this aureole glimmer when you tell your tales of glory. Increases all stats by 7.",
|
||||||
|
"con": 7,
|
||||||
|
"str": 7,
|
||||||
|
"per": 7,
|
||||||
|
"int": 7,
|
||||||
|
"value": 175,
|
||||||
|
"type": "back",
|
||||||
|
"key": "back_special_heroicAureole",
|
||||||
|
"set": "special-heroicAureole",
|
||||||
|
"klass": "special",
|
||||||
|
"index": "heroicAureole"
|
||||||
|
},
|
||||||
|
"headAccessory_armoire_gogglesOfBookbinding": {
|
||||||
|
"per": 8,
|
||||||
|
"set": "bookbinder",
|
||||||
|
"notes": "These goggles will help you zero in on any task, large or small! Increases Perception by 8. Enchanted Armoire: Bookbinder Set (Item 1 of 4).",
|
||||||
|
"text": "Goggles of Bookbinding",
|
||||||
|
"value": 100,
|
||||||
|
"type": "headAccessory",
|
||||||
|
"key": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"klass": "armoire",
|
||||||
|
"index": "gogglesOfBookbinding",
|
||||||
|
"str": 0,
|
||||||
|
"int": 0,
|
||||||
|
"con": 0
|
||||||
|
},
|
||||||
|
"eyewear_armoire_plagueDoctorMask": {
|
||||||
|
"con": 5,
|
||||||
|
"int": 5,
|
||||||
|
"set": "plagueDoctor",
|
||||||
|
"notes": "An authentic mask worn by the doctors who battle the Plague of Procrastination. Increases Constitution and Intelligence by 5 each. Enchanted Armoire: Plague Doctor Set (Item 2 of 3).",
|
||||||
|
"text": "Plague Doctor Mask",
|
||||||
|
"value": 100,
|
||||||
|
"type": "eyewear",
|
||||||
|
"key": "eyewear_armoire_plagueDoctorMask",
|
||||||
|
"klass": "armoire",
|
||||||
|
"index": "plagueDoctorMask",
|
||||||
|
"str": 0,
|
||||||
|
"per": 0
|
||||||
|
},
|
||||||
|
"body_special_aetherAmulet": {
|
||||||
|
"text": "Aether Amulet",
|
||||||
|
"notes": "This amulet has a mysterious history. Increases Constitution and Strength by 10 each.",
|
||||||
|
"value": 175,
|
||||||
|
"str": 10,
|
||||||
|
"con": 10,
|
||||||
|
"type": "body",
|
||||||
|
"key": "body_special_aetherAmulet",
|
||||||
|
"set": "special-aetherAmulet",
|
||||||
|
"klass": "special",
|
||||||
|
"index": "aetherAmulet",
|
||||||
|
"int": 0,
|
||||||
|
"per": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"appVersion": "5.29.2"
|
||||||
|
}
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,17 +24,36 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 5
|
"points": 5,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": true,
|
"needsCron": true,
|
||||||
"lastCron": "2024-09-21T22:01:55.586Z"
|
"lastCron": "2024-09-21T22:01:55.586Z",
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_healer_5",
|
||||||
|
"armor": "armor_healer_5",
|
||||||
|
"head": "head_healer_5",
|
||||||
|
"shield": "shield_healer_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_healer_5",
|
||||||
|
"armor": "armor_healer_5",
|
||||||
|
"head": "head_healer_5",
|
||||||
|
"shield": "shield_healer_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,8 @@
|
|||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,17 +24,36 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 5
|
"points": 5,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": true,
|
"needsCron": true,
|
||||||
"lastCron": "2024-09-21T22:01:55.586Z"
|
"lastCron": "2024-09-21T22:01:55.586Z",
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_rogue_5",
|
||||||
|
"armor": "armor_rogue_5",
|
||||||
|
"head": "head_rogue_5",
|
||||||
|
"shield": "shield_rogue_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": true,
|
"streaks": true,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_rogue_5",
|
||||||
|
"armor": "armor_rogue_5",
|
||||||
|
"head": "head_rogue_5",
|
||||||
|
"shield": "shield_rogue_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 4,
|
"stealth": 4,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_rogue_5",
|
||||||
|
"armor": "armor_rogue_5",
|
||||||
|
"head": "head_rogue_5",
|
||||||
|
"shield": "shield_rogue_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,12 +24,17 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 5
|
"points": 5,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
@ -59,6 +64,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"needsCron": true,
|
"needsCron": true,
|
||||||
"lastCron": "2024-09-21T22:01:55.586Z"
|
"lastCron": "2024-09-21T22:01:55.586Z",
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_warrior_5",
|
||||||
|
"armor": "armor_warrior_5",
|
||||||
|
"head": "head_warrior_5",
|
||||||
|
"shield": "shield_warrior_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,17 +24,36 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 5
|
"points": 5,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": true,
|
"needsCron": true,
|
||||||
"lastCron": "2024-09-21T22:01:55.586Z"
|
"lastCron": "2024-09-21T22:01:55.586Z",
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_warrior_5",
|
||||||
|
"armor": "armor_warrior_5",
|
||||||
|
"head": "head_warrior_5",
|
||||||
|
"shield": "shield_warrior_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_warrior_5",
|
||||||
|
"armor": "armor_warrior_5",
|
||||||
|
"head": "head_warrior_5",
|
||||||
|
"shield": "shield_warrior_5",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,17 +24,36 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 5
|
"points": 5,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": true,
|
"automaticAllocation": true,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": true,
|
"needsCron": true,
|
||||||
"lastCron": "2024-09-21T22:01:55.586Z"
|
"lastCron": "2024-09-21T22:01:55.586Z",
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_wizard_5",
|
||||||
|
"armor": "armor_wizard_5",
|
||||||
|
"head": "head_wizard_5",
|
||||||
|
"shield": "shield_base_0",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": true,
|
"streaks": true,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_wizard_5",
|
||||||
|
"armor": "armor_wizard_5",
|
||||||
|
"head": "head_wizard_5",
|
||||||
|
"shield": "shield_base_0",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
"profile": { "name": "test-user" },
|
"profile": { "name": "test-user" },
|
||||||
"stats": {
|
"stats": {
|
||||||
"buffs": {
|
"buffs": {
|
||||||
"str": 0,
|
"str": 26,
|
||||||
"int": 0,
|
"int": 26,
|
||||||
"per": 0,
|
"per": 26,
|
||||||
"con": 0,
|
"con": 26,
|
||||||
"stealth": 0,
|
"stealth": 0,
|
||||||
"streaks": false,
|
"streaks": false,
|
||||||
"seafoam": false,
|
"seafoam": false,
|
||||||
@ -24,16 +24,35 @@
|
|||||||
"maxHealth": 50,
|
"maxHealth": 50,
|
||||||
"maxMP": 166,
|
"maxMP": 166,
|
||||||
"toNextLevel": 880,
|
"toNextLevel": 880,
|
||||||
"points": 0
|
"points": 0,
|
||||||
|
"str": 15,
|
||||||
|
"con": 15,
|
||||||
|
"int": 15,
|
||||||
|
"per": 15
|
||||||
},
|
},
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"sleep": false,
|
"sleep": false,
|
||||||
"automaticAllocation": false,
|
"automaticAllocation": false,
|
||||||
"disableClasses": false
|
"disableClasses": false,
|
||||||
|
"language": "en"
|
||||||
},
|
},
|
||||||
"flags": {
|
"flags": {
|
||||||
"classSelected": true
|
"classSelected": true
|
||||||
},
|
},
|
||||||
"needsCron": false
|
"needsCron": false,
|
||||||
|
"items": {
|
||||||
|
"gear": {
|
||||||
|
"equipped": {
|
||||||
|
"weapon": "weapon_wizard_5",
|
||||||
|
"armor": "armor_wizard_5",
|
||||||
|
"head": "head_wizard_5",
|
||||||
|
"shield": "shield_base_0",
|
||||||
|
"back": "heroicAureole",
|
||||||
|
"headAccessory": "headAccessory_armoire_gogglesOfBookbinding",
|
||||||
|
"eyewear": "plagueDoctorMask",
|
||||||
|
"body": "aetherAmulet"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,61 @@
|
|||||||
'state': 'wizard',
|
'state': 'wizard',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_constitution-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'sensor',
|
||||||
|
'entity_category': None,
|
||||||
|
'entity_id': 'sensor.test_user_constitution',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
'sensor': dict({
|
||||||
|
'suggested_display_precision': 0,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Constitution',
|
||||||
|
'platform': 'habitica',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': <HabitipySensorEntity.CONSTITUTION: 'constitution'>,
|
||||||
|
'unique_id': '00000000-0000-0000-0000-000000000000_constitution',
|
||||||
|
'unit_of_measurement': 'CON',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_constitution-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'allocated': 15,
|
||||||
|
'buffs': 26,
|
||||||
|
'class': 0,
|
||||||
|
'equipment': 20,
|
||||||
|
'friendly_name': 'test-user Constitution',
|
||||||
|
'level': 19,
|
||||||
|
'unit_of_measurement': 'CON',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'sensor.test_user_constitution',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '80',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_sensors[sensor.test_user_dailies-entry]
|
# name: test_sensors[sensor.test_user_dailies-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
@ -567,6 +622,61 @@
|
|||||||
'state': '0',
|
'state': '0',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_intelligence-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'sensor',
|
||||||
|
'entity_category': None,
|
||||||
|
'entity_id': 'sensor.test_user_intelligence',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
'sensor': dict({
|
||||||
|
'suggested_display_precision': 0,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Intelligence',
|
||||||
|
'platform': 'habitica',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': <HabitipySensorEntity.INTELLIGENCE: 'intelligence'>,
|
||||||
|
'unique_id': '00000000-0000-0000-0000-000000000000_intelligence',
|
||||||
|
'unit_of_measurement': 'INT',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_intelligence-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'allocated': 15,
|
||||||
|
'buffs': 26,
|
||||||
|
'class': 0,
|
||||||
|
'equipment': 0,
|
||||||
|
'friendly_name': 'test-user Intelligence',
|
||||||
|
'level': 19,
|
||||||
|
'unit_of_measurement': 'INT',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'sensor.test_user_intelligence',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '60',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_sensors[sensor.test_user_level-entry]
|
# name: test_sensors[sensor.test_user_level-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
@ -854,6 +964,61 @@
|
|||||||
'state': '880',
|
'state': '880',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_perception-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'sensor',
|
||||||
|
'entity_category': None,
|
||||||
|
'entity_id': 'sensor.test_user_perception',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
'sensor': dict({
|
||||||
|
'suggested_display_precision': 0,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Perception',
|
||||||
|
'platform': 'habitica',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': <HabitipySensorEntity.PERCEPTION: 'perception'>,
|
||||||
|
'unique_id': '00000000-0000-0000-0000-000000000000_perception',
|
||||||
|
'unit_of_measurement': 'PER',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_perception-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'allocated': 15,
|
||||||
|
'buffs': 26,
|
||||||
|
'class': 0,
|
||||||
|
'equipment': 8,
|
||||||
|
'friendly_name': 'test-user Perception',
|
||||||
|
'level': 19,
|
||||||
|
'unit_of_measurement': 'PER',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'sensor.test_user_perception',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '68',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_sensors[sensor.test_user_rewards-entry]
|
# name: test_sensors[sensor.test_user_rewards-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
@ -915,6 +1080,61 @@
|
|||||||
'state': '1',
|
'state': '1',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_strength-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'sensor',
|
||||||
|
'entity_category': None,
|
||||||
|
'entity_id': 'sensor.test_user_strength',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
'sensor': dict({
|
||||||
|
'suggested_display_precision': 0,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Strength',
|
||||||
|
'platform': 'habitica',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': <HabitipySensorEntity.STRENGTH: 'strength'>,
|
||||||
|
'unique_id': '00000000-0000-0000-0000-000000000000_strength',
|
||||||
|
'unit_of_measurement': 'STR',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_sensors[sensor.test_user_strength-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'allocated': 15,
|
||||||
|
'buffs': 26,
|
||||||
|
'class': 0,
|
||||||
|
'equipment': 27,
|
||||||
|
'friendly_name': 'test-user Strength',
|
||||||
|
'level': 19,
|
||||||
|
'unit_of_measurement': 'STR',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'sensor.test_user_strength',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '87',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_sensors[sensor.test_user_to_do_s-entry]
|
# name: test_sensors[sensor.test_user_to_do_s-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
|
@ -66,7 +66,11 @@ async def test_pending_quest_states(
|
|||||||
json=load_json_object_fixture(f"{fixture}.json", DOMAIN),
|
json=load_json_object_fixture(f"{fixture}.json", DOMAIN),
|
||||||
)
|
)
|
||||||
aioclient_mock.get(f"{DEFAULT_URL}/api/v3/tasks/user", json={"data": []})
|
aioclient_mock.get(f"{DEFAULT_URL}/api/v3/tasks/user", json={"data": []})
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{DEFAULT_URL}/api/v3/content",
|
||||||
|
params={"language": "en"},
|
||||||
|
json=load_json_object_fixture("content.json", DOMAIN),
|
||||||
|
)
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -63,6 +63,11 @@ async def test_buttons(
|
|||||||
f"{DEFAULT_URL}/api/v3/tasks/user",
|
f"{DEFAULT_URL}/api/v3/tasks/user",
|
||||||
json=load_json_object_fixture("tasks.json", DOMAIN),
|
json=load_json_object_fixture("tasks.json", DOMAIN),
|
||||||
)
|
)
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{DEFAULT_URL}/api/v3/content",
|
||||||
|
params={"language": "en"},
|
||||||
|
json=load_json_object_fixture("content.json", DOMAIN),
|
||||||
|
)
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
@ -163,6 +168,11 @@ async def test_button_press(
|
|||||||
f"{DEFAULT_URL}/api/v3/tasks/user",
|
f"{DEFAULT_URL}/api/v3/tasks/user",
|
||||||
json=load_json_object_fixture("tasks.json", DOMAIN),
|
json=load_json_object_fixture("tasks.json", DOMAIN),
|
||||||
)
|
)
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{DEFAULT_URL}/api/v3/content",
|
||||||
|
params={"language": "en"},
|
||||||
|
json=load_json_object_fixture("content.json", DOMAIN),
|
||||||
|
)
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -672,6 +672,11 @@ async def test_next_due_date(
|
|||||||
f"{DEFAULT_URL}/api/v3/tasks/user",
|
f"{DEFAULT_URL}/api/v3/tasks/user",
|
||||||
json=load_json_object_fixture(fixture, DOMAIN),
|
json=load_json_object_fixture(fixture, DOMAIN),
|
||||||
)
|
)
|
||||||
|
aioclient_mock.get(
|
||||||
|
f"{DEFAULT_URL}/api/v3/content",
|
||||||
|
params={"language": "en"},
|
||||||
|
json=load_json_object_fixture("content.json", DOMAIN),
|
||||||
|
)
|
||||||
|
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user