text.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. # Mixins for testing text entities
  2. from homeassistant.components.text import (
  3. ATTR_MAX,
  4. ATTR_MIN,
  5. ATTR_MODE,
  6. ATTR_PATTERN,
  7. TextMode,
  8. )
  9. from ..helpers import assert_device_properties_set
  10. TEXT_PATTERN_HEX = "[0-9a-fA-F]*"
  11. TEXT_PATTERN_BASE64 = "[-A-Za-z0-9+/]*={0,3}"
  12. class BasicTextTests:
  13. def setUpBasicText(
  14. self,
  15. dp,
  16. subject,
  17. max=None,
  18. min=None,
  19. mode=TextMode.TEXT,
  20. pattern=None,
  21. testdata=None,
  22. extra_state={},
  23. ):
  24. self.basicText = subject
  25. self.basicTextDp = dp
  26. self.basicTextMin = min
  27. self.basicTextMax = max
  28. self.basicTextMode = mode
  29. self.basicTextPattern = pattern
  30. self.basicTextTestData = testdata
  31. self.basicTextExtra = extra_state
  32. def test_text_min_value(self):
  33. if self.basicTextMin is not None:
  34. self.assertEqual(self.basicText._attr_native_min, self.basicTextMin)
  35. def test_text_max_value(self):
  36. if self.basicTextMax is not None:
  37. self.assertEqual(self.basicText._attr_native_max, self.basicTextMax)
  38. def test_text_mode(self):
  39. if self.basicTextMode is not None:
  40. self.assertEqual(self.basicText._attr_mode, self.basicTextMode)
  41. def test_text_pattern(self):
  42. if self.basicTextPattern is not None:
  43. self.assertEqual(self.basicText._attr_pattern, self.basicTextPattern)
  44. def test_text_value(self):
  45. if self.basicTextTestData:
  46. val = self.basicTextTestData[0]
  47. expected = self.basicTextTestData[1]
  48. else:
  49. val = "ipsum"
  50. expected = "ipsum"
  51. self.dps[self.basicTextDp] = val
  52. self.assertEqual(self.basicText.native_value, expected)
  53. async def test_text_set_value(self):
  54. if self.basicTextTestData:
  55. dps_val = self.basicTextTestData[0]
  56. val = self.basicTextTestData[1]
  57. else:
  58. dps_val = "ipsum"
  59. val = "ipsum"
  60. async with assert_device_properties_set(
  61. self.basicText._device, {self.basicTextDp: dps_val}
  62. ):
  63. await self.basicText.async_set_value(val)
  64. def test_text_extra_state_attributes(self):
  65. expected = {ATTR_MODE: self.basicTextMode, **self.basicTextExtra}
  66. if self.basicTextPattern:
  67. expected[ATTR_PATTERN] = self.basicTextPattern
  68. if self.basicTextMin:
  69. expected[ATTR_MIN] = self.basicTextMin
  70. if self.basicTextMax:
  71. expected[ATTR_MAX] = self.basicTextMax
  72. self.assertEqual(self.basicText.extra_state_attributes, expected)
  73. class MultiTextTests:
  74. def setUpMultiText(self, texts):
  75. self.multiText = {}
  76. self.multiTextDps = {}
  77. self.multiTextMin = {}
  78. self.multiTextMax = {}
  79. self.multiTextMode = {}
  80. self.multiTextPattern = {}
  81. self.multiTextTestData = {}
  82. self.multiTextExtra = {}
  83. for text in texts:
  84. name = text.get("name")
  85. subject = self.entities.get(name)
  86. if subject is None:
  87. raise AttributeError(f"No text for {name} found.")
  88. self.multiText[name] = subject
  89. self.multiTextDps[name] = text.get("dps")
  90. self.multiTextMin[name] = text.get("min", 0)
  91. self.multiTextMax[name] = text.get("max")
  92. self.multiTextMode[name] = text.get("mode", TextMode.TEXT)
  93. self.multiTextPattern[name] = text.get("pattern")
  94. self.multiTextTestData[name] = text.get("testdata")
  95. self.multiTextExtra[name] = text.get("extra", {})
  96. def test_multi_text_min_value(self):
  97. for key, subject in self.multiText.items():
  98. if self.multiTextMin.get(key):
  99. self.assertEqual(
  100. subject.native_min_value,
  101. self.multiTextMin[key],
  102. f"{key} min value mismatch",
  103. )
  104. def test_multi_text_max_value(self):
  105. for key, subject in self.multiText.items():
  106. if self.multiTextMax.get(key):
  107. self.assertEqual(
  108. subject.native_max_value,
  109. self.multiTextMax[key],
  110. f"{key} max value mismatch",
  111. )
  112. def test_multi_text_mode(self):
  113. for key, subject in self.multiText.items():
  114. if self.multiTextMode.get(key):
  115. self.assertEqual(subject.mode, self.multiTextMode[key])
  116. def test_multi_text_pattern(self):
  117. for key, subject in self.multiText.items():
  118. if self.multiTextPattern.get(key):
  119. self.assertEqual(subject.pattern, self.multiTextPattern[key])
  120. def test_multi_text_value(self):
  121. for key, subject in self.multiText.items():
  122. if self.multiTextTestData.get(key):
  123. val = self.multiTextTestData[key][0]
  124. expected = self.multiTextTestData[key][1]
  125. else:
  126. val = "ipsum"
  127. expected = "ipsum"
  128. self.dps[self.multiTextDp[key]] = val
  129. self.assertEqual(subject.native_value, expected)
  130. async def test_multi_text_set_value(self):
  131. for key, subject in self.multiText.items():
  132. await subject.async_set_value("lorem")
  133. self.assert_device_properties_set(self.multiTextDp[key], "lorem")
  134. def test_multi_text_extra_state_attributes(self):
  135. for key, subject in self.multiText.items():
  136. expected = {
  137. ATTR_MODE: self.multiTextMode[key],
  138. **self.multiTextExtra[key],
  139. }
  140. if self.multiTextPattern.get(key):
  141. expected[ATTR_PATTERN] = self.multiTextPattern[key]
  142. if self.multiTextMin.get(key):
  143. expected[ATTR_MIN] = self.multiTextMin[key]
  144. if self.multiTextMax.get(key):
  145. expected[ATTR_MAX] = self.multiTextMax[key]
  146. self.assertEqual(subject.extra_state_attributes, expected)