Почему выполнение схемы в python graphene затягивается?
Я использую graphene. Я использовал версию 2.1.9. Теперь я использую версию 3.3. Этот код не был изменен после обновления, я собираюсь описать соответствующий код, а затем объяснить проблему дальше
build_schema: ни Query, ни Mutation не являются None, поэтому возвращается graphene.Schema(query=Query, mutation=Mutation)
@logf(level='debug')
def build_schema(*args, **kwargs) -> graphene.Schema:
"""Builds the Query and Mutation classes for the given
schema name and adds them a schema and returns the schema
"""
Query, Mutation = None, None
qclasses, qprops = _build_props('queries', *args, **kwargs)
if qclasses:
Query = type('Query', qclasses, qprops)
mclasses, mprops = _build_props('mutations', *args, **kwargs)
if mclasses:
Mutation = type('Mutation', mclasses, mprops)
if Query is None and Mutation is None:
raise ValueError('No Query or Mutation classes found')
elif Query is None:
gqlschema = graphene.Schema(mutation=Mutation)
elif Mutation is None:
gqlschema = graphene.Schema(query=Query)
else:
gqlschema = graphene.Schema(query=Query, mutation=Mutation)
return gqlschema
Это тестовый пример, который не работает, он не сообщает, почему он не работает, он просто висит в течение 60 секунд, а затем говорит, что он вышел по таймеру
def _mock_user(user='test', **kwargs):
return MagicMock(username=user, **kwargs)
def _mock_info(**kwargs):
infomock = MagicMock()
infomock.context.user = _mock_user(**kwargs)
return infomock
class TestSignUrlQuery(TestCase):
def setUp(self):
self.query = '''
query {
signedUrl(
gcsUrl: "bucket/path/to/file",
method: "PUT",
contentType: "image/png",
acl: "project-private",
expires: 60
)
}
'''
self.schema = build_schema()
@patch('pict_api.graphqlapi.internal.gcloud.queries.isAuthorized')
@patch('pict_api.graphqlapi.internal.gcloud.queries.generate_signed_url')
def test_signed_url_query(self, mock_gen_url, mock_is_auth):
mock_gen_url.return_value = 'https://signed.url'
infomock = _mock_info()
print('schema', self.schema)
result = self.schema.execute(
self.query,
context_value=infomock.context # Updated to context_value
)
self.assertFalse(result.errors)
self.assertEqual(result.data['signedUrl'], 'https://signed.url')
self.assertTrue(mock_is_auth.called)
self.assertTrue(mock_is_auth.called_with(infomock, [POD_ACCESS]))
self.assertTrue(mock_gen_url.called)
mock_gen_url.assert_called_with(
'bucket/path/to/file',
method='PUT',
expiration=60,
content_type='image/png',
acl='project-private',
)
@patch(
'pict_api.graphqlapi.internal.gcloud.queries.isAuthorized',
side_effect=GraphQLError('Not Authorized'),
)
@patch('pict_api.graphqlapi.internal.gcloud.queries.generate_signed_url')
def test_signed_url_badauth(self, mock_gen_url, mock_is_auth):
mock_is_auth.return_value = None
infomock = _mock_info(user=None)
result = self.schema.execute(
self.query,
context_value=infomock.context # Updated to context_value
)
self.assertEqual(len(result.errors), 1)
self.assertFalse(mock_gen_url.called)
Я проверил, что запрос signedUrl присутствует в схеме и что аргументы соответствуют требуемому типу, я также попробовал использовать context вместо context_value, я уверен, что это связано с обновлением с 2.1.9 до 3.3, хотя я не уверен, что именно я должен изменить.
Повторимся: тест держится на этом утверждении
result = self.schema.execute(
self.query,
context_value=infomock.context # Updated to context_value
)
И он не сообщает, почему, только то, что он завершает работу через 60 секунд. Что я делаю не так?