Exemple #1
0
 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"),
         )
Exemple #2
0
 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)
Exemple #3
0
 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))
Exemple #4
0
 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'}])
Exemple #5
0
    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'}
Exemple #6
0
    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"}
Exemple #7
0
 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
Exemple #10
0
    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'
        }
Exemple #11
0
    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",
        }
Exemple #12
0
def execute(obj, auth, url=URL, **kwargs):
    return quiz.execute(obj, auth=auth_factory(auth), url=url, **kwargs)