Skip to content
This repository was archived by the owner on Jun 19, 2019. It is now read-only.

Commit b8cd589

Browse files
Merge pull request #15 from AllenAnthes/test-initial
Test-Initial Tests
2 parents 6c82fee + d61e810 commit b8cd589

File tree

6 files changed

+209
-8
lines changed

6 files changed

+209
-8
lines changed

requirements.txt

98 Bytes
Binary file not shown.

src/app.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
new_event_logger = logging.getLogger(f'{__name__}.new_member')
1010
all_event_logger = logging.getLogger(f'{__name__}.all_events')
1111

12+
1213
# constants
1314
MESSAGE = (
1415
"Hi {real_name},\n\n Welcome to Operation Code! I'm a bot designed to help answer questions and get you on your way in our community.\n\n"
@@ -40,7 +41,9 @@ def event_handler(event_dict):
4041

4142
# can be used for development to trigger the event instead of the team_join
4243
if event_dict['type'] == 'message' and 'user' in event_dict.keys():
43-
pass
44+
45+
# Will need to be removed. Currently for testing
46+
logger.info('Message event')
4447
if event_dict['type'] == 'message' and 'user' in event_dict.keys() and event_dict['text'] == 'test4611':
4548
event_dict['user'] = {'id': event_dict['user']}
4649
new_member(event_dict)
@@ -57,13 +60,18 @@ def new_member(event_dict):
5760
custom_message = build_message(MESSAGE,
5861
real_name=user_name_from_id(user_id))
5962

60-
new_event_logger.info('Built message: {}'.format(custom_message))
61-
slack_client.api_call('chat.postMessage',
62-
channel=user_id,
63-
text=custom_message,
64-
as_user=True)
6563

66-
new_event_logger.info('New Member Slack response: {}'.format(event_dict))
64+
new_event_logger.info('Built message: {}'.format(event_dict))
65+
response = slack_client.api_call('chat.postMessage',
66+
channel=user_id,
67+
text=custom_message,
68+
as_user=True)
69+
70+
71+
if response['ok'] == 'true':
72+
new_event_logger.info('New Member Slack response: {}'.format(response))
73+
else:
74+
new_event_logger.error('FAILED -- Message to new member returned error: {}'.format(response))
6775

6876

6977
def parse_slack_output(slack_rtm_output):

tests/__init__.py

Whitespace-only changes.

tests/main.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

tests/test_basic_functionality.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from testfixtures import LogCapture
2+
import unittest
3+
import mock
4+
import logging
5+
6+
from src import app
7+
from .test_data import *
8+
9+
10+
class EventHandlerTestCase(unittest.TestCase):
11+
12+
@mock.patch('src.app.new_member')
13+
def test_event_handler_receives_team_join_calls_new_member(self, mock_new_member):
14+
"""
15+
Asserts event_handler correctly passes the event to the new_member function
16+
when event type is 'team_join'
17+
"""
18+
app.event_handler(NEW_MEMBER)
19+
mock_new_member.assert_called_with(NEW_MEMBER)
20+
21+
def test_event_handler_message_event_logs_event(self):
22+
"""
23+
Asserts event handler correctly logs message events.
24+
Will be removed eventually...
25+
"""
26+
with LogCapture() as capture:
27+
app.event_handler(MESSAGE_EVENT)
28+
capture.check(('src.app', 'INFO', 'Message event'))
29+
30+
31+
@mock.patch('src.app.slack_client')
32+
class UserNameTestCase(unittest.TestCase):
33+
34+
def test_user_name_from_id_has_real_name(self, mock_client):
35+
"""
36+
Asserts the user_name_from_id method returns the user's real name
37+
when it is present.
38+
"""
39+
mock_client.api_call.return_value = USER_INFO_HAS_REAL_NAME
40+
real_name = app.user_name_from_id(USER_INFO_HAS_REAL_NAME['user']['id'])
41+
self.assertEquals(real_name, 'Episod')
42+
43+
def test_user_name_from_id_real_name_blank_returns_name(self, mock_client):
44+
"""
45+
Asserts the user_name_from_id method returns the user's name
46+
when their real name is absent but the username is present
47+
"""
48+
mock_client.api_call.return_value = USER_INFO_HAS_NAME
49+
name = app.user_name_from_id(USER_INFO_HAS_NAME['user']['id'])
50+
self.assertEquals(name, 'Spengler')
51+
52+
def test_user_name_from_id_no_name_return_new_member(self, mock_client):
53+
"""
54+
Asserts the user_name_from_id method defaults to returning New Member
55+
when both real name and name are absent
56+
"""
57+
mock_client.api_call.return_value = USER_INFO_NO_NAME
58+
name = app.user_name_from_id(USER_INFO_NO_NAME['user']['id'])
59+
self.assertEquals(name, 'New Member')
60+
61+
62+
@mock.patch('src.app.user_name_from_id', return_value='bob')
63+
@mock.patch('src.app.build_message', return_value=MESSAGE)
64+
class NewMemberTestCase(unittest.TestCase):
65+
66+
@mock.patch('src.app.slack_client.api_call', return_value={'ok': 'true', 'info': 'stuff goes here'})
67+
def test_event_logged(self, mock_client, mock_builder, mock_username_from_id):
68+
"""
69+
Asserts messages are being logged properly when new_member is called
70+
"""
71+
with LogCapture() as capture:
72+
app.new_member(NEW_MEMBER)
73+
capture.check(
74+
('src.app.new_member', 'INFO', 'Recieved json event: {}'.format(NEW_MEMBER)),
75+
('root', 'INFO', 'team_join message'),
76+
('src.app.new_member', 'INFO', 'Built message: {}'.format(NEW_MEMBER)),
77+
('src.app.new_member', 'INFO',
78+
'New Member Slack response: {}'.format({'ok': 'true', 'info': 'stuff goes here'}))
79+
)
80+
81+
@mock.patch('src.app.slack_client')
82+
def test_slack_client_called_with_correct_params(self, mock_client, mock_builder, mock_unfi):
83+
"""
84+
Asserts new_member calls the client api with correct params.
85+
"""
86+
app.new_member(NEW_MEMBER)
87+
mock_client.api_call.assert_called_with('chat.postMessage',
88+
channel=NEW_MEMBER['user']['id'],
89+
text=MESSAGE, as_user=True)
90+
91+
#
92+
@mock.patch('src.app.slack_client.api_call', return_value={'ok': 'false', 'info': 'stuff goes here'})
93+
def test_slack_client_returns_error(self, mock_builder, mock_unfi, mock_client):
94+
"""
95+
Asserts an ERROR is logged when messaging a new member fails
96+
"""
97+
with LogCapture(level=logging.ERROR) as capture:
98+
app.new_member(USER_INFO_HAS_REAL_NAME)
99+
capture.check(
100+
('src.app.new_member', 'ERROR',
101+
"FAILED -- Message to new member returned error: {'ok': 'false', 'info': 'stuff goes here'}"))
102+
103+
104+
class BuildMessageTestCase(unittest.TestCase):
105+
106+
def test_build_message(self):
107+
"""
108+
Asserts build_message function correctly formats message.
109+
"""
110+
message = app.build_message(MESSAGE, real_name='Bob')
111+
self.assertEquals(message, MESSAGE.format(real_name='Bob'))

tests/test_data.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
NEW_MEMBER = {'type': 'team_join',
2+
'user': {'id': 'U8CGTR404', 'team_id': 'T85GYJ58B', 'name': 'azarion.vivaan', 'deleted': False,
3+
'color': '84b22f', 'real_name': 'test33', 'tz': 'America/Los_Angeles',
4+
'tz_label': 'Pacific Standard Time', 'tz_offset': -28800,
5+
'profile': {'real_name': 'test33', 'display_name': 'test33', 'avatar_hash': 'g8abd5e5995c',
6+
'title': '', 'real_name_normalized': 'test33', 'display_name_normalized': 'test33',
7+
'email': '[email protected]',
8+
'image_24': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=24&d=https%3A%2F%2Fa.slack-edge.com%2F0180%2Fimg%2Favatars%2Fava_0021-24.png',
9+
'image_32': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=32&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0021-32.png',
10+
'image_48': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=48&d=https%3A%2F%2Fa.slack-edge.com%2F3654%2Fimg%2Favatars%2Fava_0021-48.png',
11+
'image_72': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=72&d=https%3A%2F%2Fa.slack-edge.com%2F66f9%2Fimg%2Favatars%2Fava_0021-72.png',
12+
'image_192': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=192&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0021-192.png',
13+
'image_512': 'https://secure.gravatar.com/avatar/8abd5e5995cbe5a39001568d70725e0f.jpg?s=512&d=https%3A%2F%2Fa.slack-edge.com%2F7fa9%2Fimg%2Favatars%2Fava_0021-512.png',
14+
'fields': None, 'team': 'T85GYJ58B'}, 'is_admin': False, 'is_owner': False,
15+
'is_primary_owner': False, 'is_restricted': False, 'is_ultra_restricted': False, 'is_bot': False,
16+
'updated': 1512956397, 'is_app_user': False, 'presence': 'away'}, 'cache_ts': 1512956397,
17+
'event_ts': '1512956397.000025'}
18+
19+
MESSAGE_EVENT = {'type': 'message', 'channel': 'C8DA69KM4', 'user': 'U8DG4B3EK', 'text': '.', 'ts': '1513003671.000412',
20+
'source_team': 'T8CJ90MQV', 'team': 'T8CJ90MQV'}
21+
22+
USER_INFO_HAS_REAL_NAME = {
23+
"ok": 'true',
24+
"user": {
25+
"id": "W012A3CDE",
26+
"team_id": "T012AB3C4",
27+
"name": "spengler",
28+
"deleted": 'false',
29+
"color": "9f69e7",
30+
"real_name": "episod",
31+
"tz": "America\/Los_Angeles",
32+
"tz_label": "Pacific Daylight Time",
33+
"tz_offset": -25200,
34+
}
35+
}
36+
37+
MESSAGE = (
38+
"Hi {real_name},\n\n Welcome to Operation Code! I'm a bot designed to help answer questions and get you on your way in our community.\n\n"
39+
"Please take a moment to review our <https://op.co.de/code-of-conduct|Code of Conduct.>\n\n"
40+
"Our goal here at Operation Code is to get veterans and their families started on the path to a career in programming. "
41+
"We do that through providing you with scholarships, mentoring, career development opportunities, conference tickets, and more!\n\n"
42+
"You're currently in Slack, a chat application that serves as the hub of Operation Code. "
43+
"If you're currently visiting us via your browser, Slack provides a stand alone program to make staying in touch even more convenient. "
44+
"You can download it <https://slack.com/downloads|here.>\n\n"
45+
"Want to make your first change to a program right now? "
46+
"All active Operation Code Projects are located on our source control repository. "
47+
"Our projects can be viewed on <https://github.com/OperationCode/START_HERE|Github.>")
48+
49+
USER_INFO_HAS_NAME = {
50+
"ok": 'true',
51+
"user": {
52+
"id": "W012A3CDE",
53+
"team_id": "T012AB3C4",
54+
"name": "spengler",
55+
"deleted": 'false',
56+
"color": "9f69e7",
57+
"real_name": "",
58+
}
59+
}
60+
61+
USER_INFO_NO_NAME = {
62+
"ok": 'true',
63+
"user": {
64+
"id": "W012A3CDE",
65+
"team_id": "T012AB3C4",
66+
"name": "",
67+
"deleted": 'false',
68+
"color": "9f69e7",
69+
"real_name": "",
70+
}
71+
}
72+
73+
CHANNELS = {
74+
u'C8DA69KM4': {
75+
u'last_read': u'0000000000.000000', u'created': 1459497074,
76+
u'unread_count': 1, u'is_open': True, u'user': u'USLACKBOT',
77+
u'unread_count_display': 1, u'latest': {
78+
u'text': u'message from slackbot',
79+
u'type': u'message', u'user': u'USLACKBOT',
80+
u'ts': u'1459502580.797060'
81+
}, u'is_im': True, u'id': u'D0X6385P1', u'has_pins': False
82+
},
83+
}

0 commit comments

Comments
 (0)