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
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
);

@ -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)');

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

@ -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);
}

@ -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
welcome: Beinvenue
Loading…
Cancel
Save