def test_ensure_webhook_replace(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   dest=MagicMock()
   def replacement_api(version,url,form_data={},method=None,request_type=None):
     if url.endswith('hooks/'):
       return [{
         'uuid': 1,
         'url': 'http://me.com/bla',
         'description': 'Greg2',
         'skip_cert_verification': False,
         'active': True,
         'events': [u'pullrequest:comment_created', u'repo:push'],
         }]
     else:
       return dest(version,url,form_data=form_data,method=method,request_type=request_type)
   testee.api = replacement_api
   testee.ensure_webhook('on','aboat','http://me.com')
   dest.assert_called_once_with('2.0','repositories/on/aboat/hooks/1',form_data={
     'url': 'http://me.com',
     'description': 'Greg2',
     'skip_cert_verification': False,
     'active': True,
     'events': [u'pullrequest:comment_created', u'repo:push'],
     },method='PUT',request_type='json')
    def test_payload_comment(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        headers = {
            'X-Event-Key': 'pullrequest:comment_created',
        }
        querystring = {
            'token': 'glig',
        }
        testee.my_username = lambda: 'greg'
        body_path = os.path.join(os.path.dirname(__file__),
                                 'responses/bitbucket_pr_comment.txt')
        with open(body_path) as myfile:
            body = myfile.read()

        testee.get_commit_approval = MagicMock(return_value=True)
        res = testee.parse_payload(body, headers, querystring)
        self.assertEqual(res['repo']['provider'], 'bitbucket')
        self.assertEqual(res['repo']['organization'], 'dy-devops')
        self.assertEqual(res['repo']['name'], 'janitor-starter')
        self.assertEqual(res['event']['type'], 'pr:comment')
        self.assertEqual(res['event']['pr']['src_branch'], 'add-webshot')
        self.assertEqual(res['event']['pr']['dst_branch'], 'master')
        self.assertEqual(res['event']['pr']['same_repo'], True)
        self.assertEqual(res['event']['pr']['reviewers'], set(['BackSlasher']))
        self.assertEqual(res['event']['pr']['approvers'], set(['BackSlasher']))
        self.assertEqual(res['event']['pr']['id'], 1)
        self.assertEqual(res['event']['pr']['code_ok'], True)
  def test_payload_comment(self):
    testee = BridgeProviderBitbucket({
      'username': '******',
      'password': '******',
      'incoming_token': 'glig',
      })
    headers={
        'X-Event-Key': 'pullrequest:comment_created',
        }
    querystring={
        'token': 'glig',
        }
    testee.my_username = lambda: 'greg'
    body_path = os.path.join(os.path.dirname(__file__), 'responses/bitbucket_pr_comment.txt')
    with open (body_path) as myfile:
        body=myfile.read()

    testee.get_commit_approval = MagicMock(return_value=True)
    res = testee.parse_payload(body,headers,querystring)
    self.assertEqual(res['repo']['provider'],'bitbucket')
    self.assertEqual(res['repo']['organization'],'dy-devops')
    self.assertEqual(res['repo']['name'],'janitor-starter')
    self.assertEqual(res['event']['type'],'pr:comment')
    self.assertEqual(res['event']['pr']['src_branch'],'add-webshot')
    self.assertEqual(res['event']['pr']['dst_branch'],'master')
    self.assertEqual(res['event']['pr']['same_repo'],True)
    self.assertEqual(res['event']['pr']['reviewers'],set(['BackSlasher']))
    self.assertEqual(res['event']['pr']['approvers'],set(['BackSlasher']))
    self.assertEqual(res['event']['pr']['id'],1)
    self.assertEqual(res['event']['pr']['code_ok'],True)
    def test_payload_push(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        headers = {
            'X-Event-Key': 'repo:push',
        }
        querystring = {
            'token': 'glig',
        }
        body_path = os.path.join(os.path.dirname(__file__),
                                 'responses/bitbucket_code_push.txt')
        with open(body_path) as myfile:
            body = myfile.read()

        res = testee.parse_payload(body, headers, querystring)
        self.assertEqual(res['repo']['provider'], 'bitbucket')
        self.assertEqual(res['repo']['organization'], 'dy-devops')
        self.assertEqual(res['repo']['name'], 'janitor-starter')
        self.assertEqual(res['event']['type'], 'push')
        self.assertEqual(len(res['event']['changes']), 1)
        self.assertEqual(res['event']['changes'][0]['commit'],
                         'bf89e3d025b08c78009fc2c6884916add07314e1')
        self.assertEqual(res['event']['changes'][0]['branch'], 'bla')
    def test_ensure_webhook_remove(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        dest = MagicMock()

        def replacement_api(*args, **kwargs):
            if args[1].endswith('hooks/'):
                return [{
                    'uuid':
                    1,
                    'url':
                    'http://me.com/bla',
                    'description':
                    'Greg2',
                    'skip_cert_verification':
                    False,
                    'active':
                    True,
                    'events': [u'pullrequest:comment_created', u'repo:push'],
                }, {
                    'uuid':
                    2,
                    'url':
                    'http://me.com/',
                    'description':
                    'Grog2',
                    'skip_cert_verification':
                    False,
                    'active':
                    True,
                    'events': [u'pullrequest:comment_created', u'repo:push'],
                }]
            else:
                return dest(*args, **kwargs)

        testee.api = replacement_api
        testee.ensure_webhook('on', 'aboat', 'http://me.com')
        dest.assert_any_call('2.0',
                             'repositories/on/aboat/hooks/1',
                             method='DELETE')
        dest.assert_any_call('2.0',
                             'repositories/on/aboat/hooks/2',
                             method='DELETE')
        dest.assert_any_call(
            '2.0',
            'repositories/on/aboat/hooks',
            form_data={
                'url': 'http://me.com',
                'description': 'Greg2',
                'skip_cert_verification': False,
                'active': True,
                'events': [u'pullrequest:comment_created', u'repo:push'],
            },
            method='POST',
            request_type='json')
        self.assertEquals(dest.call_count, 3)
 def test_list_repos(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.api=MagicMock(return_value=[{'name':'team'},{'name':'Fortress'}])
   repos = testee.list_repos('2')
   self.assertEqual(set(repos),set(['team','Fortress']))
 def test_my_username(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.api = MagicMock(return_value={'user': {'username': '******'}})
     res = testee.my_username()
     self.assertEqual(res, 'bla')
 def test_my_username(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.api=MagicMock(return_value={'user':{'username':'******'}})
   res = testee.my_username()
   self.assertEqual(res,'bla')
 def test_pr_comment(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.api = MagicMock()
   testee.post_pr_comment('bla','blu','1','hi')
   testee.api.assert_called_once_with('1.0','repositories/bla/blu/pullrequests/1/comments',{'content':'hi'}, 'post')
 def test_commit_comment(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.api = MagicMock()
     testee.post_commit_comment('bla', 'Blu', '1', 'hello')
     testee.api.assert_called_once_with(
         '1.0', 'repositories/bla/blu/changesets/1/comments',
         {'content': 'hello'}, 'post')
 def test_commit_test(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.set_commit_approval = MagicMock()
   testee.post_commit_comment = MagicMock()
   testee.post_commit_test('bla','blu','1','j','http://google.com',True)
   testee.post_commit_comment.assert_called_once_with('bla','blu','1','Test by j: **passed**  \nhttp://google.com')
   testee.set_commit_approval.assert_called_once_with('bla','blu','1',True)
 def test_commit_notouch(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.api = MagicMock()
   testee.get_commit_approval = MagicMock()
   testee.get_commit_approval.return_value=True
   testee.set_commit_approval('bla','blu','1',True)
   testee.api.assert_not_called()
 def test_commit_disapprove(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   testee.api = MagicMock()
   testee.get_commit_approval = MagicMock()
   testee.get_commit_approval.return_value=True
   testee.set_commit_approval('bla','blu','1',False)
   testee.api.assert_called_once_with('2.0','repositories/bla/blu/commit/1/approve',method='delete')
 def test_url_base_compare(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     self.assertEqual(
         testee.url_base_compare('http://bla.com/bla', 'http://bla.com/'),
         True)
     self.assertEqual(
         testee.url_base_compare('http://bla.com/bla',
                                 'http://bla.org/bla'), False)
 def test_payload_bad_token(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   headers = {
     'X-Event-Key': 'pullrequest:comment_created',
     }
   querystring={
     'token': 'bad_token',
     }
   with self.assertRaises(Exception) as cm: testee.parse_payload('{}',headers,querystring)
 def test_list_repos(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.api = MagicMock(return_value=[{
         'name': 'team'
     }, {
         'name': 'Fortress'
     }])
     repos = testee.list_repos('2')
     self.assertEqual(set(repos), set(['team', 'Fortress']))
  def test_payload_bad_event(self):
    testee = BridgeProviderBitbucket({
      'username': '******',
      'password': '******',
      'incoming_token': 'glig',
      })
    headers = {
      'X-Github-Event': 'badbadbad',
      }
    querystring={
      'token': 'glig',
      }

    with self.assertRaises(Exception) as cm: testee.parse_payload('{}',headers,querystring)
 def test_payload_bad_token(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     headers = {
         'X-Event-Key': 'pullrequest:comment_created',
     }
     querystring = {
         'token': 'bad_token',
     }
     with self.assertRaises(Exception) as cm:
         testee.parse_payload('{}', headers, querystring)
 def test_url_base_compare(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   self.assertEqual(testee.url_base_compare(
       'http://bla.com/bla',
       'http://bla.com/'
       ),True)
   self.assertEqual(testee.url_base_compare(
       'http://bla.com/bla',
       'http://bla.org/bla'
       ),False)
    def test_payload_bad_event(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        headers = {
            'X-Github-Event': 'badbadbad',
        }
        querystring = {
            'token': 'glig',
        }

        with self.assertRaises(Exception) as cm:
            testee.parse_payload('{}', headers, querystring)
    def test_ensure_webhook_replace(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        dest = MagicMock()

        def replacement_api(version,
                            url,
                            form_data={},
                            method=None,
                            request_type=None):
            if url.endswith('hooks/'):
                return [{
                    'uuid':
                    1,
                    'url':
                    'http://me.com/bla',
                    'description':
                    'Greg2',
                    'skip_cert_verification':
                    False,
                    'active':
                    True,
                    'events': [u'pullrequest:comment_created', u'repo:push'],
                }]
            else:
                return dest(version,
                            url,
                            form_data=form_data,
                            method=method,
                            request_type=request_type)

        testee.api = replacement_api
        testee.ensure_webhook('on', 'aboat', 'http://me.com')
        dest.assert_called_once_with(
            '2.0',
            'repositories/on/aboat/hooks/1',
            form_data={
                'url': 'http://me.com',
                'description': 'Greg2',
                'skip_cert_verification': False,
                'active': True,
                'events': [u'pullrequest:comment_created', u'repo:push'],
            },
            method='PUT',
            request_type='json')
  def test_payload_comment_no_mention(self):
    testee = BridgeProviderBitbucket({
      'username': '******',
      'password': '******',
      'incoming_token': 'glig',
      })
    headers={
        'X-Event-Key': 'pullrequest:comment_created',
        }
    querystring={
        'token': 'glig',
        }
    testee.my_username = lambda: 'greg'
    body_path = os.path.join(os.path.dirname(__file__), 'responses/bitbucket_pr_comment_nogreg.txt')
    with open (body_path) as myfile:
        body=myfile.read()

    testee.get_commit_approval = MagicMock(return_value=True)
    res = testee.parse_payload(body,headers,querystring)
    self.assertEqual(res,None)
 def test_ensure_webhook_remove(self):
   testee = BridgeProviderBitbucket({
     'username': '******',
     'password': '******',
     'incoming_token': 'glig',
     })
   dest=MagicMock()
   def replacement_api(*args, **kwargs):
     if args[1].endswith('hooks/'):
       return [
           {
           'uuid': 1,
           'url': 'http://me.com/bla',
           'description': 'Greg2',
           'skip_cert_verification': False,
           'active': True,
           'events': [u'pullrequest:comment_created', u'repo:push'],
           },
           {
           'uuid': 2,
           'url': 'http://me.com/',
           'description': 'Grog2',
           'skip_cert_verification': False,
           'active': True,
           'events': [u'pullrequest:comment_created', u'repo:push'],
           }
         ]
     else:
       return dest(*args, **kwargs)
   testee.api = replacement_api
   testee.ensure_webhook('on','aboat','http://me.com')
   dest.assert_any_call('2.0','repositories/on/aboat/hooks/1',method='DELETE')
   dest.assert_any_call('2.0','repositories/on/aboat/hooks/2',method='DELETE')
   dest.assert_any_call('2.0','repositories/on/aboat/hooks',form_data={
     'url': 'http://me.com',
     'description': 'Greg2',
     'skip_cert_verification': False,
     'active': True,
     'events': [u'pullrequest:comment_created', u'repo:push'],
     },method='POST',request_type='json')
   self.assertEquals(dest.call_count,3)
    def test_payload_comment_no_mention(self):
        testee = BridgeProviderBitbucket({
            'username': '******',
            'password': '******',
            'incoming_token': 'glig',
        })
        headers = {
            'X-Event-Key': 'pullrequest:comment_created',
        }
        querystring = {
            'token': 'glig',
        }
        testee.my_username = lambda: 'greg'
        body_path = os.path.join(os.path.dirname(__file__),
                                 'responses/bitbucket_pr_comment_nogreg.txt')
        with open(body_path) as myfile:
            body = myfile.read()

        testee.get_commit_approval = MagicMock(return_value=True)
        res = testee.parse_payload(body, headers, querystring)
        self.assertEqual(res, None)
  def test_payload_push(self):
    testee = BridgeProviderBitbucket({
      'username': '******',
      'password': '******',
      'incoming_token': 'glig',
      })
    headers={
        'X-Event-Key': 'repo:push',
        }
    querystring={
        'token': 'glig',
        }
    body_path = os.path.join(os.path.dirname(__file__), 'responses/bitbucket_code_push.txt')
    with open (body_path) as myfile:
        body=myfile.read()

    res = testee.parse_payload(body,headers,querystring)
    self.assertEqual(res['repo']['provider'],'bitbucket')
    self.assertEqual(res['repo']['organization'],'dy-devops')
    self.assertEqual(res['repo']['name'],'janitor-starter')
    self.assertEqual(res['event']['type'],'push')
    self.assertEqual(len(res['event']['changes']),1)
    self.assertEqual(res['event']['changes'][0]['commit'],'bf89e3d025b08c78009fc2c6884916add07314e1')
    self.assertEqual(res['event']['changes'][0]['branch'],'bla')
 def test_commit_notouch(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.api = MagicMock()
     testee.get_commit_approval = MagicMock()
     testee.get_commit_approval.return_value = True
     testee.set_commit_approval('bla', 'blu', '1', True)
     testee.api.assert_not_called()
 def test_commit_disapprove(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.api = MagicMock()
     testee.get_commit_approval = MagicMock()
     testee.get_commit_approval.return_value = True
     testee.set_commit_approval('bla', 'blu', '1', False)
     testee.api.assert_called_once_with(
         '2.0', 'repositories/bla/blu/commit/1/approve', method='delete')
 def test_commit_test(self):
     testee = BridgeProviderBitbucket({
         'username': '******',
         'password': '******',
         'incoming_token': 'glig',
     })
     testee.set_commit_approval = MagicMock()
     testee.post_commit_comment = MagicMock()
     testee.post_commit_test('bla', 'blu', '1', 'j', 'http://google.com',
                             True)
     testee.post_commit_comment.assert_called_once_with(
         'bla', 'blu', '1', 'Test by j: **passed**  \nhttp://google.com')
     testee.set_commit_approval.assert_called_once_with(
         'bla', 'blu', '1', True)