Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions homeassistant/components/notify/html5.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def get_service(hass, config, discovery_info=None):
add_manifest_json_key(
ATTR_GCM_SENDER_ID, config.get(ATTR_GCM_SENDER_ID))

return HTML5NotificationService(gcm_api_key, registrations)
return HTML5NotificationService(gcm_api_key, registrations, json_path)


def _load_config(filename):
Expand Down Expand Up @@ -327,10 +327,11 @@ def post(self, request):
class HTML5NotificationService(BaseNotificationService):
"""Implement the notification service for HTML5."""

def __init__(self, gcm_key, registrations):
def __init__(self, gcm_key, registrations, json_path):
"""Initialize the service."""
self._gcm_key = gcm_key
self.registrations = registrations
self.registrations_json_path = json_path

@property
def targets(self):
Expand Down Expand Up @@ -383,7 +384,7 @@ def send_message(self, message="", **kwargs):
if not targets:
targets = self.registrations.keys()

for target in targets:
for target in list(targets):
info = self.registrations.get(target)
if info is None:
_LOGGER.error("%s is not a valid HTML5 push notification"
Expand All @@ -399,5 +400,16 @@ def send_message(self, message="", **kwargs):
jwt_token = jwt.encode(jwt_claims, jwt_secret).decode('utf-8')
payload[ATTR_DATA][ATTR_JWT] = jwt_token

WebPusher(info[ATTR_SUBSCRIPTION]).send(
response = WebPusher(info[ATTR_SUBSCRIPTION]).send(
json.dumps(payload), gcm_key=self._gcm_key, ttl='86400')

# pylint: disable=no-member
if response.status_code == 410:
_LOGGER.info("Notification channel has expired")
reg = self.registrations.pop(target)
if not _save_config(self.registrations_json_path,
self.registrations):
self.registrations[target] = reg
_LOGGER.error("Error saving registration.")
else:
_LOGGER.info("Configuration saved")
10 changes: 8 additions & 2 deletions tests/components/notify/test_html5.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,14 @@ def test_sending_message(self, mock_wp):
service.send_message('Hello', target=['device', 'non_existing'],
data={'icon': 'beer.png'})

assert len(mock_wp.mock_calls) == 2
print(mock_wp.mock_calls)

assert len(mock_wp.mock_calls) == 3

# WebPusher constructor
assert mock_wp.mock_calls[0][1][0] == SUBSCRIPTION_1['subscription']
# Third mock_call checks the status_code of the response.
assert mock_wp.mock_calls[2][0] == '().send().status_code.__eq__'

# Call to send
payload = json.loads(mock_wp.mock_calls[1][1][0])
Expand Down Expand Up @@ -376,11 +380,13 @@ def test_callback_view_with_jwt(self, loop, test_client):
service.send_message('Hello', target=['device'],
data={'icon': 'beer.png'})

assert len(mock_wp.mock_calls) == 2
assert len(mock_wp.mock_calls) == 3

# WebPusher constructor
assert mock_wp.mock_calls[0][1][0] == \
SUBSCRIPTION_1['subscription']
# Third mock_call checks the status_code of the response.
assert mock_wp.mock_calls[2][0] == '().send().status_code.__eq__'

# Call to send
push_payload = json.loads(mock_wp.mock_calls[1][1][0])
Expand Down