Add tests for languages, use lowercase country designation

master
Tait Hoyem 1 year ago
parent 4a1f48b3bc
commit fb0d28a175

@ -1,8 +1,8 @@
-- Add up migration script here -- Add up migration script here
CREATE TABLE IF NOT EXISTS supported_languages ( CREATE TABLE IF NOT EXISTS supported_languages (
id SERIAL PRIMARY KEY NOT NULL, id SERIAL PRIMARY KEY NOT NULL,
-- this will be used in the url, like "/en/...", or "/fr/..." -- this will be used in the url, like "/en-ca/...", or "/fr-ca/..."
short_name VARCHAR(2) NOT NULL, short_name VARCHAR(5) NOT NULL,
-- this will be the native name of the langauge on the page where you can select your language -- this will be the native name of the langauge on the page where you can select your language
native_name VARCHAR(32) NOT NULL native_name VARCHAR(32) NOT NULL
); );

@ -2,5 +2,5 @@
INSERT INTO supported_languages INSERT INTO supported_languages
(id, short_name, native_name) (id, short_name, native_name)
VALUES VALUES
(1, 'en', 'English'), (1, 'en-ca', 'English (Canada)'),
(2, 'fr', 'Français'); (2, 'fr-ca', 'Français (Canada)');

@ -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,
}

@ -2,33 +2,14 @@ mod db;
mod filters; mod filters;
mod model; mod model;
mod views; mod views;
mod languages;
use crate::model::{Division, Game, GamePlayer, League, Player, Shot, Team, Language}; use crate::model::{Division, Game, GamePlayer, League, Player, Shot, Team, Language};
use serde::{Serialize, Deserialize}; 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 views::{GoalDetails, PlayerStats, ShotDetails, TeamStats, IihfStatsI64};
use languages::SupportedLanguage;
use rust_i18n::t; use rust_i18n::t;
rust_i18n::i18n!("translations"); rust_i18n::i18n!("translations");
@ -148,7 +129,7 @@ pub struct ServerState {
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
println!("{}", t!("hello", locale="fr")); println!("{}", t!("game_url", locale="en-ca"));
println!("{:?}", available_locales()); println!("{:?}", available_locales());
let pool = db::connect().await; let pool = db::connect().await;
let state = ServerState { let state = ServerState {
@ -156,12 +137,13 @@ async fn main() {
}; };
let router = Router::new() let router = Router::new()
.route("/", get(language_list)) .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/shots/", get(shots_all))
.route("/:lang/test/", get(test_template)) .route("/:lang/test/", get(test_template))
.route("/:lang/league/:id/", get(divisions_for_league_html)) .route(&t!("league_url", locale="en-ca"), get(divisions_for_league_html))
.route("/:lang/division/:id/", get(games_for_division_html)) .route(&t!("division_url", locale="en-ca"), get(games_for_division_html))
.route("/:lang/game/:id/", get(score_for_game_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)) .route("/:lang/player/:name/", get(player_from_name))
.with_state(state); .with_state(state);
let addr = SocketAddr::from(([127, 0, 0, 1], 8000)); let addr = SocketAddr::from(([127, 0, 0, 1], 8000));

@ -17,6 +17,7 @@ macro_rules! impl_table_name {
#[derive(FromRow, Serialize, Deserialize, Debug, ormx::Table)] #[derive(FromRow, Serialize, Deserialize, Debug, ormx::Table)]
#[ormx(table = "supported_languages", id = id, insertable, deletable)] #[ormx(table = "supported_languages", id = id, insertable, deletable)]
pub struct Language { pub struct Language {
#[ormx(default)]
pub id: i32, pub id: i32,
pub native_name: String, pub native_name: String,
pub short_name: String, pub short_name: String,
@ -156,11 +157,15 @@ impl_table_name!(Team, "teams");
impl_table_name!(Shot, "shots"); impl_table_name!(Shot, "shots");
impl_table_name!(Game, "games"); impl_table_name!(Game, "games");
impl_table_name!(Period, "periods"); impl_table_name!(Period, "periods");
impl_table_name!(Language, "supported_languages");
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use ormx::Table;
use std::env; use std::env;
use crate::languages::SupportedLanguage;
use crate::model::{ use crate::model::{
Language,
GamePlayer, GamePlayer,
Player, Player,
League, League,
@ -170,6 +175,24 @@ mod tests {
TableName, TableName,
Game, 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] #[test]
fn test_get_player_from_name() { fn test_get_player_from_name() {
@ -224,4 +247,5 @@ mod tests {
generate_select_test!(Team, select_team); generate_select_test!(Team, select_team);
generate_select_test!(Shot, select_shot); generate_select_test!(Shot, select_shot);
generate_select_test!(Game, select_game); generate_select_test!(Game, select_game);
generate_select_test!(Language, select_lang);
} }

@ -1,5 +0,0 @@
test: 123
welcome: Welcome!
test2: 123123
message: Can we %{go} to the store?
hello: Hello World

@ -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

@ -1,2 +1,3 @@
game_url: /:lang/match/:id/
test: Test test: Test
welcome: Beinvenue welcome: Beinvenue
Loading…
Cancel
Save