Skip to content

Commit

Permalink
chore: tests
Browse files Browse the repository at this point in the history
  • Loading branch information
notdodo committed Oct 20, 2024
1 parent bfc2f7f commit a99700f
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 36 deletions.
88 changes: 52 additions & 36 deletions app/bot/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
use dptree::deps;
use aws_config::BehaviorVersion;
use aws_sdk_dynamodb::Client as DynamoDbClient;
use lambda_runtime::{service_fn, Error as LambdaError, LambdaEvent};
use serde_json::{json, Value};
use station::search::get_station;
use teloxide::{
prelude::*,
types::{LinkPreviewOptions, Me, ParseMode},
dispatching::{HandlerExt, UpdateFilterExt},
dptree::deps,
payloads::SendMessageSetters,
prelude::{dptree, Bot, Requester, Update},
respond,
types::{LinkPreviewOptions, Me, Message, ParseMode},
utils::command::BotCommands,
};
use tracing::{info, instrument};
mod station;
use aws_config::BehaviorVersion;
use aws_sdk_dynamodb::Client as DynamoDbClient;

use tracing_subscriber::EnvFilter;
mod station;

#[derive(BotCommands, Clone)]
#[command(rename_rule = "lowercase")]
Expand Down Expand Up @@ -65,36 +67,20 @@ async fn lambda_handler(event: LambdaEvent<Value>) -> Result<Value, LambdaError>
.branch(
dptree::entry()
.filter_command::<BaseCommand>()
.endpoint(simple_commands_handler),
.endpoint(base_commands_handler),
)
.branch(dptree::endpoint(|msg: Message, bot: Bot| async move {
let shared_config = aws_config::load_defaults(BehaviorVersion::latest()).await;
let dynamodb_client = DynamoDbClient::new(&shared_config);
let message = msg.text().unwrap();
let text = match get_station(
&dynamodb_client,
message.to_string(),
"Stazioni",
)
.await
{
Ok(Some(item)) => {
if item.nomestaz != message {
format!("{}\nSe non è la stazione corretta prova ad affinare la ricerca.", item.create_station_message())
}else {
item.create_station_message().to_string()
}
}
Err(_) | Ok(None) => "Nessuna stazione trovata con la parola di ricerca.\nInserisci esattamente il nome che vedi dalla pagina https://allertameteo.regione.emilia-romagna.it/livello-idrometrico\nAd esempio 'Cesena', 'Lavino di Sopra' o 'S. Carlo'.\nSe non sai quale cercare prova con /stazioni".to_string()
};
let mut message = text.clone();
if fastrand::choose_multiple(0..10, 1)[0] == 8 {
message = format!("{}\n\nContribuisci al progetto per mantenerlo attivo e sviluppare nuove funzionalità tramite una donazione: https://buymeacoffee.com/d0d0", text);
}
if fastrand::choose_multiple(0..50, 1)[0] == 8 {
message = format!("{}\n\nEsplora o contribuisci al progetto open-source per sviluppare nuove funzionalità: https://github.com/notdodo/erfiume_bot", text);
}
bot.send_message(msg.chat.id, message).await?;
let text = message_handler(&msg);
bot.send_message(msg.chat.id, escape_markdown_v2(&text.await.unwrap()))
.link_preview_options(LinkPreviewOptions {
is_disabled: false,
url: None,
prefer_small_media: true,
prefer_large_media: false,
show_above_text: false,
})
.parse_mode(ParseMode::MarkdownV2)
.await?;
respond(())
}));

Expand Down Expand Up @@ -127,7 +113,7 @@ fn escape_markdown_v2(text: &str) -> String {
.replace("!", "\\!")
}

async fn simple_commands_handler(
async fn base_commands_handler(
bot: Bot,
msg: Message,
cmd: BaseCommand,
Expand Down Expand Up @@ -169,3 +155,33 @@ async fn simple_commands_handler(

Ok(())
}

async fn message_handler(message: &Message) -> Result<String, teloxide::RequestError> {
let shared_config = aws_config::load_defaults(BehaviorVersion::latest()).await;
let dynamodb_client = DynamoDbClient::new(&shared_config);
let msg = message.text().unwrap();
let text = match get_station(
&dynamodb_client,
msg.to_string(),
"Stazioni",
)
.await
{
Ok(Some(item)) => {
if item.nomestaz != msg {
format!("{}\nSe non è la stazione corretta prova ad affinare la ricerca.", item.create_station_message())
}else {
item.create_station_message().to_string()
}
}
Err(_) | Ok(None) => "Nessuna stazione trovata con la parola di ricerca.\nInserisci esattamente il nome che vedi dalla pagina https://allertameteo.regione.emilia-romagna.it/livello-idrometrico\nAd esempio 'Cesena', 'Lavino di Sopra' o 'S. Carlo'.\nSe non sai quale cercare prova con /stazioni".to_string()
};
let mut message = text.clone();
if fastrand::choose_multiple(0..10, 1)[0] == 8 {
message = format!("{}\n\nContribuisci al progetto per mantenerlo attivo e sviluppare nuove funzionalità tramite una donazione: https://buymeacoffee.com/d0d0", text);
}
if fastrand::choose_multiple(0..50, 1)[0] == 8 {
message = format!("{}\n\nEsplora o contribuisci al progetto open-source per sviluppare nuove funzionalità: https://github.com/notdodo/erfiume_bot", text);
}
Ok(message)
}
43 changes: 43 additions & 0 deletions app/bot/src/station/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -331,3 +331,46 @@ pub fn stations() -> Vec<String> {
];
stations.iter().map(|s| s.to_string()).collect()
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn create_station_message_with_unknown_value() {
let station = Stazione {
idstazione: "/id/".to_string(),
timestamp: 1729454542656,
ordinamento: 1,
nomestaz: "Cesena".to_string(),
lon: "lon".to_string(),
lat: "lat".to_string(),
soglia1: 1.0,
soglia2: 2.0,
soglia3: 3.0,
value: UNKNOWN_VALUE,
};
let expected = "Stazione: Cesena\nValore: non disponibile \nSoglia Gialla: 1\nSoglia Arancione: 2\nSoglia Rossa: 3\nUltimo rilevamento: 20-10-2024 22:02".to_string();

assert_eq!(station.create_station_message(), expected);
}

#[test]
fn create_station_message() {
let station = Stazione {
idstazione: "/id/".to_string(),
timestamp: 1729454542656,
ordinamento: 1,
nomestaz: "Cesena".to_string(),
lon: "lon".to_string(),
lat: "lat".to_string(),
soglia1: 1.0,
soglia2: 2.0,
soglia3: 3.0,
value: 2.2,
};
let expected = "Stazione: Cesena\nValore: 2.2 🟠\nSoglia Gialla: 1\nSoglia Arancione: 2\nSoglia Rossa: 3\nUltimo rilevamento: 20-10-2024 22:02".to_string();

assert_eq!(station.create_station_message(), expected);
}
}

0 comments on commit a99700f

Please sign in to comment.