Skip to content

Commit c318fff

Browse files
authored
Merge pull request #10189 from Turbo87/multi-id
Fix pagination field generation for duplicate keys
2 parents 7696255 + 2764c43 commit c318fff

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

src/tests/routes/crates/list.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -664,18 +664,21 @@ async fn multiple_ids() -> anyhow::Result<()> {
664664
.expect_build(&mut conn)
665665
.await;
666666

667-
for json in search_both(
668-
&anon,
669-
"ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown",
670-
)
671-
.await
672-
{
667+
let query = "ids[]=foo&ids[]=bar&ids[]=baz&ids[]=baz&ids[]=unknown";
668+
for json in search_both(&anon, query).await {
673669
assert_eq!(json.meta.total, 3);
674670
assert_eq!(json.crates[0].name, "bar");
675671
assert_eq!(json.crates[1].name, "baz");
676672
assert_eq!(json.crates[2].name, "foo");
677673
}
678674

675+
let response = anon.search(&format!("{query}&per_page=1&page=2")).await;
676+
assert_snapshot!(response.meta.prev_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&page=1");
677+
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&page=3");
678+
679+
let response = anon.search(&format!("{query}&per_page=1")).await;
680+
assert_snapshot!(response.meta.next_page.unwrap(), @"?ids%5B%5D=foo&ids%5B%5D=bar&ids%5B%5D=baz&ids%5B%5D=baz&ids%5B%5D=unknown&per_page=1&seek=Mg");
681+
679682
Ok(())
680683
}
681684

@@ -1013,21 +1016,21 @@ async fn pagination_links_included_if_applicable() -> anyhow::Result<()> {
10131016
let page4 = anon.search("letter=p&page=4&per_page=1").await;
10141017

10151018
assert_eq!(
1016-
Some("?letter=p&page=2&per_page=1".to_string()),
1019+
Some("?letter=p&per_page=1&page=2".to_string()),
10171020
page1.meta.next_page
10181021
);
10191022
assert_eq!(None, page1.meta.prev_page);
10201023
assert_eq!(
1021-
Some("?letter=p&page=3&per_page=1".to_string()),
1024+
Some("?letter=p&per_page=1&page=3".to_string()),
10221025
page2.meta.next_page
10231026
);
10241027
assert_eq!(
1025-
Some("?letter=p&page=1&per_page=1".to_string()),
1028+
Some("?letter=p&per_page=1&page=1".to_string()),
10261029
page2.meta.prev_page
10271030
);
10281031
assert_eq!(None, page4.meta.next_page);
10291032
assert_eq!(
1030-
Some("?letter=p&page=2&per_page=1".to_string()),
1033+
Some("?letter=p&per_page=1&page=2".to_string()),
10311034
page3.meta.prev_page
10321035
);
10331036
assert!([page1.meta.total, page2.meta.total, page3.meta.total]

src/util/request_helpers.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,15 @@ impl<T: RequestPartsExt> RequestUtils for T {
4747
}
4848

4949
fn query_with_params(&self, new_params: IndexMap<String, String>) -> String {
50-
let mut params = self.query();
50+
let query_bytes = self.uri().query().unwrap_or("").as_bytes();
51+
52+
let mut params = url::form_urlencoded::parse(query_bytes)
53+
.into_owned()
54+
.filter(|(key, _)| !new_params.contains_key(key))
55+
.collect::<Vec<_>>();
56+
5157
params.extend(new_params);
58+
5259
let query_string = url::form_urlencoded::Serializer::new(String::new())
5360
.extend_pairs(params)
5461
.finish();

0 commit comments

Comments
 (0)