Changeset View
Changeset View
Standalone View
Standalone View
contrib/buildbot/test/test_teamcity.py
Show All 21 Lines | def setUp(self): | ||||
self.teamcity = test.mocks.teamcity.instance() | self.teamcity = test.mocks.teamcity.instance() | ||||
def tearDown(self): | def tearDown(self): | ||||
pass | pass | ||||
def test_ignoreList(self): | def test_ignoreList(self): | ||||
expectedList = [b'test'] | expectedList = [b'test'] | ||||
self.teamcity.ignoreList = expectedList | self.teamcity.ignoreList = expectedList | ||||
assert self.teamcity.getIgnoreList() == expectedList | self.assertListEqual(self.teamcity.getIgnoreList(), expectedList) | ||||
def test_mockTime(self): | def test_mockTime(self): | ||||
currentTime = int(time.time()) - 1 | currentTime = int(time.time()) - 1 | ||||
assert self.teamcity.getTime() >= currentTime | self.assertGreaterEqual(self.teamcity.getTime(), currentTime) | ||||
self.teamcity.setMockTime(1593635000) | self.teamcity.setMockTime(1593635000) | ||||
assert self.teamcity.getTime() == 1593635000 | self.assertEqual(self.teamcity.getTime(), 1593635000) | ||||
def test_build_url(self): | def test_build_url(self): | ||||
assert self.teamcity.build_url() == urljoin(self.teamcity.base_url, "?guest=1") | self.assertEqual( | ||||
assert self.teamcity.build_url("foo.html") == urljoin( | self.teamcity.build_url(), | ||||
self.teamcity.base_url, "foo.html?guest=1") | urljoin( | ||||
assert self.teamcity.build_url( | self.teamcity.base_url, | ||||
"?guest=1")) | |||||
self.assertEqual( | |||||
self.teamcity.build_url("foo.html"), | |||||
urljoin( | |||||
self.teamcity.base_url, | |||||
"foo.html?guest=1")) | |||||
self.assertEqual(self.teamcity.build_url( | |||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
"bar": "baz", | "bar": "baz", | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?foo=bar&bar=baz&guest=1") | }), | ||||
assert self.teamcity.build_url( | urljoin(self.teamcity.base_url, "foo.html?foo=bar&bar=baz&guest=1")) | ||||
self.assertEqual(self.teamcity.build_url( | |||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
"baz": 42, | "baz": 42, | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?foo=bar&baz=42&guest=1") | }), | ||||
assert self.teamcity.build_url( | urljoin(self.teamcity.base_url, "foo.html?foo=bar&baz=42&guest=1")) | ||||
self.assertEqual(self.teamcity.build_url( | |||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
"baz": 42 | "baz": 42 | ||||
}, | }, | ||||
"anchor") == urljoin(self.teamcity.base_url, "foo.html?foo=bar&baz=42&guest=1#anchor") | "anchor"), | ||||
urljoin(self.teamcity.base_url, "foo.html?foo=bar&baz=42&guest=1#anchor")) | |||||
# No path, a fragment but no query | # No path, a fragment but no query | ||||
assert self.teamcity.build_url( | self.assertEqual( | ||||
fragment="anchor") == urljoin(self.teamcity.base_url, "?guest=1#anchor") | self.teamcity.build_url( | ||||
fragment="anchor"), urljoin( | |||||
self.teamcity.base_url, "?guest=1#anchor")) | |||||
# Some path, a fragment but no query | # Some path, a fragment but no query | ||||
assert self.teamcity.build_url( | self.assertEqual( | ||||
"foo.html", | self.teamcity.build_url( | ||||
fragment="anchor") == urljoin(self.teamcity.base_url, "foo.html?guest=1#anchor") | "foo.html", fragment="anchor"), urljoin( | ||||
self.teamcity.base_url, "foo.html?guest=1#anchor")) | |||||
# Use RFC 3986 compliant chars | # Use RFC 3986 compliant chars | ||||
assert self.teamcity.build_url( | self.assertEqual(self.teamcity.build_url( | ||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"valid": "build($changes(*),properties(?),'triggered([a]:!b&c)')" | "valid": "build($changes(*),properties(?),'triggered([a]:!b&c)')" | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?valid=build%28%24changes%28%2A%29%2Cproperties%28%3F%29%2C%27triggered%28%5Ba%5D%3A%21b%26c%29%27%29&guest=1") | }), | ||||
urljoin(self.teamcity.base_url, "foo.html?valid=build%28%24changes%28%2A%29%2Cproperties%28%3F%29%2C%27triggered%28%5Ba%5D%3A%21b%26c%29%27%29&guest=1")) | |||||
# Check other chars are also quoted/unquoted correctly | # Check other chars are also quoted/unquoted correctly | ||||
assert self.teamcity.build_url( | self.assertEqual(self.teamcity.build_url( | ||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"invalid": "space space,slash/slash,doublequote\"doublequote" | "invalid": "space space,slash/slash,doublequote\"doublequote" | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?invalid=space+space%2Cslash%2Fslash%2Cdoublequote%22doublequote&guest=1") | }), | ||||
urljoin(self.teamcity.base_url, "foo.html?invalid=space+space%2Cslash%2Fslash%2Cdoublequote%22doublequote&guest=1")) | |||||
# The guest is already set to any value | # The guest is already set to any value | ||||
assert self.teamcity.build_url( | self.assertEqual(self.teamcity.build_url( | ||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
"guest": 0, | "guest": 0, | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?foo=bar&guest=0") | }), | ||||
assert self.teamcity.build_url( | urljoin(self.teamcity.base_url, "foo.html?foo=bar&guest=0")) | ||||
self.assertEqual(self.teamcity.build_url( | |||||
"foo.html", | "foo.html", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
"guest": 1, | "guest": 1, | ||||
}) == urljoin(self.teamcity.base_url, "foo.html?foo=bar&guest=1") | }), | ||||
urljoin(self.teamcity.base_url, "foo.html?foo=bar&guest=1")) | |||||
# No guest=1 parameter is appended when calling the rest API | # No guest=1 parameter is appended when calling the rest API | ||||
assert self.teamcity.build_url( | self.assertEqual(self.teamcity.build_url( | ||||
"app/rest/foo", | "app/rest/foo", | ||||
{ | { | ||||
"foo": "bar", | "foo": "bar", | ||||
}) == urljoin(self.teamcity.base_url, "app/rest/foo?foo=bar") | }), | ||||
urljoin(self.teamcity.base_url, "app/rest/foo?foo=bar")) | |||||
def test_convert_to_guest_url(self): | def test_convert_to_guest_url(self): | ||||
expect_no_update = [ | expect_no_update = [ | ||||
# Not a valid teamcity URL | # Not a valid teamcity URL | ||||
"", | "", | ||||
"http://foo.bar", | "http://foo.bar", | ||||
# Already a guest | # Already a guest | ||||
Show All 31 Lines | def test_convert_to_guest_url(self): | ||||
urljoin(self.teamcity.base_url, "?foo=bar&bar=baz#anchor"), | urljoin(self.teamcity.base_url, "?foo=bar&bar=baz#anchor"), | ||||
urljoin( | urljoin( | ||||
self.teamcity.base_url, | self.teamcity.base_url, | ||||
"?foo=bar&bar=baz&guest=1#anchor") | "?foo=bar&bar=baz&guest=1#anchor") | ||||
), | ), | ||||
] | ] | ||||
for url in expect_no_update: | for url in expect_no_update: | ||||
assert self.teamcity.convert_to_guest_url(url) == url | self.assertEqual(self.teamcity.convert_to_guest_url(url), url) | ||||
for url_in, url_out in expect_update: | for url_in, url_out in expect_update: | ||||
assert self.teamcity.convert_to_guest_url(url_in) == url_out | self.assertEqual( | ||||
self.teamcity.convert_to_guest_url(url_in), url_out) | |||||
def test_requestFailure(self): | def test_requestFailure(self): | ||||
self.teamcity.session.send.return_value.status_code = requests.codes.bad_request | self.teamcity.session.send.return_value.status_code = requests.codes.bad_request | ||||
req = self.teamcity._request('GET', 'https://endpoint') | req = self.teamcity._request('GET', 'https://endpoint') | ||||
self.assertRaises( | self.assertRaises( | ||||
TeamcityRequestException, | TeamcityRequestException, | ||||
self.teamcity.getResponse, | self.teamcity.getResponse, | ||||
req) | req) | ||||
def test_getBuildProblems_noProblems(self): | def test_getBuildProblems_noProblems(self): | ||||
self.teamcity.session.send.return_value.content = json.dumps({}) | self.teamcity.session.send.return_value.content = json.dumps({}) | ||||
output = self.teamcity.getBuildProblems('1234') | output = self.teamcity.getBuildProblems('1234') | ||||
assert output == [] | self.assertListEqual(output, []) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/problemOccurrences", | "app/rest/problemOccurrences", | ||||
{ | { | ||||
"locator": "build:(id:1234)", | "locator": "build:(id:1234)", | ||||
"fields": "problemOccurrence(id,details)", | "fields": "problemOccurrence(id,details)", | ||||
} | } | ||||
) | ) | ||||
})) | })) | ||||
def test_getBuildProblems_hasProblems(self): | def test_getBuildProblems_hasProblems(self): | ||||
problems = [{ | problems = [{ | ||||
'id': 'id:2500,build:(id:12345)', | 'id': 'id:2500,build:(id:12345)', | ||||
'details': 'test-details', | 'details': 'test-details', | ||||
}] | }] | ||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'problemOccurrence': problems, | 'problemOccurrence': problems, | ||||
}) | }) | ||||
output = self.teamcity.getBuildProblems('1234') | output = self.teamcity.getBuildProblems('1234') | ||||
assert output[0]['id'] == problems[0]['id'] | self.assertEqual(output[0]['id'], problems[0]['id']) | ||||
assert output[0]['details'] == problems[0]['details'] | self.assertEqual(output[0]['details'], problems[0]['details']) | ||||
assert output[0]['logUrl'] == self.teamcity.build_url( | self.assertEqual(output[0]['logUrl'], self.teamcity.build_url( | ||||
"viewLog.html", | "viewLog.html", | ||||
{ | { | ||||
"tab": "buildLog", | "tab": "buildLog", | ||||
"logTab": "tree", | "logTab": "tree", | ||||
"filter": "debug", | "filter": "debug", | ||||
"expand": "all", | "expand": "all", | ||||
"buildId": 1234, | "buildId": 1234, | ||||
}, | }, | ||||
"footer" | "footer" | ||||
) | )) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/problemOccurrences", | "app/rest/problemOccurrences", | ||||
{ | { | ||||
"locator": "build:(id:1234)", | "locator": "build:(id:1234)", | ||||
"fields": "problemOccurrence(id,details)", | "fields": "problemOccurrence(id,details)", | ||||
} | } | ||||
) | ) | ||||
})) | })) | ||||
def test_getFailedTests_noTestFailures(self): | def test_getFailedTests_noTestFailures(self): | ||||
self.teamcity.session.send.return_value.content = json.dumps({}) | self.teamcity.session.send.return_value.content = json.dumps({}) | ||||
output = self.teamcity.getFailedTests('1234') | output = self.teamcity.getFailedTests('1234') | ||||
assert output == [] | self.assertListEqual(output, []) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/testOccurrences", | "app/rest/testOccurrences", | ||||
{ | { | ||||
"locator": "build:(id:1234),status:FAILURE", | "locator": "build:(id:1234),status:FAILURE", | ||||
"fields": "testOccurrence(id,details,name)", | "fields": "testOccurrence(id,details,name)", | ||||
} | } | ||||
) | ) | ||||
})) | })) | ||||
def test_getFailedTests_hasTestFailures(self): | def test_getFailedTests_hasTestFailures(self): | ||||
failures = [{ | failures = [{ | ||||
'id': 'id:2500,build:(id:12345)', | 'id': 'id:2500,build:(id:12345)', | ||||
'details': 'stacktrace', | 'details': 'stacktrace', | ||||
'name': 'test name', | 'name': 'test name', | ||||
}] | }] | ||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'testOccurrence': failures, | 'testOccurrence': failures, | ||||
}) | }) | ||||
output = self.teamcity.getFailedTests('1234') | output = self.teamcity.getFailedTests('1234') | ||||
assert output[0]['id'] == failures[0]['id'] | self.assertEqual(output[0]['id'], failures[0]['id']) | ||||
assert output[0]['details'] == failures[0]['details'] | self.assertEqual(output[0]['details'], failures[0]['details']) | ||||
assert output[0]['name'] == failures[0]['name'] | self.assertEqual(output[0]['name'], failures[0]['name']) | ||||
assert output[0]['logUrl'] == self.teamcity.build_url( | self.assertEqual(output[0]['logUrl'], self.teamcity.build_url( | ||||
"viewLog.html", | "viewLog.html", | ||||
{ | { | ||||
"tab": "buildLog", | "tab": "buildLog", | ||||
"logTab": "tree", | "logTab": "tree", | ||||
"filter": "debug", | "filter": "debug", | ||||
"expand": "all", | "expand": "all", | ||||
"buildId": 1234, | "buildId": 1234, | ||||
"_focus": 2500, | "_focus": 2500, | ||||
} | } | ||||
) | )) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/testOccurrences", | "app/rest/testOccurrences", | ||||
{ | { | ||||
"locator": "build:(id:1234),status:FAILURE", | "locator": "build:(id:1234),status:FAILURE", | ||||
"fields": "testOccurrence(id,details,name)", | "fields": "testOccurrence(id,details,name)", | ||||
} | } | ||||
) | ) | ||||
})) | })) | ||||
def test_triggerBuild(self): | def test_triggerBuild(self): | ||||
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 | ||||
output = self.teamcity.trigger_build('1234', 'branch-name', 'test-phid', [{ | output = self.teamcity.trigger_build('1234', 'branch-name', 'test-phid', [{ | ||||
'name': 'another-property', | 'name': 'another-property', | ||||
'value': 'some value', | 'value': 'some value', | ||||
}]) | }]) | ||||
assert output == json.loads(triggerBuildResponse.content) | self.assertEqual(output, json.loads(triggerBuildResponse.content)) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url("app/rest/buildQueue"), | 'url': self.teamcity.build_url("app/rest/buildQueue"), | ||||
'body': json.dumps({ | 'body': json.dumps({ | ||||
'branchName': 'branch-name', | 'branchName': 'branch-name', | ||||
'buildType': { | 'buildType': { | ||||
'id': '1234', | 'id': '1234', | ||||
}, | }, | ||||
'properties': { | 'properties': { | ||||
Show All 13 Lines | def test_getBuildChangeDetails(self): | ||||
'username': 'email@bitcoinabc.org', | 'username': 'email@bitcoinabc.org', | ||||
'user': { | 'user': { | ||||
'name': 'Author Name', | 'name': 'Author Name', | ||||
}, | }, | ||||
} | } | ||||
self.teamcity.session.send.return_value.content = json.dumps( | self.teamcity.session.send.return_value.content = json.dumps( | ||||
expectedOutput) | expectedOutput) | ||||
output = self.teamcity.getBuildChangeDetails('1234') | output = self.teamcity.getBuildChangeDetails('1234') | ||||
assert output == expectedOutput | self.assertEqual(output, expectedOutput) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url("app/rest/changes/1234") | 'url': self.teamcity.build_url("app/rest/changes/1234") | ||||
})) | })) | ||||
def test_getBuildChanges(self): | def test_getBuildChanges(self): | ||||
self.teamcity.session.send.side_effect = [ | self.teamcity.session.send.side_effect = [ | ||||
test.mocks.teamcity.Response(json.dumps({ | test.mocks.teamcity.Response(json.dumps({ | ||||
'change': [{ | 'change': [{ | ||||
'id': '1234', | 'id': '1234', | ||||
}], | }], | ||||
})), | })), | ||||
test.mocks.teamcity.Response(json.dumps({ | test.mocks.teamcity.Response(json.dumps({ | ||||
'username': 'email@bitcoinabc.org', | 'username': 'email@bitcoinabc.org', | ||||
'user': { | 'user': { | ||||
'name': 'Author Name', | 'name': 'Author Name', | ||||
}, | }, | ||||
})), | })), | ||||
] | ] | ||||
output = self.teamcity.getBuildChanges('2345') | output = self.teamcity.getBuildChanges('2345') | ||||
assert output[0]['username'] == 'email@bitcoinabc.org' | self.assertEqual(output[0]['username'], 'email@bitcoinabc.org') | ||||
assert output[0]['user']['name'] == 'Author Name' | self.assertEqual(output[0]['user']['name'], 'Author Name') | ||||
calls = [mock.call(AnyWith(requests.PreparedRequest, { | calls = [mock.call(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/changes", | "app/rest/changes", | ||||
{ | { | ||||
"locator": "build:(id:2345)", | "locator": "build:(id:2345)", | ||||
"fields": "change(id)", | "fields": "change(id)", | ||||
} | } | ||||
) | ) | ||||
})), mock.call(AnyWith(requests.PreparedRequest, { | })), mock.call(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url("app/rest/changes/1234") | 'url': self.teamcity.build_url("app/rest/changes/1234") | ||||
}))] | }))] | ||||
self.teamcity.session.send.assert_has_calls(calls, any_order=False) | self.teamcity.session.send.assert_has_calls(calls, any_order=False) | ||||
def test_getBuildInfo(self): | def test_getBuildInfo(self): | ||||
self.teamcity.session.send.return_value = test.mocks.teamcity.buildInfo( | self.teamcity.session.send.return_value = test.mocks.teamcity.buildInfo( | ||||
properties=test.mocks.teamcity.buildInfo_properties([{ | properties=test.mocks.teamcity.buildInfo_properties([{ | ||||
'name': 'env.ABC_BUILD_NAME', | 'name': 'env.ABC_BUILD_NAME', | ||||
'value': 'build-diff', | 'value': 'build-diff', | ||||
}]), | }]), | ||||
changes=test.mocks.teamcity.buildInfo_changes( | changes=test.mocks.teamcity.buildInfo_changes( | ||||
['101298f9325ddbac7e5a8f405e5e2f24a64e5171']), | ['101298f9325ddbac7e5a8f405e5e2f24a64e5171']), | ||||
) | ) | ||||
buildInfo = self.teamcity.getBuildInfo('1234') | buildInfo = self.teamcity.getBuildInfo('1234') | ||||
assert buildInfo['triggered']['type'] == 'vcs' | self.assertEqual(buildInfo['triggered']['type'], 'vcs') | ||||
assert buildInfo.getProperties().get('env.ABC_BUILD_NAME') == 'build-diff' | self.assertEqual(buildInfo.getProperties().get( | ||||
assert buildInfo.getCommits( | 'env.ABC_BUILD_NAME'), 'build-diff') | ||||
)[0] == '101298f9325ddbac7e5a8f405e5e2f24a64e5171' | self.assertEqual( | ||||
buildInfo.getCommits()[0], | |||||
'101298f9325ddbac7e5a8f405e5e2f24a64e5171') | |||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/builds", | "app/rest/builds", | ||||
{ | { | ||||
"locator": "id:1234", | "locator": "id:1234", | ||||
"fields": "build(*,changes(*),properties(*),triggered(*))", | "fields": "build(*,changes(*),properties(*),triggered(*))", | ||||
} | } | ||||
) | ) | ||||
})) | })) | ||||
def test_getBuildInfo_noInfo(self): | def test_getBuildInfo_noInfo(self): | ||||
self.teamcity.session.send.return_value = test.mocks.teamcity.Response( | self.teamcity.session.send.return_value = test.mocks.teamcity.Response( | ||||
json.dumps({})) | json.dumps({})) | ||||
buildInfo = self.teamcity.getBuildInfo('1234') | buildInfo = self.teamcity.getBuildInfo('1234') | ||||
assert buildInfo.get('triggered', None) is None | self.assertIsNone(buildInfo.get('triggered', None)) | ||||
assert buildInfo.getProperties() is None | self.assertIsNone(buildInfo.getProperties()) | ||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/builds", | "app/rest/builds", | ||||
{ | { | ||||
"locator": "id:1234", | "locator": "id:1234", | ||||
"fields": "build(*,changes(*),properties(*),triggered(*))", | "fields": "build(*,changes(*),properties(*),triggered(*))", | ||||
} | } | ||||
) | ) | ||||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | def test_getLatestBuildAndTestFailures(self): | ||||
'buildTypeId': 'build3', | 'buildTypeId': 'build3', | ||||
}, | }, | ||||
}], | }], | ||||
})), | })), | ||||
] | ] | ||||
(buildFailures, testFailures) = self.teamcity.getLatestBuildAndTestFailures( | (buildFailures, testFailures) = self.teamcity.getLatestBuildAndTestFailures( | ||||
'BitcoinABC_Master') | 'BitcoinABC_Master') | ||||
assert len(buildFailures) == 2 | self.assertEqual(len(buildFailures), 2) | ||||
assert len(testFailures) == 2 | self.assertEqual(len(testFailures), 2) | ||||
teamcityCalls = [mock.call(AnyWith(requests.PreparedRequest, { | teamcityCalls = [mock.call(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/problemOccurrences", | "app/rest/problemOccurrences", | ||||
{ | { | ||||
"locator": "currentlyFailing:true,affectedProject:(id:BitcoinABC_Master)", | "locator": "currentlyFailing:true,affectedProject:(id:BitcoinABC_Master)", | ||||
"fields": "problemOccurrence(*)", | "fields": "problemOccurrence(*)", | ||||
} | } | ||||
Show All 36 Lines | def test_getLatestCompletedBuild(self): | ||||
'build': [{ | 'build': [{ | ||||
'id': 1234, | 'id': 1234, | ||||
}], | }], | ||||
}) | }) | ||||
build = call_getLastCompletedBuild() | build = call_getLastCompletedBuild() | ||||
self.assertEqual(build["id"], 1234) | self.assertEqual(build["id"], 1234) | ||||
def test_formatTime(self): | def test_formatTime(self): | ||||
assert self.teamcity.formatTime(1590000000) == '20200520T184000+0000' | self.assertEqual( | ||||
self.teamcity.formatTime(1590000000), | |||||
'20200520T184000+0000') | |||||
def test_getNumAggregateFailuresSince(self): | def test_getNumAggregateFailuresSince(self): | ||||
self.teamcity.setMockTime(1590000000) | self.teamcity.setMockTime(1590000000) | ||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [], | 'build': [], | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince('buildType', 0) == 0 | self.assertEqual( | ||||
self.teamcity.getNumAggregateFailuresSince( | |||||
'buildType', 0), 0) | |||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [ | 'build': [ | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
], | ], | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince('buildType', 0) == 0 | self.assertEqual( | ||||
self.teamcity.getNumAggregateFailuresSince( | |||||
'buildType', 0), 0) | |||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [{'status': 'FAILURE'}], | 'build': [{'status': 'FAILURE'}], | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince('buildType', 0) == 1 | self.assertEqual( | ||||
self.teamcity.getNumAggregateFailuresSince( | |||||
'buildType', 0), 1) | |||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [ | 'build': [ | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
] | ] | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince('buildType', 0) == 1 | self.assertEqual( | ||||
self.teamcity.getNumAggregateFailuresSince( | |||||
'buildType', 0), 1) | |||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [ | 'build': [ | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
] | ] | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince('buildType', 0) == 2 | self.assertEqual( | ||||
self.teamcity.getNumAggregateFailuresSince( | |||||
'buildType', 0), 2) | |||||
self.teamcity.session.send.return_value.content = json.dumps({ | self.teamcity.session.send.return_value.content = json.dumps({ | ||||
'build': [ | 'build': [ | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
{'status': 'FAILURE'}, | {'status': 'FAILURE'}, | ||||
{'status': 'SUCCESS'}, | {'status': 'SUCCESS'}, | ||||
] | ] | ||||
}) | }) | ||||
assert self.teamcity.getNumAggregateFailuresSince( | self.assertEqual( | ||||
'buildType', 10000000) == 3 | self.teamcity.getNumAggregateFailuresSince( | ||||
'buildType', 10000000), 3) | |||||
self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | self.teamcity.session.send.assert_called_with(AnyWith(requests.PreparedRequest, { | ||||
'url': self.teamcity.build_url( | 'url': self.teamcity.build_url( | ||||
"app/rest/builds", | "app/rest/builds", | ||||
{ | { | ||||
"locator": "buildType:{},sinceDate:{}".format('buildType', | "locator": "buildType:{},sinceDate:{}".format('buildType', | ||||
self.teamcity.formatTime(1580000000)), | self.teamcity.formatTime(1580000000)), | ||||
"fields": "build", | "fields": "build", | ||||
▲ Show 20 Lines • Show All 94 Lines • Show Last 20 Lines |