mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 11:47:06 +00:00
Rewrite imap_email_content tests to use pytest (#41200)
This commit is contained in:
parent
357a0e9d7e
commit
8bcd6c1880
@ -4,14 +4,11 @@ import datetime
|
|||||||
import email
|
import email
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
import unittest
|
|
||||||
|
|
||||||
from homeassistant.components.imap_email_content import sensor as imap_email_content
|
from homeassistant.components.imap_email_content import sensor as imap_email_content
|
||||||
from homeassistant.helpers.event import track_state_change
|
from homeassistant.helpers.event import async_track_state_change
|
||||||
from homeassistant.helpers.template import Template
|
from homeassistant.helpers.template import Template
|
||||||
|
|
||||||
from tests.common import get_test_home_assistant
|
|
||||||
|
|
||||||
|
|
||||||
class FakeEMailReader:
|
class FakeEMailReader:
|
||||||
"""A test class for sending test emails."""
|
"""A test class for sending test emails."""
|
||||||
@ -31,207 +28,203 @@ class FakeEMailReader:
|
|||||||
return self._messages.popleft()
|
return self._messages.popleft()
|
||||||
|
|
||||||
|
|
||||||
class EmailContentSensor(unittest.TestCase):
|
async def test_allowed_sender(hass):
|
||||||
"""Test the IMAP email content sensor."""
|
"""Test emails from allowed sender."""
|
||||||
|
test_message = email.message.Message()
|
||||||
|
test_message["From"] = "sender@test.com"
|
||||||
|
test_message["Subject"] = "Test"
|
||||||
|
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
|
test_message.set_payload("Test Message")
|
||||||
|
|
||||||
def setUp(self):
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
"""Set up things to be run when tests are started."""
|
hass,
|
||||||
self.hass = get_test_home_assistant()
|
FakeEMailReader(deque([test_message])),
|
||||||
self.addCleanup(self.hass.stop)
|
"test_emails_sensor",
|
||||||
|
["sender@test.com"],
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
def test_allowed_sender(self):
|
sensor.entity_id = "sensor.emailtest"
|
||||||
"""Test emails from allowed sender."""
|
sensor.async_schedule_update_ha_state(True)
|
||||||
test_message = email.message.Message()
|
await hass.async_block_till_done()
|
||||||
test_message["From"] = "sender@test.com"
|
assert "Test" == sensor.state
|
||||||
test_message["Subject"] = "Test"
|
assert "Test Message" == sensor.device_state_attributes["body"]
|
||||||
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
assert "sender@test.com" == sensor.device_state_attributes["from"]
|
||||||
test_message.set_payload("Test Message")
|
assert "Test" == sensor.device_state_attributes["subject"]
|
||||||
|
assert (
|
||||||
|
datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
|
== sensor.device_state_attributes["date"]
|
||||||
|
)
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
|
||||||
self.hass,
|
|
||||||
FakeEMailReader(deque([test_message])),
|
|
||||||
"test_emails_sensor",
|
|
||||||
["sender@test.com"],
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
async def test_multi_part_with_text(hass):
|
||||||
sensor.schedule_update_ha_state(True)
|
"""Test multi part emails."""
|
||||||
self.hass.block_till_done()
|
msg = MIMEMultipart("alternative")
|
||||||
assert "Test" == sensor.state
|
msg["Subject"] = "Link"
|
||||||
assert "Test Message" == sensor.device_state_attributes["body"]
|
msg["From"] = "sender@test.com"
|
||||||
assert "sender@test.com" == sensor.device_state_attributes["from"]
|
|
||||||
assert "Test" == sensor.device_state_attributes["subject"]
|
|
||||||
assert (
|
|
||||||
datetime.datetime(2016, 1, 1, 12, 44, 57)
|
|
||||||
== sensor.device_state_attributes["date"]
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_multi_part_with_text(self):
|
text = "Test Message"
|
||||||
"""Test multi part emails."""
|
html = "<html><head></head><body>Test Message</body></html>"
|
||||||
msg = MIMEMultipart("alternative")
|
|
||||||
msg["Subject"] = "Link"
|
|
||||||
msg["From"] = "sender@test.com"
|
|
||||||
|
|
||||||
text = "Test Message"
|
textPart = MIMEText(text, "plain")
|
||||||
html = "<html><head></head><body>Test Message</body></html>"
|
htmlPart = MIMEText(html, "html")
|
||||||
|
|
||||||
textPart = MIMEText(text, "plain")
|
msg.attach(textPart)
|
||||||
htmlPart = MIMEText(html, "html")
|
msg.attach(htmlPart)
|
||||||
|
|
||||||
msg.attach(textPart)
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
msg.attach(htmlPart)
|
hass,
|
||||||
|
FakeEMailReader(deque([msg])),
|
||||||
|
"test_emails_sensor",
|
||||||
|
["sender@test.com"],
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
sensor.entity_id = "sensor.emailtest"
|
||||||
self.hass,
|
sensor.async_schedule_update_ha_state(True)
|
||||||
FakeEMailReader(deque([msg])),
|
await hass.async_block_till_done()
|
||||||
"test_emails_sensor",
|
assert "Link" == sensor.state
|
||||||
["sender@test.com"],
|
assert "Test Message" == sensor.device_state_attributes["body"]
|
||||||
None,
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
|
||||||
sensor.schedule_update_ha_state(True)
|
|
||||||
self.hass.block_till_done()
|
|
||||||
assert "Link" == sensor.state
|
|
||||||
assert "Test Message" == sensor.device_state_attributes["body"]
|
|
||||||
|
|
||||||
def test_multi_part_only_html(self):
|
async def test_multi_part_only_html(hass):
|
||||||
"""Test multi part emails with only HTML."""
|
"""Test multi part emails with only HTML."""
|
||||||
msg = MIMEMultipart("alternative")
|
msg = MIMEMultipart("alternative")
|
||||||
msg["Subject"] = "Link"
|
msg["Subject"] = "Link"
|
||||||
msg["From"] = "sender@test.com"
|
msg["From"] = "sender@test.com"
|
||||||
|
|
||||||
html = "<html><head></head><body>Test Message</body></html>"
|
html = "<html><head></head><body>Test Message</body></html>"
|
||||||
|
|
||||||
htmlPart = MIMEText(html, "html")
|
htmlPart = MIMEText(html, "html")
|
||||||
|
|
||||||
msg.attach(htmlPart)
|
msg.attach(htmlPart)
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
self.hass,
|
hass,
|
||||||
FakeEMailReader(deque([msg])),
|
FakeEMailReader(deque([msg])),
|
||||||
"test_emails_sensor",
|
"test_emails_sensor",
|
||||||
["sender@test.com"],
|
["sender@test.com"],
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
sensor.entity_id = "sensor.emailtest"
|
||||||
sensor.schedule_update_ha_state(True)
|
sensor.async_schedule_update_ha_state(True)
|
||||||
self.hass.block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert "Link" == sensor.state
|
assert "Link" == sensor.state
|
||||||
assert (
|
assert (
|
||||||
"<html><head></head><body>Test Message</body></html>"
|
"<html><head></head><body>Test Message</body></html>"
|
||||||
== sensor.device_state_attributes["body"]
|
== sensor.device_state_attributes["body"]
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_multi_part_only_other_text(self):
|
|
||||||
"""Test multi part emails with only other text."""
|
|
||||||
msg = MIMEMultipart("alternative")
|
|
||||||
msg["Subject"] = "Link"
|
|
||||||
msg["From"] = "sender@test.com"
|
|
||||||
|
|
||||||
other = "Test Message"
|
async def test_multi_part_only_other_text(hass):
|
||||||
|
"""Test multi part emails with only other text."""
|
||||||
|
msg = MIMEMultipart("alternative")
|
||||||
|
msg["Subject"] = "Link"
|
||||||
|
msg["From"] = "sender@test.com"
|
||||||
|
|
||||||
htmlPart = MIMEText(other, "other")
|
other = "Test Message"
|
||||||
|
|
||||||
msg.attach(htmlPart)
|
htmlPart = MIMEText(other, "other")
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
msg.attach(htmlPart)
|
||||||
self.hass,
|
|
||||||
FakeEMailReader(deque([msg])),
|
|
||||||
"test_emails_sensor",
|
|
||||||
["sender@test.com"],
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
sensor.schedule_update_ha_state(True)
|
hass,
|
||||||
self.hass.block_till_done()
|
FakeEMailReader(deque([msg])),
|
||||||
assert "Link" == sensor.state
|
"test_emails_sensor",
|
||||||
assert "Test Message" == sensor.device_state_attributes["body"]
|
["sender@test.com"],
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
def test_multiple_emails(self):
|
sensor.entity_id = "sensor.emailtest"
|
||||||
"""Test multiple emails."""
|
sensor.async_schedule_update_ha_state(True)
|
||||||
states = []
|
await hass.async_block_till_done()
|
||||||
|
assert "Link" == sensor.state
|
||||||
|
assert "Test Message" == sensor.device_state_attributes["body"]
|
||||||
|
|
||||||
test_message1 = email.message.Message()
|
|
||||||
test_message1["From"] = "sender@test.com"
|
|
||||||
test_message1["Subject"] = "Test"
|
|
||||||
test_message1["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
|
||||||
test_message1.set_payload("Test Message")
|
|
||||||
|
|
||||||
test_message2 = email.message.Message()
|
async def test_multiple_emails(hass):
|
||||||
test_message2["From"] = "sender@test.com"
|
"""Test multiple emails."""
|
||||||
test_message2["Subject"] = "Test 2"
|
states = []
|
||||||
test_message2["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
|
||||||
test_message2.set_payload("Test Message 2")
|
|
||||||
|
|
||||||
def state_changed_listener(entity_id, from_s, to_s):
|
test_message1 = email.message.Message()
|
||||||
states.append(to_s)
|
test_message1["From"] = "sender@test.com"
|
||||||
|
test_message1["Subject"] = "Test"
|
||||||
|
test_message1["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
|
test_message1.set_payload("Test Message")
|
||||||
|
|
||||||
track_state_change(self.hass, ["sensor.emailtest"], state_changed_listener)
|
test_message2 = email.message.Message()
|
||||||
|
test_message2["From"] = "sender@test.com"
|
||||||
|
test_message2["Subject"] = "Test 2"
|
||||||
|
test_message2["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
|
test_message2.set_payload("Test Message 2")
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
def state_changed_listener(entity_id, from_s, to_s):
|
||||||
self.hass,
|
states.append(to_s)
|
||||||
FakeEMailReader(deque([test_message1, test_message2])),
|
|
||||||
"test_emails_sensor",
|
|
||||||
["sender@test.com"],
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
async_track_state_change(hass, ["sensor.emailtest"], state_changed_listener)
|
||||||
|
|
||||||
sensor.schedule_update_ha_state(True)
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
self.hass.block_till_done()
|
hass,
|
||||||
sensor.schedule_update_ha_state(True)
|
FakeEMailReader(deque([test_message1, test_message2])),
|
||||||
self.hass.block_till_done()
|
"test_emails_sensor",
|
||||||
|
["sender@test.com"],
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
assert "Test" == states[0].state
|
sensor.entity_id = "sensor.emailtest"
|
||||||
assert "Test 2" == states[1].state
|
|
||||||
|
|
||||||
assert "Test Message 2" == sensor.device_state_attributes["body"]
|
sensor.async_schedule_update_ha_state(True)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
sensor.async_schedule_update_ha_state(True)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
def test_sender_not_allowed(self):
|
assert "Test" == states[0].state
|
||||||
"""Test not whitelisted emails."""
|
assert "Test 2" == states[1].state
|
||||||
test_message = email.message.Message()
|
|
||||||
test_message["From"] = "sender@test.com"
|
|
||||||
test_message["Subject"] = "Test"
|
|
||||||
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
|
||||||
test_message.set_payload("Test Message")
|
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
assert "Test Message 2" == sensor.device_state_attributes["body"]
|
||||||
self.hass,
|
|
||||||
FakeEMailReader(deque([test_message])),
|
|
||||||
"test_emails_sensor",
|
|
||||||
["other@test.com"],
|
|
||||||
None,
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
|
||||||
sensor.schedule_update_ha_state(True)
|
|
||||||
self.hass.block_till_done()
|
|
||||||
assert sensor.state is None
|
|
||||||
|
|
||||||
def test_template(self):
|
async def test_sender_not_allowed(hass):
|
||||||
"""Test value template."""
|
"""Test not whitelisted emails."""
|
||||||
test_message = email.message.Message()
|
test_message = email.message.Message()
|
||||||
test_message["From"] = "sender@test.com"
|
test_message["From"] = "sender@test.com"
|
||||||
test_message["Subject"] = "Test"
|
test_message["Subject"] = "Test"
|
||||||
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
test_message.set_payload("Test Message")
|
test_message.set_payload("Test Message")
|
||||||
|
|
||||||
sensor = imap_email_content.EmailContentSensor(
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
self.hass,
|
hass,
|
||||||
FakeEMailReader(deque([test_message])),
|
FakeEMailReader(deque([test_message])),
|
||||||
"test_emails_sensor",
|
"test_emails_sensor",
|
||||||
["sender@test.com"],
|
["other@test.com"],
|
||||||
Template(
|
None,
|
||||||
"{{ subject }} from {{ from }} with message {{ body }}", self.hass
|
)
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
sensor.entity_id = "sensor.emailtest"
|
sensor.entity_id = "sensor.emailtest"
|
||||||
sensor.schedule_update_ha_state(True)
|
sensor.async_schedule_update_ha_state(True)
|
||||||
self.hass.block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert "Test from sender@test.com with message Test Message" == sensor.state
|
assert sensor.state is None
|
||||||
|
|
||||||
|
|
||||||
|
async def test_template(hass):
|
||||||
|
"""Test value template."""
|
||||||
|
test_message = email.message.Message()
|
||||||
|
test_message["From"] = "sender@test.com"
|
||||||
|
test_message["Subject"] = "Test"
|
||||||
|
test_message["Date"] = datetime.datetime(2016, 1, 1, 12, 44, 57)
|
||||||
|
test_message.set_payload("Test Message")
|
||||||
|
|
||||||
|
sensor = imap_email_content.EmailContentSensor(
|
||||||
|
hass,
|
||||||
|
FakeEMailReader(deque([test_message])),
|
||||||
|
"test_emails_sensor",
|
||||||
|
["sender@test.com"],
|
||||||
|
Template("{{ subject }} from {{ from }} with message {{ body }}", hass),
|
||||||
|
)
|
||||||
|
|
||||||
|
sensor.entity_id = "sensor.emailtest"
|
||||||
|
sensor.async_schedule_update_ha_state(True)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert "Test from sender@test.com with message Test Message" == sensor.state
|
||||||
|
Loading…
x
Reference in New Issue
Block a user