Rewrite imap_email_content tests to use pytest (#41200)

This commit is contained in:
Edward Knight 2020-10-06 14:01:25 +01:00 committed by GitHub
parent 357a0e9d7e
commit 8bcd6c1880
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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