def test_get_key_transaction_list_pagination(self):
        user = self.create_user()
        self.login_as(user=user)
        org = self.create_organization(owner=user, name="foo")
        project = self.create_project(name="baz", organization=org)

        teams = []
        for i in range(123):
            team = self.create_team(organization=org, name=f"Team {i:02d}")
            self.create_team_membership(team, user=user)
            project.add_team(team)
            teams.append(team)

        # get the first page
        with self.feature(self.features):
            response = self.client.get(
                reverse("sentry-api-0-organization-key-transactions-list", args=[org.slug]),
                data={
                    "project": [project.id],
                    "team": ["myteams"],
                },
                format="json",
            )

        assert response.status_code == 200, response.content
        assert len(response.data) == 100
        links = {
            link["rel"]: {"url": url, **link}
            for url, link in parse_link_header(response["Link"]).items()
        }
        assert links["previous"]["results"] == "false"
        assert links["next"]["results"] == "true"

        # get the second page
        with self.feature(self.features):
            response = self.client.get(
                reverse("sentry-api-0-organization-key-transactions-list", args=[org.slug]),
                data={
                    "project": [project.id],
                    "team": ["myteams"],
                    "cursor": links["next"]["cursor"],
                },
                format="json",
            )

        assert response.status_code == 200, response.content
        assert len(response.data) == 23
        links = {
            link["rel"]: {"url": url, **link}
            for url, link in parse_link_header(response["Link"]).items()
        }
        assert links["previous"]["results"] == "true"
        assert links["next"]["results"] == "false"
예제 #2
0
 def _parse_links(self, header):
     # links come in {url: {...attrs}}, but we need {rel: {...attrs}}
     links = {}
     for url, attrs in six.iteritems(parse_link_header(header)):
         links[attrs["rel"]] = attrs
         attrs["href"] = url
     return links
예제 #3
0
 def _parse_links(self, header):
     # links come in {url: {...attrs}}, but we need {rel: {...attrs}}
     links = {}
     for url, attrs in parse_link_header(header).iteritems():
         links[attrs['rel']] = attrs
         attrs['href'] = url
     return links
예제 #4
0
 def _parse_links(self, header):
     # links come in {url: {...attrs}}, but we need {rel: {...attrs}}
     links = {}
     for url, attrs in six.iteritems(parse_link_header(header)):
         links[attrs['rel']] = attrs
         attrs['href'] = url
     return links
예제 #5
0
    def test_pagination_last_page(self, mock_raw_snql_query):
        event = self.create_event()

        mock_raw_snql_query.side_effect = [
            {
                "data":
                [self.suspect_span_group_snuba_results("http.server", event)]
            },
        ]

        with self.feature(self.FEATURES):
            response = self.client.get(
                self.url,
                data={
                    "project": self.project.id,
                    "sort": "-sumExclusiveTime",
                    "per_page": 1,
                    "cursor": "0:2:0",
                },
                format="json",
            )

        assert response.status_code == 200, response.content
        links = parse_link_header(response["Link"])
        for link, info in links.items():
            assert f"project={self.project.id}" in link
            assert "sort=-sumExclusiveTime" in link
            # last page does not have a next page, only previous
            assert info["results"] == ("true" if info["rel"] == "previous" else
                                       "false")
예제 #6
0
    def test_pagination_middle_page(self, mock_raw_snql_query):
        event = self.create_event()

        mock_raw_snql_query.side_effect = [
            {
                "data": [
                    self.suspect_span_group_snuba_results(
                        "http.server", event),
                    # make sure to return 1 extra result to indicate that there is a next page
                    self.suspect_span_group_snuba_results(
                        "django.view", event),
                ],
            },
        ]

        with self.feature(self.FEATURES):
            response = self.client.get(
                self.url,
                data={
                    "project": self.project.id,
                    "sort": "-sumExclusiveTime",
                    "per_page": 1,
                    "cursor": "0:1:0",
                },
                format="json",
            )

        assert response.status_code == 200, response.content
        links = parse_link_header(response["Link"])
        for link, info in links.items():
            assert f"project={self.project.id}" in link
            assert "sort=-sumExclusiveTime" in link
            # middle page has both a previous and next
            assert info["results"] == "true"
예제 #7
0
    def test_simple(self):
        self.create_group(checksum='a' * 32)
        self.create_group(checksum='b' * 32)

        self.login_as(user=self.user)
        url = reverse('sentry-api-0-project-group-index', kwargs={
            'project_id': self.project.id})
        response = self.client.get(url + '?limit=1', format='json')
        assert response.status_code == 200
        # links come in {url: {...attrs}}, but we need {rel: {...attrs}}
        links = {
            d['rel']: d
            for d in parse_link_header(response['Link']).values()
        }

        assert links['previous']['results'] == 'false'
        assert links['next']['results'] == 'true'
    def test_next_prev_link_headers(self):
        self.login_as(user=self.user)
        project = self.create_project()
        events = [("a", "group_1"), ("b", "group_2"), ("c", "group_2"),
                  ("d", "group_2")]
        for e in events:
            self.store_event(
                data={
                    "event_id": e[0] * 32,
                    "timestamp": self.min_ago,
                    "fingerprint": [e[1]],
                    "user": {
                        "email": "*****@*****.**"
                    },
                    "tags": {
                        "language": "C++"
                    },
                },
                project_id=project.id,
            )

        with self.feature("organizations:discover-basic"):
            response = self.client.get(
                self.url,
                format="json",
                data={
                    "field": ["count(id)", "issue.id", "context.key"],
                    "sort": "-count_id",
                    "query": "language:C++",
                },
            )

        assert response.status_code == 200, response.content
        links = parse_link_header(response["Link"])
        for link in links:
            assert "field=issue.id" in link
            assert "field=count%28id%29" in link
            assert "field=context.key" in link
            assert "sort=-count_id" in link
            assert "query=language%3AC%2B%2B" in link

        assert len(response.data["data"]) == 2
        data = response.data["data"]
        assert data[0]["count_id"] == 3
        assert data[1]["count_id"] == 1