@@ -68,3 +68,168 @@ impl PasswordRequirements for NISTPasswordRequirements {
6868 Ok ( password. to_owned ( ) )
6969 }
7070}
71+
72+ #[ cfg( test) ]
73+ mod tests {
74+ use serde_json:: json;
75+
76+ use super :: * ;
77+
78+ #[ test]
79+ fn test_register_schema_serialization ( ) {
80+ let schema = RegisterSchema {
81+ tos_consent : true ,
82+ local_name : "testuser" . to_string ( ) ,
83+ password : "testpassword123" . to_string ( ) ,
84+ invite : Some ( "invite123" . to_string ( ) ) ,
85+ } ;
86+
87+ let serialized = serde_json:: to_string ( & schema) . unwrap ( ) ;
88+ let parsed: serde_json:: Value = serde_json:: from_str ( & serialized) . unwrap ( ) ;
89+
90+ assert_eq ! ( parsed[ "tosConsent" ] , true ) ;
91+ assert_eq ! ( parsed[ "localName" ] , "testuser" ) ;
92+ assert_eq ! ( parsed[ "password" ] , "testpassword123" ) ;
93+ assert_eq ! ( parsed[ "invite" ] , "invite123" ) ;
94+ }
95+
96+ #[ test]
97+ fn test_register_schema_deserialization ( ) {
98+ let json_str = r#"{"tosConsent":true,"localName":"testuser","password":"testpassword123","invite":"invite123"}"# ;
99+ let schema: RegisterSchema = serde_json:: from_str ( json_str) . unwrap ( ) ;
100+
101+ assert_eq ! ( schema. tos_consent, true ) ;
102+ assert_eq ! ( schema. local_name, "testuser" ) ;
103+ assert_eq ! ( schema. password, "testpassword123" ) ;
104+ assert_eq ! ( schema. invite, Some ( "invite123" . to_string( ) ) ) ;
105+ }
106+
107+ #[ test]
108+ fn test_nist_password_requirements_valid_password ( ) {
109+ let result = NISTPasswordRequirements :: verify_requirements ( "password123" ) ;
110+ assert ! ( result. is_ok( ) ) ;
111+ assert_eq ! ( result. unwrap( ) , "password123" ) ;
112+ }
113+
114+ #[ test]
115+ fn test_nist_password_requirements_minimum_length ( ) {
116+ let result = NISTPasswordRequirements :: verify_requirements ( "12345678" ) ;
117+ assert ! ( result. is_ok( ) ) ;
118+ assert_eq ! ( result. unwrap( ) , "12345678" ) ;
119+ }
120+
121+ #[ test]
122+ fn test_nist_password_requirements_maximum_length ( ) {
123+ let long_password = "a" . repeat ( 64 ) ;
124+ let result = NISTPasswordRequirements :: verify_requirements ( & long_password) ;
125+ assert ! ( result. is_ok( ) ) ;
126+ assert_eq ! ( result. unwrap( ) , long_password) ;
127+ }
128+
129+ #[ test]
130+ fn test_nist_password_requirements_too_short ( ) {
131+ let result = NISTPasswordRequirements :: verify_requirements ( "1234567" ) ;
132+ assert ! ( result. is_err( ) ) ;
133+ let error = result. unwrap_err ( ) ;
134+ assert_eq ! ( error. code, crate :: errors:: Errcode :: IllegalInput ) ;
135+ assert ! ( error. context. is_some( ) ) ;
136+ let context = error. context . unwrap ( ) ;
137+ assert_eq ! ( context. field_name, "password" ) ;
138+ assert_eq ! ( context. found, "7 characters" ) ;
139+ assert_eq ! ( context. expected, "More than 7 and less than 65 characters" ) ;
140+ }
141+
142+ #[ test]
143+ fn test_nist_password_requirements_too_long ( ) {
144+ let long_password = "a" . repeat ( 65 ) ;
145+ let result = NISTPasswordRequirements :: verify_requirements ( & long_password) ;
146+ assert ! ( result. is_err( ) ) ;
147+ let error = result. unwrap_err ( ) ;
148+ assert_eq ! ( error. code, crate :: errors:: Errcode :: IllegalInput ) ;
149+ assert ! ( error. context. is_some( ) ) ;
150+ let context = error. context . unwrap ( ) ;
151+ assert_eq ! ( context. field_name, "password" ) ;
152+ assert_eq ! ( context. found, "65 characters" ) ;
153+ assert_eq ! ( context. expected, "More than 7 and less than 65 characters" ) ;
154+ }
155+
156+ #[ test]
157+ fn test_nist_password_requirements_empty_password ( ) {
158+ let result = NISTPasswordRequirements :: verify_requirements ( "" ) ;
159+ assert ! ( result. is_err( ) ) ;
160+ let error = result. unwrap_err ( ) ;
161+ assert_eq ! ( error. code, crate :: errors:: Errcode :: IllegalInput ) ;
162+ assert ! ( error. context. is_some( ) ) ;
163+ let context = error. context . unwrap ( ) ;
164+ assert_eq ! ( context. field_name, "password" ) ;
165+ assert_eq ! ( context. found, "0 characters" ) ;
166+ assert_eq ! ( context. expected, "More than 7 and less than 65 characters" ) ;
167+ }
168+
169+ #[ test]
170+ fn test_nist_password_requirements_unicode_characters ( ) {
171+ let unicode_password = "пароль123🔐" ;
172+ let result = NISTPasswordRequirements :: verify_requirements ( unicode_password) ;
173+ assert ! ( result. is_ok( ) ) ;
174+ assert_eq ! ( result. unwrap( ) , unicode_password) ;
175+ }
176+
177+ #[ test]
178+ fn test_nist_password_requirements_spaces_allowed ( ) {
179+ let password_with_spaces = "password with spaces" ;
180+ let result = NISTPasswordRequirements :: verify_requirements ( password_with_spaces) ;
181+ assert ! ( result. is_ok( ) ) ;
182+ assert_eq ! ( result. unwrap( ) , password_with_spaces) ;
183+ }
184+
185+ #[ test]
186+ fn test_nist_password_requirements_special_characters ( ) {
187+ let special_password = "!@#$%^&*()_+-=[]{}|;':\" ,./<>?" ;
188+ let result = NISTPasswordRequirements :: verify_requirements ( special_password) ;
189+ assert ! ( result. is_ok( ) ) ;
190+ assert_eq ! ( result. unwrap( ) , special_password) ;
191+ }
192+
193+ #[ test]
194+ fn test_nist_password_requirements_mixed_case ( ) {
195+ let mixed_case_password = "AbCdEfGhIjKl" ;
196+ let result = NISTPasswordRequirements :: verify_requirements ( mixed_case_password) ;
197+ assert ! ( result. is_ok( ) ) ;
198+ assert_eq ! ( result. unwrap( ) , mixed_case_password) ;
199+ }
200+
201+ #[ test]
202+ fn test_nist_password_requirements_numbers_only ( ) {
203+ let numbers_only = "12345678" ;
204+ let result = NISTPasswordRequirements :: verify_requirements ( numbers_only) ;
205+ assert ! ( result. is_ok( ) ) ;
206+ assert_eq ! ( result. unwrap( ) , numbers_only) ;
207+ }
208+
209+ #[ test]
210+ fn test_nist_password_requirements_letters_only ( ) {
211+ let letters_only = "abcdefgh" ;
212+ let result = NISTPasswordRequirements :: verify_requirements ( letters_only) ;
213+ assert ! ( result. is_ok( ) ) ;
214+ assert_eq ! ( result. unwrap( ) , letters_only) ;
215+ }
216+
217+ #[ test]
218+ fn test_nist_password_requirements_boundary_values ( ) {
219+ // Test exactly 8 characters
220+ let min_valid = "12345678" ;
221+ assert ! ( NISTPasswordRequirements :: verify_requirements( min_valid) . is_ok( ) ) ;
222+
223+ // Test exactly 64 characters
224+ let max_valid = "a" . repeat ( 64 ) ;
225+ assert ! ( NISTPasswordRequirements :: verify_requirements( & max_valid) . is_ok( ) ) ;
226+
227+ // Test exactly 7 characters (should fail)
228+ let too_short = "1234567" ;
229+ assert ! ( NISTPasswordRequirements :: verify_requirements( too_short) . is_err( ) ) ;
230+
231+ // Test exactly 65 characters (should fail)
232+ let too_long = "a" . repeat ( 65 ) ;
233+ assert ! ( NISTPasswordRequirements :: verify_requirements( & too_long) . is_err( ) ) ;
234+ }
235+ }
0 commit comments