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"
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
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
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
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")
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"
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