You've already forked AstralRinth
forked from didirus/AstralRinth
Version ordering [MOD-551] (#740)
* Version ordering * cargo sqlx prepare * Use version ordering for maven * Use version ordering when sorting versions in Rust (not just SQL) * Thanks clippy
This commit is contained in:
@@ -7,6 +7,7 @@ use std::rc::Rc;
|
||||
pub mod organization;
|
||||
pub mod project;
|
||||
pub mod team;
|
||||
pub mod version;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ApiV2 {
|
||||
|
||||
91
tests/common/api_v2/version.rs
Normal file
91
tests/common/api_v2/version.rs
Normal file
@@ -0,0 +1,91 @@
|
||||
use actix_http::{header::AUTHORIZATION, StatusCode};
|
||||
use actix_web::{dev::ServiceResponse, test};
|
||||
use labrinth::models::projects::Version;
|
||||
use serde_json::json;
|
||||
|
||||
use crate::common::{self, actix::AppendsMultipart, asserts::assert_status};
|
||||
|
||||
use super::ApiV2;
|
||||
|
||||
pub fn url_encode_json_serialized_vec(elements: &[String]) -> String {
|
||||
let serialized = serde_json::to_string(&elements).unwrap();
|
||||
urlencoding::encode(&serialized).to_string()
|
||||
}
|
||||
|
||||
impl ApiV2 {
|
||||
pub async fn create_default_version(
|
||||
&self,
|
||||
project_id: &str,
|
||||
ordering: Option<i32>,
|
||||
pat: &str,
|
||||
) -> Version {
|
||||
let json_data = json!(
|
||||
{
|
||||
"project_id": project_id,
|
||||
"file_parts": ["basic-mod-different.jar"],
|
||||
"version_number": "1.2.3.4",
|
||||
"version_title": "start",
|
||||
"dependencies": [],
|
||||
"game_versions": ["1.20.1"] ,
|
||||
"release_channel": "release",
|
||||
"loaders": ["fabric"],
|
||||
"featured": true,
|
||||
"ordering": ordering,
|
||||
}
|
||||
);
|
||||
let json_segment = common::actix::MultipartSegment {
|
||||
name: "data".to_string(),
|
||||
filename: None,
|
||||
content_type: Some("application/json".to_string()),
|
||||
data: common::actix::MultipartSegmentData::Text(
|
||||
serde_json::to_string(&json_data).unwrap(),
|
||||
),
|
||||
};
|
||||
let file_segment = common::actix::MultipartSegment {
|
||||
name: "basic-mod-different.jar".to_string(),
|
||||
filename: Some("basic-mod.jar".to_string()),
|
||||
content_type: Some("application/java-archive".to_string()),
|
||||
data: common::actix::MultipartSegmentData::Binary(
|
||||
include_bytes!("../../../tests/files/basic-mod-different.jar").to_vec(),
|
||||
),
|
||||
};
|
||||
|
||||
let request = test::TestRequest::post()
|
||||
.uri("/v2/version")
|
||||
.set_multipart(vec![json_segment.clone(), file_segment.clone()])
|
||||
.append_header((AUTHORIZATION, pat))
|
||||
.to_request();
|
||||
let resp = self.call(request).await;
|
||||
assert_status(&resp, StatusCode::OK);
|
||||
test::read_body_json(resp).await
|
||||
}
|
||||
|
||||
pub async fn get_versions(&self, version_ids: Vec<String>, pat: &str) -> Vec<Version> {
|
||||
let ids = url_encode_json_serialized_vec(&version_ids);
|
||||
let request = test::TestRequest::get()
|
||||
.uri(&format!("/v2/versions?ids={}", ids))
|
||||
.append_header((AUTHORIZATION, pat))
|
||||
.to_request();
|
||||
let resp = self.call(request).await;
|
||||
assert_status(&resp, StatusCode::OK);
|
||||
test::read_body_json(resp).await
|
||||
}
|
||||
|
||||
pub async fn edit_version_ordering(
|
||||
&self,
|
||||
version_id: &str,
|
||||
ordering: Option<i32>,
|
||||
pat: &str,
|
||||
) -> ServiceResponse {
|
||||
let request = test::TestRequest::patch()
|
||||
.uri(&format!("/v2/version/{version_id}"))
|
||||
.set_json(json!(
|
||||
{
|
||||
"ordering": ordering
|
||||
}
|
||||
))
|
||||
.append_header((AUTHORIZATION, pat))
|
||||
.to_request();
|
||||
self.call(request).await
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,23 @@
|
||||
#![allow(dead_code)]
|
||||
|
||||
use crate::common::get_json_val_str;
|
||||
use itertools::Itertools;
|
||||
|
||||
pub fn assert_status(response: &actix_web::dev::ServiceResponse, status: actix_http::StatusCode) {
|
||||
assert_eq!(response.status(), status, "{:#?}", response.response());
|
||||
}
|
||||
|
||||
pub fn assert_version_ids(
|
||||
versions: &[labrinth::models::projects::Version],
|
||||
expected_ids: Vec<String>,
|
||||
) {
|
||||
let version_ids = versions
|
||||
.iter()
|
||||
.map(|v| get_json_val_str(v.id))
|
||||
.collect_vec();
|
||||
assert_eq!(version_ids, expected_ids);
|
||||
}
|
||||
|
||||
pub fn assert_any_status_except(
|
||||
response: &actix_web::dev::ServiceResponse,
|
||||
status: actix_http::StatusCode,
|
||||
|
||||
126
tests/version.rs
Normal file
126
tests/version.rs
Normal file
@@ -0,0 +1,126 @@
|
||||
use crate::common::{asserts::assert_status, get_json_val_str};
|
||||
use actix_http::StatusCode;
|
||||
use common::{
|
||||
asserts::assert_version_ids, database::USER_USER_PAT, environment::with_test_environment,
|
||||
};
|
||||
|
||||
mod common;
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn can_create_version_with_ordering() {
|
||||
with_test_environment(|env| async move {
|
||||
let alpha_project_id = env.dummy.as_ref().unwrap().project_alpha.project_id.clone();
|
||||
|
||||
let new_version_id = get_json_val_str(
|
||||
env.v2
|
||||
.create_default_version(&alpha_project_id, Some(1), USER_USER_PAT)
|
||||
.await
|
||||
.id,
|
||||
);
|
||||
|
||||
let versions = env
|
||||
.v2
|
||||
.get_versions(vec![new_version_id.clone()], USER_USER_PAT)
|
||||
.await;
|
||||
assert_eq!(versions[0].ordering, Some(1));
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn edit_version_ordering_works() {
|
||||
with_test_environment(|env| async move {
|
||||
let alpha_version_id = env.dummy.as_ref().unwrap().project_alpha.version_id.clone();
|
||||
|
||||
let resp = env
|
||||
.v2
|
||||
.edit_version_ordering(&alpha_version_id, Some(10), USER_USER_PAT)
|
||||
.await;
|
||||
assert_status(&resp, StatusCode::NO_CONTENT);
|
||||
|
||||
let versions = env
|
||||
.v2
|
||||
.get_versions(vec![alpha_version_id.clone()], USER_USER_PAT)
|
||||
.await;
|
||||
assert_eq!(versions[0].ordering, Some(10));
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn version_ordering_for_specified_orderings_orders_lower_order_first() {
|
||||
with_test_environment(|env| async move {
|
||||
let alpha_project_id = env.dummy.as_ref().unwrap().project_alpha.project_id.clone();
|
||||
let alpha_version_id = env.dummy.as_ref().unwrap().project_alpha.version_id.clone();
|
||||
let new_version_id = get_json_val_str(
|
||||
env.v2
|
||||
.create_default_version(&alpha_project_id, Some(1), USER_USER_PAT)
|
||||
.await
|
||||
.id,
|
||||
);
|
||||
env.v2
|
||||
.edit_version_ordering(&alpha_version_id, Some(10), USER_USER_PAT)
|
||||
.await;
|
||||
|
||||
let versions = env
|
||||
.v2
|
||||
.get_versions(
|
||||
vec![alpha_version_id.clone(), new_version_id.clone()],
|
||||
USER_USER_PAT,
|
||||
)
|
||||
.await;
|
||||
assert_version_ids(&versions, vec![new_version_id, alpha_version_id]);
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn version_ordering_when_unspecified_orders_oldest_first() {
|
||||
with_test_environment(|env| async move {
|
||||
let alpha_project_id = &env.dummy.as_ref().unwrap().project_alpha.project_id.clone();
|
||||
let alpha_version_id = env.dummy.as_ref().unwrap().project_alpha.version_id.clone();
|
||||
let new_version_id = get_json_val_str(
|
||||
env.v2
|
||||
.create_default_version(&alpha_project_id, None, USER_USER_PAT)
|
||||
.await
|
||||
.id,
|
||||
);
|
||||
|
||||
let versions = env
|
||||
.v2
|
||||
.get_versions(
|
||||
vec![alpha_version_id.clone(), new_version_id.clone()],
|
||||
USER_USER_PAT,
|
||||
)
|
||||
.await;
|
||||
assert_version_ids(&versions, vec![alpha_version_id, new_version_id]);
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn version_ordering_when_specified_orders_specified_before_unspecified() {
|
||||
with_test_environment(|env| async move {
|
||||
let alpha_project_id = &env.dummy.as_ref().unwrap().project_alpha.project_id.clone();
|
||||
let alpha_version_id = env.dummy.as_ref().unwrap().project_alpha.version_id.clone();
|
||||
let new_version_id = get_json_val_str(
|
||||
env.v2
|
||||
.create_default_version(&alpha_project_id, Some(10000), USER_USER_PAT)
|
||||
.await
|
||||
.id,
|
||||
);
|
||||
env.v2
|
||||
.edit_version_ordering(&alpha_version_id, None, USER_USER_PAT)
|
||||
.await;
|
||||
|
||||
let versions = env
|
||||
.v2
|
||||
.get_versions(
|
||||
vec![alpha_version_id.clone(), new_version_id.clone()],
|
||||
USER_USER_PAT,
|
||||
)
|
||||
.await;
|
||||
assert_version_ids(&versions, vec![new_version_id, alpha_version_id]);
|
||||
})
|
||||
.await;
|
||||
}
|
||||
Reference in New Issue
Block a user