mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
182 lines
4.8 KiB
Python
182 lines
4.8 KiB
Python
"""Tests for github_helpers.py."""
|
|
|
|
__copyright__ = """
|
|
Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
Exceptions. See /LICENSE for license information.
|
|
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
"""
|
|
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
from github_tools import github_helpers
|
|
|
|
|
|
_TEST_QUERY = """
|
|
query {
|
|
top(login: "foo") {
|
|
child(first: 100%(cursor)s) {
|
|
nodes {
|
|
login
|
|
}
|
|
%(pagination)s
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
|
|
_TEST_QUERY_PATH = ("top", "child")
|
|
|
|
_EXP_QUERY_FIRST_PAGE = """
|
|
query {
|
|
top(login: "foo") {
|
|
child(first: 100) {
|
|
nodes {
|
|
login
|
|
}
|
|
pageInfo {
|
|
hasNextPage
|
|
endCursor
|
|
}
|
|
totalCount
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
|
|
_EXP_QUERY_SECOND_PAGE = """
|
|
query {
|
|
top(login: "foo") {
|
|
child(first: 100 after: "CURSOR") {
|
|
nodes {
|
|
login
|
|
}
|
|
pageInfo {
|
|
hasNextPage
|
|
endCursor
|
|
}
|
|
totalCount
|
|
}
|
|
}
|
|
}
|
|
"""
|
|
|
|
|
|
class TestGithubHelpers(unittest.TestCase):
|
|
def setUp(self):
|
|
patcher = mock.patch.object(
|
|
github_helpers.Client, "__init__", lambda self, parsed_args: None
|
|
)
|
|
self.addCleanup(patcher.stop)
|
|
patcher.start()
|
|
self.client = github_helpers.Client(None)
|
|
|
|
@staticmethod
|
|
def mock_result(nodes, total_count=None, has_next_page=False):
|
|
if total_count is None:
|
|
total_count = len(nodes)
|
|
end_cursor = None
|
|
if has_next_page:
|
|
end_cursor = "CURSOR"
|
|
return {
|
|
"top": {
|
|
"child": {
|
|
"nodes": nodes,
|
|
"pageInfo": {
|
|
"hasNextPage": has_next_page,
|
|
"endCursor": end_cursor,
|
|
},
|
|
"totalCount": total_count,
|
|
}
|
|
}
|
|
}
|
|
|
|
def test_execute_and_paginate_empty(self):
|
|
self.client.execute = mock.MagicMock(return_value=self.mock_result([]))
|
|
self.assertEqual(
|
|
list(
|
|
self.client.execute_and_paginate(_TEST_QUERY, _TEST_QUERY_PATH)
|
|
),
|
|
[],
|
|
)
|
|
self.client.execute.assert_called_once_with(_EXP_QUERY_FIRST_PAGE)
|
|
|
|
def test_execute_and_paginate_one_page(self):
|
|
self.client.execute = mock.MagicMock(
|
|
return_value=self.mock_result(["foo", "bar", "baz"])
|
|
)
|
|
self.assertEqual(
|
|
list(
|
|
self.client.execute_and_paginate(_TEST_QUERY, _TEST_QUERY_PATH)
|
|
),
|
|
["foo", "bar", "baz"],
|
|
)
|
|
self.client.execute.assert_called_once_with(_EXP_QUERY_FIRST_PAGE)
|
|
|
|
def test_execute_and_paginate_one_page_count_mismatch(self):
|
|
self.client.execute = mock.MagicMock(
|
|
return_value=self.mock_result(["foo"], total_count=2),
|
|
)
|
|
self.assertRaises(
|
|
AssertionError,
|
|
list,
|
|
self.client.execute_and_paginate(_TEST_QUERY, _TEST_QUERY_PATH),
|
|
)
|
|
self.client.execute.assert_called_once_with(_EXP_QUERY_FIRST_PAGE)
|
|
|
|
def test_execute_and_paginate_two_page(self):
|
|
def paging(query):
|
|
if query == _EXP_QUERY_FIRST_PAGE:
|
|
return self.mock_result(
|
|
["foo", "bar"], total_count=3, has_next_page=True
|
|
)
|
|
elif query == _EXP_QUERY_SECOND_PAGE:
|
|
return self.mock_result(["baz"], total_count="unused")
|
|
else:
|
|
raise ValueError("Bad query: %s" % query)
|
|
|
|
self.client.execute = mock.MagicMock(side_effect=paging)
|
|
self.assertEqual(
|
|
list(
|
|
self.client.execute_and_paginate(_TEST_QUERY, _TEST_QUERY_PATH)
|
|
),
|
|
["foo", "bar", "baz"],
|
|
)
|
|
self.assertEqual(self.client.execute.call_count, 2)
|
|
|
|
def test_execute_and_paginate_first_page_done(self):
|
|
self.client.execute = mock.MagicMock()
|
|
self.assertEqual(
|
|
list(
|
|
self.client.execute_and_paginate(
|
|
_TEST_QUERY,
|
|
_TEST_QUERY_PATH,
|
|
first_page=self.mock_result(["foo"]),
|
|
)
|
|
),
|
|
["foo"],
|
|
)
|
|
self.assertEqual(self.client.execute.call_count, 0)
|
|
|
|
def test_execute_and_paginate_first_page_continue(self):
|
|
self.client.execute = mock.MagicMock(
|
|
return_value=self.mock_result(["bar"], total_count="unused")
|
|
)
|
|
self.assertEqual(
|
|
list(
|
|
self.client.execute_and_paginate(
|
|
_TEST_QUERY,
|
|
_TEST_QUERY_PATH,
|
|
first_page=self.mock_result(
|
|
["foo"], total_count=2, has_next_page=True
|
|
),
|
|
)
|
|
),
|
|
["foo", "bar"],
|
|
)
|
|
self.client.execute.assert_called_once_with(_EXP_QUERY_SECOND_PAGE)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|