mirror of
https://github.com/moodle/moodle.git
synced 2025-03-14 04:30:15 +01:00
MDL-65033 mod_forum: Behat and unit tests for favouriting
This commit is contained in:
parent
e7e6a72164
commit
897ac0de9e
2
mod/forum/amd/build/discussion_list.min.js
vendored
2
mod/forum/amd/build/discussion_list.min.js
vendored
@ -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)}}});
|
@ -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);
|
||||
|
@ -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'),
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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.
|
||||
|
48
mod/forum/tests/behat/favourite_discussion.feature
Normal file
48
mod/forum/tests/behat/favourite_discussion.feature
Normal 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"
|
@ -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().
|
||||
*
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user