def test_wrong_type(self): client = MockClient(snug.Response(200, b'{"data": {"foo": 4}}')) with pytest.raises(NotImplementedError, match="not executable: 17"): quiz.execute( 17, url="https://my.url/api", client=client, auth=token_auth("foo"), )
def test_http_error(self): err_response = snug.Response(403, b'this is an error!') client = MockClient(err_response) with pytest.raises(quiz.HTTPError) as exc: quiz.execute('my query', url='https://my.url/api', client=client, auth=token_auth('foo')) assert exc.value == quiz.HTTPError(err_response)
def test_http_error(self, mocker): err_response = snug.Response(403, b"this is an error!") client = MockClient(err_response) with pytest.raises(quiz.HTTPError) as exc: quiz.execute( "my query", url="https://my.url/api", client=client, auth=token_auth("foo"), ) assert exc.value == quiz.HTTPError( err_response, client.request.replace(headers=mocker.ANY))
def test_errors_without_data(self): client = MockClient( snug.Response( 200, json.dumps({ 'errors': [{ 'message': 'foo' }] }).encode())) with pytest.raises(quiz.ErrorResponse) as exc: quiz.execute('my query', url='https://my.url/api', client=client, auth=token_auth('foo')) assert exc.value == quiz.ErrorResponse({}, [{'message': 'foo'}])
def test_query(self): query = quiz.Query(DogQuery, _.dog[_.name.bark_volume]) client = MockClient( snug.Response( 200, json.dumps({ 'data': { 'dog': { 'name': 'Fred', 'bark_volume': 8, } } }).encode())) result = quiz.execute(query, url='https://my.url/api', client=client) assert result == DogQuery(dog=Dog( name='Fred', bark_volume=8, )) request = client.request assert request.url == 'https://my.url/api' assert request.method == 'POST' assert json.loads(request.content.decode()) == { 'query': quiz.gql(query) } assert request.headers == {'Content-Type': 'application/json'}
def test_query(self): query = quiz.Query(DogQuery, _.dog[_.name.bark_volume]) response = snug.Response( 200, json.dumps({ "data": { "dog": { "name": "Fred", "bark_volume": 8 } } }).encode(), ) client = MockClient(response) result = quiz.execute(query, url="https://my.url/api", client=client) assert result == DogQuery(dog=Dog(name="Fred", bark_volume=8)) request = client.request assert result.__metadata__ == quiz.QueryMetadata(response=response, request=request) assert request.url == "https://my.url/api" assert request.method == "POST" assert json.loads(request.content.decode()) == { "query": quiz.gql(query) } assert request.headers == {"Content-Type": "application/json"}
def test_errors_without_data(self): client = MockClient( snug.Response( 200, json.dumps({ "errors": [{ "message": "foo" }] }).encode())) with pytest.raises(quiz.ErrorResponse) as exc: quiz.execute( "my query", url="https://my.url/api", client=client, auth=token_auth("foo"), ) assert exc.value == quiz.ErrorResponse({}, [{"message": "foo"}])
def execute(self, query): client = RequestsClient() endpoint = 'http://testserver/' + settings.GRAPHQL_ENDPOINT response = client.get(endpoint) if 'csrftoken' in response.cookies: client.headers.update( {'X-CSRFToken': response.cookies['csrftoken']}) result = quiz.execute(query, url=endpoint, client=client) return result
def get_em_all(*, owner, reponame, auth): """ Get an owner like "waynew" and a reponame like 'upgraded-octo-umbrella', scrape all the issues, dumping them into `.cache`. """ schema_path = pathlib.Path(".cache", owner, reponame, "schema.json") schema_path.parent.mkdir(parents=True, exist_ok=True) try: print("Loading schema from disk...") schema = quiz.Schema.from_path(schema_path) print("Done!") except FileNotFoundError: print("Failed!") print("Loading schema from GitHub...") schema = quiz.Schema.from_url( "https://api.github.com/graphql", auth=auth, ) schema.to_path(schema_path) print("Done!") _ = quiz.SELECTOR end_cursor = "" issues = [] while end_cursor is not None: issue_filters = { "first": 100, "states": [schema.IssueState.OPEN, schema.IssueState.CLOSED], } if end_cursor: print("Loading after", end_cursor) issue_filters["after"] = end_cursor # fmt: off query = schema.query[_.repository( owner=owner, name=reponame)[_.issues(**issue_filters)[_('page_info').pageInfo[_( 'end_cursor').endCursor].nodes[_.title.number.state.closed( 'closed_at').closedAt('created_at').createdAt.labels( first=100)[_.edges[_.node[_.name]]]]]]] # fmt: on result = quiz.execute( query, "https://api.github.com/graphql", auth=auth, ) end_cursor = result.repository.issues.page_info.end_cursor issues.extend( convert_node_to_dict(node) for node in result.repository.issues.nodes) return issues
def test_simple_string(self): client = MockClient(snug.Response(200, b'{"data": {"foo": 4}}')) result = quiz.execute('my query', url='https://my.url/api', client=client, auth=token_auth('foo')) assert result == {'foo': 4} request = client.request assert request.url == 'https://my.url/api' assert request.method == 'POST' assert json.loads(request.content.decode()) == {'query': 'my query'} assert request.headers == { 'Authorization': 'token foo', 'Content-Type': 'application/json' }
def test_simple_string(self): client = MockClient(snug.Response(200, b'{"data": {"foo": 4}}')) result = quiz.execute( "my query", url="https://my.url/api", client=client, auth=token_auth("foo"), ) assert result == {"foo": 4} request = client.request assert request.url == "https://my.url/api" assert request.method == "POST" assert json.loads(request.content.decode()) == {"query": "my query"} assert request.headers == { "Authorization": "token foo", "Content-Type": "application/json", }
def execute(obj, auth, url=URL, **kwargs): return quiz.execute(obj, auth=auth_factory(auth), url=url, **kwargs)