title: Do I need to use mocks?
body: <p>I have the function which handles a specific bot event from Slack. Generally speaking, user clicks a button then my server receives and handles payload of this button.</p>
  
  <p>The question is how should I test it? Do I need to mock <code>make_admin</code> and <code>build_admins_message</code> and check that they were called or I need to test real implementations? For example, I can retrieve the user from the database and check that it is actually an admin and also check that build_admins_message returns a dictionary that I expect to receive.</p>
  
  <pre><code>@slack_interactions.on('admin_add')
  def handle_admin_add(payload):
      team_id = payload['team']['id']
      user_id = payload['user']['id']
      action_value = payload['actions'][0]['selected_options'][0]['value']
  
      user = SlackUser.objects.find_by_ids(team_id, action_value)
  
      if user and not user.is_bot:
          user.make_admin()
  
      return build_admins_message(team_id, user_id)
  </code></pre>
  
  <p>Currently my tests look like this:</p>
  
  <pre><code>class TestAdminAddHandler(TestCase):
      def setUp(self):
          team = SlackTeam.objects.create(team_id='TEAMID')
          SlackUser.objects.create(team=team, user_id='USERID')
          SlackUser.objects.create(team=team, user_id='BOTID', is_bot=True)
          SlackUser.objects.create(
              team=team, user_id='ADMINID', is_bot_admin=True)
  
      def tearDown(self):
          SlackUser.objects.all().delete()
          SlackTeam.objects.all().delete()
  
      def test_wrong_callback(self):
          payload = {'callback_id': 'wrong_callback'}
          message = handle_admin_add(payload)
          self.assertIsNone(message)
  
      def test_has_no_user(self):
          payload = {
              'callback_id': 'admin_add',
              'team': {'id': 'TEAMID'},
              'user': {'id': 'ADMINID'},
              'actions': [{
                  'selected_options': [{'value': 'BADID'}]
              }]
          }
  
          message = handle_admin_add(payload)
  
          user = SlackUser.objects.get(user_id='USERID')
          self.assertFalse(user.is_bot_admin)
  
          for att in message['attachments']:
              self.assertNotIn('BADID', att.get('title', ''))
  
      def test_user_is_bot(self):
          payload = {
              'callback_id': 'admin_add',
              'team': {'id': 'TEAMID'},
              'user': {'id': 'ADMINID'},
              'actions': [{
                  'selected_options': [{'value': 'BOTID'}]
              }]
          }
  
          message = handle_admin_add(payload)
          user = SlackUser.objects.get(user_id='BOTID')
          self.assertFalse(user.is_bot_admin)
  
          for att in message['attachments']:
              self.assertNotIn('BOTID', att.get('title', ''))
  
      def test_add_admin(self):
          payload = {
              'callback_id': 'admin_add',
              'team': {'id': 'TEAMID'},
              'user': {'id': 'ADMINID'},
              'actions': [{
                  'selected_options': [{'value': 'USERID'}]
              }]
          }
  
          message = handle_admin_add(payload)
  
          user = SlackUser.objects.filter(user_id='USERID').first()
          self.assertTrue(user.is_bot_admin)
  
          user_in_list = False
          for att in message['attachments']:
              if 'USERID' in att.get('title', ''):
                  user_in_list = True
  
          self.assertTrue(user_in_list)
  </code></pre>