1#![feature(once_cell_get_mut)]
22#![feature(macro_metavar_expr)]
23extern crate core;
24
25pub mod api;
26pub mod components;
27pub mod css;
28pub mod pages;
29pub mod static_components;
30pub mod utils;
31pub mod js;
32
33pub use app::*;
34pub use utils::*;
35
36#[cfg(test)]
40mod tests {
41 use crate::defaults::{DEFAULT_NO_TEXT, DEFAULT_TEXT_ITEM, PARAMS_CSS_CLASS, PARAMS_ID, PARAMS_TITLE};
42 use crate::jobs::JobResult;
43 use crate::testdata::data::{create_test_form, RAW_HTML_PREFORMATTED, TESTDATA_EXPECTED_FORMDATA, TESTDATA_EXPECTED_FORMDATA_EMPTY, TESTDATA_FORMDATA_EMPTY_REQUEST, TESTDATA_FORMDATA_EMPTY_REQUEST_WITH_BOUNDARIES, TESTDATA_FORMDATA_REQUEST, TRIMMED_HTML_PREFORMATTED, TRIMMED_HTML_TITLE_RENDER};
44 use crate::{rumtk_web_check_on_job, rumtk_web_get_job_manager, rumtk_web_get_text_item, rumtk_web_init_components, rumtk_web_init_job_manager, rumtk_web_post_process_html, rumtk_web_render, rumtk_web_render_component, rumtk_web_render_redirect, rumtk_web_render_template, rumtk_web_trim_rendered_html, AppState, HTMLResult, RUMWebData, RUMWebRedirect, SharedAppState, URLParams, URLPath};
45 use crate::{RUMWebResponse, RUMWebTemplate};
46 use rumtk_core::strings::{RUMString, RUMStringConversions, ToCompactString};
47 use rumtk_core::{rumtk_new_lock, rumtk_sleep};
48
49 #[test]
51 fn test_compile_form() {
52 let expected_form = TESTDATA_EXPECTED_FORMDATA();
53 let form_data = create_test_form(TESTDATA_FORMDATA_REQUEST).expect("Form");
54
55 assert_eq!(form_data, expected_form, "Form results mismatch!");
56 }
57
58 #[test]
59 fn test_compile_empty_form() {
60 let expected_form = TESTDATA_EXPECTED_FORMDATA_EMPTY();
61 let form_data = create_test_form(TESTDATA_FORMDATA_EMPTY_REQUEST).expect("Form");
62
63 assert_eq!(form_data, expected_form, "Form results mismatch!");
64 }
65
66 #[test]
67 fn test_compile_empty_form_with_boundaries() {
68 let expected_form = TESTDATA_EXPECTED_FORMDATA_EMPTY();
69 let form_data = create_test_form(TESTDATA_FORMDATA_EMPTY_REQUEST_WITH_BOUNDARIES).expect("Form");
70
71 assert_eq!(form_data, expected_form, "Form results mismatch!");
72 }
73
74 #[test]
76 fn test_render_redirect_response() {
77 let url = "http://localhost/redirected";
78 let redirect =
79 rumtk_web_render_redirect!(RUMWebRedirect::Redirect(url.to_rumstring())).unwrap();
80 let redirect_code = redirect.get_code();
81 let redirect_url = redirect.get_url();
82 assert_eq!(redirect_url, url, "Redirect url mismatch!");
83 assert_eq!(redirect_code, 303, "Wrong redirect code!");
84 }
85
86 #[test]
87 fn test_render_redirect_response_temporary() {
88 let url = "http://localhost/redirected";
89 let redirect =
90 rumtk_web_render_redirect!(RUMWebRedirect::RedirectTemporary(url.to_rumstring()))
91 .unwrap();
92 let redirect_code = redirect.get_code();
93 let redirect_url = redirect.get_url();
94 assert_eq!(redirect_url, url, "Redirect url mismatch!");
95 assert_eq!(redirect_code, 307, "Wrong redirect code!");
96 }
97
98 #[test]
99 fn test_render_redirect_response_permanent() {
100 let url = "http://localhost/redirected";
101 let redirect =
102 rumtk_web_render_redirect!(RUMWebRedirect::RedirectPermanent(url.to_rumstring()))
103 .unwrap();
104 let redirect_code = redirect.get_code();
105 let redirect_url = redirect.get_url();
106 assert_eq!(redirect_url, url, "Redirect url mismatch!");
107 assert_eq!(redirect_code, 308, "Wrong redirect code!");
108 }
109
110 #[test]
111 fn test_render_standard_web_component() {
112 rumtk_web_init_components!(None);
113
114 let params = [(PARAMS_TITLE, "Hello World!")];
115 let state = SharedAppState::default();
116 let rendered = rumtk_web_render_component!("title", params, state).unwrap().to_rumstring();
117
118 assert_eq!(
119 rendered, TRIMMED_HTML_TITLE_RENDER,
120 "Commponent rendered improperly!"
121 );
122 }
123
124 #[test]
125 fn test_render() {
126 #[derive(RUMWebTemplate)]
127 #[template(source = "<div></div>", ext = "html")]
128 struct Div {}
129
130 let result = rumtk_web_render(Div {}, RUMWebRedirect::None).unwrap();
131 let expected = RUMWebResponse::into_get_response("<div></div>");
132
133 assert_eq!(result, expected, "Test Div template rendered improperly!");
134 }
135
136
137 #[test]
138 fn test_trim_preformatted_component() {
139 let result = rumtk_web_trim_rendered_html(RAW_HTML_PREFORMATTED.to_string()).unwrap();
140
141 assert_eq!(result, TRIMMED_HTML_PREFORMATTED.to_string(), "Preformatted html string was filtered inappropriately.!");
142 }
143
144 #[test]
146 fn test_job_run() {
147 const HELLO_STR: &str = "Hello World";
148
149 let workers: usize = 5;
150 rumtk_web_init_job_manager!(&workers);
151 rumtk_web_init_components!(
152 Some(vec![
153 ("my_element", my_element)
154 ])
155 );
156
157 async fn basic_processor() -> JobResult {
158 Ok(Some(rumtk_web_post_process_html!(RUMString::new(HELLO_STR))))
159 }
160
161 fn my_element(_path_components: URLPath, params: URLParams, state: SharedAppState) -> HTMLResult {
162 let job_id = rumtk_web_get_text_item!(params, PARAMS_ID, DEFAULT_NO_TEXT);
163 let css_class = rumtk_web_get_text_item!(params, PARAMS_CSS_CLASS, DEFAULT_TEXT_ITEM);
164
165 let job_result = rumtk_web_check_on_job!("my_element", job_id, state);
166
167 let job_data = job_result.unwrap()?.to_rumstring();
168
169 rumtk_web_post_process_html!(job_data)
170 }
171
172 let app_state = rumtk_new_lock!(AppState::default());
173 let mut params = RUMWebData::new();
174 let job_id = rumtk_web_get_job_manager!().unwrap().spawn_task(basic_processor()).unwrap();
175 params.insert(RUMString::from(PARAMS_ID), job_id.to_compact_string());
176
177 rumtk_sleep!(1);
178 let rendered = my_element(&[], ¶ms, app_state.clone()).unwrap().to_rumstring();
179
180 assert!(rendered.is_empty(), "Element results survived the rendering process's filtering!");
181 }
182}