|
| 1 | +use cot::db::{Auto, ForeignKey}; |
1 | 2 | use cot::form::{ |
2 | | - Form, FormContext, FormErrorTarget, FormField, FormFieldValidationError, FormResult, |
| 3 | + AsFormField, Form, FormContext, FormErrorTarget, FormField, FormFieldValidationError, |
| 4 | + FormResult, |
3 | 5 | }; |
4 | 6 | use cot::test::TestRequestBuilder; |
| 7 | +use cot_macros::model; |
5 | 8 |
|
6 | 9 | #[derive(Debug, Form)] |
7 | 10 | struct MyForm { |
@@ -88,3 +91,70 @@ async fn values_persist_on_form_errors() { |
88 | 91 | _ => panic!("Expected a validation error"), |
89 | 92 | } |
90 | 93 | } |
| 94 | + |
| 95 | +#[cot::test] |
| 96 | +async fn foreign_key_field() { |
| 97 | + #[model] |
| 98 | + struct TestModel { |
| 99 | + #[model(primary_key)] |
| 100 | + name: String, |
| 101 | + } |
| 102 | + |
| 103 | + #[derive(Form)] |
| 104 | + struct TestModelForm { |
| 105 | + test_field: ForeignKey<TestModel>, |
| 106 | + } |
| 107 | + |
| 108 | + // test field rendering |
| 109 | + let context = TestModelForm::build_context(&mut TestRequestBuilder::get("/").build()) |
| 110 | + .await |
| 111 | + .unwrap(); |
| 112 | + let form_rendered = context.to_string(); |
| 113 | + assert!(form_rendered.contains("test_field")); |
| 114 | + assert!(form_rendered.contains("type=\"text\"")); |
| 115 | + |
| 116 | + // test form data |
| 117 | + let mut request = TestRequestBuilder::post("/") |
| 118 | + .form_data(&[("test_field", "Alice")]) |
| 119 | + .build(); |
| 120 | + let form = TestModelForm::from_request(&mut request).await; |
| 121 | + match form { |
| 122 | + Ok(FormResult::Ok(instance)) => { |
| 123 | + assert_eq!(instance.test_field.primary_key(), "Alice"); |
| 124 | + } |
| 125 | + _ => panic!("Expected a valid form"), |
| 126 | + } |
| 127 | + |
| 128 | + // test re-raising validation errors |
| 129 | + let mut request = TestRequestBuilder::post("/") |
| 130 | + .form_data(&[("test_field", "")]) |
| 131 | + .build(); |
| 132 | + let form = TestModelForm::from_request(&mut request).await; |
| 133 | + match form { |
| 134 | + Ok(FormResult::ValidationError(context)) => { |
| 135 | + assert_eq!( |
| 136 | + context.errors_for(FormErrorTarget::Field("test_field")), |
| 137 | + &[FormFieldValidationError::Required] |
| 138 | + ); |
| 139 | + } |
| 140 | + _ => panic!("Expected a validation error"), |
| 141 | + } |
| 142 | +} |
| 143 | + |
| 144 | +#[cot::test] |
| 145 | +async fn foreign_key_field_to_field_value() { |
| 146 | + #[model] |
| 147 | + struct TestModel { |
| 148 | + #[model(primary_key)] |
| 149 | + id: Auto<i32>, |
| 150 | + } |
| 151 | + |
| 152 | + let field_value = ForeignKey::<TestModel>::Model(Box::new(TestModel { |
| 153 | + id: Auto::fixed(123), |
| 154 | + })) |
| 155 | + .to_field_value(); |
| 156 | + assert_eq!(field_value, "123"); |
| 157 | + |
| 158 | + let field_value = ForeignKey::<TestModel>::PrimaryKey(Auto::fixed(456)).to_field_value(); |
| 159 | + assert_eq!(field_value, "456"); |
| 160 | +} |
0 commit comments