From fb0d28a1756ad92d577c6d5e47cc30403709df6d Mon Sep 17 00:00:00 2001 From: Tait Hoyem Date: Sun, 16 Apr 2023 12:17:57 -0600 Subject: [PATCH] Add tests for languages, use lowercase country designation --- .../20230408203101_create_languages.up.sql | 4 +-- .../20230408204846_add_languages.up.sql | 4 +-- src/languages.rs | 21 ++++++++++++ src/main.rs | 34 +++++-------------- src/model.rs | 24 +++++++++++++ translations/en-CA.yml | 5 --- translations/en-ca.yml | 9 +++++ translations/{fr-CA.yml => fr-ca.yml} | 1 + 8 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 src/languages.rs delete mode 100644 translations/en-CA.yml create mode 100644 translations/en-ca.yml rename translations/{fr-CA.yml => fr-ca.yml} (51%) diff --git a/migrations/20230408203101_create_languages.up.sql b/migrations/20230408203101_create_languages.up.sql index e8907e7..d55f04d 100644 --- a/migrations/20230408203101_create_languages.up.sql +++ b/migrations/20230408203101_create_languages.up.sql @@ -1,8 +1,8 @@ -- Add up migration script here CREATE TABLE IF NOT EXISTS supported_languages ( id SERIAL PRIMARY KEY NOT NULL, - -- this will be used in the url, like "/en/...", or "/fr/..." - short_name VARCHAR(2) NOT NULL, + -- this will be used in the url, like "/en-ca/...", or "/fr-ca/..." + short_name VARCHAR(5) NOT NULL, -- this will be the native name of the langauge on the page where you can select your language native_name VARCHAR(32) NOT NULL ); diff --git a/migrations/20230408204846_add_languages.up.sql b/migrations/20230408204846_add_languages.up.sql index eb1e790..7a60914 100644 --- a/migrations/20230408204846_add_languages.up.sql +++ b/migrations/20230408204846_add_languages.up.sql @@ -2,5 +2,5 @@ INSERT INTO supported_languages (id, short_name, native_name) VALUES - (1, 'en', 'English'), - (2, 'fr', 'Français'); + (1, 'en-ca', 'English (Canada)'), + (2, 'fr-ca', 'Français (Canada)'); diff --git a/src/languages.rs b/src/languages.rs new file mode 100644 index 0000000..74fa84e --- /dev/null +++ b/src/languages.rs @@ -0,0 +1,21 @@ +use serde::{ + Serialize, + Deserialize, +}; +use strum_macros::{ + EnumIter, + EnumVariantNames, + EnumCount, +}; + +use derive_more::Display; + +#[derive(Serialize, Deserialize, Clone, Copy, Debug, Display, EnumIter, EnumCount, EnumVariantNames)] +pub enum SupportedLanguage { + #[serde(rename="en-ca")] + #[display(fmt="en-ca")] + English, + #[serde(rename="fr-ca")] + #[display(fmt="fr-ca")] + French, +} diff --git a/src/main.rs b/src/main.rs index 571c6b3..27249fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,33 +2,14 @@ mod db; mod filters; mod model; mod views; +mod languages; use crate::model::{Division, Game, GamePlayer, League, Player, Shot, Team, Language}; use serde::{Serialize, Deserialize}; -use derive_more::Display; - -#[derive(Serialize, Deserialize, Clone, Copy, Debug, Display)] -pub enum SupportedLanguage { - #[serde(rename="en-ca")] - #[display(fmt="en-ca")] - English, - #[serde(rename="fr-ca")] - #[display(fmt="fr-ca")] - French, -} -/* -impl std::fmt::Display for SupportedLanguage { - fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { - match self { - Self::English => write!(fmt, "en-ca"), - Self::French => write!(fmt, "fr-ca"), - } - } -} -*/ use views::{GoalDetails, PlayerStats, ShotDetails, TeamStats, IihfStatsI64}; +use languages::SupportedLanguage; use rust_i18n::t; rust_i18n::i18n!("translations"); @@ -148,7 +129,7 @@ pub struct ServerState { #[tokio::main] async fn main() { - println!("{}", t!("hello", locale="fr")); + println!("{}", t!("game_url", locale="en-ca")); println!("{:?}", available_locales()); let pool = db::connect().await; let state = ServerState { @@ -156,12 +137,13 @@ async fn main() { }; let router = Router::new() .route("/", get(language_list)) - .route("/:lang/", get(league_html)) + .route(&t!("home_url", locale="en-ca"), get(league_html)) .route("/:lang/shots/", get(shots_all)) .route("/:lang/test/", get(test_template)) - .route("/:lang/league/:id/", get(divisions_for_league_html)) - .route("/:lang/division/:id/", get(games_for_division_html)) - .route("/:lang/game/:id/", get(score_for_game_html)) + .route(&t!("league_url", locale="en-ca"), get(divisions_for_league_html)) + .route(&t!("division_url", locale="en-ca"), get(games_for_division_html)) + .route(&t!("game_url", locale="en-ca"), get(score_for_game_html)) + .route(&t!("game_url", locale="fr-ca"), get(score_for_game_html)) .route("/:lang/player/:name/", get(player_from_name)) .with_state(state); let addr = SocketAddr::from(([127, 0, 0, 1], 8000)); diff --git a/src/model.rs b/src/model.rs index a3c7dba..bbe0ab9 100644 --- a/src/model.rs +++ b/src/model.rs @@ -17,6 +17,7 @@ macro_rules! impl_table_name { #[derive(FromRow, Serialize, Deserialize, Debug, ormx::Table)] #[ormx(table = "supported_languages", id = id, insertable, deletable)] pub struct Language { + #[ormx(default)] pub id: i32, pub native_name: String, pub short_name: String, @@ -156,11 +157,15 @@ impl_table_name!(Team, "teams"); impl_table_name!(Shot, "shots"); impl_table_name!(Game, "games"); impl_table_name!(Period, "periods"); +impl_table_name!(Language, "supported_languages"); #[cfg(test)] mod tests { + use ormx::Table; use std::env; + use crate::languages::SupportedLanguage; use crate::model::{ + Language, GamePlayer, Player, League, @@ -170,6 +175,24 @@ mod tests { TableName, Game, }; + use strum::{ + EnumCount, + IntoEnumIterator, + }; + + #[test] + fn db_languages_match_supported_langauges_enum() { + tokio_test::block_on(async move { + let pool = db_connect().await; + let db_langs = Language::all(&pool).await.unwrap(); + assert_eq!(db_langs.len(), SupportedLanguage::COUNT); + for lang_name in SupportedLanguage::iter() { + let found = db_langs.iter().find(|db_lang| db_lang.short_name == format!("{}", lang_name)); + assert!(found.is_some(), "No database language found for variant {lang_name}"); + assert_eq!(found.unwrap().short_name, lang_name.to_string()); + } + }); + } #[test] fn test_get_player_from_name() { @@ -224,4 +247,5 @@ mod tests { generate_select_test!(Team, select_team); generate_select_test!(Shot, select_shot); generate_select_test!(Game, select_game); + generate_select_test!(Language, select_lang); } diff --git a/translations/en-CA.yml b/translations/en-CA.yml deleted file mode 100644 index f3d9344..0000000 --- a/translations/en-CA.yml +++ /dev/null @@ -1,5 +0,0 @@ -test: 123 -welcome: Welcome! -test2: 123123 -message: Can we %{go} to the store? -hello: Hello World diff --git a/translations/en-ca.yml b/translations/en-ca.yml new file mode 100644 index 0000000..02c8206 --- /dev/null +++ b/translations/en-ca.yml @@ -0,0 +1,9 @@ +home_url: /:lang/ +game_url: /:lang/game/:id/ +league_url: /:lang/league/:id/ +division_url: /:lang/division/:id/ +test: 123 +welcome: Welcome! +test2: 123123 +message: Can we %{go} to the store? +hello: Hello World diff --git a/translations/fr-CA.yml b/translations/fr-ca.yml similarity index 51% rename from translations/fr-CA.yml rename to translations/fr-ca.yml index c97c232..84e8ff8 100644 --- a/translations/fr-CA.yml +++ b/translations/fr-ca.yml @@ -1,2 +1,3 @@ +game_url: /:lang/match/:id/ test: Test welcome: Beinvenue