
Now that we no longer support py27, we can use the standard library unittest.mock module instead of the third party mock lib. Change-Id: I35d6f1207b57ea40809f78785c69a13c2943e1bc Signed-off-by: Sean McGinnis <sean.mcginnis@gmail.com>
165 lines
6.5 KiB
Python
165 lines
6.5 KiB
Python
# Copyright (c) 2015 Rackspace
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import json
|
|
from unittest import mock
|
|
|
|
|
|
from solumclient.common import github
|
|
from solumclient.tests import base
|
|
|
|
|
|
class TestGitHubAuth(base.TestCase):
|
|
fake_repo = "http://github.com/fakeuser/fakerepo.git"
|
|
fake_trigger = "http://example.com/trigger/1"
|
|
fake_username = 'fakeuser'
|
|
fake_password = 'fakepassword'
|
|
fake_token = 'faketoken'
|
|
|
|
def test_invalid_repo(self):
|
|
self.assertRaises(ValueError,
|
|
github.GitHubAuth,
|
|
"http://example.com")
|
|
|
|
def test_auth_header_username_password(self):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
username=self.fake_username,
|
|
password=self.fake_password)
|
|
# base64.b64encode('fakeuser:fakepassword') yields 'ZmFrZX...'
|
|
expected_auth_header = {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Basic ZmFrZXVzZXI6ZmFrZXBhc3N3b3Jk',
|
|
}
|
|
self.assertEqual(expected_auth_header, gha.auth_header)
|
|
|
|
@mock.patch('getpass.getpass')
|
|
def test_auth_header_username_password_2fa(self, fake_getpass):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
username=self.fake_username,
|
|
password=self.fake_password)
|
|
gha._otp_required = True
|
|
fake_getpass.return_value = 'fakeonetime'
|
|
expected_auth_header = {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Basic ZmFrZXVzZXI6ZmFrZXBhc3N3b3Jk',
|
|
'x-github-otp': 'fakeonetime',
|
|
}
|
|
self.assertEqual(expected_auth_header, gha.auth_header)
|
|
|
|
def test_auth_header_repo_token(self):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
repo_token=self.fake_token)
|
|
expected_auth_header = {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'token %s' % self.fake_token,
|
|
}
|
|
self.assertEqual(expected_auth_header, gha.auth_header)
|
|
|
|
@mock.patch('httplib2.Http.request')
|
|
def test_create_webhook(self, fake_request):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
repo_token=self.fake_token)
|
|
fake_request.return_value = ({'status': '200'},
|
|
'{"token": "%s"}' % self.fake_token)
|
|
gha.create_repo_token = mock.MagicMock()
|
|
gha.create_repo_token.return_value = 'token123'
|
|
|
|
gha.create_webhook(self.fake_trigger)
|
|
fake_request.assert_called_once_with(
|
|
'https://api.github.com/repos/fakeuser/fakerepo/hooks',
|
|
'POST',
|
|
headers=mock.ANY,
|
|
body=mock.ANY)
|
|
|
|
expected_body = {
|
|
"config": {
|
|
"url": self.fake_trigger,
|
|
"content_type": "json"},
|
|
"name": "web",
|
|
"events": ["pull_request", "commit_comment"]}
|
|
|
|
actual_body = json.loads(fake_request.call_args[1]['body'])
|
|
self.assertEqual(expected_body, actual_body)
|
|
|
|
@mock.patch('httplib2.Http.request')
|
|
def test_create_webhook_unittest_only(self, fake_request):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
username=self.fake_username,
|
|
password=self.fake_password)
|
|
fake_request.return_value = ({'status': '200'},
|
|
'{"token": "foo"}')
|
|
|
|
gha.create_repo_token = mock.MagicMock()
|
|
gha.create_repo_token.return_value = 'token123'
|
|
|
|
gha.create_webhook(self.fake_trigger, workflow=['unittest'])
|
|
fake_request.assert_called_once_with(
|
|
'https://api.github.com/repos/fakeuser/fakerepo/hooks',
|
|
'POST',
|
|
headers=mock.ANY,
|
|
body=mock.ANY)
|
|
expected_body = {
|
|
"config": {
|
|
"url": self.fake_trigger + "?workflow=unittest",
|
|
"content_type": "json"},
|
|
"name": "web",
|
|
"events": ["pull_request", "commit_comment"]}
|
|
actual_body = json.loads(fake_request.call_args[1]['body'])
|
|
self.assertEqual(expected_body, actual_body)
|
|
|
|
@mock.patch('httplib2.Http.request')
|
|
def test_create_webhook_unittest_build(self, fake_request):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
username=self.fake_username,
|
|
password=self.fake_password)
|
|
fake_request.return_value = ({'status': '200'},
|
|
'{"token": "foo"}')
|
|
|
|
gha.create_repo_token = mock.MagicMock()
|
|
gha.create_repo_token.return_value = 'token123'
|
|
|
|
gha.create_webhook(self.fake_trigger, workflow=['unittest', 'build'])
|
|
fake_request.assert_called_once_with(
|
|
'https://api.github.com/repos/fakeuser/fakerepo/hooks',
|
|
'POST',
|
|
headers=mock.ANY,
|
|
body=mock.ANY)
|
|
expected_body = {
|
|
"config": {
|
|
"url": self.fake_trigger + "?workflow=unittest+build",
|
|
"content_type": "json"},
|
|
"name": "web",
|
|
"events": ["pull_request", "commit_comment"]}
|
|
actual_body = json.loads(fake_request.call_args[1]['body'])
|
|
self.assertEqual(expected_body, actual_body)
|
|
|
|
@mock.patch('httplib2.Http.request')
|
|
def test_add_ssh_key(self, fake_request):
|
|
gha = github.GitHubAuth(self.fake_repo,
|
|
username=self.fake_username,
|
|
password=self.fake_password)
|
|
fake_request.return_value = ({'status': '200'},
|
|
'{"token": "foo"}')
|
|
fake_pub_key = 'foo'
|
|
gha.add_ssh_key(public_key=fake_pub_key)
|
|
fake_request.assert_called_once_with(
|
|
'https://api.github.com/user/keys',
|
|
'POST',
|
|
headers=mock.ANY,
|
|
body=mock.ANY)
|
|
expected_body = {"key": "foo", "title": "devops@Solum"}
|
|
actual_body = json.loads(fake_request.call_args[1]['body'])
|
|
self.assertEqual(expected_body, actual_body)
|