Changeset View
Changeset View
Standalone View
Standalone View
contrib/buildbot/test/test_endpoint_land.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# | # | ||||
# Copyright (c) 2017-2020 The Bitcoin ABC developers | # Copyright (c) 2017-2020 The Bitcoin ABC developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
import json | import json | ||||
import requests | import requests | ||||
import unittest | import unittest | ||||
from test.abcbot_fixture import ABCBotFixture | from test.abcbot_fixture import ABCBotFixture | ||||
import test.mocks.fixture | import test.mocks.fixture | ||||
import test.mocks.teamcity | import test.mocks.teamcity | ||||
from testutil import AnyWith | from testutil import AnyWith | ||||
class landRequestData(test.mocks.fixture.MockData): | class landRevisionRequestData(test.mocks.fixture.MockData): | ||||
def __init__(self): | def __init__(self): | ||||
self.revision = 'D1234' | self.revision = 'D1234' | ||||
self.conduitToken = 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=' | self.conduitToken = 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=' | ||||
self.committerName = 'User Name' | self.committerName = 'User Name' | ||||
self.committerEmail = 'user@bitcoinabc.org' | self.committerEmail = 'user@bitcoinabc.org' | ||||
class landDiffRequestData(test.mocks.fixture.MockData): | |||||
def __init__(self): | |||||
self.diff = '12345' | |||||
self.commitMessage = '[Test] Commit message' | |||||
self.conduitToken = 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=' | |||||
self.committerName = 'User Name' | |||||
self.committerEmail = 'user@bitcoinabc.org' | |||||
class EndpointLandTestCase(ABCBotFixture): | class EndpointLandTestCase(ABCBotFixture): | ||||
def test_land_happyPath(self): | def test_land_revision(self): | ||||
data = landRequestData() | data = landRevisionRequestData() | ||||
triggerBuildResponse = test.mocks.teamcity.buildInfo( | triggerBuildResponse = test.mocks.teamcity.buildInfo( | ||||
test.mocks.teamcity.buildInfo_changes(['test-change'])) | test.mocks.teamcity.buildInfo_changes(['test-change'])) | ||||
self.teamcity.session.send.return_value = triggerBuildResponse | self.teamcity.session.send.return_value = triggerBuildResponse | ||||
response = self.app.post('/land', headers=self.headers, json=data) | response = self.app.post('/land', headers=self.headers, json=data) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': 'https://teamcity.test/app/rest/buildQueue', | 'url': 'https://teamcity.test/app/rest/buildQueue', | ||||
'body': json.dumps({ | 'body': json.dumps({ | ||||
'branchName': 'master', | 'branchName': 'master', | ||||
'buildType': { | 'buildType': { | ||||
'id': 'BitcoinAbcLandBot', | 'id': 'BitcoinAbcLandBot', | ||||
}, | }, | ||||
'properties': { | 'properties': { | ||||
'property': [{ | 'property': [{ | ||||
'name': 'env.ABC_CONDUIT_TOKEN', | |||||
'value': 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=', | |||||
}, { | |||||
'name': 'env.ABC_COMMITTER_NAME', | |||||
'value': 'User Name', | |||||
}, { | |||||
'name': 'env.ABC_COMMITTER_EMAIL', | |||||
'value': 'user@bitcoinabc.org', | |||||
}, { | |||||
'name': 'env.ABC_REVISION', | 'name': 'env.ABC_REVISION', | ||||
'value': 'D1234', | 'value': 'D1234', | ||||
}, { | }, { | ||||
'name': 'env.harborMasterTargetPHID', | |||||
'value': 'UNRESOLVED', | |||||
}], | |||||
}, | |||||
}), | |||||
})) | |||||
assert response.status_code == 200 | |||||
assert response.get_json() == json.loads(triggerBuildResponse.content) | |||||
def test_land_diff(self): | |||||
data = landDiffRequestData() | |||||
triggerBuildResponse = test.mocks.teamcity.buildInfo( | |||||
test.mocks.teamcity.buildInfo_changes(['test-change'])) | |||||
self.teamcity.session.send.return_value = triggerBuildResponse | |||||
response = self.app.post('/land', headers=self.headers, json=data) | |||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | |||||
'url': 'https://teamcity.test/app/rest/buildQueue', | |||||
'body': json.dumps({ | |||||
'branchName': 'master', | |||||
'buildType': { | |||||
'id': 'BitcoinAbcLandBot', | |||||
}, | |||||
'properties': { | |||||
'property': [{ | |||||
'name': 'env.ABC_CONDUIT_TOKEN', | 'name': 'env.ABC_CONDUIT_TOKEN', | ||||
'value': 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=', | 'value': 'U2FsdGVkX1/RI0AAAAAAAF46wjo3lSAxj1d1iqqkxks=', | ||||
}, { | }, { | ||||
'name': 'env.ABC_COMMITTER_NAME', | 'name': 'env.ABC_COMMITTER_NAME', | ||||
'value': 'User Name', | 'value': 'User Name', | ||||
}, { | }, { | ||||
'name': 'env.ABC_COMMITTER_EMAIL', | 'name': 'env.ABC_COMMITTER_EMAIL', | ||||
'value': 'user@bitcoinabc.org', | 'value': 'user@bitcoinabc.org', | ||||
}, { | }, { | ||||
'name': 'env.ABC_DIFF', | |||||
'value': '12345', | |||||
}, { | |||||
'name': 'env.ABC_COMMIT_MESSAGE', | |||||
'value': '[Test] Commit message', | |||||
}, { | |||||
'name': 'env.harborMasterTargetPHID', | 'name': 'env.harborMasterTargetPHID', | ||||
'value': 'UNRESOLVED', | 'value': 'UNRESOLVED', | ||||
}], | }], | ||||
}, | }, | ||||
}), | }), | ||||
})) | })) | ||||
assert response.status_code == 200 | assert response.status_code == 200 | ||||
assert response.get_json() == json.loads(triggerBuildResponse.content) | assert response.get_json() == json.loads(triggerBuildResponse.content) | ||||
def test_land_invalid_json(self): | def test_land_invalid_json(self): | ||||
data = "not: a valid json" | data = "not: a valid json" | ||||
response = self.app.post('/land', headers=self.headers, data=data) | response = self.app.post('/land', headers=self.headers, data=data) | ||||
self.assertEqual(response.status_code, 415) | self.assertEqual(response.status_code, 415) | ||||
def test_land_missingArguments(self): | def test_land_missingArguments(self): | ||||
# Test otherwise valid requests with each required argument missing. | # Test otherwise valid requests with each required argument missing. | ||||
# All of them should fail with status code 400. | # All of them should fail with status code 400. | ||||
requiredArgs = [ | requiredRevisionArgs = [ | ||||
'revision', | 'revision', | ||||
'conduitToken', | 'conduitToken', | ||||
'committerName', | 'committerName', | ||||
'committerEmail', | 'committerEmail', | ||||
] | ] | ||||
for arg in requiredArgs: | for arg in requiredRevisionArgs: | ||||
data = landRequestData() | data = landRevisionRequestData() | ||||
setattr(data, arg, '') | |||||
response = self.app.post('/land', headers=self.headers, json=data) | |||||
assert response.status_code == 400 | |||||
requiredDiffArgs = [ | |||||
'diff', | |||||
'commitMessage', | |||||
'conduitToken', | |||||
'committerName', | |||||
'committerEmail', | |||||
] | |||||
for arg in requiredDiffArgs: | |||||
data = landDiffRequestData() | |||||
setattr(data, arg, '') | setattr(data, arg, '') | ||||
response = self.app.post('/land', headers=self.headers, json=data) | response = self.app.post('/land', headers=self.headers, json=data) | ||||
assert response.status_code == 400 | assert response.status_code == 400 | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
unittest.main() | unittest.main() |