2 schema::captcha_answer::dsl::{answer, captcha_answer, uuid},
3 source::captcha_answer::{CaptchaAnswer, CaptchaAnswerForm, CheckCaptchaAnswer},
4 utils::{functions::lower, get_conn, DbPool},
15 use diesel_async::RunQueryDsl;
18 pub async fn insert(pool: &DbPool, captcha: &CaptchaAnswerForm) -> Result<Self, Error> {
19 let conn = &mut get_conn(pool).await?;
21 insert_into(captcha_answer)
23 .get_result::<Self>(conn)
27 pub async fn check_captcha(pool: &DbPool, to_check: CheckCaptchaAnswer) -> Result<bool, Error> {
28 let conn = &mut get_conn(pool).await?;
30 // fetch requested captcha
31 let captcha_exists = select(exists(
33 .filter((uuid).eq(to_check.uuid))
34 .filter(lower(answer).eq(to_check.answer.to_lowercase().clone())),
36 .get_result::<bool>(conn)
39 // delete checked captcha
40 delete(captcha_answer.filter(uuid.eq(to_check.uuid)))
51 source::captcha_answer::{CaptchaAnswer, CaptchaAnswerForm, CheckCaptchaAnswer},
52 utils::build_db_pool_for_tests,
54 use serial_test::serial;
58 async fn test_captcha_happy_path() {
59 let pool = &build_db_pool_for_tests().await;
61 let inserted = CaptchaAnswer::insert(
64 answer: "XYZ".to_string(),
68 .expect("should not fail to insert captcha");
70 let result = CaptchaAnswer::check_captcha(
74 answer: "xyz".to_string(),
79 assert!(result.is_ok());
80 assert!(result.unwrap());
85 async fn test_captcha_repeat_answer_fails() {
86 let pool = &build_db_pool_for_tests().await;
88 let inserted = CaptchaAnswer::insert(
91 answer: "XYZ".to_string(),
95 .expect("should not fail to insert captcha");
97 let _result = CaptchaAnswer::check_captcha(
101 answer: "xyz".to_string(),
106 let result_repeat = CaptchaAnswer::check_captcha(
110 answer: "xyz".to_string(),
115 assert!(result_repeat.is_ok());
116 assert!(!result_repeat.unwrap());