Skip to content

Commit

Permalink
Merge pull request #21 from repsejnworb/configurable-icon-url
Browse files Browse the repository at this point in the history
Add flags to configure 'icon_url' in Slack message
  • Loading branch information
LaserPhaser committed May 13, 2019
2 parents 51aca26 + 6b984df commit c3f47ac
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 16 deletions.
12 changes: 8 additions & 4 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,14 @@ Usage
Set the reporter name
--slack_timeout=SLACK_TIMEOUT [DEFAULT = 10s ]
Set the timeout for sending results in seconds
--slack_success_icon=SLACK_SUCCESS_ICON [default = :thumbsup:]
Set icon for a successful run
--slack_failed_icon=SLACK_FAILED_ICON [default = :thumbsdown:]
Set icon for a failed run
--slack_success_emoji=SLACK_SUCCESS_EMOJI [default = :thumbsup:]
Set emoji for a successful run
--slack_failed_emoji=SLACK_FAILED_EMOJI [default = :thumbsdown:]
Set emoji for a failed run
--slack_success_icon=SLACK_SUCCESS_ICON [default = None]
Set icon (a url) for a successful run. Overrides SLACK_SUCCESS_EMOJI
--slack_failed_icon=SLACK_FAILED_ICON [default = None]
Set icon (a url) for a failed run. Overrides SLACK_FAILED_EMOJI


Example
Expand Down
33 changes: 26 additions & 7 deletions pytest_slack/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,20 +45,36 @@ def pytest_addoption(parser):
help='Set the report send timeout'
)

group.addoption(
'--slack_success_emoji',
action='store',
dest='slack_success_emoji',
default=':thumbsup:',
help='Set emoji for a successful run'
)

group.addoption(
'--slack_failed_emoji',
action='store',
dest='slack_failed_emoji',
default=':thumbsdown:',
help='Set emoji for a failed run'
)

group.addoption(
'--slack_success_icon',
action='store',
dest='slack_success_icon',
default=':thumbsup:',
help='Set icon for a successful run'
default=None,
help='Set icon (a url) for a successful run. Overrides slack_success_emoji'
)

group.addoption(
'--slack_failed_icon',
action='store',
dest='slack_failed_icon',
default=':thumbsdown:',
help='Set icon for a failed run'
default=None,
help='Set icon (a url) for a failed run. Overrides slack_failed_icon'
)


Expand All @@ -82,10 +98,12 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):

if int(exitstatus) == 0:
color = "#56a64f"
emoji = config.option.slack_success_icon
emoji = config.option.slack_success_emoji
icon = config.option.slack_success_icon
else:
color = '#ff0000'
emoji = config.option.slack_failed_icon
emoji = config.option.slack_failed_emoji
icon = config.option.slack_failed_icon

final_results = 'Passed=%s Failed=%s Skipped=%s Error=%s' % (passed, failed, skipped, error)
if report_link:
Expand All @@ -103,6 +121,7 @@ def pytest_terminal_summary(terminalreporter, exitstatus, config):
payload = {"channel": channel,
"username": slack_username,
"attachments": [results_pattern],
"icon_emoji": emoji}
"icon_emoji": emoji if icon is None else None,
"icon_url": icon}

requests.post(slack_hook, data=json.dumps(payload), timeout=timeout)
70 changes: 65 additions & 5 deletions tests/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def test_error(test):
'--slack_hook', slack_hook_host,
'--slack_report_link', slack_hook_report_host,
'--slack_username', slack_hook_username,
'--slack_failed_icon', slack_hook_icon_emoji)
'--slack_failed_emoji', slack_hook_icon_emoji)

called_data = json.loads(mock_post.call_args[1]['data'])
called_host = mock_post.call_args[0][0]
Expand Down Expand Up @@ -80,7 +80,7 @@ def test_pass():
'--slack_hook', slack_hook_host,
'--slack_report_link', slack_hook_report_host,
'--slack_username', slack_hook_username,
'--slack_success_icon', slack_hook_icon_emoji)
'--slack_success_emoji', slack_hook_icon_emoji)

called_data = json.loads(mock_post.call_args[1]['data'])
called_host = mock_post.call_args[0][0]
Expand All @@ -102,7 +102,7 @@ def test_pass():
('1 == 1', ':sunny:'),
('2 == 1', ':rain_cloud:'),
])
def test_pytest_slack_custom_icons(testdir, test_input, expected_emoji):
def test_pytest_slack_custom_emojis(testdir, test_input, expected_emoji):
testdir.makepyfile(
"""
def test_icon_emoji():
Expand All @@ -117,10 +117,70 @@ def test_icon_emoji():
with mock.patch('requests.post') as mock_post:
testdir.runpytest('--slack_channel', slack_hook_channel,
'--slack_hook', slack_hook_host,
'--slack_success_icon', slack_hook_icon_emoji_success,
'--slack_failed_icon', slack_hook_icon_emoji_failed)
'--slack_success_emoji', slack_hook_icon_emoji_success,
'--slack_failed_emoji', slack_hook_icon_emoji_failed)

called_data = json.loads(mock_post.call_args[1]['data'])
emoji = called_data['icon_emoji']

assert emoji == expected_emoji


@pytest.mark.parametrize('test_input,expected_url', [
('1 == 1', 'http://localhost/success.png'),
('2 == 1', 'http://localhost/failed.png'),
])
def test_pytest_slack_custom_icons(testdir, test_input, expected_url):
testdir.makepyfile(
"""
def test_icon_url():
assert %s
""" % test_input
)

slack_hook_host = 'http://test.com/any_hash'
slack_hook_channel = 'test'
slack_hook_icon_url_success = 'http://localhost/success.png'
slack_hook_icon_url_failed = 'http://localhost/failed.png'
with mock.patch('requests.post') as mock_post:
testdir.runpytest('--slack_channel', slack_hook_channel,
'--slack_hook', slack_hook_host,
'--slack_success_icon', slack_hook_icon_url_success,
'--slack_failed_icon', slack_hook_icon_url_failed)

called_data = json.loads(mock_post.call_args[1]['data'])
emoji = called_data['icon_url']

assert emoji == expected_url


@pytest.mark.parametrize('test_input,expected_url', [
('1 == 1', 'http://localhost/success.png'),
('2 == 1', 'http://localhost/failed.png'),
])
def test_pytest_slack_icon_overrides_emoji(testdir, test_input, expected_url):
testdir.makepyfile(
"""
def test_icon_url():
assert %s
""" % test_input
)

slack_hook_host = 'http://test.com/any_hash'
slack_hook_channel = 'test'
slack_hook_icon_url_success = 'http://localhost/success.png'
slack_hook_icon_url_failed = 'http://localhost/failed.png'
slack_hook_icon_emoji_success = ':sunny:'
slack_hook_icon_emoji_failed = ':rain_cloud:'
with mock.patch('requests.post') as mock_post:
testdir.runpytest('--slack_channel', slack_hook_channel,
'--slack_hook', slack_hook_host,
'--slack_success_icon', slack_hook_icon_url_success,
'--slack_failed_icon', slack_hook_icon_url_failed,
'--slack_success_emoji', slack_hook_icon_emoji_success,
'--slack_failed_emoji', slack_hook_icon_emoji_failed)

called_data = json.loads(mock_post.call_args[1]['data'])
emoji = called_data['icon_url']

assert emoji == expected_url

0 comments on commit c3f47ac

Please sign in to comment.