tests
This commit is contained in:
32
src/lib.rs
32
src/lib.rs
@@ -1,7 +1,7 @@
|
||||
|
||||
use nanobyte_tera::{hosts::static_filter, l18n::translate_filter, date::{calculate_age, get_year}, string::insert_space_every, gravatar::gravatar_link};
|
||||
use ovlach_tera::entity::lang_entity;
|
||||
use rocket::{*, fairing::AdHoc};
|
||||
use rocket::{*, fairing::{AdHoc, Fairing}};
|
||||
use rocket_dyn_templates::Template;
|
||||
use ::serde::{Deserialize, Serialize};
|
||||
use tools::tera::advanced_filter;
|
||||
@@ -35,6 +35,22 @@ pub struct DefaultPerson {
|
||||
default_person_name: String,
|
||||
}
|
||||
|
||||
pub fn template_fairing() -> impl Fairing {
|
||||
Template::try_custom(|engines| {
|
||||
engines.tera.register_filter("static", static_filter);
|
||||
engines.tera.register_filter("translate", translate_filter);
|
||||
engines.tera.register_filter("calculate_age", calculate_age);
|
||||
engines.tera.register_filter("insert_space_every", insert_space_every);
|
||||
engines.tera.register_filter("gravatar_link", gravatar_link);
|
||||
// filters specific to API
|
||||
engines.tera.register_filter("lang_entity", lang_entity);
|
||||
engines.tera.register_filter("format_date", get_year); // deprecated
|
||||
engines.tera.register_filter("get_year", get_year);
|
||||
engines.tera.register_filter("advanced_filter", advanced_filter);
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
pub fn rocket_builder() -> Rocket<Build> {
|
||||
let rocket = rocket::build();
|
||||
@@ -43,19 +59,7 @@ pub fn rocket_builder() -> Rocket<Build> {
|
||||
//let config: PresentationConfig = figment.extract().expect("config");
|
||||
|
||||
rocket.attach(
|
||||
Template::try_custom(|engines| {
|
||||
engines.tera.register_filter("static", static_filter);
|
||||
engines.tera.register_filter("translate", translate_filter);
|
||||
engines.tera.register_filter("calculate_age", calculate_age);
|
||||
engines.tera.register_filter("insert_space_every", insert_space_every);
|
||||
engines.tera.register_filter("gravatar_link", gravatar_link);
|
||||
// filters specific to API
|
||||
engines.tera.register_filter("lang_entity", lang_entity);
|
||||
engines.tera.register_filter("format_date", get_year); // deprecated
|
||||
engines.tera.register_filter("get_year", get_year);
|
||||
engines.tera.register_filter("advanced_filter", advanced_filter);
|
||||
Ok(())
|
||||
})
|
||||
template_fairing()
|
||||
).attach(
|
||||
AdHoc::config::<PresentationConfig>()
|
||||
).attach(
|
||||
|
||||
@@ -48,3 +48,104 @@ pub fn index_without_lang() -> Redirect {
|
||||
// Default language is czech (TODO: config)
|
||||
Redirect::to(format!("{}/{}", "", "cs"))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::collections::HashMap;
|
||||
use crate::template_fairing;
|
||||
|
||||
use super::*;
|
||||
|
||||
use chrono::NaiveDate;
|
||||
use nanobyte_opentelemetry::rocket::TracingFairing;
|
||||
use ovlach_data::cv::data::{CV, SocalLinks, Person};
|
||||
use rocket::local::asynchronous::Client;
|
||||
use rocket::{routes, Build};
|
||||
use serde_json::json;
|
||||
use wiremock::{MockServer, Mock, ResponseTemplate};
|
||||
use wiremock::matchers::{method, path};
|
||||
|
||||
|
||||
fn create_cv() -> CV {
|
||||
let mut about = HashMap::<String, String>::new();
|
||||
about.insert("cs".to_string(), "czech".to_string());
|
||||
CV {
|
||||
person: Person {
|
||||
name: "TEST@NAME".to_string(),
|
||||
email: "TEST@EMAIL".to_string(),
|
||||
surname: "TEST@SURNAME".to_string(),
|
||||
birthday: NaiveDate::from_ymd_opt(1980, 1, 1).unwrap(),
|
||||
phone: 800017002,
|
||||
adress: None,
|
||||
social: SocalLinks {
|
||||
facebook: None,
|
||||
linkedin: None,
|
||||
github: None,
|
||||
instagram: None,
|
||||
mastodon: None,
|
||||
},
|
||||
about,
|
||||
},
|
||||
languages: vec![],
|
||||
education: vec![],
|
||||
jobs: vec![],
|
||||
skills: vec![],
|
||||
}
|
||||
}
|
||||
|
||||
fn build_rocket(port: u16) -> rocket::Rocket<Build> {
|
||||
let data_source = CVBackendConfig{
|
||||
cv_backend_path: format!("http://localhost:{}", port),
|
||||
};
|
||||
|
||||
let presentation_config = PresentationConfig {
|
||||
static_route: format!("http://localhost:{}", port),
|
||||
};
|
||||
|
||||
let default_person = DefaultPerson {
|
||||
default_person_name: "foo".to_string(),
|
||||
};
|
||||
|
||||
let frontend_svc = FrontendSVCConfig {
|
||||
contact_service: "http://localhost:8080".to_string(),
|
||||
pdf_service: "http://localhost:8080".to_string(),
|
||||
};
|
||||
|
||||
rocket::build()
|
||||
.mount("/", routes![index])
|
||||
.attach(TracingFairing::ignite())
|
||||
.attach(template_fairing())
|
||||
.manage(presentation_config)
|
||||
.manage(default_person)
|
||||
.manage(data_source)
|
||||
.manage(frontend_svc)
|
||||
}
|
||||
|
||||
#[test_log::test(tokio::test)]
|
||||
async fn main() {
|
||||
// Start a background HTTP server on a random local port
|
||||
let mock_server = MockServer::start().await;
|
||||
|
||||
// Arrange the behaviour of the MockServer adding a Mock:
|
||||
// when it receives a GET request on '/hello' it will respond with a 200.
|
||||
Mock::given(method("GET"))
|
||||
.and(path("/api/v1/cv/foo"))
|
||||
.respond_with(ResponseTemplate::new(200).set_body_json(json!(create_cv())))
|
||||
// Mounting the mock on the mock server - it's now effective!
|
||||
.mount(&mock_server)
|
||||
.await;
|
||||
|
||||
let rocket = build_rocket(mock_server.address().port());
|
||||
let client = Client::tracked(rocket).await.unwrap();
|
||||
let response = client
|
||||
.get("/cs").dispatch().await;
|
||||
|
||||
assert_eq!(response.status(), Status::Ok);
|
||||
assert!(response.body().is_some());
|
||||
assert_eq!(response.content_type(), Some("text/html".parse().unwrap()));
|
||||
let body = response.into_string().await.unwrap();
|
||||
assert!(body.contains("TEST@NAME"));
|
||||
assert!(body.contains("TEST@EMAIL"));
|
||||
assert!(body.contains("TEST@SURNAME"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ impl From<reqwest::Error> for FetchError {
|
||||
|
||||
#[instrument]
|
||||
pub async fn fetch_cv_data_from_backend(backend_host: &String, person_name: &String, client: &Client) -> Result<CV, FetchError> {
|
||||
let url = format!("{}/{}/{}", backend_host, "/api/v1/cv", person_name);
|
||||
let url = format!("{}/{}/{}", backend_host, "api/v1/cv", person_name);
|
||||
debug!("Fetching CV data from backend: {}", url);
|
||||
let resp = client
|
||||
.get(url).send()
|
||||
|
||||
Reference in New Issue
Block a user