@@ -128,3 +128,51 @@ pub struct S3Config {
128128 ) ]
129129 pub path_style : bool ,
130130}
131+
132+ #[ cfg( test) ]
133+ mod test {
134+ use super :: * ;
135+ use clap:: Parser ;
136+ use rstest:: rstest;
137+
138+ #[ derive( Parser ) ]
139+ struct Wrapper {
140+ #[ command( flatten) ]
141+ storage : StorageConfig ,
142+ }
143+
144+ #[ rstest]
145+ #[ case:: both_omitted( None , None , true ) ]
146+ #[ case:: access_key_only( Some ( "my-access-key" ) , None , false ) ]
147+ #[ case:: secret_key_only( None , Some ( "my-secret-key" ) , false ) ]
148+ #[ case:: both_provided( Some ( "my-access-key" ) , Some ( "my-secret-key" ) , true ) ]
149+ fn s3_credentials (
150+ #[ case] access_key : Option < & str > ,
151+ #[ case] secret_key : Option < & str > ,
152+ #[ case] expect_ok : bool ,
153+ ) {
154+ let mut args = vec ! [
155+ "test" ,
156+ "--storage-strategy" ,
157+ "s3" ,
158+ "--s3-bucket" ,
159+ "b" ,
160+ "--s3-region" ,
161+ "r" ,
162+ ] ;
163+ if let Some ( ak) = access_key {
164+ args. extend ( [ "--s3-access-key" , ak] ) ;
165+ }
166+ if let Some ( sk) = secret_key {
167+ args. extend ( [ "--s3-secret-key" , sk] ) ;
168+ }
169+
170+ let result = Wrapper :: try_parse_from ( & args) ;
171+
172+ assert_eq ! ( result. is_ok( ) , expect_ok) ;
173+ if let Ok ( wrapper) = result {
174+ assert_eq ! ( wrapper. storage. s3_config. access_key. as_deref( ) , access_key) ;
175+ assert_eq ! ( wrapper. storage. s3_config. secret_key. as_deref( ) , secret_key) ;
176+ }
177+ }
178+ }
0 commit comments