diff --git a/src/admin/admin.php b/src/admin/admin.php index b4f1aee..afe5061 100644 --- a/src/admin/admin.php +++ b/src/admin/admin.php @@ -179,4 +179,67 @@ function wordpoints_importer_validate_points_type_setting( $valid, $settings, $f , 3 ); +/** + * Display a rank group dropdown above the ranks component settings. + * + * @since 1.1.0 + */ +function wordpoints_importer_admin_screen_rank_group_select() { + + $rank_groups = WordPoints_Rank_Groups::get(); + + // See https://github.com/WordPoints/wordpoints/issues/310. + $options = array(); + foreach ( $rank_groups as $rank_group ) { + $options[ $rank_group->slug ] = $rank_group->name; + } + + $dropdown = new WordPoints_Dropdown_Builder( + $options + , array( 'name' => 'wordpoints_import[ranks][_data][rank_group]' ) + ); + + ?> + +

+ +

+ +warning( __( 'Skipping Ranks component—no rank group specified.', 'wordpoints-importer' ) ); + $valid = false; + } elseif ( ! WordPoints_Rank_Groups::is_group_registered( $settings['rank_group'] ) ) { + $feedback->warning( __( 'Skipping Ranks component—invalid rank group selected.', 'wordpoints-importer' ) ); + $valid = false; + } + } + + return $valid; +} +add_action( + 'wordpoints_import_settings_valid-ranks' + , 'wordpoints_importer_validate_rank_group_setting' + , 10 + , 3 +); + // EOF diff --git a/src/includes/importers/cubepoints.php b/src/includes/importers/cubepoints.php index 7ebd8a5..75064bd 100644 --- a/src/includes/importers/cubepoints.php +++ b/src/includes/importers/cubepoints.php @@ -42,6 +42,13 @@ public function __construct( $name ) { 'can_import' => array( $this, 'can_import_points_logs' ), ), ), + 'ranks' => array( + 'ranks' => array( + 'label' => __( 'Rank settings', 'wordpoints-importer' ), + 'description' => __( 'If checked, the list of ranks is imported, and users will have the correct ranks assigned to them.', 'wordpoints-importer' ), + 'function' => array( $this, 'import_ranks' ), + ), + ), ); } @@ -458,6 +465,63 @@ protected function get_next_points_logs_batch( $start ) { return $logs; } + + /** + * Import ranks. + * + * @since 1.1.0 + * + * @param array $settings The import settings for the ranks component. + */ + public function import_ranks( $settings ) { + + $this->feedback->info( __( 'Importing ranks…', 'wordpoints-importer' ) ); + + $ranks_data = get_option( 'cp_module_ranks_data' ); + + if ( empty( $ranks_data ) || ! is_array( $ranks_data ) ) { + $this->feedback->error( __( 'No ranks found.', 'wordpoints-importer' ) ); + return; + } + + $i = 0; + + // The base rank already exists, so we just update it. + if ( isset( $ranks_data[0] ) ) { + + wordpoints_update_rank( + WordPoints_Rank_Groups::get_group( $settings['rank_group'] )->get_rank( 0 ) + , $ranks_data[0] + , 'base' + , $settings['rank_group'] + , 0 + ); + + $i++; + + unset( $ranks_data[0] ); + } + + $points_type = substr( $settings['rank_group'], strlen( 'points_type-' ) ); + $rank_type = 'points-' . $points_type; + + ksort( $ranks_data ); + + foreach ( $ranks_data as $points => $rank_name ) { + + wordpoints_add_rank( + $rank_name + , $rank_type + , $settings['rank_group'] + , $i + , array( 'points' => $points, 'points_type' => $points_type ) + ); + + $i++; + } + + $this->feedback->success( sprintf( __( 'Imported %s ranks.', 'wordpoints-importer' ), $i ) ); + } } // EOF diff --git a/tests/phpunit/tests/admin-functions.php b/tests/phpunit/tests/admin-functions.php index 77cd855..23c61b3 100644 --- a/tests/phpunit/tests/admin-functions.php +++ b/tests/phpunit/tests/admin-functions.php @@ -97,6 +97,98 @@ public function test_validate_points_type_setting_valid_false() { $this->assertFalse( $valid ); $this->assertEmpty( $feedback->messages ); } + + /** + * Test that a rank group must be supplied. + * + * @since 1.1.0 + * + * @covers ::wordpoints_importer_validate_rank_group_setting + */ + public function test_validate_rank_group_setting_not_set() { + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback; + + $valid = wordpoints_importer_validate_rank_group_setting( + true + , array() + , $feedback + ); + + $this->assertFalse( $valid ); + $this->assertCount( 1, $feedback->messages['warning'] ); + } + + /** + * Test that the rank group supplied must be valid. + * + * @since 1.1.0 + * + * @covers ::wordpoints_importer_validate_rank_group_setting + */ + public function test_validate_rank_group_setting_invalid() { + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback; + + $valid = wordpoints_importer_validate_rank_group_setting( + true + , array( 'rank_group' => 'invalid' ) + , $feedback + ); + + $this->assertFalse( $valid ); + $this->assertCount( 1, $feedback->messages['warning'] ); + } + + /** + * Test that it returns true when supplied a valid rank group. + * + * @since 1.1.0 + * + * @covers ::wordpoints_importer_validate_rank_group_setting + */ + public function test_validate_rank_group_setting_valid() { + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback; + + $valid = wordpoints_importer_validate_rank_group_setting( + true + , array( 'rank_group' => 'points_type-points' ) + , $feedback + ); + + $this->assertTrue( $valid ); + $this->assertEmpty( $feedback->messages ); + } + + /** + * Test that it returns false when supplied a valid rank group if $valid is false. + * + * @since 1.1.0 + * + * @covers ::wordpoints_importer_validate_rank_group_setting + */ + public function test_validate_rank_group_setting_valid_false() { + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback; + + $valid = wordpoints_importer_validate_rank_group_setting( + false + , array( 'rank_group' => 'points_type-points' ) + , $feedback + ); + + $this->assertFalse( $valid ); + $this->assertEmpty( $feedback->messages ); + } } // EOF diff --git a/tests/phpunit/tests/importers/cubepoints.php b/tests/phpunit/tests/importers/cubepoints.php index 4c855c2..9d930ff 100644 --- a/tests/phpunit/tests/importers/cubepoints.php +++ b/tests/phpunit/tests/importers/cubepoints.php @@ -36,6 +36,17 @@ public function setUp() { $this->importer = new WordPoints_CubePoints_Importer( 'Test CubePoints' ); } + /** + * @since 1.1.0 + */ + public function tearDown() { + + WordPoints_Rank_Groups::deregister_group( 'points_type-points' ); + WordPoints_Rank_Types::deregister_type( 'points-points' ); + + parent::tearDown(); + } + /** * Test that it returns true when CubePoints is installed. * @@ -292,6 +303,80 @@ public function test_import_points_logs() { $this->assertEquals( $post_id, wordpoints_get_points_log_meta( $log->id, 'cubepoints_data', true ) ); } + /** + * Test that ranks are imported. + * + * @since 1.1.0 + * + * @covers WordPoints_CubePoints_Importer::import_ranks + */ + public function test_ranks_import() { + + update_option( + 'cp_module_ranks_data' + , array( 0 => 'Newbie', 1000 => 'Biggie', 5000 => 'Oldie' ) + ); + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback(); + + $this->importer->do_import( + array( + 'ranks' => array( + 'ranks' => '1', + '_data' => array( 'rank_group' => 'points_type-points' ), + ), + ) + , $feedback + ); + + $this->assertCount( 4, $feedback->messages['info'] ); + $this->assertCount( 1, $feedback->messages['success'] ); + + $group = WordPoints_Rank_Groups::get_group( 'points_type-points' ); + + $base_rank = wordpoints_get_rank( $group->get_rank( 0 ) ); + $this->assertEquals( 'base', $base_rank->type ); + $this->assertEquals( 'Newbie', $base_rank->name ); + + $second_rank = wordpoints_get_rank( $group->get_rank( 1 ) ); + $this->assertEquals( 1000, $second_rank->points ); + $this->assertEquals( 'Biggie', $second_rank->name ); + + $third_rank = wordpoints_get_rank( $group->get_rank( 2 ) ); + $this->assertEquals( 5000, $third_rank->points ); + $this->assertEquals( 'Oldie', $third_rank->name ); + } + + /** + * Test that there is an error if there are no ranks import. + * + * @since 1.1.0 + * + * @covers WordPoints_CubePoints_Importer::import_ranks + */ + public function test_error_if_no_ranks_to_import() { + + wordpoints_register_points_ranks(); + + $feedback = new WordPoints_Importer_Tests_Feedback(); + + $this->importer->do_import( + array( + 'ranks' => array( + 'ranks' => '1', + '_data' => array( 'rank_group' => 'points_type-points' ), + ), + ) + , $feedback + ); + + $this->assertCount( 4, $feedback->messages['info'] ); + $this->assertCount( 1, $feedback->messages['error'] ); + + } + // // Helpers. //