Skip to content

Commit

Permalink
CubePoints: Support for importing ranks
Browse files Browse the repository at this point in the history
Fixes #1
  • Loading branch information
JDGrimes committed Mar 31, 2015
1 parent 4c58244 commit 4ce57b2
Show file tree
Hide file tree
Showing 4 changed files with 304 additions and 0 deletions.
63 changes: 63 additions & 0 deletions src/admin/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -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]' )
);

?>

<p>
<label for="wordpoints_import[ranks][_data][rank_group]">
<?php esc_html_e( 'Import to rank group:', 'wordpoints-importer' ); ?>
<?php $dropdown->display(); ?>
</label>
</p>

<?php
}
add_action(
'wordpoints_importer_before_component_options-ranks'
, 'wordpoints_importer_admin_screen_rank_group_select'
);

/**
* Validate the rank group import setting for the ranks component.
*
* @since 1.1.0
*/
function wordpoints_importer_validate_rank_group_setting( $valid, $settings, $feedback ) {

if ( $valid ) {

if ( ! isset( $settings['rank_group'] ) ) {
$feedback->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
64 changes: 64 additions & 0 deletions src/includes/importers/cubepoints.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' ),
),
),
);
}

Expand Down Expand Up @@ -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&hellip;', '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
92 changes: 92 additions & 0 deletions tests/phpunit/tests/admin-functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
85 changes: 85 additions & 0 deletions tests/phpunit/tests/importers/cubepoints.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down Expand Up @@ -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.
//
Expand Down

0 comments on commit 4ce57b2

Please sign in to comment.