From 988581f99b2fe9fce579f6a5de5917c719a46679 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Fri, 11 Aug 2023 17:22:34 +0200 Subject: [PATCH 01/53] int test setup --- backend/tests/command.rs | 94 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 backend/tests/command.rs diff --git a/backend/tests/command.rs b/backend/tests/command.rs new file mode 100644 index 00000000..d6955c89 --- /dev/null +++ b/backend/tests/command.rs @@ -0,0 +1,94 @@ +use futures::Future; +use mensa_app_backend::{ + interface::{ + api_command::{AuthInfo, Command, InnerAuthInfo}, + persistent_data::{CommandDataAccess, MealplanManagementDataAccess}, + }, + layer::{ + data::{ + database::{command::PersistentCommandData, factory::DataAccessFactory}, + flickr_api::flickr_api_handler::FlickrApiHandler, + mail::{mail_info::MailInfo, mail_sender::MailSender}, + }, + logic::api_command::command_handler::CommandHandler, + }, + startup::config::ConfigReader, + util::{MealType, Uuid}, +}; +use sqlx::{ + migrate::{MigrateDatabase, Migration}, + Database, PgPool, +}; + +#[tokio::test] +#[ignore = "manual test"] +async fn test_command() { + use_database("name", |cmd, factory, pool| async move { + let insertion = factory.get_mealplan_management_data_access(); + // let canteen = insertion.insert_canteen("canteen", 0).await.unwrap(); + // let line = insertion.insert_line(canteen, "line", 0).await.unwrap(); + let meal1 = insertion + .insert_meal("meal1", MealType::Beef, &[], &[]) + .await + .unwrap(); + + let client_id = Uuid::new_v4(); + let auth_info = Some(InnerAuthInfo { + api_ident: API_KEY.into(), + client_id, + hash: "".into(), + }); + + cmd.add_image(meal1, "image_url".into(), auth_info) + .await + .unwrap(); + }) + .await; +} + +const API_KEY: &str = "abcdefghij"; + +async fn use_database>( + name: &str, + action: impl (FnOnce( + CommandHandler, + DataAccessFactory, + PgPool, + ) -> T), +) { + let reader = ConfigReader::default(); + let mut info = reader.read_database_info().unwrap(); + info.connection += "_command_test_"; + info.connection += name; + let conn = info.connection.clone(); + + { + // setup database + if sqlx::Postgres::database_exists(&conn).await.unwrap() { + sqlx::Postgres::drop_database(&conn).await.unwrap(); + } + sqlx::Postgres::create_database(&conn).await.unwrap(); + + let pool = PgPool::connect_lazy(&conn).unwrap(); + sqlx::query!( + "INSERT INTO api_key(api_key, description) VALUES ($1, 'default')", + API_KEY + ) + .execute(&pool) + .await + .unwrap(); + // setup cmd + + let mail = MailSender::new(reader.read_mail_info().unwrap()).unwrap(); + let hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); + + let factory = DataAccessFactory::new(info, true).await.unwrap(); + let data = factory.get_command_data_access(); + let cmd = CommandHandler::new(data, mail, hoster).await.unwrap(); + + action(cmd, factory, pool).await; + } + + // delete database out of scope + sqlx::Postgres::drop_database(&conn).await.unwrap(); +} From 502b3df4189c1921a7b480552b7ee9ed4ed5a89e Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Fri, 11 Aug 2023 18:11:11 +0200 Subject: [PATCH 02/53] test add image --- backend/tests/command.rs | 96 ++++++++++++---------------------------- 1 file changed, 29 insertions(+), 67 deletions(-) diff --git a/backend/tests/command.rs b/backend/tests/command.rs index d6955c89..f7d45967 100644 --- a/backend/tests/command.rs +++ b/backend/tests/command.rs @@ -1,94 +1,56 @@ -use futures::Future; use mensa_app_backend::{ interface::{ api_command::{AuthInfo, Command, InnerAuthInfo}, - persistent_data::{CommandDataAccess, MealplanManagementDataAccess}, + persistent_data::CommandDataAccess, }, layer::{ data::{ - database::{command::PersistentCommandData, factory::DataAccessFactory}, + database::factory::{DataAccessFactory, DatabaseInfo}, flickr_api::flickr_api_handler::FlickrApiHandler, - mail::{mail_info::MailInfo, mail_sender::MailSender}, + mail::mail_sender::MailSender, }, logic::api_command::command_handler::CommandHandler, }, startup::config::ConfigReader, - util::{MealType, Uuid}, -}; -use sqlx::{ - migrate::{MigrateDatabase, Migration}, - Database, PgPool, + util::Uuid, }; #[tokio::test] #[ignore = "manual test"] -async fn test_command() { - use_database("name", |cmd, factory, pool| async move { - let insertion = factory.get_mealplan_management_data_access(); - // let canteen = insertion.insert_canteen("canteen", 0).await.unwrap(); - // let line = insertion.insert_line(canteen, "line", 0).await.unwrap(); - let meal1 = insertion - .insert_meal("meal1", MealType::Beef, &[], &[]) - .await - .unwrap(); +async fn test_add_image() { + let cmd = setup_cmd().await; - let client_id = Uuid::new_v4(); - let auth_info = Some(InnerAuthInfo { - api_ident: API_KEY.into(), - client_id, - hash: "".into(), - }); + let meal = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); - cmd.add_image(meal1, "image_url".into(), auth_info) - .await - .unwrap(); - }) - .await; -} + let auth_info = get_auth_info("T7X93M0t4oWRxRFxH2MpWdYSHZNsiqkkkpKbxL1AeD8wXR5pD+jmHvM4JjfD+WEx0Knl7g0DKSesmyzL2jVYxA=="); -const API_KEY: &str = "abcdefghij"; + cmd.add_image(meal, "https://flic.kr/p/2oSg8aV".into(), auth_info) + .await + .unwrap(); +} -async fn use_database>( - name: &str, - action: impl (FnOnce( - CommandHandler, - DataAccessFactory, - PgPool, - ) -> T), -) { +async fn setup_cmd() -> impl Command { let reader = ConfigReader::default(); - let mut info = reader.read_database_info().unwrap(); - info.connection += "_command_test_"; - info.connection += name; - let conn = info.connection.clone(); - { - // setup database - if sqlx::Postgres::database_exists(&conn).await.unwrap() { - sqlx::Postgres::drop_database(&conn).await.unwrap(); - } - sqlx::Postgres::create_database(&conn).await.unwrap(); - let pool = PgPool::connect_lazy(&conn).unwrap(); - sqlx::query!( - "INSERT INTO api_key(api_key, description) VALUES ($1, 'default')", - API_KEY - ) - .execute(&pool) - .await - .unwrap(); - // setup cmd + let mail = MailSender::new(reader.read_mail_info().unwrap()).unwrap(); + let hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); + + let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true).await.unwrap(); + let data = factory.get_command_data_access(); + CommandHandler::new(data, mail, hoster).await.unwrap() +} + - let mail = MailSender::new(reader.read_mail_info().unwrap()).unwrap(); - let hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); - let factory = DataAccessFactory::new(info, true).await.unwrap(); - let data = factory.get_command_data_access(); - let cmd = CommandHandler::new(data, mail, hoster).await.unwrap(); - action(cmd, factory, pool).await; - } +fn get_auth_info(hash: &str) -> AuthInfo { + let client_id = Uuid::try_from("6f04a6c7-9723-4a01-ae8c-67baa62fba75").unwrap(); + const API_IDENT: &str = "1234567890"; - // delete database out of scope - sqlx::Postgres::drop_database(&conn).await.unwrap(); + Some(InnerAuthInfo { + api_ident: API_IDENT.into(), + client_id, + hash: hash.into(), + }) } From 28c8fa23011f016f3e6b337c877d4b764f64e3b1 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:05:54 +0200 Subject: [PATCH 03/53] added meal_type check for similar food to relation_resolver.rs --- .../src/layer/logic/mealplan_management/relation_resolver.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/layer/logic/mealplan_management/relation_resolver.rs b/backend/src/layer/logic/mealplan_management/relation_resolver.rs index d3a85008..464d914a 100644 --- a/backend/src/layer/logic/mealplan_management/relation_resolver.rs +++ b/backend/src/layer/logic/mealplan_management/relation_resolver.rs @@ -89,11 +89,11 @@ where ) -> Result<(), DataError> { let similar_meal_result = self .db - .get_similar_meal(&dish.name, &dish.allergens, &dish.additives) + .get_similar_meal(&dish.name, &dish.meal_type, &dish.allergens, &dish.additives) .await?; let similar_side_result = self .db - .get_similar_side(&dish.name, &dish.allergens, &dish.additives) + .get_similar_side(&dish.name, &dish.meal_type, &dish.allergens, &dish.additives) .await?; // Case 1.1: A similar side and meal could be found. Uncommon case. From 0416b45f255ac5d9e06f9bf3f70df2b3810caa32 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:14:06 +0200 Subject: [PATCH 04/53] added meal_type check to interface --- backend/src/interface/persistent_data.rs | 2 ++ .../src/layer/logic/mealplan_management/relation_resolver.rs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/interface/persistent_data.rs b/backend/src/interface/persistent_data.rs index b8b89151..0f5a5426 100644 --- a/backend/src/interface/persistent_data.rs +++ b/backend/src/interface/persistent_data.rs @@ -69,6 +69,7 @@ pub trait MealplanManagementDataAccess: Send + Sync { async fn get_similar_meal( &self, similar_name: &str, + meal_type: MealType, allergens: &[Allergen], additives: &[Additive], ) -> Result>; @@ -78,6 +79,7 @@ pub trait MealplanManagementDataAccess: Send + Sync { async fn get_similar_side( &self, similar_name: &str, + meal_type: MealType, allergens: &[Allergen], additives: &[Additive], ) -> Result>; diff --git a/backend/src/layer/logic/mealplan_management/relation_resolver.rs b/backend/src/layer/logic/mealplan_management/relation_resolver.rs index 464d914a..00c3ae68 100644 --- a/backend/src/layer/logic/mealplan_management/relation_resolver.rs +++ b/backend/src/layer/logic/mealplan_management/relation_resolver.rs @@ -89,11 +89,11 @@ where ) -> Result<(), DataError> { let similar_meal_result = self .db - .get_similar_meal(&dish.name, &dish.meal_type, &dish.allergens, &dish.additives) + .get_similar_meal(&dish.name, dish.meal_type, &dish.allergens, &dish.additives) .await?; let similar_side_result = self .db - .get_similar_side(&dish.name, &dish.meal_type, &dish.allergens, &dish.additives) + .get_similar_side(&dish.name, dish.meal_type, &dish.allergens, &dish.additives) .await?; // Case 1.1: A similar side and meal could be found. Uncommon case. From fcbcdced3122614c27eeb807d9ead3740e7e5da3 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:22:03 +0200 Subject: [PATCH 05/53] added meal_type check to implementation --- .../data/database/mealplan_management.rs | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/backend/src/layer/data/database/mealplan_management.rs b/backend/src/layer/data/database/mealplan_management.rs index bd4451b9..d5cd7e50 100644 --- a/backend/src/layer/data/database/mealplan_management.rs +++ b/backend/src/layer/data/database/mealplan_management.rs @@ -1,3 +1,4 @@ +use async_graphql::InputType; use async_trait::async_trait; use sqlx::{Pool, Postgres}; @@ -53,34 +54,36 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { async fn get_similar_meal( &self, similar_name: &str, + meal_type: MealType, allergens: &[Allergen], additives: &[Additive], ) -> Result> { sqlx::query_scalar!( // the `<@` operator checks whether each element in the left array is also present in the right - " + r#" SELECT food_id FROM food JOIN meal USING (food_id) - WHERE similarity(name, $1) >= $4 + WHERE similarity(name, $1) >= $5 AND food_type = $2 AND food_id IN ( -- all food_id's with same allergens SELECT food_id FROM food_allergen FULL JOIN food USING (food_id) GROUP BY food_id - HAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $2::allergen[] - AND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $2::allergen[] + HAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $3::allergen[] + AND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $3::allergen[] ) AND food_id IN ( -- all food_id's with same additives SELECT food_id FROM food_additive FULL JOIN food USING (food_id) GROUP BY food_id - HAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $3::additive[] - AND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $3::additive[] + HAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $4::additive[] + AND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $4::additive[] ) ORDER BY similarity(name, $1) DESC - ", + "#, similar_name, + meal_type as _, allergens .iter() .copied() @@ -101,34 +104,36 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { async fn get_similar_side( &self, similar_name: &str, + meal_type: MealType, allergens: &[Allergen], additives: &[Additive], ) -> Result> { sqlx::query_scalar!( // the `<@` operator checks whether each element in the left array is also present in the right - " + r#" SELECT food_id FROM food - WHERE similarity(name, $1) >= $4 AND food_id NOT IN (SELECT food_id FROM meal) + WHERE similarity(name, $1) >= $5 AND food_type = $2 AND food_id NOT IN (SELECT food_id FROM meal) AND food_id IN ( -- all food_id's with same allergens SELECT food_id FROM food_allergen FULL JOIN food USING (food_id) GROUP BY food_id - HAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $2::allergen[] - AND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $2::allergen[] + HAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $3::allergen[] + AND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $3::allergen[] ) AND food_id IN ( -- all food_id's with same additives SELECT food_id FROM food_additive FULL JOIN food USING (food_id) GROUP BY food_id - HAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $3::additive[] - AND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $3::additive[] + HAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $4::additive[] + AND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $4::additive[] ) ORDER BY similarity(name, $1) DESC - ", + "#, similar_name, + meal_type as _, allergens .iter() .copied() From 2bb9b2f30a78d93caebd72a2b930e53320346348 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:28:07 +0200 Subject: [PATCH 06/53] fixed database tests --- .../data/database/mealplan_management.rs | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/backend/src/layer/data/database/mealplan_management.rs b/backend/src/layer/data/database/mealplan_management.rs index d5cd7e50..b6fbe413 100644 --- a/backend/src/layer/data/database/mealplan_management.rs +++ b/backend/src/layer/data/database/mealplan_management.rs @@ -1,4 +1,3 @@ -use async_graphql::InputType; use async_trait::async_trait; use sqlx::{Pool, Postgres}; @@ -535,44 +534,50 @@ mod test { ( Uuid::parse_str("f7337122-b018-48ad-b420-6202dc3cb4ff").unwrap(), "Geflügel - Cevapcici, Ajvar, Djuvec Reis", + MealType::Unknown, true, ), ( Uuid::parse_str("25cb8c50-75a4-48a2-b4cf-8ab2566d8bec").unwrap(), "2 Dampfnudeln mit Vanillesoße", + MealType::Vegetarian, true, ), ( Uuid::parse_str("0a850476-eda4-4fd8-9f93-579eb85b8c25").unwrap(), "Mediterraner Gemüsegulasch mit Räuchertofu, dazu Sommerweizen", + MealType::Vegan, true, ), // 'Similar' with identical addons ( Uuid::parse_str("f7337122-b018-48ad-b420-6202dc3cb4ff").unwrap(), "Geflügel - Cevapcici, Ajvar, Reis", + MealType::Unknown, true, ), ( Uuid::parse_str("25cb8c50-75a4-48a2-b4cf-8ab2566d8bec").unwrap(), "Dampfnudeln mit Vanillesoße", + MealType::Vegetarian, true, ), ( Uuid::parse_str("0a850476-eda4-4fd8-9f93-579eb85b8c25").unwrap(), "Mediterraner Gemüsegulasch mit Räuchertofu und Sommerweizen", + MealType::Vegan, true, ), // No longer 'similar' with identical addons - (Uuid::default(), "Geflügel - Cevapcici", false), - (Uuid::default(), "Dampfnudeln", false), - (Uuid::default(), "", false), + (Uuid::default(), "Geflügel - Cevapcici", MealType::Unknown, false), + (Uuid::default(), "Dampfnudeln", MealType::Vegetarian, false), + (Uuid::default(), "", MealType::Vegan, false), ]; - for (uuid, name, is_similar) in tests { + for (uuid, name, meal_type, is_similar) in tests { println!("Testing values: '{uuid}', '{name}'. Should be similar: {is_similar}"); let (additives, allergens) = addons.get(&*uuid.to_string()).unwrap(); - req.get_similar_meal(name, allergens, additives) + req.get_similar_meal(name, meal_type, allergens, additives) .await .unwrap() .map_or_else( @@ -604,44 +609,50 @@ mod test { ( Uuid::parse_str("73cf367b-a536-4b49-ad0c-cb984caa9a08").unwrap(), "zu jedem Gericht reichen wir ein Dessert oder Salat", + MealType::Vegan, true, ), ( Uuid::parse_str("836b17fb-cb16-425d-8d3c-c274a9cdbd0c").unwrap(), "Salatbuffet mit frischer Rohkost, Blattsalate und hausgemachten Dressings, Preis je 100 g", + MealType::Vegetarian, true, ), ( Uuid::parse_str("2c662143-eb84-4142-aa98-bd7bdf84c498").unwrap(), "Insalata piccola - kleiner Blattsalat mit Thunfisch und Paprika", + MealType::Fish, true, ), // 'Similar' with identical addons ( Uuid::parse_str("73cf367b-a536-4b49-ad0c-cb984caa9a08").unwrap(), "zu jedem Gericht reichen wir Desserts oder Salate", + MealType::Vegan, true, ), ( Uuid::parse_str("836b17fb-cb16-425d-8d3c-c274a9cdbd0c").unwrap(), "Salatbuffet mit frischer Rohkost, Blattsalate und hausgemachten Dressings", + MealType::Vegetarian, true, ), ( Uuid::parse_str("2c662143-eb84-4142-aa98-bd7bdf84c498").unwrap(), "Insalata piccola - Blattsalat mit Thunfisch und Paprika", + MealType::Fish, true, ), // No longer 'similar' with identical addons - (Uuid::default(), "zu jedem Gericht reichen wir ein Dessert", false), - (Uuid::default(), "Salatbuffet mit frischer Rohkost", false), - (Uuid::default(), "Insalata piccola", false), + (Uuid::default(), "zu jedem Gericht reichen wir ein Dessert", MealType::Vegan, false), + (Uuid::default(), "Salatbuffet mit frischer Rohkost", MealType::Vegetarian, false), + (Uuid::default(), "Insalata piccola", MealType::Fish, false), ]; - for (uuid, name, is_similar) in tests { + for (uuid, name, meal_type, is_similar) in tests { println!("Testing values: '{uuid}', '{name}'. Should be similar: {is_similar}"); let (additives, allergens) = addons.get(&*uuid.to_string()).unwrap(); - req.get_similar_side(name, allergens, additives) + req.get_similar_side(name, meal_type, allergens, additives) .await .unwrap() .map_or_else( From 6b58270a0ac110805f5678c7a9a094f2dedce435 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:34:50 +0200 Subject: [PATCH 07/53] fixed mealplan management database mock --- .../test/mealplan_management_database_mock.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/layer/logic/mealplan_management/test/mealplan_management_database_mock.rs b/backend/src/layer/logic/mealplan_management/test/mealplan_management_database_mock.rs index 210ed7a6..28df1bfe 100644 --- a/backend/src/layer/logic/mealplan_management/test/mealplan_management_database_mock.rs +++ b/backend/src/layer/logic/mealplan_management/test/mealplan_management_database_mock.rs @@ -32,6 +32,7 @@ impl MealplanManagementDataAccess for MealplanManagementDatabaseMock { async fn get_similar_meal( &self, _similar_name: &str, + _meal_type: MealType, _allergens: &[Allergen], _additives: &[Additive], ) -> Result> { @@ -41,6 +42,7 @@ impl MealplanManagementDataAccess for MealplanManagementDatabaseMock { async fn get_similar_side( &self, _similar_name: &str, + _meal_type: MealType, _allergens: &[Allergen], _additives: &[Additive], ) -> Result> { From 983f1f9764ecddfa47ab43239026b9201f0f4d1e Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:35:19 +0200 Subject: [PATCH 08/53] fixed test errors as meal_types need to match with test data --- .../layer/data/database/mealplan_management.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/src/layer/data/database/mealplan_management.rs b/backend/src/layer/data/database/mealplan_management.rs index b6fbe413..31348e0e 100644 --- a/backend/src/layer/data/database/mealplan_management.rs +++ b/backend/src/layer/data/database/mealplan_management.rs @@ -609,44 +609,44 @@ mod test { ( Uuid::parse_str("73cf367b-a536-4b49-ad0c-cb984caa9a08").unwrap(), "zu jedem Gericht reichen wir ein Dessert oder Salat", - MealType::Vegan, + MealType::Unknown, true, ), ( Uuid::parse_str("836b17fb-cb16-425d-8d3c-c274a9cdbd0c").unwrap(), "Salatbuffet mit frischer Rohkost, Blattsalate und hausgemachten Dressings, Preis je 100 g", - MealType::Vegetarian, + MealType::Vegan, true, ), ( Uuid::parse_str("2c662143-eb84-4142-aa98-bd7bdf84c498").unwrap(), "Insalata piccola - kleiner Blattsalat mit Thunfisch und Paprika", - MealType::Fish, + MealType::Unknown, true, ), // 'Similar' with identical addons ( Uuid::parse_str("73cf367b-a536-4b49-ad0c-cb984caa9a08").unwrap(), "zu jedem Gericht reichen wir Desserts oder Salate", - MealType::Vegan, + MealType::Unknown, true, ), ( Uuid::parse_str("836b17fb-cb16-425d-8d3c-c274a9cdbd0c").unwrap(), "Salatbuffet mit frischer Rohkost, Blattsalate und hausgemachten Dressings", - MealType::Vegetarian, + MealType::Vegan, true, ), ( Uuid::parse_str("2c662143-eb84-4142-aa98-bd7bdf84c498").unwrap(), "Insalata piccola - Blattsalat mit Thunfisch und Paprika", - MealType::Fish, + MealType::Unknown, true, ), // No longer 'similar' with identical addons - (Uuid::default(), "zu jedem Gericht reichen wir ein Dessert", MealType::Vegan, false), - (Uuid::default(), "Salatbuffet mit frischer Rohkost", MealType::Vegetarian, false), - (Uuid::default(), "Insalata piccola", MealType::Fish, false), + (Uuid::default(), "zu jedem Gericht reichen wir ein Dessert", MealType::Unknown, false), + (Uuid::default(), "Salatbuffet mit frischer Rohkost", MealType::Vegan, false), + (Uuid::default(), "Insalata piccola", MealType::Unknown, false), ]; for (uuid, name, meal_type, is_similar) in tests { From d1f5d8f15352d4d5f12392f7916ffad0109767e9 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:35:44 +0200 Subject: [PATCH 09/53] formatting --- backend/src/layer/data/database/mealplan_management.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/layer/data/database/mealplan_management.rs b/backend/src/layer/data/database/mealplan_management.rs index 31348e0e..dab51943 100644 --- a/backend/src/layer/data/database/mealplan_management.rs +++ b/backend/src/layer/data/database/mealplan_management.rs @@ -569,7 +569,12 @@ mod test { true, ), // No longer 'similar' with identical addons - (Uuid::default(), "Geflügel - Cevapcici", MealType::Unknown, false), + ( + Uuid::default(), + "Geflügel - Cevapcici", + MealType::Unknown, + false, + ), (Uuid::default(), "Dampfnudeln", MealType::Vegetarian, false), (Uuid::default(), "", MealType::Vegan, false), ]; From 2b5b76e3f54888c26fa8ad8074678e1451ace34c Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Mon, 14 Aug 2023 13:55:11 +0200 Subject: [PATCH 10/53] added and tested different thresholds for food, line and canteen names --- .../src/layer/data/database/mealplan_management.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/src/layer/data/database/mealplan_management.rs b/backend/src/layer/data/database/mealplan_management.rs index dab51943..f4f9b319 100644 --- a/backend/src/layer/data/database/mealplan_management.rs +++ b/backend/src/layer/data/database/mealplan_management.rs @@ -10,7 +10,9 @@ pub struct PersistentMealplanManagementData { pub(super) pool: Pool, } -const THRESHOLD: f32 = 0.785; +const THRESHOLD_MEAL: f32 = 0.785; +const THRESHOLD_LINE: f32 = 0.894; +const THRESHOLD_CANTEEN: f32 = 0.8515; #[async_trait] #[allow(clippy::missing_panics_doc)] // necessary because sqlx macro sometimes create unreachable panics? @@ -33,7 +35,7 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { async fn get_similar_canteen(&self, similar_name: &str) -> Result> { sqlx::query_scalar!( "SELECT canteen_id FROM canteen WHERE similarity(name, $1) >= $2 ORDER BY similarity(name, $1) DESC", - similar_name, THRESHOLD + similar_name, THRESHOLD_CANTEEN ) .fetch_optional(&self.pool) .await @@ -43,7 +45,7 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { async fn get_similar_line(&self, similar_name: &str, canteen_id: Uuid) -> Result> { sqlx::query_scalar!( "SELECT line_id FROM line WHERE similarity(name, $1) >= $3 AND canteen_id = $2 ORDER BY similarity(name, $1) DESC", - similar_name, canteen_id, THRESHOLD + similar_name, canteen_id, THRESHOLD_LINE ) .fetch_optional(&self.pool) .await @@ -93,7 +95,7 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { .copied() .map(Additive::to_db_string) .collect::>() as _, - THRESHOLD + THRESHOLD_MEAL ) .fetch_optional(&self.pool) .await @@ -143,7 +145,7 @@ impl MealplanManagementDataAccess for PersistentMealplanManagementData { .copied() .map(Additive::to_db_string) .collect::>() as _, - THRESHOLD + THRESHOLD_MEAL ) .fetch_optional(&self.pool) .await From ff302c4f03b5ce9558e63a80bf106d1413c293e5 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 15 Aug 2023 16:19:17 +0200 Subject: [PATCH 11/53] sqlx prepare --- ...474096b7c3f85e733978b532798168c91d811.json | 2 +- ...9a17d7c6c7239c0edde425738cdb871e098e.json} | 23 ++++++++++++++++--- ...c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json | 2 +- ...aea188636a59c4c4465524cdd0a41807f50e.json} | 23 ++++++++++++++++--- 4 files changed, 42 insertions(+), 8 deletions(-) rename backend/.sqlx/{query-a0feec1f96f09eb6bf55a46425929363c0f8574ea181807ff488f12ba3285fe0.json => query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json} (61%) rename backend/.sqlx/{query-6248da40d2a41a9ff120b64e11a200860a6369d3d472262583e991d201995a03.json => query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json} (59%) diff --git a/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json b/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json index ec7cd455..34e89ddf 100644 --- a/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json +++ b/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json @@ -22,7 +22,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICIALLY_BLACKENED_OLIVES", + "ARTIFICALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", diff --git a/backend/.sqlx/query-a0feec1f96f09eb6bf55a46425929363c0f8574ea181807ff488f12ba3285fe0.json b/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json similarity index 61% rename from backend/.sqlx/query-a0feec1f96f09eb6bf55a46425929363c0f8574ea181807ff488f12ba3285fe0.json rename to backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json index 42cc1726..ebf00568 100644 --- a/backend/.sqlx/query-a0feec1f96f09eb6bf55a46425929363c0f8574ea181807ff488f12ba3285fe0.json +++ b/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT food_id \n FROM food JOIN meal USING (food_id)\n WHERE similarity(name, $1) >= $4\n AND food_id IN (\n -- all food_id's with same allergens\n SELECT food_id \n FROM food_allergen FULL JOIN food USING (food_id)\n GROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $2::allergen[] \n\t\t\t\tAND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $2::allergen[]\n )\n AND food_id IN (\n -- all food_id's with same additives\n SELECT food_id\n\t\t\t\tFROM food_additive FULL JOIN food USING (food_id)\n\t\t\t\tGROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $3::additive[] \n\t\t\t\tAND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $3::additive[]\n )\n ORDER BY similarity(name, $1) DESC\n ", + "query": "\n SELECT food_id \n FROM food JOIN meal USING (food_id)\n WHERE similarity(name, $1) >= $5 AND food_type = $2\n AND food_id IN (\n -- all food_id's with same allergens\n SELECT food_id \n FROM food_allergen FULL JOIN food USING (food_id)\n GROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $3::allergen[]\n\t\t\t\tAND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $3::allergen[]\n )\n AND food_id IN (\n -- all food_id's with same additives\n SELECT food_id\n\t\t\t\tFROM food_additive FULL JOIN food USING (food_id)\n\t\t\t\tGROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $4::additive[]\n\t\t\t\tAND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $4::additive[]\n )\n ORDER BY similarity(name, $1) DESC\n ", "describe": { "columns": [ { @@ -12,6 +12,23 @@ "parameters": { "Left": [ "Text", + { + "Custom": { + "name": "meal_type", + "kind": { + "Enum": [ + "VEGAN", + "VEGETARIAN", + "BEEF", + "BEEF_AW", + "PORK", + "PORK_AW", + "FISH", + "UNKNOWN" + ] + } + } + }, { "Custom": { "name": "_allergen", @@ -72,7 +89,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICIALLY_BLACKENED_OLIVES", + "ARTIFICALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", @@ -94,5 +111,5 @@ false ] }, - "hash": "a0feec1f96f09eb6bf55a46425929363c0f8574ea181807ff488f12ba3285fe0" + "hash": "65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e" } diff --git a/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json b/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json index 3d0b5d35..7d5f55a8 100644 --- a/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json +++ b/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json @@ -18,7 +18,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICIALLY_BLACKENED_OLIVES", + "ARTIFICALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", diff --git a/backend/.sqlx/query-6248da40d2a41a9ff120b64e11a200860a6369d3d472262583e991d201995a03.json b/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json similarity index 59% rename from backend/.sqlx/query-6248da40d2a41a9ff120b64e11a200860a6369d3d472262583e991d201995a03.json rename to backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json index 29ad6986..6e6d8412 100644 --- a/backend/.sqlx/query-6248da40d2a41a9ff120b64e11a200860a6369d3d472262583e991d201995a03.json +++ b/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT food_id \n FROM food\n WHERE similarity(name, $1) >= $4 AND food_id NOT IN (SELECT food_id FROM meal)\n AND food_id IN (\n -- all food_id's with same allergens\n SELECT food_id \n FROM food_allergen FULL JOIN food USING (food_id)\n GROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $2::allergen[] \n\t\t\t\tAND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $2::allergen[]\n )\n AND food_id IN (\n -- all food_id's with same additives\n SELECT food_id\n\t\t\t\tFROM food_additive FULL JOIN food USING (food_id)\n\t\t\t\tGROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $3::additive[] \n\t\t\t\tAND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $3::additive[]\n )\n ORDER BY similarity(name, $1) DESC\n ", + "query": "\n SELECT food_id \n FROM food\n WHERE similarity(name, $1) >= $5 AND food_type = $2 AND food_id NOT IN (SELECT food_id FROM meal)\n AND food_id IN (\n -- all food_id's with same allergens\n SELECT food_id \n FROM food_allergen FULL JOIN food USING (food_id)\n GROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) <@ $3::allergen[]\n\t\t\t\tAND COALESCE(array_agg(allergen) FILTER (WHERE allergen IS NOT NULL), ARRAY[]::allergen[]) @> $3::allergen[]\n )\n AND food_id IN (\n -- all food_id's with same additives\n SELECT food_id\n\t\t\t\tFROM food_additive FULL JOIN food USING (food_id)\n\t\t\t\tGROUP BY food_id \n\t\t\t\tHAVING COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) <@ $4::additive[]\n\t\t\t\tAND COALESCE(array_agg(additive) FILTER (WHERE additive IS NOT NULL), ARRAY[]::additive[]) @> $4::additive[]\n )\n ORDER BY similarity(name, $1) DESC\n ", "describe": { "columns": [ { @@ -12,6 +12,23 @@ "parameters": { "Left": [ "Text", + { + "Custom": { + "name": "meal_type", + "kind": { + "Enum": [ + "VEGAN", + "VEGETARIAN", + "BEEF", + "BEEF_AW", + "PORK", + "PORK_AW", + "FISH", + "UNKNOWN" + ] + } + } + }, { "Custom": { "name": "_allergen", @@ -72,7 +89,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICIALLY_BLACKENED_OLIVES", + "ARTIFICALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", @@ -94,5 +111,5 @@ false ] }, - "hash": "6248da40d2a41a9ff120b64e11a200860a6369d3d472262583e991d201995a03" + "hash": "f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e" } From 1f02f72b7aa024788aa5981e80c314ae2fe3cca3 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 15 Aug 2023 17:53:39 +0200 Subject: [PATCH 12/53] sqlx prepare fix --- ...0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json | 2 +- ...8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json | 2 +- ...6db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json | 2 +- ...18a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json b/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json index 34e89ddf..ec7cd455 100644 --- a/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json +++ b/backend/.sqlx/query-4ccb2bf5b0d096494183081ae2f474096b7c3f85e733978b532798168c91d811.json @@ -22,7 +22,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICALLY_BLACKENED_OLIVES", + "ARTIFICIALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", diff --git a/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json b/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json index ebf00568..a851157b 100644 --- a/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json +++ b/backend/.sqlx/query-65630236c8b3fdd68940518d8bcd9a17d7c6c7239c0edde425738cdb871e098e.json @@ -89,7 +89,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICALLY_BLACKENED_OLIVES", + "ARTIFICIALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", diff --git a/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json b/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json index 7d5f55a8..3d0b5d35 100644 --- a/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json +++ b/backend/.sqlx/query-edc31a0336db71587fd7bef4608c80e8baaf5fb4658de6b7ebc2bb2ae7fd83cb.json @@ -18,7 +18,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICALLY_BLACKENED_OLIVES", + "ARTIFICIALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", diff --git a/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json b/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json index 6e6d8412..98bd7d58 100644 --- a/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json +++ b/backend/.sqlx/query-f2c03bb5318a96d62eef79ca7a76aea188636a59c4c4465524cdd0a41807f50e.json @@ -89,7 +89,7 @@ "PHOSPHATE", "SURFACE_WAXED", "SULPHUR", - "ARTIFICALLY_BLACKENED_OLIVES", + "ARTIFICIALLY_BLACKENED_OLIVES", "SWEETENER", "LAXATIVE_IF_OVERUSED", "PHENYLALANINE", From 65e0bbfec8043aa9ee763a13933096f7006f8eb7 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:12:06 +0200 Subject: [PATCH 13/53] Fixed inconsistency in variable names --- .../src/layer/logic/image_review/image_reviewer.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/src/layer/logic/image_review/image_reviewer.rs b/backend/src/layer/logic/image_review/image_reviewer.rs index 4c9fd1c3..832f44a3 100644 --- a/backend/src/layer/logic/image_review/image_reviewer.rs +++ b/backend/src/layer/logic/image_review/image_reviewer.rs @@ -61,25 +61,23 @@ where async fn try_start_image_review(&self) -> ReviewerResult<()> { let today = Local::now().date_naive(); - let images_by_rank_date = self + let images_for_date = self .data_access .get_images_for_date(NUMBER_OF_IMAGES_TO_CHECK, today) .await?; - self.review_images(images_by_rank_date).await; + self.review_images(images_for_date).await; - let images_next_week_by_rank_not_checked_last_week = self + let unvalidated_images_for_next_week = self .data_access .get_unvalidated_images_for_next_week(NUMBER_OF_IMAGES_TO_CHECK) .await?; - self.review_images(images_next_week_by_rank_not_checked_last_week) - .await; + self.review_images(unvalidated_images_for_next_week).await; - let images_by_last_checked_not_checked_last_week = self + let old_images = self .data_access .get_old_images(NUMBER_OF_IMAGES_TO_CHECK) .await?; - self.review_images(images_by_last_checked_not_checked_last_week) - .await; + self.review_images(old_images).await; Ok(()) } From 198956e32a49ca98b38600cd3e020e3401038848 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Thu, 17 Aug 2023 13:12:28 +0200 Subject: [PATCH 14/53] Added implementation for Test --- backend/tests/image_review.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 backend/tests/image_review.rs diff --git a/backend/tests/image_review.rs b/backend/tests/image_review.rs new file mode 100644 index 00000000..eee6b179 --- /dev/null +++ b/backend/tests/image_review.rs @@ -0,0 +1,29 @@ +use mensa_app_backend::{ + interface::image_review::ImageReviewScheduling, + layer::{ + data::{ + database::factory::DataAccessFactory, flickr_api::flickr_api_handler::FlickrApiHandler, + }, + logic::image_review::image_reviewer::ImageReviewer, + }, + startup::config::ConfigReader, +}; + +#[tokio::test] +#[ignore = "manual test "] +async fn test_start_image_review() { + let image_reviewer = setup().await; + image_reviewer.start_image_review().await; +} + +async fn setup() -> impl ImageReviewScheduling { + let reader = ConfigReader::default(); + + let image_hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); + + let database_factory = DataAccessFactory::new(reader.read_database_info().unwrap(), false) + .await + .unwrap(); + let data_access = database_factory.get_image_review_data_access(); + ImageReviewer::new(data_access, image_hoster) +} From 156b6c70bc2b11a7453c2582a12a18d483782fa8 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Fri, 18 Aug 2023 06:16:22 +0200 Subject: [PATCH 15/53] added mgmt integration setup --- backend/tests/mealplan_management.rs | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 backend/tests/mealplan_management.rs diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs new file mode 100644 index 00000000..0b3288a2 --- /dev/null +++ b/backend/tests/mealplan_management.rs @@ -0,0 +1,52 @@ +use mensa_app_backend::{ + layer::{ + data::{ + database::factory::DataAccessFactory, + }, + }, + startup::config::ConfigReader, +}; +use mensa_app_backend::layer::data::database::mealplan_management::PersistentMealplanManagementData; +use mensa_app_backend::layer::data::swka_parser::swka_parse_manager::SwKaParseManager; +use mensa_app_backend::layer::logic::mealplan_management::meal_plan_manager::MealPlanManager; + +#[tokio::test] +#[ignore = "manual test"] +async fn test_add_image() { + let cmd = setup_cmd().await; + + start_full_with_empty_db(); + + start_update_with_empty_db(); + + start_full_with_filled_db(); + + start_update_with_filled_db(); +} + +async fn setup_cmd() -> MealPlanManager { + let reader = ConfigReader::default(); + let mensa_parser = SwKaParseManager::new(reader.read_swka_info().unwrap())? + .unwrap(); + + let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true).await.unwrap(); + let data = factory.get_mealplan_management_data_access(); + MealPlanManager::new(data, mensa_parser) +} + + +fn start_full_with_empty_db() { + +} + +fn start_update_with_empty_db() { + +} + +fn start_full_with_filled_db() { + +} + +fn start_update_with_filled_db() { + +} \ No newline at end of file From b4cf0eadf310ec4d8a9221c9a40a8a2cffc49ab4 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Fri, 18 Aug 2023 17:35:21 +0200 Subject: [PATCH 16/53] added old_license check + tests to license parse --- .../src/layer/data/flickr_api/json_parser.rs | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/backend/src/layer/data/flickr_api/json_parser.rs b/backend/src/layer/data/flickr_api/json_parser.rs index 5d1a4524..90ad6ed5 100644 --- a/backend/src/layer/data/flickr_api/json_parser.rs +++ b/backend/src/layer/data/flickr_api/json_parser.rs @@ -57,20 +57,21 @@ impl JsonParser { /// # Errors /// If an image is invalid [`ImageHosterError::InvalidLicense`] with the invalid license will be returned. pub fn check_license(root: JsonRootLicense) -> Result<(), ImageHosterError> { - let license = root + let (old_license, new_license) = root .license_history .into_iter() - .max_by_key(|l| l.date_change) - .map(|entry| entry.new_license) + .max_by_key(|history| history.date_change) + .map(|history| (history.old_license, history.new_license)) .ok_or_else(|| { ImageHosterError::InvalidLicense(String::from("none"), VALID_LICENSES.join(", ")) })?; - let str_license = license.as_str(); - if VALID_LICENSES.contains(&str_license) { + + let new_license = new_license.as_str(); + if VALID_LICENSES.contains(&new_license) || VALID_LICENSES.contains(&old_license.as_str()) { Ok(()) } else { Err(ImageHosterError::InvalidLicense( - license, + String::from(new_license), VALID_LICENSES.join(", "), )) } @@ -182,16 +183,49 @@ mod test { LicenceHistory { date_change: 1_295_918_034, new_license: String::from("Attribution License"), + old_license: String::from("Public Domain Mark"), }, LicenceHistory { date_change: 1_598_990_519, new_license: String::from("Public Domain Mark"), + old_license: String::from("Attribution License"), }, ], }; assert!(JsonParser::check_license(valid_licenses).is_ok()); } + #[test] + fn test_valid_check_old_license() { + let valid_licenses = JsonRootLicense { + license_history: vec![LicenceHistory { + date_change: 1_295_918_034, + new_license: String::new(), + old_license: String::from("Public Domain Mark"), + }], + }; + assert!(JsonParser::check_license(valid_licenses).is_ok()); + } + + #[test] + fn test_invalid_check_old_license() { + let valid_licenses = JsonRootLicense { + license_history: vec![ + LicenceHistory { + date_change: 1_295_918_034, + new_license: String::from("United States Government Work"), + old_license: String::from("Public Domain Dedication (CC0)"), + }, + LicenceHistory { + date_change: 1_598_990_519, + new_license: String::from("All Rights Reserved"), + old_license: String::from("United States Government Work"), + }, + ], + }; + assert!(JsonParser::check_license(valid_licenses).is_err()); + } + #[test] fn test_valid_parse_error() { let valid_error = JsonRootError { From be46d69b2cb706acff2e67c075d518d74b9cfe3a Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Fri, 18 Aug 2023 17:35:36 +0200 Subject: [PATCH 17/53] modified license struct --- backend/src/layer/data/flickr_api/json_structs.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/layer/data/flickr_api/json_structs.rs b/backend/src/layer/data/flickr_api/json_structs.rs index dc0cb589..2477cebb 100644 --- a/backend/src/layer/data/flickr_api/json_structs.rs +++ b/backend/src/layer/data/flickr_api/json_structs.rs @@ -68,6 +68,7 @@ pub struct JsonRootLicense { pub struct LicenceHistory { pub date_change: u64, pub new_license: String, + pub old_license: String, } /// Example for an error response structure: From 8284caba10e7baa08d4ae9eb33b12052ae7ce3f1 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 09:28:39 +0200 Subject: [PATCH 18/53] int test_report_image --- backend/tests/command.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/backend/tests/command.rs b/backend/tests/command.rs index f7d45967..d539eaff 100644 --- a/backend/tests/command.rs +++ b/backend/tests/command.rs @@ -12,7 +12,7 @@ use mensa_app_backend::{ logic::api_command::command_handler::CommandHandler, }, startup::config::ConfigReader, - util::Uuid, + util::{Uuid, ReportReason}, }; #[tokio::test] @@ -29,6 +29,23 @@ async fn test_add_image() { .unwrap(); } + +#[tokio::test] +#[ignore = "manual test"] +async fn test_report_image() { + let cmd = setup_cmd().await; + + let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); + + let reason = ReportReason::NoMeal; + + let auth_info = get_auth_info("rxGJ5jz4aMwklyzFxZq6eHlySLuuPyv2+ixnzz8hDB2UQ+KuiJOaLKtINJh/iPZmgAEipA7E/ADceiFSO1RWmQ=="); + + cmd.report_image(image_id, reason, auth_info).await.unwrap(); +} + + + async fn setup_cmd() -> impl Command { let reader = ConfigReader::default(); @@ -42,8 +59,6 @@ async fn setup_cmd() -> impl Command { } - - fn get_auth_info(hash: &str) -> AuthInfo { let client_id = Uuid::try_from("6f04a6c7-9723-4a01-ae8c-67baa62fba75").unwrap(); const API_IDENT: &str = "1234567890"; From 05ca496cc71455255fd3a30dd6d30b9417beaebe Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 09:55:56 +0200 Subject: [PATCH 19/53] int command --- backend/tests/command.rs | 99 ++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 13 deletions(-) diff --git a/backend/tests/command.rs b/backend/tests/command.rs index d539eaff..6adea2f6 100644 --- a/backend/tests/command.rs +++ b/backend/tests/command.rs @@ -1,18 +1,14 @@ use mensa_app_backend::{ - interface::{ - api_command::{AuthInfo, Command, InnerAuthInfo}, - persistent_data::CommandDataAccess, - }, + interface::api_command::{AuthInfo, Command, InnerAuthInfo}, layer::{ data::{ - database::factory::{DataAccessFactory, DatabaseInfo}, - flickr_api::flickr_api_handler::FlickrApiHandler, + database::factory::DataAccessFactory, flickr_api::flickr_api_handler::FlickrApiHandler, mail::mail_sender::MailSender, }, logic::api_command::command_handler::CommandHandler, }, startup::config::ConfigReader, - util::{Uuid, ReportReason}, + util::{ReportReason, Uuid}, }; #[tokio::test] @@ -22,14 +18,15 @@ async fn test_add_image() { let meal = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); - let auth_info = get_auth_info("T7X93M0t4oWRxRFxH2MpWdYSHZNsiqkkkpKbxL1AeD8wXR5pD+jmHvM4JjfD+WEx0Knl7g0DKSesmyzL2jVYxA=="); + let auth_info = get_auth_info( + "T7X93M0t4oWRxRFxH2MpWdYSHZNsiqkkkpKbxL1AeD8wXR5pD+jmHvM4JjfD+WEx0Knl7g0DKSesmyzL2jVYxA==", + ); cmd.add_image(meal, "https://flic.kr/p/2oSg8aV".into(), auth_info) .await .unwrap(); } - #[tokio::test] #[ignore = "manual test"] async fn test_report_image() { @@ -39,26 +36,102 @@ async fn test_report_image() { let reason = ReportReason::NoMeal; - let auth_info = get_auth_info("rxGJ5jz4aMwklyzFxZq6eHlySLuuPyv2+ixnzz8hDB2UQ+KuiJOaLKtINJh/iPZmgAEipA7E/ADceiFSO1RWmQ=="); + let auth_info = get_auth_info( + "rxGJ5jz4aMwklyzFxZq6eHlySLuuPyv2+ixnzz8hDB2UQ+KuiJOaLKtINJh/iPZmgAEipA7E/ADceiFSO1RWmQ==", + ); cmd.report_image(image_id, reason, auth_info).await.unwrap(); } +#[tokio::test] +#[ignore = "manual test"] +async fn test_set_meal_rating() { + let cmd = setup_cmd().await; + + let meal_id = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); + + let rating = 4; + + let auth_info = get_auth_info( + "YXBIcDFORrhY83pBmwuSwb0l0zsYXM/h18OfT+AMEYCXWCtpExlN2EMiLtjGkv7w2/cAPmIKe8m+mQbGasbcEQ==", + ); + + cmd.set_meal_rating(meal_id, rating, auth_info) + .await + .unwrap(); +} + +#[tokio::test] +#[ignore = "manual test"] +async fn test_add_image_upvote() { + let cmd = setup_cmd().await; + + let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); + + let auth_info = get_auth_info( + "r+tenhKxOfa2wJUE+EPzOyRgtIc5IBDjh/iMyvlP4vznoiLLsJKOMyKOs60ZV98oPrOEMpyDnONdavwFgnoH+g==", + ); + + cmd.add_image_upvote(image_id, auth_info).await.unwrap(); +} + +#[tokio::test] +#[ignore = "manual test"] +async fn test_add_image_dovnvote() { + let cmd = setup_cmd().await; + + let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); + let auth_info = get_auth_info( + "aKlyzgxz/0pHK+LWQFHhWoyhUjOKa+/fmr6my4VH3Rxn+lPvvXb4lk3rENx8TSwCd2Sjw7qspPrs2S93ZoG/fQ==", + ); + + cmd.add_image_downvote(image_id, auth_info).await.unwrap(); +} + +#[tokio::test] +#[ignore = "manual test"] +async fn test_remove_image_upvote() { + let cmd = setup_cmd().await; + + let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); + + let auth_info = get_auth_info( + "aNN/2nk2JgE0wZOMWG0zzxg/LtqaCeiLhjq7ebqDrnSSXtWVJC9kItKk1/RBKnzD+T+gGH/JGclBy8SWdgBKMQ==", + ); + + cmd.remove_image_upvote(image_id, auth_info).await.unwrap(); +} + +#[tokio::test] +#[ignore = "manual test"] +async fn test_remove_image_downvote() { + let cmd = setup_cmd().await; + + let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); + + let auth_info = get_auth_info( + "65KlFbT+MijU8OqUWOleQZ/oxikIGp7q4hbEYTlEMnjbylrzNnl8nZUa1LEFaKZptAW46PmGJ/Xgcm6p4FzQxg==", + ); + + cmd.remove_image_downvote(image_id, auth_info) + .await + .unwrap(); +} async fn setup_cmd() -> impl Command { let reader = ConfigReader::default(); - let mail = MailSender::new(reader.read_mail_info().unwrap()).unwrap(); let hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); - let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true).await.unwrap(); + let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true) + .await + .unwrap(); let data = factory.get_command_data_access(); CommandHandler::new(data, mail, hoster).await.unwrap() } - fn get_auth_info(hash: &str) -> AuthInfo { let client_id = Uuid::try_from("6f04a6c7-9723-4a01-ae8c-67baa62fba75").unwrap(); const API_IDENT: &str = "1234567890"; From 5f1dd0687b520ab62eb8410e90da866a2d1ebd44 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 11:16:20 +0200 Subject: [PATCH 20/53] graphql mutation integration tests --- backend/tests/mutation.graphql | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 backend/tests/mutation.graphql diff --git a/backend/tests/mutation.graphql b/backend/tests/mutation.graphql new file mode 100644 index 00000000..4c86a7c0 --- /dev/null +++ b/backend/tests/mutation.graphql @@ -0,0 +1,50 @@ +# file containing some example graphql mutations for integration testing purposes + +# Used Data: API-Key: 1234567890, clientID: 6f04a6c7-9723-4a01-ae8c-67baa62fba75 + + +# === addImage === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6VDdYOTNNMHQ0b1dSeFJGeEgyTXBXZFlTSFpOc2lxa2trcEtieEwxQWVEOHdYUjVwRCtqbUh2TTRKamZEK1dFeDBLbmw3ZzBES1Nlc215ekwyalZZeEE9PQ== +mutation { + addImage(mealId:"48b0ed7b-8387-46ad-866c-7993f469a9bf", imageUrl:"https://flic.kr/p/2oSg8aV") +} + + +# === reportImage === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6cnhHSjVqejRhTXdrbHl6RnhacTZlSGx5U0x1dVB5djIraXhueno4aERCMlVRK0t1aUpPYUxLdElOSmgvaVBabWdBRWlwQTdFL0FEY2VpRlNPMVJXbVE9PQ== +mutation { + reportImage(imageId:"1b8f373b-7383-4a3a-9818-e0137fd164b7", reason: NO_MEAL) +} + +# === setRating === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6WVhCSWNERk9ScmhZODNwQm13dVN3YjBsMHpzWVhNL2gxOE9mVCtBTUVZQ1hXQ3RwRXhsTjJFTWlMdGpHa3Y3dzIvY0FQbUlLZThtK21RYkdhc2JjRVE9PQ== +mutation { + setRating(mealId:"48b0ed7b-8387-46ad-866c-7993f469a9bf", rating:4) +} + +# === addUpvote === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6cit0ZW5oS3hPZmEyd0pVRStFUHpPeVJndEljNUlCRGpoL2lNeXZsUDR2em5vaUxMc0pLT015S09zNjBaVjk4b1ByT0VNcHlEbk9OZGF2d0Znbm9IK2c9PQ== +mutation { + addUpvote(imageId:"1b8f373b-7383-4a3a-9818-e0137fd164b7") +} + + +# === addDownvote === TODO +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6YUtseXpneHovMHBISytMV1FGSGhXb3loVWpPS2ErL2ZtcjZteTRWSDNSeG4rbFB2dlhiNGxrM3JFTng4VFN3Q2QyU2p3N3FzcFByczJTOTNab0cvZlE9PQ== +mutation { + addDownvote(imageId:"1b8f373b-7383-4a3a-9818-e0137fd164b7") +} + +# === removeUpvote === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6YU5OLzJuazJKZ0Uwd1pPTVdHMHp6eGcvTHRxYUNlaUxoanE3ZWJxRHJuU1NYdFdWSkM5a0l0S2sxL1JCS256RCtUK2dHSC9KR2NsQnk4U1dkZ0JLTVE9PQ== +mutation { + removeUpvote(imageId:"1b8f373b-7383-4a3a-9818-e0137fd164b7") +} + + +# === removeDownvote === +# Header Autorization: Mensa NmYwNGE2YzctOTcyMy00YTAxLWFlOGMtNjdiYWE2MmZiYTc1OjEyMzQ1Njc4OTA6NjVLbEZiVCtNaWpVOE9xVVdPbGVRWi9veGlrSUdwN3E0aGJFWVRsRU1uamJ5bHJ6Tm5sOG5aVWExTEVGYUtacHRBVzQ2UG1HSi9YZ2NtNnA0RnpReGc9PQ== +mutation { + removeDownvote(imageId:"1b8f373b-7383-4a3a-9818-e0137fd164b7") +} + From d2354994b8e40bf5cd55642150f6ebcc671988b5 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 13:12:39 +0200 Subject: [PATCH 21/53] automatic version etc from cargo toml in help page --- backend/src/startup/cli.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/startup/cli.rs b/backend/src/startup/cli.rs index 3abd5d95..92db7fea 100644 --- a/backend/src/startup/cli.rs +++ b/backend/src/startup/cli.rs @@ -9,7 +9,10 @@ pub fn print_help() { "{}", "==================================================".bright_black() ); - println!("{}", " MensaApp Backend v0.1 🥘 ".green()); + println!( + "{}", + format!(" MensaApp Backend v{} 🥘 ", env!("CARGO_PKG_VERSION")).green() + ); println!( "{}", "==================================================".bright_black() @@ -17,9 +20,9 @@ pub fn print_help() { println!("This binary runs the backend to for the mensa app,"); println!("including a graphql server."); println!("For more information, "); - println!("see https://github.com/kronos-et-al/MensaApp"); + println!("see {}", env!("CARGO_PKG_REPOSITORY")); println!(); - println!("{}", "Licensed under the MIT license.".italic()); + println!("{}", format!("Licensed under the {} license.", env!("CARGO_PKG_LICENSE")).italic()); println!(); println!(); println!("{}", "Available commands:".blue()); From 8835481cece05aaa8131c46e93a90b86dc3fd0ee Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 14:10:03 +0200 Subject: [PATCH 22/53] more extensive logging --- backend/src/interface/admin_notification.rs | 2 ++ backend/src/layer/data/mail/mail_sender.rs | 14 ++++++++++---- backend/src/layer/data/mail/template.txt | 2 +- .../layer/logic/api_command/command_handler.rs | 3 +++ .../layer/logic/image_review/image_reviewer.rs | 6 +++++- backend/src/layer/trigger/graphql/mutation.rs | 15 +++++++-------- backend/src/layer/trigger/graphql/query.rs | 13 ++++++------- backend/src/layer/trigger/graphql/server.rs | 16 ++++++---------- backend/src/layer/trigger/graphql/util.rs | 3 --- .../src/layer/trigger/scheduling/scheduler.rs | 2 +- backend/src/startup/cli.rs | 5 ++++- backend/src/startup/config.rs | 12 ++++++++++-- backend/src/startup/server.rs | 8 ++++++-- 13 files changed, 61 insertions(+), 40 deletions(-) diff --git a/backend/src/interface/admin_notification.rs b/backend/src/interface/admin_notification.rs index 6af81ab3..bea95130 100644 --- a/backend/src/interface/admin_notification.rs +++ b/backend/src/interface/admin_notification.rs @@ -30,4 +30,6 @@ pub struct ImageReportInfo { pub negative_rating_count: u32, /// Image rank after which the images are sorted when shown to the user. pub get_image_rank: f32, + /// Number of times this image would have to be reported to automatically get hidden (at the current date) + pub report_barrier: u32, } diff --git a/backend/src/layer/data/mail/mail_sender.rs b/backend/src/layer/data/mail/mail_sender.rs index f9e64fcb..c38881d8 100644 --- a/backend/src/layer/data/mail/mail_sender.rs +++ b/backend/src/layer/data/mail/mail_sender.rs @@ -74,8 +74,8 @@ impl MailSender { .body(report)?; self.mailer.send(&email)?; info!( - "Notified administrators about image report for image with id {} at {}", - info.image_id, info.image_link + ?info, + "Notified administrators about image report for image with id {}", info.image_id, ); Ok(()) } @@ -91,8 +91,8 @@ impl MailSender { } fn get_report(info: &ImageReportInfo) -> String { - let info_array_map: [(&str, &dyn ToString); 8] = [ - ("image_link", &info.image_link), + let info_array_map = [ + ("image_link", &info.image_link as &dyn ToString), ("image_id", &info.image_id), ("report_count", &info.report_count), ("reason", &info.reason), @@ -100,6 +100,7 @@ impl MailSender { ("positive_rating_count", &info.positive_rating_count), ("negative_rating_count", &info.negative_rating_count), ("get_image_rank", &info.get_image_rank), + ("report_barrier", &info.report_barrier), ]; let info_map = info_array_map @@ -171,6 +172,10 @@ mod test { report.contains(info.get_image_rank.to_string().as_str()), "the template must contain all of the information from the report info" ); + assert!( + report.contains(info.report_barrier.to_string().as_str()), + "the template must contain all of the information from the report info" + ); } #[tokio::test] @@ -211,6 +216,7 @@ mod test { positive_rating_count: 10, negative_rating_count: 20, get_image_rank: 1.0, + report_barrier: 1, } } diff --git a/backend/src/layer/data/mail/template.txt b/backend/src/layer/data/mail/template.txt index 455c1a42..98e15b5a 100644 --- a/backend/src/layer/data/mail/template.txt +++ b/backend/src/layer/data/mail/template.txt @@ -2,7 +2,7 @@ The image at the url {{image_link}} with the id {{image_id}} was reported {{report_count}} times. Reason: {{reason}} -Image automatically hidden: {{image_got_hidden}} +Image automatically hidden: {{image_got_hidden}} ({{report_barrier}} reports needed) Additional Data: Positive ratings: {{positive_rating_count}} diff --git a/backend/src/layer/logic/api_command/command_handler.rs b/backend/src/layer/logic/api_command/command_handler.rs index 67419d38..357c0482 100644 --- a/backend/src/layer/logic/api_command/command_handler.rs +++ b/backend/src/layer/logic/api_command/command_handler.rs @@ -1,5 +1,6 @@ use async_trait::async_trait; use chrono::Local; +use tracing::info; use crate::{ interface::{ @@ -103,6 +104,7 @@ where let will_be_hidden = Self::will_be_hidden(&info); if will_be_hidden { self.command_data.hide_image(image_id).await?; + info!(image = ?info, "Automatically hid image {image_id} because reported {} times.", info.report_count); } let report_info = ImageReportInfo { reason, @@ -113,6 +115,7 @@ where positive_rating_count: info.upvotes, negative_rating_count: info.downvotes, get_image_rank: info.rank, + report_barrier: Self::get_report_barrier(info.upload_date), }; self.admin_notification diff --git a/backend/src/layer/logic/image_review/image_reviewer.rs b/backend/src/layer/logic/image_review/image_reviewer.rs index 4c9fd1c3..a7322ae3 100644 --- a/backend/src/layer/logic/image_review/image_reviewer.rs +++ b/backend/src/layer/logic/image_review/image_reviewer.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; use chrono::Local; use futures::future::join_all; use thiserror::Error; -use tracing::warn; +use tracing::{info, warn}; use crate::interface::{ image_hoster::{ImageHoster, ImageHosterError}, @@ -100,6 +100,10 @@ where self.data_access.mark_as_checked(image.id).await?; } else { self.data_access.delete_image(image.id).await?; + info!( + ?image, + "Deleted image {} as it does not exist at the hoster anymore", image.id + ); } Ok(()) } diff --git a/backend/src/layer/trigger/graphql/mutation.rs b/backend/src/layer/trigger/graphql/mutation.rs index edc37b8f..addb56fa 100644 --- a/backend/src/layer/trigger/graphql/mutation.rs +++ b/backend/src/layer/trigger/graphql/mutation.rs @@ -1,4 +1,3 @@ -use crate::layer::trigger::graphql::util::TRACE_MUTATION_MESSAGE; use crate::util::{ReportReason, Uuid}; use async_graphql::{Context, Object, Result}; use tracing::{instrument, trace}; @@ -28,7 +27,7 @@ impl MutationRoot { #[graphql(desc = "Id of the meal to link an image to.")] meal_id: Uuid, #[graphql(desc = "Flickr url to the image.")] image_url: String, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `addImage`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -47,7 +46,7 @@ impl MutationRoot { #[graphql(desc = "Id of the meal to rate to.")] meal_id: Uuid, #[graphql(desc = "The new rating of the main dish.")] rating: u32, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `setRating`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -65,7 +64,7 @@ impl MutationRoot { ctx: &Context<'_>, #[graphql(desc = "Id of the image to add the upvote to.")] image_id: Uuid, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `addUpvote`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -83,7 +82,7 @@ impl MutationRoot { ctx: &Context<'_>, #[graphql(desc = "Id of the image to remove the upvote from.")] image_id: Uuid, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `removeUpvote`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -101,7 +100,7 @@ impl MutationRoot { ctx: &Context<'_>, #[graphql(desc = "Id of the image to add the downvote to.")] image_id: Uuid, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `addDownvote`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -119,7 +118,7 @@ impl MutationRoot { ctx: &Context<'_>, #[graphql(desc = "Id of the image to remove the downvote from.")] image_id: Uuid, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `removeDownvote`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); @@ -138,7 +137,7 @@ impl MutationRoot { #[graphql(desc = "Id of the image to report.")] image_id: Uuid, #[graphql(desc = "The reason for reporting the image.")] reason: ReportReason, ) -> Result { - trace!(TRACE_MUTATION_MESSAGE); + trace!("Mutated `reportImage`"); let command = ctx.get_command(); let auth_info = ctx.get_auth_info(); diff --git a/backend/src/layer/trigger/graphql/query.rs b/backend/src/layer/trigger/graphql/query.rs index 6fe273c8..3ff65949 100644 --- a/backend/src/layer/trigger/graphql/query.rs +++ b/backend/src/layer/trigger/graphql/query.rs @@ -1,4 +1,3 @@ -use crate::layer::trigger::graphql::util::TRACE_QUERY_MESSAGE; use async_graphql::{Context, Object, Result}; use tracing::{instrument, trace}; @@ -19,7 +18,7 @@ impl QueryRoot { /// This query returns a list of all available canteens. #[instrument(skip(self, ctx))] async fn get_canteens(&self, ctx: &Context<'_>) -> Result> { - trace!(TRACE_QUERY_MESSAGE); + trace!("Queried `getCanteens`"); let data = ctx.get_data_access(); let canteens = data .get_canteens() @@ -38,7 +37,7 @@ impl QueryRoot { ctx: &Context<'_>, #[graphql(desc = "Id of the canteen to get.")] canteen_id: Uuid, ) -> Result> { - trace!(TRACE_QUERY_MESSAGE); + trace!("Queried `getCanteen`"); let data = ctx.get_data_access(); let canteen = data.get_canteen(canteen_id).await?.map(Into::into); Ok(canteen) @@ -55,7 +54,7 @@ impl QueryRoot { line_id: Uuid, #[graphql(desc = "Date of the day on which the meal to get is to be offered.")] date: Date, ) -> Result> { - trace!(TRACE_QUERY_MESSAGE); + trace!("Queried `getMeal`"); let data_access = ctx.get_data_access(); let meal = data_access .get_meal(meal_id, line_id, date) @@ -67,15 +66,15 @@ impl QueryRoot { /// This query returns the version of this API schema. It can also be used for health checks. #[instrument(skip(self, _ctx))] async fn api_version(&self, _ctx: &Context<'_>) -> String { - trace!(TRACE_QUERY_MESSAGE); - "1.0".into() + trace!("Queried `apiVersion`"); + env!("CARGO_PKG_VERSION").into() } /// This query returns the in the `Authorization` request header provided authentication information. /// It is intended for debugging purposes to check whether these information got passed correctly. #[instrument(skip(ctx))] async fn get_my_auth(&self, ctx: &Context<'_>) -> Option { - trace!(TRACE_QUERY_MESSAGE); + trace!("Queried `getMyAuth`"); ctx.get_auth_info().map(Into::into) } } diff --git a/backend/src/layer/trigger/graphql/server.rs b/backend/src/layer/trigger/graphql/server.rs index 518637fd..af035d5a 100644 --- a/backend/src/layer/trigger/graphql/server.rs +++ b/backend/src/layer/trigger/graphql/server.rs @@ -190,15 +190,7 @@ async fn graphql_handler( async { let response = schema.execute(request).await; if response.is_err() { - debug!( - "Error handling request: {}", - response - .errors - .iter() - .map(ToString::to_string) - .collect::>() - .join(", ") - ); + debug!(errors = ?response.errors, "Error handling request"); } response.into() } @@ -257,7 +249,11 @@ mod tests { .unwrap(); assert_eq!( - "{\"data\":{\"apiVersion\":\"1.0\"}}", resp, + format!( + "{{\"data\":{{\"apiVersion\":\"{}\"}}}}", + env!("CARGO_PKG_VERSION") + ), + resp, "wrong data returned on graphql version health check." ); diff --git a/backend/src/layer/trigger/graphql/util.rs b/backend/src/layer/trigger/graphql/util.rs index 2c6250ec..b64efa84 100644 --- a/backend/src/layer/trigger/graphql/util.rs +++ b/backend/src/layer/trigger/graphql/util.rs @@ -32,9 +32,6 @@ impl<'a> ApiUtil for Context<'a> { } } -pub const TRACE_MUTATION_MESSAGE: &str = "incoming mutation request"; -pub const TRACE_QUERY_MESSAGE: &str = "incoming query request"; - const AUTH_TYPE: &str = "Mensa"; const AUTH_SEPARATOR: char = ':'; diff --git a/backend/src/layer/trigger/scheduling/scheduler.rs b/backend/src/layer/trigger/scheduling/scheduler.rs index e9a3b0c8..c351c0d5 100644 --- a/backend/src/layer/trigger/scheduling/scheduler.rs +++ b/backend/src/layer/trigger/scheduling/scheduler.rs @@ -193,7 +193,7 @@ mod tests { tokio::time::sleep(Duration::from_secs(10)).await; - info!("shutting down"); + println!("shutting down"); scheduler.shutdown().await; assert!( diff --git a/backend/src/startup/cli.rs b/backend/src/startup/cli.rs index 92db7fea..9af3168d 100644 --- a/backend/src/startup/cli.rs +++ b/backend/src/startup/cli.rs @@ -22,7 +22,10 @@ pub fn print_help() { println!("For more information, "); println!("see {}", env!("CARGO_PKG_REPOSITORY")); println!(); - println!("{}", format!("Licensed under the {} license.", env!("CARGO_PKG_LICENSE")).italic()); + println!( + "{}", + format!("Licensed under the {} license.", env!("CARGO_PKG_LICENSE")).italic() + ); println!(); println!(); println!("{}", "Available commands:".blue()); diff --git a/backend/src/startup/config.rs b/backend/src/startup/config.rs index 7e60254b..a0e6c082 100644 --- a/backend/src/startup/config.rs +++ b/backend/src/startup/config.rs @@ -56,7 +56,6 @@ impl ConfigReader { let info = LogInfo { log_config: read_var("LOG_CONFIG").unwrap_or_else(|_| DEFAULT_LOG_CONFIG.into()), }; - info!("using log config: {}", info.log_config); Ok(info) } @@ -84,6 +83,10 @@ impl ConfigReader { username: read_var("SMTP_USERNAME")?, password: read_var("SMTP_PASSWORD")?, }; + info!( + "Sending mails to {} from {} using {}:{}", + info.admin_email_address, info.username, info.smtp_server, info.smtp_port + ); Ok(info) } @@ -99,6 +102,10 @@ impl ConfigReader { image_review_schedule: env::var("IMAGE_REVIEW_SCHEDULE") .unwrap_or_else(|_| DEFAULT_NIGHTLY_SCHEDULE.into()), }; + info!( + "Running full parsing on `{}`, update parsing on `{}` and image reviews on `{}`", + info.full_parse_schedule, info.update_parse_schedule, info.image_review_schedule + ); Ok(info) } @@ -109,6 +116,7 @@ impl ConfigReader { let info = FlickrInfo { api_key: read_var("FLICKR_API_KEY")?, }; + info!("Using flickr api key `{}***`", &info.api_key[0..4]); Ok(info) } @@ -137,7 +145,7 @@ impl ConfigReader { valid_canteens: canteens, }; info!( - "getting canteen data from {} for canteens {}", + "getting canteen data from <{}> for canteens {}", info.base_url, info.valid_canteens.join(", ") ); diff --git a/backend/src/startup/server.rs b/backend/src/startup/server.rs index 04a7a607..00949934 100644 --- a/backend/src/startup/server.rs +++ b/backend/src/startup/server.rs @@ -65,6 +65,8 @@ impl Server { // logging Logger::init(config.read_log_info()?); + info!("Starting server..."); + // help text if config.should_print_help() { cli::print_help(); @@ -102,15 +104,17 @@ impl Server { scheduler.start().await; graphql.start(); - info!("server is running"); + info!("Server is running"); ctrl_c().await?; - info!("shutting down server..."); + info!("Shutting down server..."); scheduler.shutdown().await; graphql.shutdown().await; + info!("Server stopped."); + Ok(()) } } From 7822594becba8352527bb5ea08ed77fa0399cca2 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 14:14:21 +0200 Subject: [PATCH 23/53] allow complex server run function --- backend/src/startup/server.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/startup/server.rs b/backend/src/startup/server.rs index 00949934..db8c3f91 100644 --- a/backend/src/startup/server.rs +++ b/backend/src/startup/server.rs @@ -59,6 +59,7 @@ impl Server { /// # Errors /// - when the the config could not read environment variables /// - when crating a component fails + #[allow(clippy::cognitive_complexity)] pub async fn run() -> Result<()> { let config = ConfigReader::default(); From 8f6c6d1a3d3422a4267371a528de298ecf8f11c4 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Sun, 20 Aug 2023 14:20:56 +0200 Subject: [PATCH 24/53] client id in image report notification --- backend/src/interface/admin_notification.rs | 4 +++- backend/src/layer/data/mail/mail_sender.rs | 6 ++++++ backend/src/layer/data/mail/template.txt | 1 + backend/src/layer/logic/api_command/command_handler.rs | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/src/interface/admin_notification.rs b/backend/src/interface/admin_notification.rs index bea95130..5be1a1eb 100644 --- a/backend/src/interface/admin_notification.rs +++ b/backend/src/interface/admin_notification.rs @@ -30,6 +30,8 @@ pub struct ImageReportInfo { pub negative_rating_count: u32, /// Image rank after which the images are sorted when shown to the user. pub get_image_rank: f32, - /// Number of times this image would have to be reported to automatically get hidden (at the current date) + /// Number of times this image would have to be reported to automatically get hidden (at the current date). pub report_barrier: u32, + /// User that reported the image. + pub client_id: Uuid, } diff --git a/backend/src/layer/data/mail/mail_sender.rs b/backend/src/layer/data/mail/mail_sender.rs index c38881d8..abe7e9d6 100644 --- a/backend/src/layer/data/mail/mail_sender.rs +++ b/backend/src/layer/data/mail/mail_sender.rs @@ -101,6 +101,7 @@ impl MailSender { ("negative_rating_count", &info.negative_rating_count), ("get_image_rank", &info.get_image_rank), ("report_barrier", &info.report_barrier), + ("client_id", &info.client_id), ]; let info_map = info_array_map @@ -176,6 +177,10 @@ mod test { report.contains(info.report_barrier.to_string().as_str()), "the template must contain all of the information from the report info" ); + assert!( + report.contains(info.client_id.to_string().as_str()), + "the template must contain all of the information from the report info" + ); } #[tokio::test] @@ -217,6 +222,7 @@ mod test { negative_rating_count: 20, get_image_rank: 1.0, report_barrier: 1, + client_id: Uuid::default(), } } diff --git a/backend/src/layer/data/mail/template.txt b/backend/src/layer/data/mail/template.txt index 98e15b5a..c9029319 100644 --- a/backend/src/layer/data/mail/template.txt +++ b/backend/src/layer/data/mail/template.txt @@ -1,6 +1,7 @@ The image at the url {{image_link}} with the id {{image_id}} was reported {{report_count}} times. +Last reported by: {{client_id}} Reason: {{reason}} Image automatically hidden: {{image_got_hidden}} ({{report_barrier}} reports needed) diff --git a/backend/src/layer/logic/api_command/command_handler.rs b/backend/src/layer/logic/api_command/command_handler.rs index 357c0482..7b354dbb 100644 --- a/backend/src/layer/logic/api_command/command_handler.rs +++ b/backend/src/layer/logic/api_command/command_handler.rs @@ -116,6 +116,7 @@ where negative_rating_count: info.downvotes, get_image_rank: info.rank, report_barrier: Self::get_report_barrier(info.upload_date), + client_id: auth_info.client_id, }; self.admin_notification From d24fa0c2aad76ae0c5719292226379b195efb8f8 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:46:49 +0200 Subject: [PATCH 25/53] Added first implementation of setup --- backend/tests/image_review_scheduler.rs | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 backend/tests/image_review_scheduler.rs diff --git a/backend/tests/image_review_scheduler.rs b/backend/tests/image_review_scheduler.rs new file mode 100644 index 00000000..ccb60896 --- /dev/null +++ b/backend/tests/image_review_scheduler.rs @@ -0,0 +1,39 @@ +use mensa_app_backend::{ + layer::{ + data::{ + database::factory::DataAccessFactory, flickr_api::flickr_api_handler::FlickrApiHandler, + swka_parser::swka_parse_manager::SwKaParseManager, + }, + logic::{ + image_review::image_reviewer::ImageReviewer, + mealplan_management::meal_plan_manager::MealPlanManager, + }, + trigger::scheduling::scheduler::{ScheduleInfo, Scheduler}, + }, + startup::config::ConfigReader, +}; + +#[tokio::test] +async fn test_image_scheduling() {} + +async fn setup() -> Scheduler { + let info = ScheduleInfo { + full_parse_schedule: "*/1 * * * * *".to_string(), + update_parse_schedule: "*/2 * * * * *".to_string(), + image_review_schedule: "*/5 * * * * *".to_string(), + }; + let reader = ConfigReader::default(); + + let image_hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); + let meal_plan_parser = SwKaParseManager::new(reader.read_swka_info().unwrap()).unwrap(); + let database_factory = DataAccessFactory::new(reader.read_database_info().unwrap(), false) + .await + .unwrap(); + let image_review_data = database_factory.get_image_review_data_access(); + let mealplan_management_data = database_factory.get_mealplan_management_data_access(); + + let image_scheduling = ImageReviewer::new(image_review_data, image_hoster); + + let parse_scheduling = MealPlanManager::new(mealplan_management_data, meal_plan_parser); + Scheduler::new(info, image_scheduling, parse_scheduling).await +} From e298ef3ec0297c00d58a8aac4b72dfc29274cab4 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:04:17 +0200 Subject: [PATCH 26/53] Added mock for the parser --- backend/tests/image_review_scheduler.rs | 42 ++++++++++++++++--------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/backend/tests/image_review_scheduler.rs b/backend/tests/image_review_scheduler.rs index ccb60896..7dc8d57f 100644 --- a/backend/tests/image_review_scheduler.rs +++ b/backend/tests/image_review_scheduler.rs @@ -1,39 +1,51 @@ +use async_trait::async_trait; use mensa_app_backend::{ + interface::mealplan_management::MensaParseScheduling, layer::{ data::{ database::factory::DataAccessFactory, flickr_api::flickr_api_handler::FlickrApiHandler, - swka_parser::swka_parse_manager::SwKaParseManager, - }, - logic::{ - image_review::image_reviewer::ImageReviewer, - mealplan_management::meal_plan_manager::MealPlanManager, }, + logic::image_review::image_reviewer::ImageReviewer, trigger::scheduling::scheduler::{ScheduleInfo, Scheduler}, }, startup::config::ConfigReader, }; +use tokio::signal::ctrl_c; #[tokio::test] -async fn test_image_scheduling() {} +async fn test_image_scheduling() { + let mut scheduler = setup().await; + scheduler.start().await; + ctrl_c().await.unwrap(); + scheduler.shutdown().await; +} async fn setup() -> Scheduler { let info = ScheduleInfo { - full_parse_schedule: "*/1 * * * * *".to_string(), - update_parse_schedule: "*/2 * * * * *".to_string(), + full_parse_schedule: "* * * * * 0".to_string(), + update_parse_schedule: "* * * * * 0".to_string(), image_review_schedule: "*/5 * * * * *".to_string(), }; let reader = ConfigReader::default(); - - let image_hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); - let meal_plan_parser = SwKaParseManager::new(reader.read_swka_info().unwrap()).unwrap(); let database_factory = DataAccessFactory::new(reader.read_database_info().unwrap(), false) .await .unwrap(); let image_review_data = database_factory.get_image_review_data_access(); - let mealplan_management_data = database_factory.get_mealplan_management_data_access(); - + let image_hoster = FlickrApiHandler::new(reader.read_flickr_info().unwrap()); let image_scheduling = ImageReviewer::new(image_review_data, image_hoster); + Scheduler::new(info, image_scheduling, MealplanManagerMock::default()).await +} + +#[derive(Default)] +struct MealplanManagerMock {} + +#[async_trait] +impl MensaParseScheduling for MealplanManagerMock { + async fn start_update_parsing(&self) { + return; + } - let parse_scheduling = MealPlanManager::new(mealplan_management_data, meal_plan_parser); - Scheduler::new(info, image_scheduling, parse_scheduling).await + async fn start_full_parsing(&self) { + return; + } } From b55cb5b42b76a992d013c31f426835856ef1201f Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:06:52 +0200 Subject: [PATCH 27/53] Made scheduler slower --- backend/tests/image_review_scheduler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/tests/image_review_scheduler.rs b/backend/tests/image_review_scheduler.rs index 7dc8d57f..8da8909a 100644 --- a/backend/tests/image_review_scheduler.rs +++ b/backend/tests/image_review_scheduler.rs @@ -24,7 +24,7 @@ async fn setup() -> Scheduler { let info = ScheduleInfo { full_parse_schedule: "* * * * * 0".to_string(), update_parse_schedule: "* * * * * 0".to_string(), - image_review_schedule: "*/5 * * * * *".to_string(), + image_review_schedule: "0 */5 * * * *".to_string(), }; let reader = ConfigReader::default(); let database_factory = DataAccessFactory::new(reader.read_database_info().unwrap(), false) From 44e8ef3a4cf7589de011e0b41fe58475a50d1d32 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:32:09 +0200 Subject: [PATCH 28/53] Added implementation --- backend/tests/mensa_parse_scheduling.rs | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 backend/tests/mensa_parse_scheduling.rs diff --git a/backend/tests/mensa_parse_scheduling.rs b/backend/tests/mensa_parse_scheduling.rs new file mode 100644 index 00000000..910ada98 --- /dev/null +++ b/backend/tests/mensa_parse_scheduling.rs @@ -0,0 +1,61 @@ +use async_trait::async_trait; +use mensa_app_backend::{ + interface::image_review::ImageReviewScheduling, + layer::{ + data::{ + database::factory::DataAccessFactory, swka_parser::swka_parse_manager::SwKaParseManager, + }, + logic::mealplan_management::meal_plan_manager::MealPlanManager, + trigger::scheduling::scheduler::{ScheduleInfo, Scheduler}, + }, + startup::config::ConfigReader, +}; +use tokio::signal::ctrl_c; + +#[tokio::test] +async fn test_full_mensa_parse_scheduling() { + let info = ScheduleInfo { + full_parse_schedule: "0 */5 * * * *".to_string(), + update_parse_schedule: "* * * * 0 *".to_string(), + image_review_schedule: "* * * * 0 *".to_string(), + }; + let mut scheduler = setup(info).await; + scheduler.start().await; + ctrl_c().await.unwrap(); + scheduler.shutdown().await; +} + +#[tokio::test] +async fn test_update_mensa_parse_scheduling() { + let info = ScheduleInfo { + full_parse_schedule: "* * * * 0 *".to_string(), + update_parse_schedule: "0 */5 * * * *".to_string(), + image_review_schedule: "* * * * 0 *".to_string(), + }; + let mut scheduler = setup(info).await; + scheduler.start().await; + ctrl_c().await.unwrap(); + scheduler.shutdown().await; +} + +async fn setup(info: ScheduleInfo) -> Scheduler { + let reader = ConfigReader::default(); + let database_factory = DataAccessFactory::new(reader.read_database_info().unwrap(), false) + .await + .unwrap(); + let mealplan_management_data = database_factory.get_mealplan_management_data_access(); + let parser = SwKaParseManager::new(reader.read_swka_info().unwrap()).unwrap(); + + let mealplan_management = MealPlanManager::new(mealplan_management_data, parser); + Scheduler::new(info, ImageSchedulingMock::default(), mealplan_management).await +} + +#[derive(Default)] +struct ImageSchedulingMock {} + +#[async_trait] +impl ImageReviewScheduling for ImageSchedulingMock { + async fn start_image_review(&self) { + return; + } +} From b6993fed5cfb7a4922e0e7242d9a4abda12c42ae Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:40:45 +0200 Subject: [PATCH 29/53] Fixed error in schedule and ignored test --- backend/tests/image_review_scheduler.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/tests/image_review_scheduler.rs b/backend/tests/image_review_scheduler.rs index 8da8909a..925421de 100644 --- a/backend/tests/image_review_scheduler.rs +++ b/backend/tests/image_review_scheduler.rs @@ -13,6 +13,7 @@ use mensa_app_backend::{ use tokio::signal::ctrl_c; #[tokio::test] +#[ignore = "manual test"] async fn test_image_scheduling() { let mut scheduler = setup().await; scheduler.start().await; @@ -22,8 +23,8 @@ async fn test_image_scheduling() { async fn setup() -> Scheduler { let info = ScheduleInfo { - full_parse_schedule: "* * * * * 0".to_string(), - update_parse_schedule: "* * * * * 0".to_string(), + full_parse_schedule: "* * * * 1 *".to_string(), + update_parse_schedule: "* * * * 1 *".to_string(), image_review_schedule: "0 */5 * * * *".to_string(), }; let reader = ConfigReader::default(); From 5ccb8dc880d36153048f166822d298719eeb8e19 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:44:32 +0200 Subject: [PATCH 30/53] Made tests manual and changed schedule --- backend/tests/mensa_parse_scheduling.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/tests/mensa_parse_scheduling.rs b/backend/tests/mensa_parse_scheduling.rs index 910ada98..7d1621db 100644 --- a/backend/tests/mensa_parse_scheduling.rs +++ b/backend/tests/mensa_parse_scheduling.rs @@ -12,12 +12,15 @@ use mensa_app_backend::{ }; use tokio::signal::ctrl_c; +const NEVER: &str = "* * * 31 2 *"; + #[tokio::test] +#[ignore = "manual test"] async fn test_full_mensa_parse_scheduling() { let info = ScheduleInfo { full_parse_schedule: "0 */5 * * * *".to_string(), - update_parse_schedule: "* * * * 0 *".to_string(), - image_review_schedule: "* * * * 0 *".to_string(), + update_parse_schedule: NEVER.to_string(), + image_review_schedule: NEVER.to_string(), }; let mut scheduler = setup(info).await; scheduler.start().await; @@ -26,11 +29,12 @@ async fn test_full_mensa_parse_scheduling() { } #[tokio::test] +#[ignore = "manual test"] async fn test_update_mensa_parse_scheduling() { let info = ScheduleInfo { - full_parse_schedule: "* * * * 0 *".to_string(), + full_parse_schedule: NEVER.to_string(), update_parse_schedule: "0 */5 * * * *".to_string(), - image_review_schedule: "* * * * 0 *".to_string(), + image_review_schedule: NEVER.to_string(), }; let mut scheduler = setup(info).await; scheduler.start().await; From 5f3dac82f64a4ae7757499840ec68a876b8d0b5e Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:45:29 +0200 Subject: [PATCH 31/53] Changed schedule --- backend/tests/image_review_scheduler.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/tests/image_review_scheduler.rs b/backend/tests/image_review_scheduler.rs index 925421de..107d4431 100644 --- a/backend/tests/image_review_scheduler.rs +++ b/backend/tests/image_review_scheduler.rs @@ -12,6 +12,8 @@ use mensa_app_backend::{ }; use tokio::signal::ctrl_c; +const NEVER: &str = "* * * 31 2 *"; + #[tokio::test] #[ignore = "manual test"] async fn test_image_scheduling() { @@ -23,8 +25,8 @@ async fn test_image_scheduling() { async fn setup() -> Scheduler { let info = ScheduleInfo { - full_parse_schedule: "* * * * 1 *".to_string(), - update_parse_schedule: "* * * * 1 *".to_string(), + full_parse_schedule: NEVER.to_string(), + update_parse_schedule: NEVER.to_string(), image_review_schedule: "0 */5 * * * *".to_string(), }; let reader = ConfigReader::default(); From 0ff81670bf3ada42d35a1b4c1c9d19207056ce67 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Mon, 21 Aug 2023 09:36:47 +0200 Subject: [PATCH 32/53] removed id repitition --- backend/tests/command.rs | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/backend/tests/command.rs b/backend/tests/command.rs index 6adea2f6..7e70ffd2 100644 --- a/backend/tests/command.rs +++ b/backend/tests/command.rs @@ -1,3 +1,4 @@ +use lazy_static::lazy_static; use mensa_app_backend::{ interface::api_command::{AuthInfo, Command, InnerAuthInfo}, layer::{ @@ -11,18 +12,21 @@ use mensa_app_backend::{ util::{ReportReason, Uuid}, }; +lazy_static! { + static ref MEAL_ID: Uuid = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); + static ref IMAGE_ID: Uuid = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); +} + #[tokio::test] #[ignore = "manual test"] async fn test_add_image() { let cmd = setup_cmd().await; - let meal = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); - let auth_info = get_auth_info( "T7X93M0t4oWRxRFxH2MpWdYSHZNsiqkkkpKbxL1AeD8wXR5pD+jmHvM4JjfD+WEx0Knl7g0DKSesmyzL2jVYxA==", ); - cmd.add_image(meal, "https://flic.kr/p/2oSg8aV".into(), auth_info) + cmd.add_image(*MEAL_ID, "https://flic.kr/p/2oSg8aV".into(), auth_info) .await .unwrap(); } @@ -32,15 +36,15 @@ async fn test_add_image() { async fn test_report_image() { let cmd = setup_cmd().await; - let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); - let reason = ReportReason::NoMeal; let auth_info = get_auth_info( "rxGJ5jz4aMwklyzFxZq6eHlySLuuPyv2+ixnzz8hDB2UQ+KuiJOaLKtINJh/iPZmgAEipA7E/ADceiFSO1RWmQ==", ); - cmd.report_image(image_id, reason, auth_info).await.unwrap(); + cmd.report_image(*IMAGE_ID, reason, auth_info) + .await + .unwrap(); } #[tokio::test] @@ -48,15 +52,13 @@ async fn test_report_image() { async fn test_set_meal_rating() { let cmd = setup_cmd().await; - let meal_id = Uuid::try_from("48b0ed7b-8387-46ad-866c-7993f469a9bf").unwrap(); - let rating = 4; let auth_info = get_auth_info( "YXBIcDFORrhY83pBmwuSwb0l0zsYXM/h18OfT+AMEYCXWCtpExlN2EMiLtjGkv7w2/cAPmIKe8m+mQbGasbcEQ==", ); - cmd.set_meal_rating(meal_id, rating, auth_info) + cmd.set_meal_rating(*MEAL_ID, rating, auth_info) .await .unwrap(); } @@ -66,13 +68,11 @@ async fn test_set_meal_rating() { async fn test_add_image_upvote() { let cmd = setup_cmd().await; - let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); - let auth_info = get_auth_info( "r+tenhKxOfa2wJUE+EPzOyRgtIc5IBDjh/iMyvlP4vznoiLLsJKOMyKOs60ZV98oPrOEMpyDnONdavwFgnoH+g==", ); - cmd.add_image_upvote(image_id, auth_info).await.unwrap(); + cmd.add_image_upvote(*IMAGE_ID, auth_info).await.unwrap(); } #[tokio::test] @@ -80,13 +80,11 @@ async fn test_add_image_upvote() { async fn test_add_image_dovnvote() { let cmd = setup_cmd().await; - let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); - let auth_info = get_auth_info( "aKlyzgxz/0pHK+LWQFHhWoyhUjOKa+/fmr6my4VH3Rxn+lPvvXb4lk3rENx8TSwCd2Sjw7qspPrs2S93ZoG/fQ==", ); - cmd.add_image_downvote(image_id, auth_info).await.unwrap(); + cmd.add_image_downvote(*IMAGE_ID, auth_info).await.unwrap(); } #[tokio::test] @@ -94,13 +92,11 @@ async fn test_add_image_dovnvote() { async fn test_remove_image_upvote() { let cmd = setup_cmd().await; - let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); - let auth_info = get_auth_info( "aNN/2nk2JgE0wZOMWG0zzxg/LtqaCeiLhjq7ebqDrnSSXtWVJC9kItKk1/RBKnzD+T+gGH/JGclBy8SWdgBKMQ==", ); - cmd.remove_image_upvote(image_id, auth_info).await.unwrap(); + cmd.remove_image_upvote(*IMAGE_ID, auth_info).await.unwrap(); } #[tokio::test] @@ -108,13 +104,11 @@ async fn test_remove_image_upvote() { async fn test_remove_image_downvote() { let cmd = setup_cmd().await; - let image_id = Uuid::try_from("1b8f373b-7383-4a3a-9818-e0137fd164b7").unwrap(); - let auth_info = get_auth_info( "65KlFbT+MijU8OqUWOleQZ/oxikIGp7q4hbEYTlEMnjbylrzNnl8nZUa1LEFaKZptAW46PmGJ/Xgcm6p4FzQxg==", ); - cmd.remove_image_downvote(image_id, auth_info) + cmd.remove_image_downvote(*IMAGE_ID, auth_info) .await .unwrap(); } From cf89e1d2c46b48d107acb373f37eaf67dae9d14f Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Tue, 22 Aug 2023 11:35:41 +0200 Subject: [PATCH 33/53] parsing one more week --- backend/src/layer/data/database/request.rs | 10 +++++----- .../src/layer/data/swka_parser/swka_link_creator.rs | 11 +++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/backend/src/layer/data/database/request.rs b/backend/src/layer/data/database/request.rs index 07ebedd4..08d34fa5 100644 --- a/backend/src/layer/data/database/request.rs +++ b/backend/src/layer/data/database/request.rs @@ -8,11 +8,11 @@ use crate::{ DataError, RequestDataAccess, Result, }, null_error, - util::{Additive, Allergen, Date, MealType, Price, Uuid}, + util::{Additive, Allergen, Date, MealType, Price, Uuid}, layer::data::swka_parser::swka_link_creator::NUMBER_OF_WEEKS_TO_POLL, }; /// We have for four weeks, including the current week -const MAX_WEEKS_DATA: i64 = 4; +const MAX_WEEKS_DATA: u32 = NUMBER_OF_WEEKS_TO_POLL; /// Class implementing all database requests arising from graphql manipulations. #[derive(Debug)] @@ -109,7 +109,7 @@ impl RequestDataAccess for PersistentRequestData { // This should probably be inside the logic layer which currently does not exists for request. let today = Local::now().date_naive(); let first_unknown_day = - today.week(chrono::Weekday::Mon).first_day() + Duration::weeks(MAX_WEEKS_DATA); + today.week(chrono::Weekday::Mon).first_day() + Duration::weeks(i64::from(MAX_WEEKS_DATA)); if date >= first_unknown_day { return Ok(None); } @@ -428,13 +428,13 @@ mod tests { assert_eq!(meals, provide_dummy_meals()); let meals_in_future = request - .get_meals(line_id, Local::now().date_naive() + Duration::weeks(4)) + .get_meals(line_id, Local::now().date_naive() + Duration::weeks(5)) .await .unwrap(); assert!(meals_in_future.is_none()); let meals_in_near_future = request - .get_meals(line_id, Local::now().date_naive() + Duration::weeks(3)) + .get_meals(line_id, Local::now().date_naive() + Duration::weeks(4)) .await .unwrap(); assert!(meals_in_near_future.is_some()); diff --git a/backend/src/layer/data/swka_parser/swka_link_creator.rs b/backend/src/layer/data/swka_parser/swka_link_creator.rs index 3cecaa87..ad4bb70e 100644 --- a/backend/src/layer/data/swka_parser/swka_link_creator.rs +++ b/backend/src/layer/data/swka_parser/swka_link_creator.rs @@ -13,7 +13,7 @@ use crate::util::Date; const URL_SEPARATOR: char = '/'; const WEEK_SELECTOR: &str = "?kw="; -const NUMBER_OF_WEEKS_TO_POLL: u32 = 4; +pub const NUMBER_OF_WEEKS_TO_POLL: u32 = 5; pub struct SwKaLinkCreator { base_url: String, @@ -70,7 +70,7 @@ mod tests { use crate::layer::data::swka_parser::test::const_test_data as test_util; use crate::util::Date; - const URLS_FOR_NEXT_WEEKS: [&str; 28] = [ + const URLS_FOR_NEXT_WEEKS: [&str; 35] = [ "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_adenauerring/?kw=28", "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_gottesaue/?kw=28", "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_moltke/?kw=28", @@ -99,6 +99,13 @@ mod tests { "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_erzberger/?kw=31", "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_tiefenbronner/?kw=31", "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_holzgarten/?kw=31", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_adenauerring/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_gottesaue/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_moltke/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_x1moltkestrasse/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_erzberger/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_tiefenbronner/?kw=32", + "https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/mensa_holzgarten/?kw=32", ]; const URLS_FOR_CURRENT_WEEK: [&str; 7] = [ From 75fccc97b6476a4bed2c8ae8bcb0607a5be9816a Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 12:45:28 +0200 Subject: [PATCH 34/53] added routes and handler to axum webserver --- backend/tests/mealplan_management.rs | 108 ++++++++++++++++++++++----- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs index 0b3288a2..be306e5c 100644 --- a/backend/tests/mealplan_management.rs +++ b/backend/tests/mealplan_management.rs @@ -1,3 +1,9 @@ +use std::{env, fs}; +use axum::response::Html; +use axum::Router; +use axum::routing::get; +use chrono::{Datelike, Local}; +use dotenvy::dotenv; use mensa_app_backend::{ layer::{ data::{ @@ -10,43 +16,107 @@ use mensa_app_backend::layer::data::database::mealplan_management::PersistentMea use mensa_app_backend::layer::data::swka_parser::swka_parse_manager::SwKaParseManager; use mensa_app_backend::layer::logic::mealplan_management::meal_plan_manager::MealPlanManager; -#[tokio::test] -#[ignore = "manual test"] -async fn test_add_image() { - let cmd = setup_cmd().await; - - start_full_with_empty_db(); - - start_update_with_empty_db(); +async fn setup() -> MealPlanManager { + dotenv().ok(); + assert_eq!(env::var("MENSA_BASE_URL").unwrap(), "localhost"); + assert_eq!(env::var("CANTEENS").unwrap(), "canteen1,canteen2,canteen3"); - start_full_with_filled_db(); + setup_local_webserver().await; - start_update_with_filled_db(); -} - -async fn setup_cmd() -> MealPlanManager { let reader = ConfigReader::default(); - let mensa_parser = SwKaParseManager::new(reader.read_swka_info().unwrap())? - .unwrap(); + let mensa_parser = SwKaParseManager::new(reader.read_swka_info().unwrap()).unwrap(); let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true).await.unwrap(); let data = factory.get_mealplan_management_data_access(); MealPlanManager::new(data, mensa_parser) } +async fn setup_router() -> Router { + let cur_calender_week = Local::now().date_naive().iso_week().week(); + let next_calender_week = cur_calender_week + 1; + let second_next_calender_week = cur_calender_week + 2; + let third_next_calender_week = cur_calender_week + 3; + + Router::new() + .route(&format!("/canteen1/?kw={cur_calender_week}"), get(canteen1_w1)) + .route(&format!("/canteen1/?kw={next_calender_week}"), get(canteen1_w2)) + .route(&format!("/canteen1/?kw={second_next_calender_week}"), get(canteen1_w3)) + .route(&format!("/canteen1/?kw={third_next_calender_week}"), get(canteen1_w4)) + .route(&format!("/canteen2/?kw={cur_calender_week}"), get(canteen2_w1)) + .route(&format!("/canteen2/?kw={next_calender_week}"), get(canteen2_w2)) + .route(&format!("/canteen2/?kw={second_next_calender_week}"), get(canteen2_w3)) + .route(&format!("/canteen2/?kw={third_next_calender_week}"), get(canteen2_w4)) + .route(&format!("/canteen3/?kw={cur_calender_week}"), get(canteen3_w1)) + .route(&format!("/canteen3/?kw={next_calender_week}"), get(canteen3_w2)) + .route(&format!("/canteen3/?kw={second_next_calender_week}"), get(canteen3_w3)) + .route(&format!("/canteen3/?kw={third_next_calender_week}"), get(canteen3_w4)) +} -fn start_full_with_empty_db() { +async fn setup_local_webserver() { + tokio::spawn(axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) + .serve(setup_router().await.into_make_service()) + ); +} + +#[tokio::test] +#[ignore = "manual test"] +async fn start_full_with_empty_db() { + let mgmt = setup().await; +} + +#[tokio::test] +#[ignore = "manual test"] +async fn start_update_with_empty_db() { } -fn start_update_with_empty_db() { +#[tokio::test] +#[ignore = "manual test"] +async fn start_full_with_filled_db() { } -fn start_full_with_filled_db() { +#[tokio::test] +#[ignore = "manual test"] +async fn start_update_with_filled_db() { } -fn start_update_with_filled_db() { +// HANDLER +async fn canteen1_w1() -> Html { + Html(fs::read_to_string("tests/data/w1_canteen1.html").unwrap()) +} +async fn canteen1_w2() -> Html { + Html(fs::read_to_string("tests/data/w2_canteen1.html").unwrap()) +} +async fn canteen1_w3() -> Html { + Html(fs::read_to_string("tests/data/w3_canteen1.html").unwrap()) +} +async fn canteen1_w4() -> Html { + Html(fs::read_to_string("tests/data/w4_canteen1.html").unwrap()) +} +async fn canteen2_w1() -> Html { + Html(fs::read_to_string("tests/data/w1_canteen2.html").unwrap()) +} +async fn canteen2_w2() -> Html { + Html(fs::read_to_string("tests/data/w2_canteen2.html").unwrap()) +} +async fn canteen2_w3() -> Html { + Html(fs::read_to_string("tests/data/w3_canteen2.html").unwrap()) +} +async fn canteen2_w4() -> Html { + Html(fs::read_to_string("tests/data/w4_canteen2.html").unwrap()) +} +async fn canteen3_w1() -> Html { + Html(fs::read_to_string("tests/data/w1_canteen3.html").unwrap()) +} +async fn canteen3_w2() -> Html { + Html(fs::read_to_string("tests/data/w2_canteen3.html").unwrap()) +} +async fn canteen3_w3() -> Html { + Html(fs::read_to_string("tests/data/w3_canteen3.html").unwrap()) +} +async fn canteen3_w4() -> Html { + Html(fs::read_to_string("tests/data/w4_canteen3.html").unwrap()) } \ No newline at end of file From 14be0782770ca3a30df35e6e76029be0d93dd618 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 12:45:51 +0200 Subject: [PATCH 35/53] added test html data --- backend/tests/data/w1_canteen1.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w1_canteen2.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w1_canteen3.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w2_canteen1.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w2_canteen2.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w2_canteen3.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w3_canteen1.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w3_canteen2.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w3_canteen3.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w4_canteen1.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w4_canteen2.html | 790 ++++++++++++++++++++++++++++ backend/tests/data/w4_canteen3.html | 790 ++++++++++++++++++++++++++++ 12 files changed, 9480 insertions(+) create mode 100644 backend/tests/data/w1_canteen1.html create mode 100644 backend/tests/data/w1_canteen2.html create mode 100644 backend/tests/data/w1_canteen3.html create mode 100644 backend/tests/data/w2_canteen1.html create mode 100644 backend/tests/data/w2_canteen2.html create mode 100644 backend/tests/data/w2_canteen3.html create mode 100644 backend/tests/data/w3_canteen1.html create mode 100644 backend/tests/data/w3_canteen2.html create mode 100644 backend/tests/data/w3_canteen3.html create mode 100644 backend/tests/data/w4_canteen1.html create mode 100644 backend/tests/data/w4_canteen2.html create mode 100644 backend/tests/data/w4_canteen3.html diff --git a/backend/tests/data/w1_canteen1.html b/backend/tests/data/w1_canteen1.html new file mode 100644 index 00000000..e76b7953 --- /dev/null +++ b/backend/tests/data/w1_canteen1.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa am Adenauerring

+ + + + +
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,25 €

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,10 €

2,00 €
[pizza]werk
Pizza
11-14 Uhr

4,55 €

4,45 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:00 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w1_canteen2.html b/backend/tests/data/w1_canteen2.html new file mode 100644 index 00000000..8d40bdb8 --- /dev/null +++ b/backend/tests/data/w1_canteen2.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa Moltke

+ + + + +
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w1_canteen3.html b/backend/tests/data/w1_canteen3.html new file mode 100644 index 00000000..3c4746cf --- /dev/null +++ b/backend/tests/data/w1_canteen3.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Menseria Erzbergerstraẞe

+ + + + +
Wahlessen 1

-
Wahlessen 2

-
Wahlessen 3

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 +

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w2_canteen1.html b/backend/tests/data/w2_canteen1.html new file mode 100644 index 00000000..d26e83b2 --- /dev/null +++ b/backend/tests/data/w2_canteen1.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa am Adenauerring

+ + + + +
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,70 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,65 €

4,35 €

4,35 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w2_canteen2.html b/backend/tests/data/w2_canteen2.html new file mode 100644 index 00000000..c9879ceb --- /dev/null +++ b/backend/tests/data/w2_canteen2.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa Moltke

+ + + + +
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w2_canteen3.html b/backend/tests/data/w2_canteen3.html new file mode 100644 index 00000000..34f5b3a7 --- /dev/null +++ b/backend/tests/data/w2_canteen3.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Menseria Erzbergerstraẞe

+ + + + +
Wahlessen 1

-
Wahlessen 2

-
Wahlessen 3

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 +

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w3_canteen1.html b/backend/tests/data/w3_canteen1.html new file mode 100644 index 00000000..30a3a9ce --- /dev/null +++ b/backend/tests/data/w3_canteen1.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa am Adenauerring

+ + + + +
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,80 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,65 €

4,45 €

4,45 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w3_canteen2.html b/backend/tests/data/w3_canteen2.html new file mode 100644 index 00000000..8eac308f --- /dev/null +++ b/backend/tests/data/w3_canteen2.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa Moltke

+ + + + +
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w3_canteen3.html b/backend/tests/data/w3_canteen3.html new file mode 100644 index 00000000..b4ea125b --- /dev/null +++ b/backend/tests/data/w3_canteen3.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Menseria Erzbergerstraẞe

+ + + + +
Wahlessen 1

3,20 €

Wahlessen 2

3,20 €

Wahlessen 3

1,05 €

0,90 €

0,90 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 +

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w4_canteen1.html b/backend/tests/data/w4_canteen1.html new file mode 100644 index 00000000..6ba93264 --- /dev/null +++ b/backend/tests/data/w4_canteen1.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa am Adenauerring

+ + + + +
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

3,25 €

0,90 €

0,85 €
Linie 4

0,90 €

0,85 €

Linie 5

3,95 €

1,05 €

0,90 €

0,90 €

0,85 €

0,55 €
Schnitzel-/
Burgerbar

1,05 €

0,85 €

0,65 €
Linie 6

0,85 €
Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,70 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,55 €

4,35 €

4,35 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w4_canteen2.html b/backend/tests/data/w4_canteen2.html new file mode 100644 index 00000000..b401a646 --- /dev/null +++ b/backend/tests/data/w4_canteen2.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Mensa Moltke

+ + + + +
Wahlessen 1

1,05 €

1,05 €

0,55 €
Wahlessen 2

3,50 €

0,95 €

0,90 €

0,90 €
Aktionstheke

2,10 €

2,10 €

1,30 €

Gut & Günstig

3,20 €

3,20 €

Buffet

1,00 €
Schnitzelbar

-
[Kœri]werk

-
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
+

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file diff --git a/backend/tests/data/w4_canteen3.html b/backend/tests/data/w4_canteen3.html new file mode 100644 index 00000000..696c1d22 --- /dev/null +++ b/backend/tests/data/w4_canteen3.html @@ -0,0 +1,790 @@ + Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe + +
+ + + +
Facebook +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Facebook
Twitter +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

Twitter
Instagram +
+
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
+

+ +Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe +weitergeleitet wirst, auf der deine personenbezogenen Daten anders +verarbeitet werden als bei uns.

+Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du +hier nachlesen, was bei der externen Webseite zum Datenschutz zu +beachten ist. +

InstagramKontrast
DE
+ + +
+ + + +
+ +
+ +
+ + + +
+ +
+
+ + +
+

Menseria Erzbergerstraẞe

+ + + + +
Wahlessen 1

3,20 €

Wahlessen 2

3,20 €

3,20 €

Wahlessen 3

1,05 €

1,00 €

0,90 €

0,90 €

0,85 €
+ + + + + + + + + + + + + + + + + + + +
+ Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr +
+
+
+
Legende
+
+
+
+ Zusatzstoffe
+[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
+[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
+[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
+[10] - kann bei übermäßigem Verzehr abführend wirken
+[11] - enthält eine Phenylalaninquelle
+[12] - kann Restalkohol enthalten
+[14] - aus Fleischstücken zusammengefügt
+[15] - mit kakaohaltiger Fettglasur
+[27] - aus Fischstücken zusammengefügt
+

+Freiwillige Angaben
+
- enthält Rindfleisch
+
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
+
- enthält Schweinefleisch
+
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
+
- vegetarisches Gericht
+
- veganes Gericht
+
- MSC aus zertifizierter Fischerei
+
- Mensa Vital
+
+[LAB] - mit tierischem Lab
+[GEL] - mit Gelatine
+
+Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. +
+
+
+ + +
+ + + Alternative Ansicht des Speiseplans für Sehbehinderte + + +
+Tageskarte herunterladen (PDF) +
+Wochenkarte herunterladen (PDF) + +
+ + + + + + + +
+
+ + + +
+ + Kontakt +
+ +

+ Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 +

+

+ +

+ +
+ + +
+
+ +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +

+
+
+ + + + + + + + + +
+
+ +
+
+ +
+
+ + +
+ +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + + + + + + + +
+ + \ No newline at end of file From f2129946edd8ad01f57de70fab568b7f81dfbcdf Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 12:48:27 +0200 Subject: [PATCH 36/53] added test assertions --- backend/tests/mealplan_management.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs index be306e5c..2ef786ff 100644 --- a/backend/tests/mealplan_management.rs +++ b/backend/tests/mealplan_management.rs @@ -18,7 +18,7 @@ use mensa_app_backend::layer::logic::mealplan_management::meal_plan_manager::Mea async fn setup() -> MealPlanManager { dotenv().ok(); - assert_eq!(env::var("MENSA_BASE_URL").unwrap(), "localhost"); + assert_eq!(env::var("MENSA_BASE_URL").unwrap(), "http://localhost:3000"); assert_eq!(env::var("CANTEENS").unwrap(), "canteen1,canteen2,canteen3"); setup_local_webserver().await; From 7ca61523d1210ce3944f27f0bc11cc8a65c0bd1d Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 13:09:40 +0200 Subject: [PATCH 37/53] removed automated server testing --- backend/tests/mealplan_management.rs | 102 +++------------------------ 1 file changed, 9 insertions(+), 93 deletions(-) diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs index 2ef786ff..fcdc986d 100644 --- a/backend/tests/mealplan_management.rs +++ b/backend/tests/mealplan_management.rs @@ -1,9 +1,3 @@ -use std::{env, fs}; -use axum::response::Html; -use axum::Router; -use axum::routing::get; -use chrono::{Datelike, Local}; -use dotenvy::dotenv; use mensa_app_backend::{ layer::{ data::{ @@ -12,111 +6,33 @@ use mensa_app_backend::{ }, startup::config::ConfigReader, }; +use mensa_app_backend::interface::mealplan_management::MensaParseScheduling; use mensa_app_backend::layer::data::database::mealplan_management::PersistentMealplanManagementData; use mensa_app_backend::layer::data::swka_parser::swka_parse_manager::SwKaParseManager; use mensa_app_backend::layer::logic::mealplan_management::meal_plan_manager::MealPlanManager; async fn setup() -> MealPlanManager { - dotenv().ok(); - assert_eq!(env::var("MENSA_BASE_URL").unwrap(), "http://localhost:3000"); - assert_eq!(env::var("CANTEENS").unwrap(), "canteen1,canteen2,canteen3"); - - setup_local_webserver().await; - let reader = ConfigReader::default(); let mensa_parser = SwKaParseManager::new(reader.read_swka_info().unwrap()).unwrap(); - let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true).await.unwrap(); + let factory = DataAccessFactory::new(reader.read_database_info().unwrap(), true) + .await + .unwrap(); let data = factory.get_mealplan_management_data_access(); MealPlanManager::new(data, mensa_parser) } -async fn setup_router() -> Router { - let cur_calender_week = Local::now().date_naive().iso_week().week(); - let next_calender_week = cur_calender_week + 1; - let second_next_calender_week = cur_calender_week + 2; - let third_next_calender_week = cur_calender_week + 3; - - Router::new() - .route(&format!("/canteen1/?kw={cur_calender_week}"), get(canteen1_w1)) - .route(&format!("/canteen1/?kw={next_calender_week}"), get(canteen1_w2)) - .route(&format!("/canteen1/?kw={second_next_calender_week}"), get(canteen1_w3)) - .route(&format!("/canteen1/?kw={third_next_calender_week}"), get(canteen1_w4)) - .route(&format!("/canteen2/?kw={cur_calender_week}"), get(canteen2_w1)) - .route(&format!("/canteen2/?kw={next_calender_week}"), get(canteen2_w2)) - .route(&format!("/canteen2/?kw={second_next_calender_week}"), get(canteen2_w3)) - .route(&format!("/canteen2/?kw={third_next_calender_week}"), get(canteen2_w4)) - .route(&format!("/canteen3/?kw={cur_calender_week}"), get(canteen3_w1)) - .route(&format!("/canteen3/?kw={next_calender_week}"), get(canteen3_w2)) - .route(&format!("/canteen3/?kw={second_next_calender_week}"), get(canteen3_w3)) - .route(&format!("/canteen3/?kw={third_next_calender_week}"), get(canteen3_w4)) -} - -async fn setup_local_webserver() { - tokio::spawn(axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) - .serve(setup_router().await.into_make_service()) - ); -} - #[tokio::test] #[ignore = "manual test"] -async fn start_full_with_empty_db() { +async fn start_full_parsing() { let mgmt = setup().await; + mgmt.start_full_parsing().await; } #[tokio::test] #[ignore = "manual test"] -async fn start_update_with_empty_db() { - -} - -#[tokio::test] -#[ignore = "manual test"] -async fn start_full_with_filled_db() { - -} - -#[tokio::test] -#[ignore = "manual test"] -async fn start_update_with_filled_db() { - -} - -// HANDLER +async fn start_update_parsing() { + let mgmt = setup().await; + mgmt.start_update_parsing().await; -async fn canteen1_w1() -> Html { - Html(fs::read_to_string("tests/data/w1_canteen1.html").unwrap()) -} -async fn canteen1_w2() -> Html { - Html(fs::read_to_string("tests/data/w2_canteen1.html").unwrap()) -} -async fn canteen1_w3() -> Html { - Html(fs::read_to_string("tests/data/w3_canteen1.html").unwrap()) -} -async fn canteen1_w4() -> Html { - Html(fs::read_to_string("tests/data/w4_canteen1.html").unwrap()) -} -async fn canteen2_w1() -> Html { - Html(fs::read_to_string("tests/data/w1_canteen2.html").unwrap()) -} -async fn canteen2_w2() -> Html { - Html(fs::read_to_string("tests/data/w2_canteen2.html").unwrap()) -} -async fn canteen2_w3() -> Html { - Html(fs::read_to_string("tests/data/w3_canteen2.html").unwrap()) -} -async fn canteen2_w4() -> Html { - Html(fs::read_to_string("tests/data/w4_canteen2.html").unwrap()) -} -async fn canteen3_w1() -> Html { - Html(fs::read_to_string("tests/data/w1_canteen3.html").unwrap()) -} -async fn canteen3_w2() -> Html { - Html(fs::read_to_string("tests/data/w2_canteen3.html").unwrap()) -} -async fn canteen3_w3() -> Html { - Html(fs::read_to_string("tests/data/w3_canteen3.html").unwrap()) -} -async fn canteen3_w4() -> Html { - Html(fs::read_to_string("tests/data/w4_canteen3.html").unwrap()) } \ No newline at end of file From 04d18a461fa57a7a90fc67849508c2ac7b9bf96f Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 13:10:01 +0200 Subject: [PATCH 38/53] formatting --- backend/tests/mealplan_management.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs index fcdc986d..0d8087a0 100644 --- a/backend/tests/mealplan_management.rs +++ b/backend/tests/mealplan_management.rs @@ -1,15 +1,10 @@ -use mensa_app_backend::{ - layer::{ - data::{ - database::factory::DataAccessFactory, - }, - }, - startup::config::ConfigReader, -}; use mensa_app_backend::interface::mealplan_management::MensaParseScheduling; use mensa_app_backend::layer::data::database::mealplan_management::PersistentMealplanManagementData; use mensa_app_backend::layer::data::swka_parser::swka_parse_manager::SwKaParseManager; use mensa_app_backend::layer::logic::mealplan_management::meal_plan_manager::MealPlanManager; +use mensa_app_backend::{ + layer::data::database::factory::DataAccessFactory, startup::config::ConfigReader, +}; async fn setup() -> MealPlanManager { let reader = ConfigReader::default(); @@ -34,5 +29,4 @@ async fn start_full_parsing() { async fn start_update_parsing() { let mgmt = setup().await; mgmt.start_update_parsing().await; - -} \ No newline at end of file +} From 5a49aa46884a4a3fe721e980006a8b7004136391 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 13:10:23 +0200 Subject: [PATCH 39/53] deleted test data --- backend/tests/data/w1_canteen1.html | 790 ---------------------------- backend/tests/data/w1_canteen2.html | 790 ---------------------------- backend/tests/data/w1_canteen3.html | 790 ---------------------------- backend/tests/data/w2_canteen1.html | 790 ---------------------------- backend/tests/data/w2_canteen2.html | 790 ---------------------------- backend/tests/data/w2_canteen3.html | 790 ---------------------------- backend/tests/data/w3_canteen1.html | 790 ---------------------------- backend/tests/data/w3_canteen2.html | 790 ---------------------------- backend/tests/data/w3_canteen3.html | 790 ---------------------------- backend/tests/data/w4_canteen1.html | 790 ---------------------------- backend/tests/data/w4_canteen2.html | 790 ---------------------------- backend/tests/data/w4_canteen3.html | 790 ---------------------------- 12 files changed, 9480 deletions(-) delete mode 100644 backend/tests/data/w1_canteen1.html delete mode 100644 backend/tests/data/w1_canteen2.html delete mode 100644 backend/tests/data/w1_canteen3.html delete mode 100644 backend/tests/data/w2_canteen1.html delete mode 100644 backend/tests/data/w2_canteen2.html delete mode 100644 backend/tests/data/w2_canteen3.html delete mode 100644 backend/tests/data/w3_canteen1.html delete mode 100644 backend/tests/data/w3_canteen2.html delete mode 100644 backend/tests/data/w3_canteen3.html delete mode 100644 backend/tests/data/w4_canteen1.html delete mode 100644 backend/tests/data/w4_canteen2.html delete mode 100644 backend/tests/data/w4_canteen3.html diff --git a/backend/tests/data/w1_canteen1.html b/backend/tests/data/w1_canteen1.html deleted file mode 100644 index e76b7953..00000000 --- a/backend/tests/data/w1_canteen1.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa am Adenauerring

- - - - -
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,25 €

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,10 €

2,00 €
[pizza]werk
Pizza
11-14 Uhr

4,55 €

4,45 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:00 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w1_canteen2.html b/backend/tests/data/w1_canteen2.html deleted file mode 100644 index 8d40bdb8..00000000 --- a/backend/tests/data/w1_canteen2.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa Moltke

- - - - -
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w1_canteen3.html b/backend/tests/data/w1_canteen3.html deleted file mode 100644 index 3c4746cf..00000000 --- a/backend/tests/data/w1_canteen3.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Menseria Erzbergerstraẞe

- - - - -
Wahlessen 1

-
Wahlessen 2

-
Wahlessen 3

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 -

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w2_canteen1.html b/backend/tests/data/w2_canteen1.html deleted file mode 100644 index d26e83b2..00000000 --- a/backend/tests/data/w2_canteen1.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa am Adenauerring

- - - - -
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,70 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,65 €

4,35 €

4,35 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w2_canteen2.html b/backend/tests/data/w2_canteen2.html deleted file mode 100644 index c9879ceb..00000000 --- a/backend/tests/data/w2_canteen2.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa Moltke

- - - - -
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w2_canteen3.html b/backend/tests/data/w2_canteen3.html deleted file mode 100644 index 34f5b3a7..00000000 --- a/backend/tests/data/w2_canteen3.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Menseria Erzbergerstraẞe

- - - - -
Wahlessen 1

-
Wahlessen 2

-
Wahlessen 3

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 -

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w3_canteen1.html b/backend/tests/data/w3_canteen1.html deleted file mode 100644 index 30a3a9ce..00000000 --- a/backend/tests/data/w3_canteen1.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa am Adenauerring

- - - - -
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

Linie 4

Linie 5

Schnitzel-/
Burgerbar

1,05 €

0,65 €
Linie 6

Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,80 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,65 €

4,45 €

4,45 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w3_canteen2.html b/backend/tests/data/w3_canteen2.html deleted file mode 100644 index 8eac308f..00000000 --- a/backend/tests/data/w3_canteen2.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa Moltke

- - - - -
Wahlessen 1

-
Wahlessen 2

-
Aktionstheke

-
Gut & Günstig

-
Buffet

-
Schnitzelbar

-
[Kœri]werk

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w3_canteen3.html b/backend/tests/data/w3_canteen3.html deleted file mode 100644 index b4ea125b..00000000 --- a/backend/tests/data/w3_canteen3.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Menseria Erzbergerstraẞe

- - - - -
Wahlessen 1

3,20 €

Wahlessen 2

3,20 €

Wahlessen 3

1,05 €

0,90 €

0,90 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:05 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 -

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w4_canteen1.html b/backend/tests/data/w4_canteen1.html deleted file mode 100644 index 6ba93264..00000000 --- a/backend/tests/data/w4_canteen1.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa am Adenauerring - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa am Adenauerring

- - - - -
Linie 1
Gut & Günstig

3,20 €

3,20 €

Linie 2
Vegane Linie

3,50 €

Linie 3

3,25 €

0,90 €

0,85 €
Linie 4

0,90 €

0,85 €

Linie 5

3,95 €

1,05 €

0,90 €

0,90 €

0,85 €

0,55 €
Schnitzel-/
Burgerbar

1,05 €

0,85 €

0,65 €
Linie 6

0,85 €
Spätausgabe und Abendessen

3,20 €
[kœri]werk
11-14 Uhr

2,10 €

2,10 €

1,30 €

Cafeteria
11-14 Uhr

2,70 €

1,90 €
[pizza]werk
Pizza
11-14 Uhr

4,55 €

4,35 €

4,35 €

4,05 €

4,05 €
[pizza]werk
Pasta

-
[pizza]werk
Salate / Vorspeisen

1,80 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa am Adenauerring
Adenauerring 7
76131 Karlsruhe

Bereichsleitung:
Steffen Oertel

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-230
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w4_canteen2.html b/backend/tests/data/w4_canteen2.html deleted file mode 100644 index b401a646..00000000 --- a/backend/tests/data/w4_canteen2.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Mensa Moltke - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Mensa Moltke

- - - - -
Wahlessen 1

1,05 €

1,05 €

0,55 €
Wahlessen 2

3,50 €

0,95 €

0,90 €

0,90 €
Aktionstheke

2,10 €

2,10 €

1,30 €

Gut & Günstig

3,20 €

3,20 €

Buffet

1,00 €
Schnitzelbar

-
[Kœri]werk

-
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Mensa Moltke
Moltkestraße 12
76133 Karlsruhe

Leiter Mensa Moltke:
Antonio Ziccardi

E-Mail: gastronomie@sw-ka.de
Telefon: +49 721 6909-257
-

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file diff --git a/backend/tests/data/w4_canteen3.html b/backend/tests/data/w4_canteen3.html deleted file mode 100644 index 696c1d22..00000000 --- a/backend/tests/data/w4_canteen3.html +++ /dev/null @@ -1,790 +0,0 @@ - Studierendenwerk Karlsruhe | Hochschulgastronomie | Speiseplan | Menseria Erzbergerstraẞe - -
- - - -
Facebook -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.facebook.com/Studipilot/ -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Facebook
Twitter -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://twitter.com/Studipilot -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

Twitter
Instagram -
-
Du verlässt nun die Webseite des Studierendenwerks Karlsruhe (sw-ka.de)
-

- -Bitte beachte, dass du auf die externe Webseite https://www.instagram.com/studierendenwerk_karlsruhe -weitergeleitet wirst, auf der deine personenbezogenen Daten anders -verarbeitet werden als bei uns.

-Ehe du mit „Ja, weiter“ dieser Verarbeitung zustimmst, solltest du -hier nachlesen, was bei der externen Webseite zum Datenschutz zu -beachten ist. -

InstagramKontrast
DE
- - -
- - - -
- -
- -
- - - -
- -
-
- - -
-

Menseria Erzbergerstraẞe

- - - - -
Wahlessen 1

3,20 €

Wahlessen 2

3,20 €

3,20 €

Wahlessen 3

1,05 €

1,00 €

0,90 €

0,90 €

0,85 €
- - - - - - - - - - - - - - - - - - - -
- Letztes Update: Dienstag, 22.08.2023 um 12:10 Uhr -
-
-
-
Legende
-
-
-
- Zusatzstoffe
-[1] mit Farbstoff | [2] mit Konservierungsstoff | [3] mit Antioxidationsmittel
-[4] mit Geschmacksverstärker | [5] mit Phosphat | [6] Oberfläche gewachst
-[7] geschwefelt | [8] Oliven geschwärzt | [9] mit Süßungsmittel
-[10] - kann bei übermäßigem Verzehr abführend wirken
-[11] - enthält eine Phenylalaninquelle
-[12] - kann Restalkohol enthalten
-[14] - aus Fleischstücken zusammengefügt
-[15] - mit kakaohaltiger Fettglasur
-[27] - aus Fischstücken zusammengefügt
-

-Freiwillige Angaben
-
- enthält Rindfleisch
-
- enthält regionales Rindfleisch aus artgerechter Tierhaltung
-
- enthält Schweinefleisch
-
- enthält regionales Schweinefleisch aus artgerechter Tierhaltung
-
- vegetarisches Gericht
-
- veganes Gericht
-
- MSC aus zertifizierter Fischerei
-
- Mensa Vital
-
-[LAB] - mit tierischem Lab
-[GEL] - mit Gelatine
-
-Eine komplette Liste aller gesetzlich ausweisungspflichtigen Zusatzstoffe und Allergene findest du hier. -
-
-
- - -
- - - Alternative Ansicht des Speiseplans für Sehbehinderte - - -
-Tageskarte herunterladen (PDF) -
-Wochenkarte herunterladen (PDF) - -
- - - - - - - -
-
- - - -
- - Kontakt -
- -

- Menseria Erzbergerstraße
Erzbergerstraße 121
76133 Karlsruhe

Menserialeitung:
Martin Wittmann

E-Mail:gastronomie@sw-ka.de
Telefon: +49 721 752380 -

-

- -

- -
- - -
-
- -
-
- - - - - - - - - - - -
-
- - - - - - - - - - - -

-
-
- - - - - - - - - -
-
- -
-
- -
-
- - -
- -
-
- - - - - -
-
-
-
-
-
-
-
-
- - - - - - - - - - -
- - \ No newline at end of file From 43f0397f6685fb4f7e7d01307a736133a9066ad0 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 13:22:39 +0200 Subject: [PATCH 40/53] naming --- backend/tests/mealplan_management.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/tests/mealplan_management.rs b/backend/tests/mealplan_management.rs index 0d8087a0..9d155315 100644 --- a/backend/tests/mealplan_management.rs +++ b/backend/tests/mealplan_management.rs @@ -19,14 +19,14 @@ async fn setup() -> MealPlanManager Date: Tue, 22 Aug 2023 14:18:54 +0200 Subject: [PATCH 41/53] Formatting --- backend/src/layer/data/database/request.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/src/layer/data/database/request.rs b/backend/src/layer/data/database/request.rs index 08d34fa5..3342111f 100644 --- a/backend/src/layer/data/database/request.rs +++ b/backend/src/layer/data/database/request.rs @@ -7,8 +7,9 @@ use crate::{ model::{Canteen, Image, Line, Meal, Side}, DataError, RequestDataAccess, Result, }, + layer::data::swka_parser::swka_link_creator::NUMBER_OF_WEEKS_TO_POLL, null_error, - util::{Additive, Allergen, Date, MealType, Price, Uuid}, layer::data::swka_parser::swka_link_creator::NUMBER_OF_WEEKS_TO_POLL, + util::{Additive, Allergen, Date, MealType, Price, Uuid}, }; /// We have for four weeks, including the current week @@ -108,8 +109,8 @@ impl RequestDataAccess for PersistentRequestData { // If date too far into the future, return `None`. // This should probably be inside the logic layer which currently does not exists for request. let today = Local::now().date_naive(); - let first_unknown_day = - today.week(chrono::Weekday::Mon).first_day() + Duration::weeks(i64::from(MAX_WEEKS_DATA)); + let first_unknown_day = today.week(chrono::Weekday::Mon).first_day() + + Duration::weeks(i64::from(MAX_WEEKS_DATA)); if date >= first_unknown_day { return Ok(None); } From 6d14e7b27a1d9cc387d8379e4f0e094249619de2 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 17:05:11 +0200 Subject: [PATCH 42/53] mgmt log fixes --- .../layer/logic/mealplan_management/meal_plan_manager.rs | 6 +++--- .../layer/logic/mealplan_management/relation_resolver.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs b/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs index 66c51f9b..35a0d478 100644 --- a/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs +++ b/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs @@ -6,7 +6,7 @@ use crate::layer::logic::mealplan_management::relation_resolver::RelationResolve use crate::util::Date; use async_trait::async_trait; use chrono::Local; -use tracing::{trace, warn}; +use tracing::{trace, error, warn}; pub struct MealPlanManager where @@ -57,7 +57,7 @@ where self.start_resolving(parse_canteens, today).await; } Err(error) => { - warn!("canteens parsed with error and can't be resolved: {error}"); + error!("canteens parsed with error and can't be resolved: {error}"); } } } @@ -74,7 +74,7 @@ where } } Err(error) => { - warn!("canteens parsed with error and can't be resolved: {error}"); + error!("canteens parsed with error and can't be resolved: {error}"); } } } diff --git a/backend/src/layer/logic/mealplan_management/relation_resolver.rs b/backend/src/layer/logic/mealplan_management/relation_resolver.rs index 00c3ae68..631b4872 100644 --- a/backend/src/layer/logic/mealplan_management/relation_resolver.rs +++ b/backend/src/layer/logic/mealplan_management/relation_resolver.rs @@ -43,7 +43,7 @@ where for line in canteen.lines { let name = &line.name.clone(); if let Err(e) = self.resolve_line(date, line, db_canteen).await { - warn!("Skip line '{name}' as it could not be resolved: {e}"); + warn!("Skipped line '{name}' as it could not be resolved: {e}"); } } Ok(()) @@ -74,7 +74,7 @@ where for dish in line.dishes { let name = &dish.name.clone(); if let Err(e) = self.resolve_dish(line_id, date, dish, average).await { - warn!("Skip dish '{name}' as it could not be resolved: {e}"); + warn!("Skipped dish '{name}' as it could not be resolved: {e}"); } } Ok(()) From d0f493159ab1ccebb2990c97d67c2b5ea77b3349 Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Tue, 22 Aug 2023 17:40:02 +0200 Subject: [PATCH 43/53] formatting --- .../src/layer/logic/mealplan_management/meal_plan_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs b/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs index 35a0d478..ebd48ea0 100644 --- a/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs +++ b/backend/src/layer/logic/mealplan_management/meal_plan_manager.rs @@ -6,7 +6,7 @@ use crate::layer::logic::mealplan_management::relation_resolver::RelationResolve use crate::util::Date; use async_trait::async_trait; use chrono::Local; -use tracing::{trace, error, warn}; +use tracing::{error, trace, warn}; pub struct MealPlanManager where From b5e5fffe005a8c293d3185bb9deb82917df47cab Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Wed, 23 Aug 2023 09:28:33 +0200 Subject: [PATCH 44/53] env for weeks to parse --- backend/.env.example | 1 + backend/src/layer/data/database/factory.rs | 10 ++- backend/src/layer/data/database/request.rs | 84 ++++++++++++++----- .../data/swka_parser/swka_link_creator.rs | 11 ++- .../data/swka_parser/swka_parse_manager.rs | 2 + .../data/swka_parser/test/const_test_data.rs | 3 +- backend/src/startup/config.rs | 9 ++ 7 files changed, 95 insertions(+), 25 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index fff40945..f2d5e88e 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -24,6 +24,7 @@ FLICKR_API_KEY= #MENSA_BASE_URL=https://www.sw-ka.de/de/hochschulgastronomie/speiseplan/ #CANTEENS=mensa_adenauerring,mensa_gottesaue,mensa_moltke,mensa_x1moltkestrasse,mensa_erzberger,mensa_tiefenbronner,mensa_holzgarten #USER_AGENT= +#PARSE_WEEKS= # --- graphql server --- diff --git a/backend/src/layer/data/database/factory.rs b/backend/src/layer/data/database/factory.rs index bcbc5196..0fd39dbd 100644 --- a/backend/src/layer/data/database/factory.rs +++ b/backend/src/layer/data/database/factory.rs @@ -12,11 +12,14 @@ use super::{ pub struct DatabaseInfo { /// Connection string to database of format `postgres://:@:/`. pub connection: String, + /// Number of weeks, including the current we /get meal plan data for. + pub max_weeks_data: u32, } /// This class is responsible for instantiating the database access implementations classes. pub struct DataAccessFactory { pool: Pool, + pub max_weeks_data: u32, } const MAX_DB_CONNECTIONS: u32 = 20; @@ -39,7 +42,10 @@ impl DataAccessFactory { info!("Successfully run database migrations"); } - Ok(Self { pool }) + Ok(Self { + pool, + max_weeks_data: info.max_weeks_data, + }) } /// Returns a object for accessing database requests for api commands. @@ -71,6 +77,7 @@ impl DataAccessFactory { pub fn get_request_data_access(&self) -> PersistentRequestData { PersistentRequestData { pool: self.pool.clone(), + max_weeks_data: self.max_weeks_data, } } } @@ -95,6 +102,7 @@ mod tests { let info = DatabaseInfo { connection: connection.clone(), + max_weeks_data: 4, }; let factory = DataAccessFactory::new(info, true) .await diff --git a/backend/src/layer/data/database/request.rs b/backend/src/layer/data/database/request.rs index 3342111f..cb02b5b6 100644 --- a/backend/src/layer/data/database/request.rs +++ b/backend/src/layer/data/database/request.rs @@ -7,18 +7,16 @@ use crate::{ model::{Canteen, Image, Line, Meal, Side}, DataError, RequestDataAccess, Result, }, - layer::data::swka_parser::swka_link_creator::NUMBER_OF_WEEKS_TO_POLL, null_error, util::{Additive, Allergen, Date, MealType, Price, Uuid}, }; -/// We have for four weeks, including the current week -const MAX_WEEKS_DATA: u32 = NUMBER_OF_WEEKS_TO_POLL; - /// Class implementing all database requests arising from graphql manipulations. #[derive(Debug)] pub struct PersistentRequestData { pub(super) pool: Pool, + /// Number of weeks, including the current week, we get/have data for. + pub(super) max_weeks_data: u32, } #[async_trait] @@ -110,7 +108,7 @@ impl RequestDataAccess for PersistentRequestData { // This should probably be inside the logic layer which currently does not exists for request. let today = Local::now().date_naive(); let first_unknown_day = today.week(chrono::Weekday::Mon).first_day() - + Duration::weeks(i64::from(MAX_WEEKS_DATA)); + + Duration::weeks(i64::from(self.max_weeks_data)); if date >= first_unknown_day { return Ok(None); } @@ -300,10 +298,14 @@ mod tests { use sqlx::PgPool; const WRONG_UUID: Uuid = Uuid::from_u128(7u128); + const MAX_WEEKS_DATA: u32 = 5; #[sqlx::test(fixtures("canteen"))] async fn test_get_canteen(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let canteen_id_strs = [ "10728cc4-1e07-4e18-a9d9-ca45b9782413", @@ -330,7 +332,10 @@ mod tests { #[sqlx::test(fixtures("canteen"))] async fn test_get_canteens(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let canteen = request.get_canteens().await.unwrap(); assert!(canteen.len() == 3); @@ -341,7 +346,10 @@ mod tests { #[sqlx::test(fixtures("canteen", "line"))] async fn test_get_line(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let lines = request .get_lines(Uuid::parse_str("10728cc4-1e07-4e18-a9d9-ca45b9782413").unwrap()) @@ -356,7 +364,10 @@ mod tests { #[sqlx::test(fixtures("canteen", "line"))] async fn test_get_lines(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let line_id_strs = [ "3e8c11fa-906a-4c6a-bc71-28756c6b00ae", @@ -379,7 +390,10 @@ mod tests { #[sqlx::test(fixtures("canteen", "line", "meal", "food_plan"))] async fn test_get_meal(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let meal_id_strs = [ "f7337122-b018-48ad-b420-6202dc3cb4ff", @@ -416,7 +430,10 @@ mod tests { #[sqlx::test(fixtures("canteen", "line", "meal", "food_plan"))] async fn test_get_meals(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let line_id = Uuid::parse_str("3e8c11fa-906a-4c6a-bc71-28756c6b00ae").unwrap(); @@ -429,13 +446,19 @@ mod tests { assert_eq!(meals, provide_dummy_meals()); let meals_in_future = request - .get_meals(line_id, Local::now().date_naive() + Duration::weeks(5)) + .get_meals( + line_id, + Local::now().date_naive() + Duration::weeks(i64::from(MAX_WEEKS_DATA)), + ) .await .unwrap(); assert!(meals_in_future.is_none()); let meals_in_near_future = request - .get_meals(line_id, Local::now().date_naive() + Duration::weeks(4)) + .get_meals( + line_id, + Local::now().date_naive() + Duration::weeks(i64::from(MAX_WEEKS_DATA) - 1), + ) .await .unwrap(); assert!(meals_in_near_future.is_some()); @@ -449,7 +472,10 @@ mod tests { #[sqlx::test(fixtures("canteen", "line", "meal", "food_plan"))] async fn test_get_sides(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let date = Local::now().date_naive(); let line_id = Uuid::parse_str("3e8c11fa-906a-4c6a-bc71-28756c6b00ae").unwrap(); @@ -464,7 +490,10 @@ mod tests { #[sqlx::test(fixtures("meal", "image"))] async fn test_get_visible_images(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let meal_id = Uuid::parse_str("f7337122-b018-48ad-b420-6202dc3cb4ff").unwrap(); let client_id = Uuid::parse_str("c51d2d81-3547-4f07-af58-ed613c6ece67").unwrap(); @@ -507,7 +536,10 @@ mod tests { #[sqlx::test(fixtures("meal", "image", "rating"))] async fn test_get_personal_rating(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let meal_id = Uuid::parse_str("f7337122-b018-48ad-b420-6202dc3cb4ff").unwrap(); let client_id = Uuid::parse_str("c51d2d81-3547-4f07-af58-ed613c6ece67").unwrap(); @@ -525,7 +557,10 @@ mod tests { #[sqlx::test(fixtures("meal", "image", "rating"))] async fn test_get_personal_upvote(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let image_id = Uuid::parse_str("76b904fe-d0f1-4122-8832-d0e21acab86d").unwrap(); let client_id = Uuid::parse_str("c51d2d81-3547-4f07-af58-ed613c6ece67").unwrap(); @@ -548,7 +583,10 @@ mod tests { #[sqlx::test(fixtures("meal", "image", "rating"))] async fn test_get_personal_downvote(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let image_id = Uuid::parse_str("76b904fe-d0f1-4122-8832-d0e21acab86d").unwrap(); let client_id = Uuid::parse_str("00adb927-8cb9-4d80-ae01-d8f2e8f2d4cf").unwrap(); @@ -571,7 +609,10 @@ mod tests { #[sqlx::test(fixtures("meal", "additive"))] async fn test_get_additives(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let food_ids = [ "f7337122-b018-48ad-b420-6202dc3cb4ff", "73cf367b-a536-4b49-ad0c-cb984caa9a08", @@ -603,7 +644,10 @@ mod tests { #[sqlx::test(fixtures("meal", "allergen"))] async fn test_get_allergens(pool: PgPool) { - let request = PersistentRequestData { pool }; + let request = PersistentRequestData { + pool, + max_weeks_data: MAX_WEEKS_DATA, + }; let food_ids = [ "f7337122-b018-48ad-b420-6202dc3cb4ff", "73cf367b-a536-4b49-ad0c-cb984caa9a08", diff --git a/backend/src/layer/data/swka_parser/swka_link_creator.rs b/backend/src/layer/data/swka_parser/swka_link_creator.rs index ad4bb70e..be68c91d 100644 --- a/backend/src/layer/data/swka_parser/swka_link_creator.rs +++ b/backend/src/layer/data/swka_parser/swka_link_creator.rs @@ -13,20 +13,25 @@ use crate::util::Date; const URL_SEPARATOR: char = '/'; const WEEK_SELECTOR: &str = "?kw="; -pub const NUMBER_OF_WEEKS_TO_POLL: u32 = 5; pub struct SwKaLinkCreator { base_url: String, valid_canteens: Vec, + number_of_weeks_to_poll: u32, } impl SwKaLinkCreator { /// Method for creating a [`SwKaLinkCreator`] instance. #[must_use] - pub fn new(base_url: String, valid_canteens: Vec) -> Self { + pub fn new( + base_url: String, + valid_canteens: Vec, + number_of_weeks_to_poll: u32, + ) -> Self { Self { base_url, valid_canteens, + number_of_weeks_to_poll, } } @@ -57,7 +62,7 @@ impl SwKaLinkCreator { } fn get_all_urls_for_next_weeks_from_date(&self, date: Date) -> Vec { - (0..NUMBER_OF_WEEKS_TO_POLL) + (0..self.number_of_weeks_to_poll) .flat_map(|week| Self::get_urls(self, date + Duration::weeks(week.into()))) .collect() } diff --git a/backend/src/layer/data/swka_parser/swka_parse_manager.rs b/backend/src/layer/data/swka_parser/swka_parse_manager.rs index 4a0b9844..01810b52 100644 --- a/backend/src/layer/data/swka_parser/swka_parse_manager.rs +++ b/backend/src/layer/data/swka_parser/swka_parse_manager.rs @@ -15,6 +15,7 @@ pub struct SwKaInfo { pub valid_canteens: Vec, pub client_timeout: std::time::Duration, pub client_user_agent: String, + pub number_of_weeks_to_poll: u32, } pub struct SwKaParseManager { @@ -32,6 +33,7 @@ impl SwKaParseManager { link_creator: SwKaLinkCreator::new( parse_info.base_url.clone(), parse_info.valid_canteens.clone(), + parse_info.number_of_weeks_to_poll, ), request: SwKaHtmlRequest::new(parse_info.client_timeout, parse_info.client_user_agent)?, html_parser: HTMLParser::new(), diff --git a/backend/src/layer/data/swka_parser/test/const_test_data.rs b/backend/src/layer/data/swka_parser/test/const_test_data.rs index 7b4d5f4c..347bd62a 100644 --- a/backend/src/layer/data/swka_parser/test/const_test_data.rs +++ b/backend/src/layer/data/swka_parser/test/const_test_data.rs @@ -40,12 +40,13 @@ pub fn get_parse_info() -> SwKaInfo { valid_canteens: get_mensa_names(), client_timeout: get_client_timeout(), client_user_agent: get_client_user_agent(), + number_of_weeks_to_poll: 5, } } #[must_use] pub fn get_creator() -> SwKaLinkCreator { - SwKaLinkCreator::new(get_base_url(), get_mensa_names()) + SwKaLinkCreator::new(get_base_url(), get_mensa_names(), 5) } #[must_use] diff --git a/backend/src/startup/config.rs b/backend/src/startup/config.rs index 7e60254b..69394092 100644 --- a/backend/src/startup/config.rs +++ b/backend/src/startup/config.rs @@ -26,6 +26,7 @@ const DEFAULT_USER_AGENT: &str = "MensaKa 0.1"; const DEFAULT_CLIENT_TIMEOUT: u64 = 6000; const DEFAULT_HTTP_PORT: u16 = 80; const DEFAULT_SMTP_PORT: u16 = 465; +const DEFAULT_PARSE_WEEKS: u32 = 5; /// Class for reading configuration from environment variables. pub struct ConfigReader {} @@ -66,6 +67,10 @@ impl ConfigReader { pub fn read_database_info(&self) -> Result { let info = DatabaseInfo { connection: read_var("DATABASE_URL")?, + max_weeks_data: read_var("PARSE_WEEKS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_PARSE_WEEKS), }; Ok(info) } @@ -135,6 +140,10 @@ impl ConfigReader { client_user_agent: env::var("USER_AGENT") .unwrap_or_else(|_| String::from(DEFAULT_USER_AGENT)), valid_canteens: canteens, + number_of_weeks_to_poll: read_var("PARSE_WEEKS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_PARSE_WEEKS), }; info!( "getting canteen data from {} for canteens {}", From 2434e7f1f3dfcdeeeaa2919ec278e408701bfa44 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Wed, 23 Aug 2023 09:31:38 +0200 Subject: [PATCH 45/53] parse week offset --- backend/src/startup/config.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/backend/src/startup/config.rs b/backend/src/startup/config.rs index 69394092..1a8de319 100644 --- a/backend/src/startup/config.rs +++ b/backend/src/startup/config.rs @@ -26,7 +26,7 @@ const DEFAULT_USER_AGENT: &str = "MensaKa 0.1"; const DEFAULT_CLIENT_TIMEOUT: u64 = 6000; const DEFAULT_HTTP_PORT: u16 = 80; const DEFAULT_SMTP_PORT: u16 = 465; -const DEFAULT_PARSE_WEEKS: u32 = 5; +const DEFAULT_PARSE_WEEKS: u32 = 4; /// Class for reading configuration from environment variables. pub struct ConfigReader {} @@ -67,10 +67,7 @@ impl ConfigReader { pub fn read_database_info(&self) -> Result { let info = DatabaseInfo { connection: read_var("DATABASE_URL")?, - max_weeks_data: read_var("PARSE_WEEKS") - .ok() - .and_then(|s| s.parse().ok()) - .unwrap_or(DEFAULT_PARSE_WEEKS), + max_weeks_data: get_max_weeks_data() }; Ok(info) } @@ -140,10 +137,7 @@ impl ConfigReader { client_user_agent: env::var("USER_AGENT") .unwrap_or_else(|_| String::from(DEFAULT_USER_AGENT)), valid_canteens: canteens, - number_of_weeks_to_poll: read_var("PARSE_WEEKS") - .ok() - .and_then(|s| s.parse().ok()) - .unwrap_or(DEFAULT_PARSE_WEEKS), + number_of_weeks_to_poll: get_max_weeks_data(), }; info!( "getting canteen data from {} for canteens {}", @@ -171,6 +165,14 @@ fn read_var(var: &str) -> Result { env::var(var).map_err(|e| ServerError::MissingEnvVar(var.to_string(), e)) } +fn get_max_weeks_data() -> u32 { + read_var("PARSE_WEEKS") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(DEFAULT_PARSE_WEEKS) + + 1 // +1 for current week +} + #[cfg(test)] mod tests { use super::ConfigReader; From 2f7c09c29fe8a6ed38ce63b31bea944ca9f55538 Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Wed, 23 Aug 2023 09:41:28 +0200 Subject: [PATCH 46/53] formatting --- backend/src/startup/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/startup/config.rs b/backend/src/startup/config.rs index a087e324..f711d3af 100644 --- a/backend/src/startup/config.rs +++ b/backend/src/startup/config.rs @@ -66,7 +66,7 @@ impl ConfigReader { pub fn read_database_info(&self) -> Result { let info = DatabaseInfo { connection: read_var("DATABASE_URL")?, - max_weeks_data: get_max_weeks_data() + max_weeks_data: get_max_weeks_data(), }; Ok(info) } From f9b5433a871f440e013ad27b8f4c957e1093370e Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Wed, 23 Aug 2023 16:53:40 +0200 Subject: [PATCH 47/53] Added image age to mail --- backend/src/interface/admin_notification.rs | 4 +++- backend/src/layer/data/mail/mail_sender.rs | 10 ++++++++++ backend/src/layer/data/mail/template.txt | 3 ++- backend/src/layer/logic/api_command/command_handler.rs | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/src/interface/admin_notification.rs b/backend/src/interface/admin_notification.rs index 5be1a1eb..fbf38ffa 100644 --- a/backend/src/interface/admin_notification.rs +++ b/backend/src/interface/admin_notification.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; -use crate::util::{ReportReason, Uuid}; +use crate::util::{ReportReason, Uuid, Date}; /// Interface for notification of administrators. #[async_trait] @@ -34,4 +34,6 @@ pub struct ImageReportInfo { pub report_barrier: u32, /// User that reported the image. pub client_id: Uuid, + /// The date of the day the image was uploaded + pub upload_date: Date, } diff --git a/backend/src/layer/data/mail/mail_sender.rs b/backend/src/layer/data/mail/mail_sender.rs index abe7e9d6..719246c4 100644 --- a/backend/src/layer/data/mail/mail_sender.rs +++ b/backend/src/layer/data/mail/mail_sender.rs @@ -1,4 +1,5 @@ use async_trait::async_trait; +use chrono::Local; use thiserror::Error; use lettre::{ @@ -91,6 +92,7 @@ impl MailSender { } fn get_report(info: &ImageReportInfo) -> String { + let today = Local::now().date_naive(); let info_array_map = [ ("image_link", &info.image_link as &dyn ToString), ("image_id", &info.image_id), @@ -102,6 +104,7 @@ impl MailSender { ("get_image_rank", &info.get_image_rank), ("report_barrier", &info.report_barrier), ("client_id", &info.client_id), + ("image_age", &today.signed_duration_since(info.upload_date).num_days().to_string()), ]; let info_map = info_array_map @@ -123,6 +126,7 @@ mod test { layer::data::mail::mail_sender::MailSender, util::Uuid, }; + use chrono::Local; use dotenvy; use std::env::{self, VarError}; use tracing_test::traced_test; @@ -181,6 +185,11 @@ mod test { report.contains(info.client_id.to_string().as_str()), "the template must contain all of the information from the report info" ); + let today = Local::now().date_naive(); + assert!( + report.contains(today.signed_duration_since(info.upload_date).num_days().to_string().as_str()), + "the template must contain all of the information from the report info" + ); } #[tokio::test] @@ -223,6 +232,7 @@ mod test { get_image_rank: 1.0, report_barrier: 1, client_id: Uuid::default(), + upload_date: Local::now().date_naive(), } } diff --git a/backend/src/layer/data/mail/template.txt b/backend/src/layer/data/mail/template.txt index c9029319..ae3871ed 100644 --- a/backend/src/layer/data/mail/template.txt +++ b/backend/src/layer/data/mail/template.txt @@ -8,4 +8,5 @@ Image automatically hidden: {{image_got_hidden}} ({{report_barrier}} reports nee Additional Data: Positive ratings: {{positive_rating_count}} Negative ratings: {{negative_rating_count}} -Rank: {{get_image_rank}} \ No newline at end of file +Rank: {{get_image_rank}} +Image age: {{image_age}} \ No newline at end of file diff --git a/backend/src/layer/logic/api_command/command_handler.rs b/backend/src/layer/logic/api_command/command_handler.rs index 7b354dbb..f7180eba 100644 --- a/backend/src/layer/logic/api_command/command_handler.rs +++ b/backend/src/layer/logic/api_command/command_handler.rs @@ -117,6 +117,7 @@ where get_image_rank: info.rank, report_barrier: Self::get_report_barrier(info.upload_date), client_id: auth_info.client_id, + upload_date: info.upload_date, }; self.admin_notification From 114c5c194372f73166ff41fae1dce0886a2b3660 Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Wed, 23 Aug 2023 16:58:10 +0200 Subject: [PATCH 48/53] Improved implementation --- backend/src/interface/admin_notification.rs | 6 +++--- backend/src/layer/data/mail/mail_sender.rs | 10 +++------- backend/src/layer/logic/api_command/command_handler.rs | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/backend/src/interface/admin_notification.rs b/backend/src/interface/admin_notification.rs index fbf38ffa..372d8501 100644 --- a/backend/src/interface/admin_notification.rs +++ b/backend/src/interface/admin_notification.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; -use crate::util::{ReportReason, Uuid, Date}; +use crate::util::{ReportReason, Uuid}; /// Interface for notification of administrators. #[async_trait] @@ -34,6 +34,6 @@ pub struct ImageReportInfo { pub report_barrier: u32, /// User that reported the image. pub client_id: Uuid, - /// The date of the day the image was uploaded - pub upload_date: Date, + /// The age of the image in days + pub image_age: i64, } diff --git a/backend/src/layer/data/mail/mail_sender.rs b/backend/src/layer/data/mail/mail_sender.rs index 719246c4..445ea1e6 100644 --- a/backend/src/layer/data/mail/mail_sender.rs +++ b/backend/src/layer/data/mail/mail_sender.rs @@ -1,5 +1,4 @@ use async_trait::async_trait; -use chrono::Local; use thiserror::Error; use lettre::{ @@ -92,7 +91,6 @@ impl MailSender { } fn get_report(info: &ImageReportInfo) -> String { - let today = Local::now().date_naive(); let info_array_map = [ ("image_link", &info.image_link as &dyn ToString), ("image_id", &info.image_id), @@ -104,7 +102,7 @@ impl MailSender { ("get_image_rank", &info.get_image_rank), ("report_barrier", &info.report_barrier), ("client_id", &info.client_id), - ("image_age", &today.signed_duration_since(info.upload_date).num_days().to_string()), + ("image_age", &info.image_age), ]; let info_map = info_array_map @@ -126,7 +124,6 @@ mod test { layer::data::mail::mail_sender::MailSender, util::Uuid, }; - use chrono::Local; use dotenvy; use std::env::{self, VarError}; use tracing_test::traced_test; @@ -185,9 +182,8 @@ mod test { report.contains(info.client_id.to_string().as_str()), "the template must contain all of the information from the report info" ); - let today = Local::now().date_naive(); assert!( - report.contains(today.signed_duration_since(info.upload_date).num_days().to_string().as_str()), + report.contains(info.image_age.to_string().as_str()), "the template must contain all of the information from the report info" ); } @@ -232,7 +228,7 @@ mod test { get_image_rank: 1.0, report_barrier: 1, client_id: Uuid::default(), - upload_date: Local::now().date_naive(), + image_age: 1, } } diff --git a/backend/src/layer/logic/api_command/command_handler.rs b/backend/src/layer/logic/api_command/command_handler.rs index f7180eba..1dee08e6 100644 --- a/backend/src/layer/logic/api_command/command_handler.rs +++ b/backend/src/layer/logic/api_command/command_handler.rs @@ -117,7 +117,7 @@ where get_image_rank: info.rank, report_barrier: Self::get_report_barrier(info.upload_date), client_id: auth_info.client_id, - upload_date: info.upload_date, + image_age: Self::days_since(info.upload_date), }; self.admin_notification From ade9f6685c409e3cc92eb77cf033428c7c7c890d Mon Sep 17 00:00:00 2001 From: Jonatan Ziegler Date: Fri, 25 Aug 2023 09:18:33 +0200 Subject: [PATCH 49/53] version 1.0.0 --- backend/Cargo.lock | 2 +- backend/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 8979ac7a..273056ae 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1413,7 +1413,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mensa-app-backend" -version = "0.1.0" +version = "1.0.0" dependencies = [ "async-graphql", "async-graphql-axum", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 19987b90..7a1db8bb 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mensa-app-backend" -version = "0.1.0" +version = "1.0.0" edition = "2021" authors = ["Alexander Albers ", "Peer Booken ", "Elena Häußler ", "Alexander Kutschera ", "Jonatan Ziegler Date: Fri, 25 Aug 2023 13:21:38 +0200 Subject: [PATCH 50/53] version 0.2.0 --- backend/Cargo.lock | 2 +- backend/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 273056ae..68d50367 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1413,7 +1413,7 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mensa-app-backend" -version = "1.0.0" +version = "0.2.0" dependencies = [ "async-graphql", "async-graphql-axum", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 7a1db8bb..0d05526a 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mensa-app-backend" -version = "1.0.0" +version = "0.2.0" edition = "2021" authors = ["Alexander Albers ", "Peer Booken ", "Elena Häußler ", "Alexander Kutschera ", "Jonatan Ziegler Date: Fri, 25 Aug 2023 13:54:46 +0200 Subject: [PATCH 51/53] Fixed things suggested by linter --- backend/src/layer/data/database/factory.rs | 3 + .../src/layer/data/swka_parser/html_parser.rs | 5 +- .../logic/api_command/command_handler.rs | 110 +++++++++--------- backend/src/layer/trigger/scheduling/mocks.rs | 12 ++ .../src/layer/trigger/scheduling/scheduler.rs | 5 + backend/src/startup/logging.rs | 5 +- 6 files changed, 82 insertions(+), 58 deletions(-) diff --git a/backend/src/layer/data/database/factory.rs b/backend/src/layer/data/database/factory.rs index 0fd39dbd..55074b4e 100644 --- a/backend/src/layer/data/database/factory.rs +++ b/backend/src/layer/data/database/factory.rs @@ -30,6 +30,9 @@ impl DataAccessFactory { /// If wished, database migrations can be applied to create the wanted relations. /// # Errors /// if a migrations should, but could not run + /// + /// # Panics + /// if the connection to the database could not be established pub async fn new(info: DatabaseInfo, should_migrate: bool) -> Result { let pool = PgPoolOptions::new() .max_connections(MAX_DB_CONNECTIONS) diff --git a/backend/src/layer/data/swka_parser/html_parser.rs b/backend/src/layer/data/swka_parser/html_parser.rs index c64b9f01..d8bc715e 100644 --- a/backend/src/layer/data/swka_parser/html_parser.rs +++ b/backend/src/layer/data/swka_parser/html_parser.rs @@ -181,10 +181,7 @@ impl HTMLParser { ))); } // Here we have two vectors of the same length: One containing Date and one containing ParseCanteen. In order to get one containing tuples of both we use zip() - Ok(dates - .into_iter() - .zip(canteen_for_all_days.into_iter()) - .collect()) + Ok(dates.into_iter().zip(canteen_for_all_days).collect()) } fn get_root_node(document: &Html) -> Result { diff --git a/backend/src/layer/logic/api_command/command_handler.rs b/backend/src/layer/logic/api_command/command_handler.rs index 1dee08e6..59546490 100644 --- a/backend/src/layer/logic/api_command/command_handler.rs +++ b/backend/src/layer/logic/api_command/command_handler.rs @@ -223,24 +223,24 @@ mod test { #[tokio::test] async fn test_report_image() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "zsqn7BQuQZDKhEs2kgjKRA5sAFStu6P+WnF8bEtmU6VVZ7SZn6FB8cUFadoT6s7j9y1MqYMMb3DPctimykn+mg==".into(), client_id: Uuid::try_from("b637365e-9ec5-47cf-8e39-eab3e10de4e5").unwrap(), - }); + }; let image_id = Uuid::try_from("afa781ab-278f-441a-9241-f70e1013ed42").unwrap(); let reason = ReportReason::Advert; assert!(handler.report_image(image_id, reason, None).await.is_err()); assert!(handler - .report_image(image_id, reason, auth_info.clone()) + .report_image(image_id, reason, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "x2D2nVGg9oCyt44TB/pA5LACvo5ZghPVJDMNCfAZOiME8hS1CF4NKaFK3chfbwVEnmZxlVRfmWK2nGHE7yBknQ==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .report_image(IMAGE_ID_TO_FAIL, reason, auth_info.clone()) + .report_image(IMAGE_ID_TO_FAIL, reason, Some(auth_info.clone())) .await .is_err()); } @@ -248,24 +248,24 @@ mod test { #[tokio::test] async fn test_add_image_upvote() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "AQPykbV6530qtbsE93KZsgl0KvORCz5LYH+HhzUSiX1FAFUjo/52y7rnTRq9tlUN3dzRa8xHxWg5y2PwIkItdg==".into(), client_id: Uuid::try_from("4c57fc70-4839-4398-be08-d151c0dbb246").unwrap(), - }); + }; let image_id = Uuid::try_from("1d170ff5-e18b-4c45-b452-8feed7328cd3").unwrap(); assert!(handler.add_image_upvote(image_id, None).await.is_err()); // No auth information present assert!(handler - .add_image_upvote(image_id, auth_info.clone()) + .add_image_upvote(image_id, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "nNfedG2cgeaOutiLzHSUDbYWRS0tDVwK482ULfqDkV0h/nZl6ZN5bwesenmr+CZBJrc2MT1Ps/I+5sKDy2qdCw==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .add_image_upvote(IMAGE_ID_TO_FAIL, auth_info.clone()) + .add_image_upvote(IMAGE_ID_TO_FAIL, Some(auth_info.clone())) .await .is_err()); } @@ -273,25 +273,25 @@ mod test { #[tokio::test] async fn test_add_image_downvote() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "Xz+c2URLRn6rDa58ExTWPXsj3FXnXu/3nPmV62XqypXkQnJTCwI/m9idDRyBqVjqh9ysPKd9tm6JngY/BSYh3Q==".into(), client_id: Uuid::default(), - }); + }; let image_id = Uuid::try_from("1d170ff5-e18b-4c45-b452-8feed7328cd3").unwrap(); assert!(handler.add_image_downvote(image_id, None).await.is_err()); // No auth information present assert!(handler - .add_image_downvote(image_id, auth_info.clone()) + .add_image_downvote(image_id, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "jFEnp7ky0dbUrisVR5Rh6GOAywS1GGePT6TBbuIumbPjoRHkOgO1vW9iJPc64evEX6YuvdNZTpu4JET2bYxJdw==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .add_image_downvote(IMAGE_ID_TO_FAIL, auth_info.clone()) + .add_image_downvote(IMAGE_ID_TO_FAIL, Some(auth_info.clone())) .await .is_err()); } @@ -299,25 +299,25 @@ mod test { #[tokio::test] async fn test_remove_image_upvote() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "8jYXv/+3YqO9j9zJnrkSGy4Bx1VZLgXoW95RodDWZ/PmzcAqqhyKiv2gI09JCBUuBOZoDMkNPhCjbesBkCGaxg==".into(), client_id: Uuid::try_from("4c57fc70-4839-4398-be08-d151c0dbb246").unwrap(), - }); + }; let image_id = Uuid::try_from("1d170ff5-e18b-4c45-b452-8feed7328cd3").unwrap(); assert!(handler.remove_image_upvote(image_id, None).await.is_err()); // No auth information present assert!(handler - .remove_image_upvote(image_id, auth_info.clone()) + .remove_image_upvote(image_id, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "75irLLawyqHZ6RyENq6LgVH91qViG8K9p30xefHUygKYBTkHeAAxMX7zfvmil4FuIr1FcKhFcO7YnubS6JhBrA==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .remove_image_upvote(IMAGE_ID_TO_FAIL, auth_info.clone()) + .remove_image_upvote(IMAGE_ID_TO_FAIL, Some(auth_info.clone())) .await .is_err()); } @@ -325,25 +325,25 @@ mod test { #[tokio::test] async fn test_remove_image_downvote() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "lb4TH+zjHTl0Z9zijEZ7KtOFIBFHvY70rmZtX+Xk/fa++fGJtAS10EjFOqAgx/0scDJDbhpdn9WS5Yy5zCYeoQ==".into(), client_id: Uuid::try_from("4c57fc70-4839-4398-be08-d151c0dbb246").unwrap(), - }); + }; let image_id = Uuid::try_from("1d170ff5-e18b-4c45-b452-8feed7328cd3").unwrap(); assert!(handler.remove_image_downvote(image_id, None).await.is_err()); // No auth information present assert!(handler - .remove_image_downvote(image_id, auth_info.clone()) + .remove_image_downvote(image_id, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "Jv4OClK/9hYeTQPdInfwjoNtUmVmoLp4+q7LEI5gKhDJLdeaEX+cER7BvFU5JTuzQhG7T8sae55fgYF+ybK7cQ==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .remove_image_downvote(IMAGE_ID_TO_FAIL, auth_info.clone()) + .remove_image_downvote(IMAGE_ID_TO_FAIL, Some(auth_info.clone())) .await .is_err()); } @@ -351,11 +351,11 @@ mod test { #[tokio::test] async fn test_add_image() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "ozNFvc9F0FWdrkFuncTpWA8z+ugwwox4El21hNiHoJW1conWnAOL0q7g4iNWEdDViFyTBjmDhK17FKpmReAgrA==".into(), client_id: Uuid::default(), - }); + }; let meal_id = Uuid::try_from("1d170ff5-e18b-4c45-b452-8feed7328cd3").unwrap(); let image_url = "http://test.de"; @@ -364,23 +364,27 @@ mod test { .await .is_err()); assert!(handler - .add_image(meal_id, image_url.to_string(), auth_info.clone()) + .add_image(meal_id, image_url.to_string(), Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "JWN194mSo+ZAMH4ohZ4WO1//k3NH9ztxIFuWjdrKy6ct3+Y4P7zqQs1JiE7p63TkCDRVqlobEqi7bIGuAjGFZg==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .add_image(meal_id, INVALID_URL.to_string(), auth_info.clone()) + .add_image(meal_id, INVALID_URL.to_string(), Some(auth_info.clone())) .await .is_err()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "TLvbxrv6azE4FpA2sROa8CD8ACdRGjj1M6OtLl1h4Q/NYypCKagZz0C2c4SEsoGjRpIbMAaKprFMcavssf2z2w==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; handler - .add_image(MEAL_ID_TO_FAIL, image_url.to_string(), auth_info.clone()) + .add_image( + MEAL_ID_TO_FAIL, + image_url.to_string(), + Some(auth_info.clone()), + ) .await .unwrap_err(); } @@ -388,24 +392,24 @@ mod test { #[tokio::test] async fn test_set_meal_rating() { let handler = get_handler().await.unwrap(); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { api_ident: "YWpzZGg4Mn".into(), hash: "rHh8opE3qYEupyehP6ttMLVpgV0lTmGJE4rV53oFUUGCdQkzZnUu2snS/Hr4ZyYZ/1D7WiLonHSldbYSMLVBVQ==".into(), client_id: Uuid::default(), - }); + }; let meal_id = Uuid::try_from("94cf40a7-ade4-4c1f-b718-89b2d418c2d0").unwrap(); assert!(handler.set_meal_rating(meal_id, 0, None).await.is_err()); assert!(handler - .set_meal_rating(meal_id, 2, auth_info.clone()) + .set_meal_rating(meal_id, 2, Some(auth_info.clone())) .await .is_ok()); - let auth_info = Some(InnerAuthInfo { + let auth_info = InnerAuthInfo { hash: "0gdAkgRigzK+vV4IkP20QdUBZPco1E8zQC01F8WiPNO5BMEyKd+W/PiC7abF68B/s8wRW1MgY/7VdscEaKBQDA==".into(), - ..auth_info.unwrap() - }); + ..auth_info + }; assert!(handler - .set_meal_rating(MEAL_ID_TO_FAIL, 2, auth_info.clone()) + .set_meal_rating(MEAL_ID_TO_FAIL, 2, Some(auth_info.clone())) .await .is_err()); } diff --git a/backend/src/layer/trigger/scheduling/mocks.rs b/backend/src/layer/trigger/scheduling/mocks.rs index ca17a5b2..9a8796be 100644 --- a/backend/src/layer/trigger/scheduling/mocks.rs +++ b/backend/src/layer/trigger/scheduling/mocks.rs @@ -16,6 +16,10 @@ pub struct MensaParseMock { } impl MensaParseMock { + /// A function to get the number of calls to the function of the same name + /// + /// # Panics + /// if the mutex could not be acquired #[must_use] pub fn get_update_calls(&self) -> u32 { *self @@ -24,6 +28,10 @@ impl MensaParseMock { .expect("failed to lock mutex for `update_calls` counter") } + /// A function to get the number of calls to the function of the same name + /// + /// # Panics + /// if the mutex could not be acquired #[must_use] pub fn get_full_calls(&self) -> u32 { *self @@ -65,6 +73,10 @@ pub struct ImageReviewMock { } impl ImageReviewMock { + /// A function to get the number of calls to the function of the same name + /// + /// # Panics + /// if the mutex could not be acquired #[must_use] pub fn get_calls(&self) -> u32 { *self diff --git a/backend/src/layer/trigger/scheduling/scheduler.rs b/backend/src/layer/trigger/scheduling/scheduler.rs index c351c0d5..54754f0d 100644 --- a/backend/src/layer/trigger/scheduling/scheduler.rs +++ b/backend/src/layer/trigger/scheduling/scheduler.rs @@ -35,6 +35,11 @@ pub struct Scheduler { impl Scheduler { /// Creates a new scheduler with time plans specified in `info` and actions specified in the `scheduling`s. + /// + /// # Panics + /// 1. If the scheduler could not be initialised + /// 2. If the schedules could not be created (invalid cron syntax) + /// 3. If the jobs could not be scheduled pub async fn new( info: ScheduleInfo, image_scheduling: impl ImageReviewScheduling + 'static, diff --git a/backend/src/startup/logging.rs b/backend/src/startup/logging.rs index 3a0a3817..8ee42a19 100644 --- a/backend/src/startup/logging.rs +++ b/backend/src/startup/logging.rs @@ -10,7 +10,10 @@ pub struct LogInfo { pub struct Logger; impl Logger { - // Initializes the logger. + /// Initializes the logger. + /// + /// # Panics + /// if the logging config could not be read from the .env file or if the subscriber could not be set pub fn init(info: LogInfo) { let env_filter = EnvFilter::builder() .parse(info.log_config) From 404c117d13a958030c05be05c32604af3be9168b Mon Sep 17 00:00:00 2001 From: Whatsuup Date: Fri, 25 Aug 2023 14:36:22 +0200 Subject: [PATCH 52/53] linter fixes image_review --- .../logic/image_review/image_reviewer.rs | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/backend/src/layer/logic/image_review/image_reviewer.rs b/backend/src/layer/logic/image_review/image_reviewer.rs index 671e5e4f..025109b6 100644 --- a/backend/src/layer/logic/image_review/image_reviewer.rs +++ b/backend/src/layer/logic/image_review/image_reviewer.rs @@ -10,7 +10,7 @@ use crate::interface::{ persistent_data::{model::Image, DataError, ImageReviewDataAccess}, }; -pub type ReviewerResult = std::result::Result; +pub type ReviewerResult = Result; /// Enum describing the possible ways, the image review can fail. #[derive(Debug, Error)] @@ -85,7 +85,7 @@ where let images = join_all(images.into_iter().map(|image| self.review_image(image))).await; images .into_iter() - .filter_map(std::result::Result::err) + .filter_map(Result::err) .for_each(|error| warn!("Error reviewing image: {error}")); } @@ -109,8 +109,6 @@ where #[cfg(test)] mod test { - use tracing_test::traced_test; - use crate::{ interface::{image_review::ImageReviewScheduling, persistent_data::model::Image}, layer::logic::image_review::{ @@ -128,7 +126,7 @@ mod test { }; #[tokio::test] - #[traced_test] + #[tracing_test::traced_test] async fn test_start_image_review() { let image_reviewer = ImageReviewer::new( ImageReviewDatabaseMock::default(), @@ -146,14 +144,14 @@ mod test { async fn test_full_review() { let image_reviewer = get_image_reviewer(); assert!(image_reviewer.try_start_image_review().await.is_ok()); - assert!(image_reviewer.data_access.get_images_for_date_calls() == 1); - assert!( + assert_eq!(image_reviewer.data_access.get_images_for_date_calls(), 1); + assert_eq!( image_reviewer .data_access - .get_unvalidated_images_for_next_week_calls() - == 1 + .get_unvalidated_images_for_next_week_calls(), + 1 ); - assert!(image_reviewer.data_access.get_old_images_calls() == 1); + assert_eq!(image_reviewer.data_access.get_old_images_calls(), 1); } #[tokio::test] @@ -220,9 +218,18 @@ mod test { exp_delete_calls: u32, exp_check_calls: u32, ) { - assert!(image_reviewer.image_hoster.get_existence_calls() == exp_existence_calls); - assert!(image_reviewer.data_access.get_delete_image_calls() == exp_delete_calls); - assert!(image_reviewer.data_access.get_mark_as_checked_calls() == exp_check_calls); + assert_eq!( + image_reviewer.image_hoster.get_existence_calls(), + exp_existence_calls + ); + assert_eq!( + image_reviewer.data_access.get_delete_image_calls(), + exp_delete_calls + ); + assert_eq!( + image_reviewer.data_access.get_mark_as_checked_calls(), + exp_check_calls + ); } fn get_image_reviewer() -> ImageReviewer { From 5bbf5955c9b1c001b741b890ce37a7ef2350692b Mon Sep 17 00:00:00 2001 From: uglrl <134957879+uglrl@users.noreply.github.com> Date: Fri, 25 Aug 2023 14:41:22 +0200 Subject: [PATCH 53/53] Removed panic --- backend/src/layer/data/database/factory.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/layer/data/database/factory.rs b/backend/src/layer/data/database/factory.rs index 55074b4e..a758d458 100644 --- a/backend/src/layer/data/database/factory.rs +++ b/backend/src/layer/data/database/factory.rs @@ -30,15 +30,12 @@ impl DataAccessFactory { /// If wished, database migrations can be applied to create the wanted relations. /// # Errors /// if a migrations should, but could not run - /// - /// # Panics /// if the connection to the database could not be established pub async fn new(info: DatabaseInfo, should_migrate: bool) -> Result { let pool = PgPoolOptions::new() .max_connections(MAX_DB_CONNECTIONS) .connect(&info.connection) - .await - .expect("cannot connect to database"); + .await?; if should_migrate { sqlx::migrate!().run(&pool).await?;