Почему выполнение схемы в 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 секунд. Что я делаю не так?

Вернуться на верх