MDL-65032 mod_forum: Behat test for locking
authorPeter <peter@moodle.com>
Mon, 8 Apr 2019 02:15:15 +0000 (10:15 +0800)
committerPeter <peter@moodle.com>
Wed, 24 Apr 2019 03:55:51 +0000 (11:55 +0800)
mod/forum/tests/behat/behat_mod_forum.php
mod/forum/tests/behat/discussion_lock.feature [new file with mode: 0644]
mod/forum/tests/entities_discussion_summary_test.php
mod/forum/tests/entities_discussion_test.php
mod/forum/tests/entities_forum_test.php
mod/forum/tests/exporters_discussion_test.php
mod/forum/tests/externallib_test.php
mod/forum/tests/generator/lib.php

index 6ad16bf..ecebde1 100644 (file)
@@ -101,6 +101,21 @@ class behat_mod_forum extends behat_base {
         $this->execute('behat_forms::press_button', get_string('submit', 'core'));
     }
 
+    /**
+     * Navigates to a particular discussion page
+     *
+     * @Given /^I navigate to post "(?P<post_subject_string>(?:[^"]|\\")*)" in "(?P<forum_name_string>(?:[^"]|\\")*)" forum$/
+     * @param string $postsubject The subject of the post
+     * @param string $forumname The forum name
+     */
+    public function i_navigate_to_post_in_forum($postsubject, $forumname) {
+
+        // Navigate to forum discussion.
+        $this->execute('behat_general::click_link', $this->escape($forumname));
+        $this->execute('behat_general::click_link', $this->escape($postsubject));
+    }
+
+
     /**
      * Returns the steps list to add a new discussion to a forum.
      *
diff --git a/mod/forum/tests/behat/discussion_lock.feature b/mod/forum/tests/behat/discussion_lock.feature
new file mode 100644 (file)
index 0000000..3c33f8c
--- /dev/null
@@ -0,0 +1,50 @@
+@mod @mod_forum @javascript
+Feature: As a teacher, you can manually lock individual discussions when viewing the discussion
+
+  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 add a new discussion to "Test forum name" forum with:
+      | Subject | Discussion 2 |
+      | Message | Discussion contents 2, first message |
+    And I reply "Discussion 2" post from "Test forum name" forum with:
+      | Subject | Reply 1 to discussion 2 |
+      | Message | Discussion contents 2, second message |
+    And I log out
+
+  Scenario: Lock a discussion and view
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to post "Discussion 1" in "Test forum name" forum
+    Then "Lock" "link" should be visible
+    And I follow "Lock"
+    Then "a[@title='Lock']" "css_element" should not be visible
+    Then "Locked" "link" should be visible
+    And I reload the page
+    Then I should see "This discussion has been locked so you can no longer reply to it."
+    And I follow "Discussion 2"
+    Then I should not see "This discussion has been locked so you can no longer reply to it."
+    And I log out
+    And I log in as "student1"
+    And I am on "Course 1" course homepage
+    And I navigate to post "Discussion 1" in "Test forum name" forum
+    Then I should see "This discussion has been locked so you can no longer reply to it."
+    And "Reply" "link" should not be visible
index 1cb03f6..5674237 100644 (file)
@@ -72,7 +72,8 @@ class mod_forum_entities_discussion_summary_testcase extends advanced_testcase {
             time(),
             0,
             0,
-            false
+            false,
+            0
         );
         $firstpost = new post_entity(
             1,
index 356aae2..9c01ac0 100644 (file)
@@ -56,7 +56,8 @@ class mod_forum_entities_discussion_testcase extends advanced_testcase {
             $time,
             0,
             0,
-            false
+            false,
+            0
         );
         $firstpost = new post_entity(
             4,
index 0bbfb62..829d29f 100644 (file)
@@ -58,7 +58,8 @@ class mod_forum_entities_forum_testcase extends advanced_testcase {
             $time,
             0,
             0,
-            false
+            false,
+            0
         );
 
         $past = time() - 100;
index 7eb28b6..7290395 100644 (file)
@@ -87,7 +87,8 @@ class mod_forum_exporters_discussion_testcase extends advanced_testcase {
             $now,
             0,
             0,
-            false
+            false,
+            0
         );
 
         $exporter = new discussion_exporter($discussion, [
index 96a4eeb..7db8013 100644 (file)
@@ -1422,6 +1422,54 @@ class mod_forum_external_testcase extends externallib_advanced_testcase {
 
     }
 
+    /*
+     * Test set_lock_state.
+     */
+    public function test_set_lock_state() {
+        global $DB;
+        $this->resetAfterTest(true);
+
+        // Create courses to add the modules.
+        $course = self::getDataGenerator()->create_course();
+        $user = self::getDataGenerator()->create_user();
+        $studentrole = $DB->get_record('role', array('shortname' => 'student'));
+
+        // First forum with tracking off.
+        $record = new stdClass();
+        $record->course = $course->id;
+        $record->type = 'news';
+        $forum = self::getDataGenerator()->create_module('forum', $record);
+
+        $record = new stdClass();
+        $record->course = $course->id;
+        $record->userid = $user->id;
+        $record->forum = $forum->id;
+        $discussion = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
+
+        // User who is a student.
+        self::setUser($user);
+        $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id, 'manual');
+
+        // Only a teacher should be able to lock a discussion.
+        $result = mod_forum_external::set_lock_state($forum->id, $discussion->id, 0);
+        $result = external_api::clean_returnvalue(mod_forum_external::set_lock_state_returns(), $result);
+        $this->assertFalse($result['userstate']['locked']);
+        $this->assertEquals('0', $result['times']['locked']);
+
+        // Set the lock.
+        self::setAdminUser();
+        $result = mod_forum_external::set_lock_state($forum->id, $discussion->id, 0);
+        $result = external_api::clean_returnvalue(mod_forum_external::set_lock_state_returns(), $result);
+        $this->assertTrue($result['userstate']['locked']);
+        $this->assertNotEquals(0, $result['times']['locked']);
+
+        // Unset the lock.
+        $result = mod_forum_external::set_lock_state($forum->id, $discussion->id, time());
+        $result = external_api::clean_returnvalue(mod_forum_external::set_lock_state_returns(), $result);
+        $this->assertFalse($result['userstate']['locked']);
+        $this->assertEquals('0', $result['times']['locked']);
+    }
+
     /*
      * Test can_add_discussion. A basic test since all the API functions are already covered by unit tests.
      */
index 4550c10..5cae167 100644 (file)
@@ -194,7 +194,7 @@ class mod_forum_generator extends testing_module_generator {
         }
 
         if (!isset($record['locked'])) {
-            $record['locked'] = "0";
+            $record['locked'] = 0;
         }
 
         if (isset($record['mailed'])) {