diff --git a/inc/class-wp-revisions-control.php b/inc/class-wp-revisions-control.php index a84f2f02d13c815ec94cb6c7626778c06e89b22d..87c8967ae384c693ab18bff7492fe53e0882e29a 100644 --- a/inc/class-wp-revisions-control.php +++ b/inc/class-wp-revisions-control.php @@ -362,29 +362,43 @@ class WP_Revisions_Control { // Request is valid if $response is still empty, as no errors arose above. if ( empty( $response ) ) { - $revisions = wp_get_post_revisions( $post_id ); + $response = $this->do_purge_all( $post_id ); + } - $count = count( $revisions ); + // Pass the response back to JS. + echo json_encode( $response ); + exit; + } - foreach ( $revisions as $revision ) { - wp_delete_post_revision( $revision->ID ); - } + /** + * Remove all revisions from a given post ID. + * + * @param int $post_id Post ID to purge of revisions. + * @return array + */ + public function do_purge_all( $post_id ) { + $response = array(); - $response['success'] = sprintf( - /* translators: 1. Number of removed revisions, already formatted for locale. */ - esc_html__( - 'Removed %1$s revisions associated with this post.', - 'wp_revisions_control' - ), - number_format_i18n( $count, 0 ) - ); + $revisions = wp_get_post_revisions( $post_id ); + + $count = count( $revisions ); - $response['count'] = $count; + foreach ( $revisions as $revision ) { + wp_delete_post_revision( $revision->ID ); } - // Pass the response back to JS. - echo json_encode( $response ); - exit; + $response['success'] = sprintf( + /* translators: 1. Number of removed revisions, already formatted for locale. */ + esc_html__( + 'Removed %1$s revisions associated with this post.', + 'wp_revisions_control' + ), + number_format_i18n( $count, 0 ) + ); + + $response['count'] = $count; + + return $response; } /** diff --git a/tests/test-hooks.php b/tests/test-hooks.php new file mode 100755 index 0000000000000000000000000000000000000000..b38534b098f10670e18476ed6973669044d82ba9 --- /dev/null +++ b/tests/test-hooks.php @@ -0,0 +1,110 @@ +<?php +/** + * Test WP hooks. + * + * @package WP_Revisions_Control + */ + +/** + * Class TestHooks. + */ +class TestHooks extends WP_UnitTestCase { + /** + * Plugin slug used in many settings etc. + * + * @var string + */ + protected static $settings_section = 'wp_revisions_control'; + + /** + * Plugin's limit meta key. + * + * @var string + */ + protected static $meta_key = '_wp_rev_ctl_limit'; + + /** + * Test saving post's revisions limit. + */ + public function test_save_post() { + $post_id = $this->factory->post->create(); + $expected = 92; + + $_POST[ static::$settings_section . '_limit_nonce' ] = wp_create_nonce( static::$settings_section . '_limit' ); + $_POST[ static::$settings_section . '_qty' ] = $expected; + + WP_Revisions_Control::get_instance()->action_save_post( $post_id ); + + $to_keep = (int) get_post_meta( $post_id, static::$meta_key, true ); + $to_keep_filtered = wp_revisions_to_keep( get_post( $post_id ) ); + + $this->assertEquals( $expected, $to_keep ); + $this->assertEquals( $expected, $to_keep_filtered ); + } + + /** + * Test limits, ensuring no leakage. + */ + public function test_limits() { + $post_id_limited = $this->factory->post->create(); + $post_id_unlimited = $this->factory->post->create(); + $expected = 47; + + update_post_meta( $post_id_limited, static::$meta_key, $expected ); + + $this->assertEquals( + $expected, + wp_revisions_to_keep( get_post( $post_id_limited ) ) + ); + + $this->assertEquals( + -1, + wp_revisions_to_keep( get_post( $post_id_unlimited ) ) + ); + } + + /** + * Test revision purging. + */ + public function test_purge_all() { + $post_id = $this->factory->post->create(); + $iterations = 10; + + for ( $i = 0; $i < $iterations; $i++ ) { + wp_update_post( + [ + 'ID' => $post_id, + 'post_content' => wp_rand(), + ] + ); + } + + $revisions_to_purge = count( wp_get_post_revisions( $post_id ) ); + $this->assertEquals( + $iterations, + $revisions_to_purge, + 'Failed to assert that there are revisions to purge.' + ); + + $purge = WP_Revisions_Control::get_instance()->do_purge_all( $post_id ); + $revisions_remaining = count( wp_get_post_revisions( $post_id ) ); + + $this->assertEquals( + 0, + $revisions_remaining, + 'Failed to assert that all revisions were purged.' + ); + + $this->assertEquals( + 10, + $purge['count'], + 'Failed to assert that response includes expected count of purged revisions.' + ); + + $this->assertEquals( + 'Removed 10 revisions associated with this post.', + $purge['success'], + 'Failed to assert that response includes expected success message.' + ); + } +} diff --git a/tests/test-sample.php b/tests/test-sample.php deleted file mode 100755 index 6c88ac8560879088d217111b2b4bab2227b6331f..0000000000000000000000000000000000000000 --- a/tests/test-sample.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Class SampleTest - * - * @package WP_Revisions_Control - */ - -/** - * Sample test case. - */ -class SampleTest extends WP_UnitTestCase { - - /** - * A single example test. - */ - public function test_sample() { - // Replace this with some actual testing code. - $this->assertTrue( true ); - } -}