MDL-65033 mod_forum: Behat and unit tests for favouriting

This commit is contained in:
Peter 2019-03-20 12:19:11 +08:00 committed by Peter
parent e7e6a72164
commit 897ac0de9e
9 changed files with 155 additions and 5 deletions

View File

@ -1 +1 @@
define(["mod_forum/subscription_toggle"],function(a){return{init:function(b){a.init(b)}}});
define(["jquery","mod_forum/subscription_toggle","mod_forum/selectors","mod_forum/repository"],function(a,b,c,d){var e=function(b){b.on("click",c.favourite.toggle,function(){var b=a(this),c=b.data("forumid"),e=b.data("discussionid"),f=b.data("targetstate");d.toggleFavouriteDiscussionState(c,e,f).then(function(){location.reload()})["catch"](Notification.exception)})};return{init:function(a){b.init(a),e(a)}}});

View File

@ -33,13 +33,13 @@ define([
Repository
) {
var registerEventListeners = function(root) {
root.on('click', Selectors.favourite.toggle, function(e) {
root.on('click', Selectors.favourite.toggle, function() {
var toggleElement = $(this);
var forumId = toggleElement.data('forumid');
var discussionId = toggleElement.data('discussionid');
var subscriptionState = toggleElement.data('targetstate');
Repository.toggleFavouriteDiscussionState(forumId, discussionId, subscriptionState)
.then(function(context) {
.then(function() {
location.reload();
})
.catch(Notification.exception);

View File

@ -1149,7 +1149,7 @@ class mod_forum_external extends external_api {
return discussion_exporter::get_read_structure();
}
public function toggle_favourite_state_parameters() {
public static function toggle_favourite_state_parameters() {
return new external_function_parameters(
[
'forumid' => new external_value(PARAM_INT, 'Forum that the discussion is in'),

View File

@ -222,7 +222,7 @@
<div class="p1-1">
{{> mod_forum/discussion_subscription_toggle}}
</div>
<div class="p1-1 m-t-1">
<div class="p1-1 m-t-1" data-container='discussion-tools'>
{{> mod_forum/forum_action_menu}}
</div>
</div>

View File

@ -27,6 +27,7 @@
<div class="ml-auto dropdown">
<button class="m-t-0 p-t-0 btn btn-link btn-icon"
type="button"
role="button"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">

View File

@ -127,6 +127,18 @@ class behat_mod_forum extends behat_base {
$this->execute('behat_general::click_link', $this->escape($postsubject));
}
/**
* Opens up the action menu for the discussion
*
* @Given /^I click on "(?P<post_subject_string>(?:[^"]|\\")*)" action menu$/
* @param string $discussion The subject of the discussion
*/
public function i_click_on_action_menu($discussion) {
$this->execute('behat_general::i_click_on_in_the', [
"[data-container='discussion-tools'] [data-toggle='dropdown']", "css_element",
"//tr[@class='discussion-row' and contains(.,'$discussion')]", "xpath_element"
]);
}
/**
* Returns the steps list to add a new discussion to a forum.

View File

@ -0,0 +1,48 @@
@mod @mod_forum @javascript
Feature: A student can favourite a discussion via the forum settings menu
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
And the following "courses" exist:
| fullname | shortname | category |
| Course 1 | C1 | 0 |
And the following "course enrolments" exist:
| user | course | role |
| student1 | C1 | student |
And I log in as "admin"
And I am on "Course 1" course homepage with editing mode on
And I add a "Forum" to section "1" and I fill the form with:
| Forum name | Test forum name |
| Description | Test forum description |
And I add a new discussion to "Test forum name" forum with:
| Subject | Discussion 1 |
| Message | Discussion contents 1, first message |
And I reply "Discussion 1" post from "Test forum name" forum with:
| Subject | Reply 1 to discussion 1 |
| Message | Discussion contents 1, second message |
And I log out
And I log in as "student1"
And I am on "Course 1" course homepage
Scenario: Student can favourite a discussion from within an individual discussion
Given I reply "Discussion 1" post from "Test forum name" forum with:
| Subject | Reply 2 to discussion 1 |
| Message | Discussion contents 1, third message |
And I wait until the page is ready
And I open the action menu in "[data-container='discussion-tools']" "css_element"
And I click on "Star this discussion" "link"
And I wait "3" seconds
And I open the action menu in "[data-container='discussion-tools']" "css_element"
Then I should see "Unstar this discussion"
Scenario: Student can favourite a discussion from the discussion list
Given I reply "Discussion 1" post from "Test forum name" forum with:
| Subject | Reply 2 to discussion 1 |
| Message | Discussion contents 1, third message |
And I follow "Test forum name"
And I click on "Discussion 1" action menu
And I click on "Star this discussion" "link"
And I click on "Discussion 1" action menu
Then I should see "Unstar this discussion"

View File

@ -158,6 +158,54 @@ class mod_forum_entities_discussion_testcase extends advanced_testcase {
$this->assertEquals($isvisible, $discussion->is_timed_discussion_visible(), $testdescription);
}
public function test_is_favourited() {
$this->resetAfterTest(true);
$time = time() + 10;
// Create a user.
$user = self::getDataGenerator()->create_user(array('trackforums' => 1));
// Set to the user.
self::setUser($user);
// Create courses to add the modules.
$course1 = self::getDataGenerator()->create_course();
$this->getDataGenerator()->enrol_user($user->id, $course1->id);
$record = new stdClass();
$record->introformat = FORMAT_HTML;
$record->course = $course1->id;
$record->trackingtype = FORUM_TRACKING_OFF;
$forum1 = self::getDataGenerator()->create_module('forum', $record);
$discussion = new discussion_entity(
1,
$course1->id,
$forum1->id,
'test discussion',
4,
5,
6,
false,
$time,
$time,
0,
0,
false
);
$coursemodule = get_coursemodule_from_instance('forum', $forum1->id);
$contextmodule = context_module::instance($coursemodule->id);
$this->assertFalse(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
// Toggle the favourite for discussion
$usercontext = \context_user::instance($user->id);
$ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
$ufservice->create_favourite('mod_forum', 'discussions', $discussion->get_id(), $contextmodule);
$this->assertTrue(\mod_forum\local\entities\discussion::is_favourited($discussion, $contextmodule, $user));
}
/**
* Data provider for test_display_period_settings().
*

View File

@ -180,6 +180,47 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
$this->assertCount(0, $forums);
}
/**
* Test the toggle favourite state
*/
public function test_mod_forum_toggle_favourite_state() {
global $USER, $CFG, $DB;
$this->resetAfterTest(true);
// Create a user.
$user = self::getDataGenerator()->create_user(array('trackforums' => 1));
// Set to the user.
self::setUser($user);
// Create courses to add the modules.
$course1 = self::getDataGenerator()->create_course();
$this->getDataGenerator()->enrol_user($user->id, $course1->id);
$record = new stdClass();
$record->introformat = FORMAT_HTML;
$record->course = $course1->id;
$record->trackingtype = FORUM_TRACKING_OFF;
$forum1 = self::getDataGenerator()->create_module('forum', $record);
$forum1->introfiles = [];
// Add discussions to the forums.
$record = new stdClass();
$record->course = $course1->id;
$record->userid = $user->id;
$record->forum = $forum1->id;
$discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
$response = mod_forum_external::toggle_favourite_state($forum1->id, $discussion1->id, 1);
$response = external_api::clean_returnvalue(mod_forum_external::toggle_favourite_state_returns(), $response);
$this->assertTrue($response['userstate']['favourited']);
$response = mod_forum_external::toggle_favourite_state($forum1->id, $discussion1->id, 0);
$response = external_api::clean_returnvalue(mod_forum_external::toggle_favourite_state_returns(), $response);
$this->assertFalse($response['userstate']['favourited']);
}
/**
* Test get forum posts
*/