Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract get_courses with dependent methods from Sensei_Analysis_Overview_List_Table #4938

Merged
merged 32 commits into from Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
2f26013
Add a rough structure for Reports
merkushin Mar 22, 2022
a7b8cfc
Pass date filters with other arguments
merkushin Mar 23, 2022
863fc09
Rename get_date_filters to get_additional_filters
merkushin Mar 23, 2022
f114f53
Conform new interface of data provider
merkushin Mar 23, 2022
8018348
Fix classnames to correspond conventions
merkushin Mar 23, 2022
6a5e66d
Fix linter issues
merkushin Mar 23, 2022
8eeadfb
Fix classname and other linter issues
merkushin Mar 23, 2022
22ae2fd
Fix linter issues for list tables
merkushin Mar 23, 2022
c45eea2
Update filter names
merkushin Mar 24, 2022
71773bf
Add new classes to autoloader
merkushin Mar 24, 2022
c45f40e
Add first test for courses data provider
merkushin Mar 24, 2022
20f976b
Merge branch 'master' into update/reports-structure-proposal
merkushin Mar 24, 2022
8f09d4f
Extract the students overview report logic into multiple classes
m1r0 Mar 24, 2022
ec7aef3
Add tests for the `Sensei_Reports_Overview_Data_Provider_Students_Tes…
m1r0 Mar 25, 2022
f2e6df2
Add test with last activity
merkushin Mar 26, 2022
49b42c0
Merge branch 'trunk' into update/reports-structure-proposal
merkushin Mar 26, 2022
6a064b4
Add tests for list table
merkushin Mar 28, 2022
87429be
Add tests for overview list table factory
merkushin Mar 29, 2022
2140108
Update load_data_object to use overview list table factory
merkushin Mar 29, 2022
ba7b7b7
Add column for course list table
merkushin Mar 29, 2022
bfdd17f
Fix default order value
merkushin Mar 29, 2022
ce54d52
Add test for Sensei_Analysis::load_data_object
merkushin Mar 29, 2022
230dc23
Fix tests for displaying columns
merkushin Mar 29, 2022
eb696db
Fix linter issues
merkushin Mar 29, 2022
431d360
Update since tag from 4.2.1 to 4.3.0
merkushin Mar 29, 2022
3efcaa1
Merge branch 'update/reports-structure-proposal' into refactor/report…
m1r0 Mar 29, 2022
1e047e0
Fix linter
m1r0 Mar 29, 2022
1bf8587
Fix tests for multisite
m1r0 Mar 29, 2022
3f2845b
Add user date registered column to the students report
m1r0 Mar 29, 2022
5e23129
Add tests for the `Sensei_Reports_Overview_List_Table_Students` class
m1r0 Mar 29, 2022
a3ac9b0
Add comments and newlines for better readability
merkushin Mar 30, 2022
c582358
Merge pull request #4947 from Automattic/refactor/reports-get-learners
m1r0 Mar 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -329,7 +329,6 @@ public function search_button() {
return __( 'Search Courses', 'sensei-lms' );
}


/**
* Get the selected course ID.
*
Expand Down
Expand Up @@ -16,7 +16,7 @@ class Sensei_Reports_Overview_Data_Provider_Courses_Test extends WP_UnitTestCase
/**
* Set up before each test.
*/
public function setup() {
public function setUp() {
parent::setUp();

$this->factory = new Sensei_Factory();
Expand Down
@@ -0,0 +1,85 @@
<?php

class Sensei_Reports_Overview_List_Table_Abstract_Test extends WP_UnitTestCase {
private static $initial_hook_suffix;

public static function setUpBeforeClass() {
parent::setUpBeforeClass();
self::$initial_hook_suffix = $GLOBALS['hook_suffix'] ?? null;
$GLOBALS['hook_suffix'] = null;
}

public static function tearDownAfterClass() {
parent::tearDownAfterClass();
$GLOBALS['hook_suffix'] = self::$initial_hook_suffix;
}

public function testPrepareItems_WhenCalled_GetsItemsFromDataProvider() {
$data_provider = $this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class );

$list_table = $this->getMockBuilder( Sensei_Reports_Overview_List_Table_Abstract::class )
->setConstructorArgs( [ 'a', $data_provider ] )
->getMockForAbstractClass();
$list_table->method( 'get_additional_filters' )->willReturn( [ 'a' => 1 ] );

$data_provider
->expects( self::once() )
->method( 'get_items' )
->with(
[
'number' => 20,
'offset' => 0,
'orderby' => '',
'order' => 'DESC',
'a' => 1,
]
)
->willReturn( [] );
$list_table->prepare_items();
}

public function testGenerateReport_WhenCalled_ReturnsMatchingArray() {
$post1 = new WP_Post( new stdClass() );
$post2 = new WP_Post( new stdClass() );

$data_provider = $this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class );
$data_provider
->method( 'get_items' )
->with(
[
'number' => -1,
'offset' => 0,
'orderby' => '',
'order' => 'DESC',
'a' => 1,
]
)
->willReturn( [ $post1, $post2 ] );

$list_table = $this->getMockBuilder( Sensei_Reports_Overview_List_Table_Abstract::class )
->setMethods( [ 'get_additional_filters', 'get_row_data' ] )
->setConstructorArgs( [ 'a', $data_provider ] )
->getMockForAbstractClass();
$list_table
->method( 'get_additional_filters' )
->willReturn( [ 'a' => 1 ] );
$list_table
->method( 'get_row_data' )
->willReturnMap(
[
[ $post1, [ 'b' => 2 ] ],
[ $post2, [ 'c' => 3 ] ],
]
);
$list_table->columns = [ 'd', 'e', 'f' ];

$actual = $list_table->generate_report();

$expected = [
[ 'd', 'e', 'f' ],
[ 'b' => 2 ],
[ 'c' => 3 ],
];
self::assertSame( $expected, $actual );
}
}
Expand Up @@ -7,4 +7,123 @@
*/
class Sensei_Reports_Overview_List_Table_Courses_Test extends WP_UnitTestCase {

private static $initial_hook_suffix;

/**
* Factory for setting up testing data.
*
* @var Sensei_Factory
*/
private $factory;

public static function setUpBeforeClass() {
parent::setUpBeforeClass();
self::$initial_hook_suffix = $GLOBALS['hook_suffix'] ?? null;
$GLOBALS['hook_suffix'] = null;
}

public static function tearDownAfterClass() {
parent::tearDownAfterClass();
$GLOBALS['hook_suffix'] = self::$initial_hook_suffix;
}

/**
* Set up before each test.
*/
public function setUp() {
parent::setUp();

$this->factory = new Sensei_Factory();
}

/**
* Tear down after each test.
*/
public function tearDown() {
parent::tearDown();

$this->factory->tearDown();
}

public function testGetColumns_NoCompletionsFound_ReturnsMatchingArray() {
$grading = $this->createMock( Sensei_Grading::class );
$grading->method( 'get_courses_average_grade' )->willReturn( 2 );
$course = $this->createMock( Sensei_Course::class );
$course->method( 'get_days_to_completion_total' )->willReturn( 3 );
$list_table = new Sensei_Reports_Overview_List_Table_Courses(
$grading,
$course,
$this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class )
);
$list_table->total_items = 1;

$actual = $list_table->get_columns();

$expected = [
'title' => 'Course (1)',
'last_activity' => 'Last Activity',
'completions' => 'Completed (0)',
'average_percent' => 'Average Grade (2%)',
'days_to_completion' => 'Days to Completion (3)',
];

self::assertSame( $expected, $actual );
}

public function testGetColumns_CompletionsFound_ReturnsMatchingArray() {
$user_id = $this->factory->user->create();
$course_id = $this->factory->course->create();
Sensei_Utils::update_course_status( $user_id, $course_id, 'complete' );
$grading = $this->createMock( Sensei_Grading::class );
$grading->method( 'get_courses_average_grade' )->willReturn( 2 );
$course = $this->createMock( Sensei_Course::class );
$course->method( 'get_days_to_completion_total' )->willReturn( 3 );
$list_table = new Sensei_Reports_Overview_List_Table_Courses(
$grading,
$course,
$this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class )
);
$list_table->total_items = 4;
m1r0 marked this conversation as resolved.
Show resolved Hide resolved

$actual = $list_table->get_columns();

$expected = [
'title' => 'Course (4)',
'last_activity' => 'Last Activity',
'completions' => 'Completed (1)',
'average_percent' => 'Average Grade (2%)',
'days_to_completion' => 'Days to Completion (3)',
];

self::assertSame( $expected, $actual );
}

public function testGetSortableColumns_WhenCalled_ReturnsMatchingArray() {
$list_table = new Sensei_Reports_Overview_List_Table_Courses(
$this->createMock( Sensei_Grading::class ),
$this->createMock( Sensei_Course::class ),
$this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class )
);

$actual = $list_table->get_sortable_columns();

$expected = [
'title' => [ 'title', false ],
'completions' => [ 'completions', false ],
'average_percent' => [ 'average_percent', false ],
];
self::assertSame( $expected, $actual );
}

public function testSearchButton_WhenCalled_ReturnsMatchingString() {
$list_table = new Sensei_Reports_Overview_List_Table_Courses(
$this->createMock( Sensei_Grading::class ),
$this->createMock( Sensei_Course::class ),
$this->createMock( Sensei_Reports_Overview_Data_Provider_Interface::class )
);

$actual = $list_table->search_button();

self::assertSame( 'Search Courses', $actual );
}
}