Procházet zdrojové kódy

Improve test coverage for generic components.

Still not 100%, as the components cover some cases that our current config files don't use.  Probably some test configs are needed to fully exercise the generic classes ahead of any real device using them.

Remove devcontainer config.  Based on upstream changes, it seems it is out of date, and I do not use it myself so it is just a maintenance burden keeping it.
Jason Rumney před 4 roky
rodič
revize
9c1c73e5d8
4 změnil soubory, kde provedl 21 přidání a 27 odebrání
  1. 0 26
      .devcontainer/devcontainer.json
  2. 7 0
      tests/test_light.py
  3. 7 0
      tests/test_lock.py
  4. 7 1
      tests/test_switch.py

+ 0 - 26
.devcontainer/devcontainer.json

@@ -1,26 +0,0 @@
-{
-  "name": "Goldair Climate dev",
-  "image": "ludeeus/container:integration",
-  "context": "..",
-  "appPort": 8123,
-  "postCreateCommand": "dc install",
-  "runArgs": ["-e", "GIT_EDITOR=code --wait"],
-  "extensions": [
-    "ms-python.python",
-    "visualstudioexptteam.vscodeintellicode",
-    "redhat.vscode-yaml",
-    "esbenp.prettier-vscode",
-    "ryanluker.vscode-coverage-gutters"
-  ],
-  "settings": {
-    "files.exclude": {
-      "config/custom_components/goldair_climate": true
-    },
-    "python.pythonPath": "/usr/bin/python",
-    "terminal.integrated.shell.linux": "/bin/bash"
-  },
-  "mounts": [
-    "source=${env:HOME}${env:USERPROFILE}/.ssh,target=/tmp/.ssh,type=bind,consistency=cached",
-    "source=${localWorkspaceFolder}/config,target=/config,type=bind,consistency=cached"
-  ]
-}

+ 7 - 0
tests/test_light.py

@@ -54,6 +54,7 @@ class TestTuyaLocalLight(IsolatedAsyncioTestCase):
                 break
                 break
         self.subject = TuyaLocalLight(self.mock_device(), light)
         self.subject = TuyaLocalLight(self.mock_device(), light)
         self.dps = GPPH_HEATER_PAYLOAD.copy()
         self.dps = GPPH_HEATER_PAYLOAD.copy()
+        self.light_name = light.name
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]
 
 
     def test_should_poll(self):
     def test_should_poll(self):
@@ -62,6 +63,9 @@ class TestTuyaLocalLight(IsolatedAsyncioTestCase):
     def test_name_returns_device_name(self):
     def test_name_returns_device_name(self):
         self.assertEqual(self.subject.name, self.subject._device.name)
         self.assertEqual(self.subject.name, self.subject._device.name)
 
 
+    def test_friendly_name_returns_config_name(self):
+        self.assertEqual(self.subject.friendly_name, self.light_name)
+
     def test_unique_id_returns_device_unique_id(self):
     def test_unique_id_returns_device_unique_id(self):
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
 
 
@@ -82,6 +86,9 @@ class TestTuyaLocalLight(IsolatedAsyncioTestCase):
         self.dps[GPPH_LIGHTSWITCH_DPS] = False
         self.dps[GPPH_LIGHTSWITCH_DPS] = False
         self.assertEqual(self.subject.is_on, False)
         self.assertEqual(self.subject.is_on, False)
 
 
+    def test_state_attributes(self):
+        self.assertEqual(self.subject.device_state_attributes, {})
+
     async def test_turn_on(self):
     async def test_turn_on(self):
         async with assert_device_properties_set(
         async with assert_device_properties_set(
             self.subject._device, {GPPH_LIGHTSWITCH_DPS: True}
             self.subject._device, {GPPH_LIGHTSWITCH_DPS: True}

+ 7 - 0
tests/test_lock.py

@@ -58,6 +58,7 @@ class TestTuyaLocalLock(IsolatedAsyncioTestCase):
                 break
                 break
         self.subject = TuyaLocalLock(self.mock_device(), lock)
         self.subject = TuyaLocalLock(self.mock_device(), lock)
         self.dps = GPPH_HEATER_PAYLOAD.copy()
         self.dps = GPPH_HEATER_PAYLOAD.copy()
+        self.lock_name = lock.name
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]
         self.subject._device.get_property.side_effect = lambda id: self.dps[id]
 
 
     def test_should_poll(self):
     def test_should_poll(self):
@@ -66,6 +67,9 @@ class TestTuyaLocalLock(IsolatedAsyncioTestCase):
     def test_name_returns_device_name(self):
     def test_name_returns_device_name(self):
         self.assertEqual(self.subject.name, self.subject._device.name)
         self.assertEqual(self.subject.name, self.subject._device.name)
 
 
+    def test_friendly_name_returns_config_name(self):
+        self.assertEqual(self.subject.friendly_name, self.lock_name)
+
     def test_unique_id_returns_device_unique_id(self):
     def test_unique_id_returns_device_unique_id(self):
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
 
 
@@ -82,6 +86,9 @@ class TestTuyaLocalLock(IsolatedAsyncioTestCase):
         self.dps[GPPH_LOCK_DPS] = None
         self.dps[GPPH_LOCK_DPS] = None
         self.assertEqual(self.subject.state, STATE_UNAVAILABLE)
         self.assertEqual(self.subject.state, STATE_UNAVAILABLE)
 
 
+    def test_state_attributes(self):
+        self.assertEqual(self.subject.device_state_attributes, {})
+
     def test_is_locked(self):
     def test_is_locked(self):
         self.dps[GPPH_LOCK_DPS] = True
         self.dps[GPPH_LOCK_DPS] = True
         self.assertTrue(self.subject.is_locked)
         self.assertTrue(self.subject.is_locked)

+ 7 - 1
tests/test_switch.py

@@ -57,7 +57,7 @@ class TestTuyaLocalSwitch(IsolatedAsyncioTestCase):
         self.mock_device = device_patcher.start()
         self.mock_device = device_patcher.start()
         kogan_switch_config = config_for_legacy_use(CONF_TYPE_KOGAN_SWITCH)
         kogan_switch_config = config_for_legacy_use(CONF_TYPE_KOGAN_SWITCH)
         switch = kogan_switch_config.primary_entity
         switch = kogan_switch_config.primary_entity
-
+        self.switch_name = switch.name
         self.subject = TuyaLocalSwitch(self.mock_device(), switch)
         self.subject = TuyaLocalSwitch(self.mock_device(), switch)
         self.dps = KOGAN_SOCKET_PAYLOAD.copy()
         self.dps = KOGAN_SOCKET_PAYLOAD.copy()
 
 
@@ -69,9 +69,15 @@ class TestTuyaLocalSwitch(IsolatedAsyncioTestCase):
     def test_name_returns_device_name(self):
     def test_name_returns_device_name(self):
         self.assertEqual(self.subject.name, self.subject._device.name)
         self.assertEqual(self.subject.name, self.subject._device.name)
 
 
+    def test_friendly_name_returns_config_name(self):
+        self.assertEqual(self.subject.friendly_name, self.switch_name)
+
     def test_unique_id_returns_device_unique_id(self):
     def test_unique_id_returns_device_unique_id(self):
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
         self.assertEqual(self.subject.unique_id, self.subject._device.unique_id)
 
 
+    def test_device_info_returns_device_info_from_device(self):
+        self.assertEqual(self.subject.device_info, self.subject._device.device_info)
+
     def test_device_class_is_outlet(self):
     def test_device_class_is_outlet(self):
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)
         self.assertEqual(self.subject.device_class, DEVICE_CLASS_OUTLET)