Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

editoast: refactor work schedules, scenario tests #7780

Merged
merged 2 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions editoast/src/views/v2/scenario.rs
Original file line number Diff line number Diff line change
Expand Up @@ -471,8 +471,6 @@ async fn list(
#[cfg(test)]
mod tests {
use actix_web::http::StatusCode;
use actix_web::test::call_and_read_body_json;
use actix_web::test::call_service;
use actix_web::test::TestRequest;
use pretty_assertions::assert_eq;
use rstest::rstest;
Expand Down Expand Up @@ -510,7 +508,8 @@ mod tests {
);
let request = TestRequest::get().uri(&url).to_request();

let response: ScenarioResponse = call_and_read_body_json(&app.service, request).await;
let response: ScenarioResponse =
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert_eq!(response.scenario, fixtures.scenario);
}
Expand All @@ -524,10 +523,10 @@ mod tests {
create_scenario_fixtures_set(pool.get_ok().deref_mut(), "test_scenario_name").await;

let url = scenario_url(fixtures.project.id, fixtures.study.id, None);

let request = TestRequest::get().uri(&url).to_request();

let mut response: ListScenariosResponse =
call_and_read_body_json(&app.service, request).await;
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert!(!response.results.is_empty());
assert_eq!(
Expand All @@ -551,9 +550,8 @@ mod tests {
let url = scenario_url(fixtures.project.id, 99999999, Some(fixtures.scenario.id));

let request = TestRequest::get().uri(&url).to_request();
let response = call_service(&app.service, request).await;

assert_eq!(response.status(), StatusCode::NOT_FOUND);
app.fetch(request).assert_status(StatusCode::NOT_FOUND);
}

#[rstest]
Expand Down Expand Up @@ -585,7 +583,9 @@ mod tests {
"tags": study_tags
}))
.to_request();
let response: ScenarioResponse = call_and_read_body_json(&app.service, request).await;

let response: ScenarioResponse =
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert_eq!(response.scenario.name, study_name);
assert_eq!(response.scenario.description, study_description);
Expand Down Expand Up @@ -632,7 +632,8 @@ mod tests {
"tags": study_tags
}))
.to_request();
let response: ScenarioResponse = call_and_read_body_json(&app.service, request).await;
let response: ScenarioResponse =
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert_eq!(response.scenario.name, study_name);
assert_eq!(response.scenario.description, study_description);
Expand Down Expand Up @@ -661,8 +662,7 @@ mod tests {
}))
.to_request();

let response = call_service(&app.service, request).await;
assert_eq!(response.status(), StatusCode::NOT_FOUND);
app.fetch(request).assert_status(StatusCode::NOT_FOUND);
}

#[rstest]
Expand Down Expand Up @@ -693,7 +693,8 @@ mod tests {
"infra_id": study_other_infra_id,
}))
.to_request();
let response: ScenarioResponse = call_and_read_body_json(&app.service, request).await;
let response: ScenarioResponse =
app.fetch(request).assert_status(StatusCode::OK).json_into();

assert_eq!(response.scenario.infra_id, study_other_infra_id);
assert_eq!(response.scenario.name, study_name);
Expand All @@ -713,9 +714,8 @@ mod tests {
Some(fixtures.scenario.id),
);
let request = TestRequest::delete().uri(&url).to_request();
let response = call_service(&app.service, request).await;

assert_eq!(response.status(), StatusCode::NO_CONTENT);
app.fetch(request).assert_status(StatusCode::NO_CONTENT);

let exists = Scenario::exists(pool.get_ok().deref_mut(), fixtures.scenario.id)
.await
Expand Down
125 changes: 55 additions & 70 deletions editoast/src/views/work_schedules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::modelsv2::work_schedules::WorkScheduleType;
use crate::modelsv2::Changeset;
use crate::modelsv2::Create;
use crate::modelsv2::CreateBatch;
use crate::modelsv2::DbConnectionPool;
use crate::modelsv2::DbConnectionPoolV2;
use crate::modelsv2::Model;
use editoast_schemas::infra::TrackRange;

Expand Down Expand Up @@ -137,7 +137,7 @@ struct WorkScheduleCreateResponse {
)]
#[post("")]
async fn create(
db_pool: Data<DbConnectionPool>,
db_pool: Data<DbConnectionPoolV2>,
data: Json<WorkScheduleCreateForm>,
) -> Result<Json<WorkScheduleCreateResponse>> {
let conn = &mut db_pool.get().await?;
Expand Down Expand Up @@ -170,35 +170,23 @@ async fn create(
#[cfg(test)]
pub mod test {
use actix_web::http::StatusCode;
use actix_web::test::{call_service, read_body_json, TestRequest};
use actix_web::test::TestRequest;
use pretty_assertions::assert_eq;
use rstest::rstest;
use serde_json::json;
use std::sync::Arc;
use std::ops::DerefMut;

use super::*;
use crate::assert_response_error_type_match;
use crate::fixtures::tests::{db_pool, TestFixture};
use crate::modelsv2::Retrieve;
use crate::views::tests::create_test_service;

async fn create_work_schedule_group_fixture(
db_pool: Arc<DbConnectionPool>,
work_schedule_response: WorkScheduleCreateResponse,
) -> TestFixture<WorkScheduleGroup> {
let mut conn = db_pool.get().await.unwrap();
let created_group =
WorkScheduleGroup::retrieve(&mut conn, work_schedule_response.work_schedule_group_id)
.await
.unwrap();
assert!(created_group.is_some());
TestFixture::new(created_group.unwrap(), db_pool.clone())
}
use crate::modelsv2::prelude::*;
use crate::views::test_app::TestAppBuilder;

#[rstest]
async fn work_schedule_create(db_pool: Arc<DbConnectionPool>) {
async fn work_schedule_create() {
// GIVEN
let app = create_test_service().await;
let req = TestRequest::post()
let app = TestAppBuilder::default_app();
let pool = app.db_pool();

let request = TestRequest::post()
.uri("/work_schedules")
.set_json(json!({
"work_schedule_group_name": "work schedule group name",
Expand All @@ -213,20 +201,26 @@ pub mod test {
.to_request();

// WHEN
let response = call_service(&app, req).await;
let work_schedule_response = app
.fetch(request)
.assert_status(StatusCode::OK)
.json_into::<WorkScheduleCreateResponse>();

// THEN
assert_eq!(response.status(), StatusCode::OK);
let work_schedule_response: WorkScheduleCreateResponse = read_body_json(response).await;
let _fixture =
create_work_schedule_group_fixture(db_pool.clone(), work_schedule_response).await;
let created_group = WorkScheduleGroup::retrieve(
pool.get_ok().deref_mut(),
work_schedule_response.work_schedule_group_id,
)
.await
.expect("Failed to retrieve work schedule group");
assert!(created_group.is_some());
}

#[rstest]
async fn work_schedule_create_fail_start_date_after_end_date() {
// GIVEN
let app = create_test_service().await;
let req = TestRequest::post()
let app = TestAppBuilder::default_app();

let request = TestRequest::post()
.uri("/work_schedules")
.set_json(json!({
"work_schedule_group_name": "work schedule group name",
Expand All @@ -240,53 +234,44 @@ pub mod test {
}))
.to_request();

// WHEN
let response = call_service(&app, req).await;

// THEN
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
app.fetch(request).assert_status(StatusCode::BAD_REQUEST);
}

#[rstest]
async fn work_schedule_create_fail_name_already_used(db_pool: Arc<DbConnectionPool>) {
async fn work_schedule_create_fail_name_already_used() {
// GIVEN
let app = create_test_service().await;
let payload = json!({
"work_schedule_group_name": "duplicated work schedule group name",
"work_schedules": [{
"start_date_time": "2024-01-01T08:00:00",
"end_date_time": "2024-01-01T09:00:00",
"track_ranges": [],
"obj_id": "work_schedule_obj_id",
"work_schedule_type": "CATENARY"
}]
});
let app = TestAppBuilder::default_app();
let pool = app.db_pool();

let req = TestRequest::post()
.uri("/work_schedules")
.set_json(payload.clone())
.to_request();
let first_response = call_service(&app, req).await;
assert_eq!(first_response.status(), StatusCode::OK);
let work_schedule_response: WorkScheduleCreateResponse =
read_body_json(first_response).await;
let _fixture =
create_work_schedule_group_fixture(db_pool.clone(), work_schedule_response).await;
WorkScheduleGroup::changeset()
.name("duplicated work schedule group name".to_string())
.creation_date(Utc::now().naive_utc())
.create(pool.get_ok().deref_mut())
.await
.expect("Failed to create work schedule group");

// WHEN
let req = TestRequest::post()
let request = TestRequest::post()
.uri("/work_schedules")
.set_json(payload.clone())
.set_json(json!({
"work_schedule_group_name": "duplicated work schedule group name",
"work_schedules": [{
"start_date_time": "2024-01-01T08:00:00",
"end_date_time": "2024-01-01T09:00:00",
"track_ranges": [],
"obj_id": "work_schedule_obj_id",
"work_schedule_type": "CATENARY"
}]
}))
.to_request();

// THEN
let response = call_service(&app, req).await;
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
assert_response_error_type_match!(
response,
WorkScheduleError::NameAlreadyUsed {
name: String::from("duplicated work schedule group name"),
}
let work_schedule_response = app
.fetch(request)
.assert_status(StatusCode::BAD_REQUEST)
.json_into::<InternalError>();

assert_eq!(
&work_schedule_response.error_type,
"editoast:work_schedule:NameAlreadyUsed"
);
}
}
Loading