@@ -349,6 +349,40 @@ public function test_begin_and_confirm_server_owned_enrollment() {
349349 Two_Factor_Totp::set_time ( null );
350350 }
351351
352+ /**
353+ * An unchanged pending enrollment value is not a database error.
354+ *
355+ * @covers Two_Factor_Totp::rest_begin_enrollment
356+ */
357+ public function test_begin_enrollment_accepts_unchanged_meta_update () {
358+ wp_set_current_user ( self ::$ admin_id );
359+
360+ $ filter = function ( $ check , $ user_id , $ meta_key , $ meta_value ) use ( &$ filter ) {
361+ if ( Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY !== $ meta_key ) {
362+ return $ check ;
363+ }
364+
365+ remove_filter ( 'update_user_metadata ' , $ filter );
366+ update_user_meta ( $ user_id , $ meta_key , $ meta_value );
367+
368+ return false ;
369+ };
370+ add_filter ( 'update_user_metadata ' , $ filter , 10 , 4 );
371+
372+ $ request = new WP_REST_Request ( 'POST ' , '/ ' . Two_Factor_Core::REST_NAMESPACE . '/totp/enrollment ' );
373+ $ request ->set_body_params ( array ( 'user_id ' => self ::$ admin_id ) );
374+ $ response = rest_do_request ( $ request );
375+ $ data = $ response ->get_data ();
376+
377+ remove_filter ( 'update_user_metadata ' , $ filter );
378+
379+ $ this ->assertSame ( 200 , $ response ->get_status () );
380+ $ pending = get_user_meta ( self ::$ admin_id , Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY , true );
381+ $ this ->assertSame ( $ data ['secret ' ], $ pending ['key ' ] );
382+
383+ delete_user_meta ( self ::$ admin_id , Two_Factor_Totp::PENDING_ENROLLMENT_META_KEY );
384+ }
385+
352386 /**
353387 * A newer enrollment replaces the previous pending secret.
354388 *
0 commit comments