use structform::{
derive_form_input, impl_text_input_with_stringops, ParseAndFormat, ParseError, StructForm,
};
#[derive(Default, Debug, PartialEq, Eq)]
struct LoginData {
username: String,
password: String,
}
#[derive(Default, Clone, StructForm)]
#[structform(model = "LoginData")]
struct LoginForm {
username: FormTextInput<String>,
password: FormPasswordInput<String>,
}
derive_form_input! {FormTextInput}
impl_text_input_with_stringops!(FormTextInput, String);
derive_form_input! {FormPasswordInput}
impl ParseAndFormat<String> for FormPasswordInput<String> {
fn parse(value: &str) -> Result<String, ParseError> {
if value.is_empty() {
Err(ParseError::Required)
} else {
Ok(value.into())
}
}
fn format(value: &String) -> String {
value.clone()
}
}
#[test]
fn a_form_can_be_initialized_with_default_data() {
let mut form = LoginForm::default();
let model = form.submit();
assert_eq!(model, Err(ParseError::Required));
}
#[test]
fn a_forms_inputs_are_changed_by_sending_messages() {
let mut form = LoginForm::default();
assert_eq!(form.username.input, "".to_string());
assert_eq!(form.username.value, Err(ParseError::Required));
assert_eq!(form.username.is_edited, false);
form.set_input(LoginFormField::Username, " hello".to_string());
assert_eq!(form.username.input, " hello".to_string());
assert_eq!(form.username.value, Ok("hello".to_string()));
assert_eq!(form.username.is_edited, true);
form.set_input(LoginFormField::Password, "adm1n".to_string());
let parsed = form.submit();
assert_eq!(
parsed,
Ok(LoginData {
username: "hello".into(),
password: "adm1n".into()
})
);
}
#[test]
fn a_form_can_be_initialized_from_an_existing_model() {
let existing_model = LoginData {
username: "admin".into(),
password: "admin".into(),
};
let mut form = LoginForm::new(&existing_model);
assert_eq!(form.username.is_edited, false);
assert_eq!(form.username.input, "admin".to_string());
assert_eq!(form.username.value, Ok("admin".to_string()));
form.set_input(LoginFormField::Password, "adm1n".to_string());
let updated_model = form.submit_update(existing_model);
assert_eq!(
updated_model,
Ok(LoginData {
username: "admin".into(),
password: "adm1n".into()
})
);
}
#[test]
fn form_inputs_track_if_submit_is_attempted() {
let mut form = LoginForm::default();
assert_eq!(form.username.is_edited, false);
assert_eq!(form.password.is_edited, false);
let _parsed = form.submit();
assert_eq!(form.username.is_edited, true);
assert_eq!(form.password.is_edited, true);
}