@@ -573,7 +573,10 @@ mod tests {
573573 s3:: { ChecksumAlgorithmKind , FullObjectChecksum , StoredObjectLock } ,
574574 sqlite:: KeyMetadata ,
575575 } ;
576- use s3s:: dto:: { ChecksumAlgorithm , ETagCondition , ObjectCannedACL , Timestamp } ;
576+ use s3s:: dto:: {
577+ ChecksumAlgorithm , ETagCondition , ObjectCannedACL , ObjectLockLegalHoldStatus ,
578+ ObjectLockMode , Timestamp ,
579+ } ;
577580 use time:: Duration ;
578581
579582 fn assert_error_code < T > ( result : S3Result < T > , code : & S3ErrorCode ) {
@@ -665,6 +668,18 @@ mod tests {
665668 assert ! ( matches!( result, Err ( SqliteError :: PreconditionFailed ) ) ) ;
666669 }
667670
671+ #[ test]
672+ #[ should_panic( expected = "expected" ) ]
673+ fn assert_error_code_panics_on_success ( ) {
674+ assert_error_code ( Ok ( ( ) ) , & S3ErrorCode :: InvalidRequest ) ;
675+ }
676+
677+ #[ test]
678+ #[ should_panic( expected = "assertion failed" ) ]
679+ fn assert_precondition_failed_panics_on_success ( ) {
680+ assert_precondition_failed ( & Ok ( ( ) ) ) ;
681+ }
682+
668683 #[ test]
669684 fn parses_copy_object_request_defaults ( ) {
670685 let request = match parse_copy_object_request ( copy_input ( ) ) {
@@ -693,6 +708,7 @@ mod tests {
693708 #[ test]
694709 fn parses_copy_object_replace_metadata_and_conditions ( ) {
695710 let expires = Timestamp :: from ( OffsetDateTime :: UNIX_EPOCH ) ;
711+ let retain_until = Timestamp :: from ( OffsetDateTime :: now_utc ( ) + Duration :: days ( 1 ) ) ;
696712 let input = match CopyObjectInput :: builder ( )
697713 . bucket ( "target-bucket" . to_string ( ) )
698714 . key ( "target-key" . to_string ( ) )
@@ -715,6 +731,13 @@ mod tests {
715731 . copy_source_if_none_match ( Some ( ETagCondition :: ETag ( ETag :: Weak ( "other" . to_string ( ) ) ) ) )
716732 . copy_source_if_modified_since ( Some ( Timestamp :: from ( OffsetDateTime :: UNIX_EPOCH ) ) )
717733 . copy_source_if_unmodified_since ( Some ( Timestamp :: from ( OffsetDateTime :: UNIX_EPOCH ) ) )
734+ . object_lock_legal_hold_status ( Some ( ObjectLockLegalHoldStatus :: from_static (
735+ ObjectLockLegalHoldStatus :: ON ,
736+ ) ) )
737+ . object_lock_mode ( Some ( ObjectLockMode :: from_static (
738+ ObjectLockMode :: GOVERNANCE ,
739+ ) ) )
740+ . object_lock_retain_until_date ( Some ( retain_until) )
718741 . build ( )
719742 {
720743 Ok ( input) => input,
@@ -752,6 +775,7 @@ mod tests {
752775 Some ( ETagCondition :: ETag ( ETag :: Weak ( value) ) ) if value == "other"
753776 ) ) ;
754777 assert ! ( request. source_conditions. unmodified_since. is_some( ) ) ;
778+ assert ! ( request. object_lock_headers. has_any( ) ) ;
755779 }
756780
757781 #[ test]
@@ -801,6 +825,21 @@ mod tests {
801825 parse_copy_object_request ( grant_header) ,
802826 & S3ErrorCode :: AccessControlListNotSupported ,
803827 ) ;
828+
829+ let unsupported_sse = match CopyObjectInput :: builder ( )
830+ . bucket ( "target-bucket" . to_string ( ) )
831+ . key ( "target-key" . to_string ( ) )
832+ . copy_source ( source ( "source-bucket" , "source-key" , None ) )
833+ . ssekms_key_id ( Some ( "key" . to_string ( ) ) )
834+ . build ( )
835+ {
836+ Ok ( input) => input,
837+ Err ( err) => panic ! ( "unexpected build error: {err:?}" ) ,
838+ } ;
839+ assert_error_code (
840+ parse_copy_object_request ( unsupported_sse) ,
841+ & S3ErrorCode :: InvalidArgument ,
842+ ) ;
804843 }
805844
806845 #[ test]
0 commit comments