Skip to content

Commit 2ca8b54

Browse files
committed
controllers/summary: Expose the yanked field
1 parent 188e033 commit 2ca8b54

File tree

2 files changed

+79
-12
lines changed

2 files changed

+79
-12
lines changed

src/controllers/summary.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
3434

3535
fn encode_crates(
3636
conn: &mut impl Conn,
37-
data: Vec<(Crate, i64, Option<i64>, Option<String>)>,
37+
data: Vec<Record>,
3838
) -> AppResult<Vec<EncodableCrate>> {
3939
let krates = data.iter().map(|(c, ..)| c).collect::<Vec<_>>();
4040
let versions: Vec<Version> = krates.versions().load(conn)?;
@@ -43,17 +43,19 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
4343
.into_iter()
4444
.map(TopVersions::from_versions)
4545
.zip(data)
46-
.map(|(top_versions, (krate, total, recent, default_version))| {
47-
Ok(EncodableCrate::from_minimal(
48-
krate,
49-
default_version.as_deref(),
50-
None,
51-
Some(&top_versions),
52-
false,
53-
total,
54-
recent,
55-
))
56-
})
46+
.map(
47+
|(top_versions, (krate, total, recent, default_version, yanked))| {
48+
Ok(EncodableCrate::from_minimal(
49+
krate,
50+
default_version.as_deref(),
51+
yanked,
52+
Some(&top_versions),
53+
false,
54+
total,
55+
recent,
56+
))
57+
},
58+
)
5759
.collect()
5860
}
5961

@@ -62,6 +64,7 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
6264
crate_downloads::downloads,
6365
recent_crate_downloads::downloads.nullable(),
6466
versions::num.nullable(),
67+
versions::yanked.nullable(),
6568
);
6669

6770
let new_crates = crates::table
@@ -137,3 +140,5 @@ pub async fn summary(state: AppState) -> AppResult<Json<Value>> {
137140
})
138141
.await
139142
}
143+
144+
type Record = (Crate, i64, Option<i64>, Option<String>, Option<bool>);

src/tests/routes/summary.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ async fn summary_new_crates() {
100100
json.most_downloaded[0].default_version,
101101
Some("0.2.0".into())
102102
);
103+
assert_eq!(json.most_downloaded[0].yanked, Some(false));
103104
assert_eq!(json.most_downloaded[0].downloads, 5000);
104105
assert_eq!(json.most_downloaded[0].recent_downloads, Some(50));
105106
assert_eq!(
@@ -110,23 +111,27 @@ async fn summary_new_crates() {
110111
json.most_recently_downloaded[0].default_version,
111112
Some("0.2.0".into())
112113
);
114+
assert_eq!(json.most_recently_downloaded[0].yanked, Some(false));
113115
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(50));
114116
assert_eq!(json.popular_keywords[0].keyword, "popular");
115117
assert_eq!(json.popular_categories[0].category, "Category 1");
116118
assert_eq!(json.just_updated.len(), 2);
117119

118120
assert_eq!(json.just_updated[0].name, "just_updated_patch");
119121
assert_eq!(json.just_updated[0].default_version, Some("0.2.0".into()));
122+
assert_eq!(json.just_updated[0].yanked, Some(false));
120123
assert_eq!(json.just_updated[0].max_version, "0.2.0");
121124
assert_eq!(json.just_updated[0].newest_version, "0.1.1");
122125

123126
assert_eq!(json.just_updated[1].name, "just_updated");
124127
assert_eq!(json.just_updated[1].default_version, Some("0.1.2".into()));
128+
assert_eq!(json.just_updated[1].yanked, Some(false));
125129
assert_eq!(json.just_updated[1].max_version, "0.1.2");
126130
assert_eq!(json.just_updated[1].newest_version, "0.1.2");
127131

128132
assert_eq!(json.new_crates[0].name, "with_downloads");
129133
assert_eq!(json.new_crates[0].default_version, Some("0.3.0".into()));
134+
assert_eq!(json.new_crates[0].yanked, Some(false));
130135
assert_eq!(json.new_crates.len(), 5);
131136
}
132137

@@ -172,6 +177,7 @@ async fn excluded_crate_id() {
172177
json.most_downloaded[0].default_version,
173178
Some("0.1.0".into())
174179
);
180+
assert_eq!(json.most_downloaded[0].yanked, Some(false));
175181
assert_eq!(json.most_downloaded[0].downloads, 20);
176182

177183
assert_eq!(json.most_recently_downloaded.len(), 1);
@@ -180,5 +186,61 @@ async fn excluded_crate_id() {
180186
json.most_recently_downloaded[0].default_version,
181187
Some("0.1.0".into())
182188
);
189+
assert_eq!(json.most_recently_downloaded[0].yanked, Some(false));
190+
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(10));
191+
}
192+
193+
#[tokio::test(flavor = "multi_thread")]
194+
async fn all_yanked() {
195+
let (app, anon, user) = TestApp::init()
196+
.with_config(|config| {
197+
config.excluded_crate_names = vec![
198+
"most_recent_downloads".into(),
199+
// make sure no error occurs with a crate name that doesn't exist and that the name
200+
// matches are exact, not substrings
201+
"downloads".into(),
202+
];
203+
})
204+
.with_user();
205+
206+
let mut conn = app.db_conn();
207+
let user = user.as_model();
208+
209+
CrateBuilder::new("some_downloads", user.id)
210+
.version(VersionBuilder::new("0.1.0").yanked(true))
211+
.version(VersionBuilder::new("0.2.0").yanked(true))
212+
.description("description")
213+
.keyword("popular")
214+
.category("cat1")
215+
.downloads(20)
216+
.recent_downloads(10)
217+
.expect_build(&mut conn);
218+
219+
CrateBuilder::new("most_recent_downloads", user.id)
220+
.version(VersionBuilder::new("0.2.0"))
221+
.keyword("popular")
222+
.category("cat1")
223+
.downloads(5000)
224+
.recent_downloads(50)
225+
.expect_build(&mut conn);
226+
227+
let json: SummaryResponse = anon.get("/api/v1/summary").await.good();
228+
229+
assert_eq!(json.most_downloaded.len(), 1);
230+
assert_eq!(json.most_downloaded[0].name, "some_downloads");
231+
assert_eq!(
232+
json.most_downloaded[0].default_version,
233+
Some("0.2.0".into())
234+
);
235+
assert_eq!(json.most_downloaded[0].yanked, Some(true));
236+
assert_eq!(json.most_downloaded[0].downloads, 20);
237+
238+
assert_eq!(json.most_recently_downloaded.len(), 1);
239+
assert_eq!(json.most_recently_downloaded[0].name, "some_downloads");
240+
assert_eq!(
241+
json.most_recently_downloaded[0].default_version,
242+
Some("0.2.0".into())
243+
);
244+
assert_eq!(json.most_recently_downloaded[0].yanked, Some(true));
183245
assert_eq!(json.most_recently_downloaded[0].recent_downloads, Some(10));
184246
}

0 commit comments

Comments
 (0)