Skip to content

Commit

Permalink
Input detail directly into post
Browse files Browse the repository at this point in the history
  • Loading branch information
amancevice committed May 29, 2021
1 parent 00bf81c commit da0ae96
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 43 deletions.
1 change: 1 addition & 0 deletions main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ resource "aws_cloudwatch_event_rule" "post" {
resource "aws_cloudwatch_event_target" "post" {
arn = aws_lambda_function.post.arn
event_bus_name = aws_cloudwatch_event_rule.post.event_bus_name
input_path = "$.detail"
rule = aws_cloudwatch_event_rule.post.name
target_id = "slack-post"
}
Expand Down
35 changes: 23 additions & 12 deletions src/events.py
Original file line number Diff line number Diff line change
@@ -1,52 +1,63 @@
import base64
import json
from collections.abc import Mapping

import boto3

from logger import logger


class Event:
class Event(Mapping):
def __init__(self, event):
self.event = event

def __getitem__(self, key):
return self.event[key]

def __iter__(self):
return iter(self.event)

def __len__(self):
return len(self.event)


class EventBridgeEvent(Event):
@property
def detail(self):
return self.event['detail']
def body(self):
return self.get('body')

@property
def detail_type(self):
return self.event['detail-type']
def headers(self):
return self.get('headers')

@property
def task_token(self):
return self.detail.get('task-token')
return self.get('task-token')

@property
def url(self):
return self.get('url')


class HttpEvent(Event):
@property
def body(self):
if self.event.get('isBase64Encoded'):
return base64.b64decode(self.event['body']).decode()
return self.event.get('body')
if self.get('isBase64Encoded'):
return base64.b64decode(self['body']).decode()
return self.get('body')

@property
def headers(self):
headers = self.event.get('headers') or {}
headers = self.get('headers') or {}
return {k.lower(): v for k, v in headers.items()}

@property
def query(self):
return self.event['queryStringParameters']
return self.get('queryStringParameters')

@property
def route_key(self):
return self.event.get('routeKey')
return self.get('routeKey')

@property
def trace_header(self):
Expand Down
4 changes: 2 additions & 2 deletions src/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from urllib.parse import parse_qsl

from errors import (Forbidden, NotFound)
from events import (Events, HttpEvent, EventBridgeEvent)
from events import (Events, EventBridgeEvent, HttpEvent)
from logger import logger
from secrets import export
from slack import Slack
Expand Down Expand Up @@ -132,7 +132,7 @@ def post_slash_cmd(event):
@logger.bind
def post(event, context=None):
event = EventBridgeEvent(event)
result = slack.post(**event.detail)
result = slack.post(event.url, event.body, event.headers)
if result['ok']:
events.publish('result', result)
if result['ok'] and event.task_token:
Expand Down
24 changes: 17 additions & 7 deletions tests/events_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import json
from unittest.mock import MagicMock

import pytest

from src.events import (Event, EventBridgeEvent, HttpEvent, Events)


Expand All @@ -12,19 +14,27 @@ def setup(self):
def test_getitem(self):
assert self.subject['fizz'] == 'buzz'

def test_len(self):
assert len(self.subject) == 1


class TestEventBridgeEvent:
def setup(self):
self.subject = EventBridgeEvent({
'detail': {'fizz': 'buzz'},
'detail-type': 'jazz-fuzz',
'url': 'https://slack.com/api/some.method',
'body': '{"fizz": "buzz"}',
'headers': {'content-type': 'application/json; charset=utf-8'},
'task-token': '<token>',
})

def test_detail(self):
assert self.subject.detail == {'fizz': 'buzz'}

def test_detail_type(self):
assert self.subject.detail_type == 'jazz-fuzz'
@pytest.mark.parametrize(('attr', 'exp'), [
('url', 'https://slack.com/api/some.method'),
('body', '{"fizz": "buzz"}'),
('headers', {'content-type': 'application/json; charset=utf-8'}),
('task_token', '<token>'),
])
def test_attr(self, attr, exp):
assert getattr(self.subject, attr) == exp


class TestHttpEvent:
Expand Down
36 changes: 14 additions & 22 deletions tests/index_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,37 +245,29 @@ def test_500(self):
def test_post(self):
index.slack.post.return_value = {'ok': True}
event = {
'detail-type': 'post',
'detail': {
'url': 'https://slack.com/api/chat.postMessage',
'body': json.dumps({'text': 'FIZZ'}),
'headers': {'content-type': 'application/json; charset=utf-8'},
'task-token': '<token>',
},
}
index.post(event)
index.slack.post.assert_called_once_with(**{
'url': 'https://slack.com/api/chat.postMessage',
'body': json.dumps({'text': 'FIZZ'}),
'headers': {'content-type': 'application/json; charset=utf-8'},
'task-token': '<token>',
})
}
index.post(event)
index.slack.post.assert_called_once_with(
'https://slack.com/api/chat.postMessage',
json.dumps({'text': 'FIZZ'}),
{'content-type': 'application/json; charset=utf-8'},
)

def test_post_fail(self):
index.slack.post.return_value = {'ok': False, 'error': 'fizz'}
event = {
'detail-type': 'post',
'detail': {
'url': 'https://slack.com/api/chat.postMessage',
'body': json.dumps({'text': 'FIZZ'}),
'headers': {'content-type': 'application/json; charset=utf-8'},
'task-token': '<token>',
},
}
index.post(event)
index.slack.post.assert_called_once_with(**{
'url': 'https://slack.com/api/chat.postMessage',
'body': json.dumps({'text': 'FIZZ'}),
'headers': {'content-type': 'application/json; charset=utf-8'},
'task-token': '<token>',
})
}
index.post(event)
index.slack.post.assert_called_once_with(
'https://slack.com/api/chat.postMessage',
json.dumps({'text': 'FIZZ'}),
{'content-type': 'application/json; charset=utf-8'},
)

0 comments on commit da0ae96

Please sign in to comment.