print_error('invalidcoursemodule');
}
if (!($cm = get_coursemodule_from_instance("anonforum", $anonforum->id, $course->id))) {
    print_error('invalidcoursemodule');
}
require_course_login($course, false, $cm);
$returnto = anonforum_go_back_to($returnpage . '?id=' . $course->id . '&f=' . $anonforum->id);
if (!anonforum_tp_can_track_anonforums($anonforum)) {
    redirect($returnto);
}
$info = new stdClass();
$info->name = fullname($USER);
$info->anonforum = format_string($anonforum->name);
$eventparams = array('context' => context_module::instance($cm->id), 'relateduserid' => $USER->id, 'anonymous' => 1, 'other' => array('anonforumid' => $anonforum->id));
if (anonforum_tp_is_tracked($anonforum)) {
    if (anonforum_tp_stop_tracking($anonforum->id)) {
        if (empty($anonforum->anonymous)) {
            $event = \mod_anonforum\event\readtracking_disabled::create($eventparams);
            $event->trigger();
        }
        redirect($returnto, get_string("nownottracking", "anonforum", $info), 1);
    } else {
        print_error('cannottrack', '', $_SERVER["HTTP_REFERER"]);
    }
} else {
    // subscribe
    if (anonforum_tp_start_tracking($anonforum->id)) {
        if (empty($anonforum->anonymous)) {
            $event = \mod_anonforum\event\readtracking_enabled::create($eventparams);
            $event->trigger();
        }
 /**
  * Test the logic in the test_anonforum_tp_get_untracked_anonforums() function.
  */
 public function test_anonforum_tp_get_untracked_anonforums()
 {
     global $CFG;
     $this->resetAfterTest();
     $useron = $this->getDataGenerator()->create_user(array('trackforums' => 1));
     $useroff = $this->getDataGenerator()->create_user(array('trackforums' => 0));
     $course = $this->getDataGenerator()->create_course();
     $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_OFF);
     // Off.
     $anonforumoff = $this->getDataGenerator()->create_module('anonforum', $options);
     $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_FORCED);
     // On.
     $anonforumforce = $this->getDataGenerator()->create_module('anonforum', $options);
     $options = array('course' => $course->id, 'trackingtype' => FORUM_TRACKING_OPTIONAL);
     // Optional.
     $anonforumoptional = $this->getDataGenerator()->create_module('anonforum', $options);
     // Allow force.
     $CFG->anonforum_allowforcedreadtracking = 1;
     // On user with force on.
     $result = anonforum_tp_get_untracked_anonforums($useron->id, $course->id);
     $this->assertEquals(1, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     // Off user with force on.
     $result = anonforum_tp_get_untracked_anonforums($useroff->id, $course->id);
     $this->assertEquals(2, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     // Don't allow force.
     $CFG->anonforum_allowforcedreadtracking = 0;
     // On user with force off.
     $result = anonforum_tp_get_untracked_anonforums($useron->id, $course->id);
     $this->assertEquals(1, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     // Off user with force off.
     $result = anonforum_tp_get_untracked_anonforums($useroff->id, $course->id);
     $this->assertEquals(3, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     $this->assertEquals(true, isset($result[$anonforumforce->id]));
     // Stop tracking so we can test again.
     anonforum_tp_stop_tracking($anonforumforce->id, $useron->id);
     anonforum_tp_stop_tracking($anonforumoptional->id, $useron->id);
     anonforum_tp_stop_tracking($anonforumforce->id, $useroff->id);
     anonforum_tp_stop_tracking($anonforumoptional->id, $useroff->id);
     // Allow force.
     $CFG->anonforum_allowforcedreadtracking = 1;
     // On user with force on.
     $result = anonforum_tp_get_untracked_anonforums($useron->id, $course->id);
     $this->assertEquals(2, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     // Off user with force on.
     $result = anonforum_tp_get_untracked_anonforums($useroff->id, $course->id);
     $this->assertEquals(2, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     // Don't allow force.
     $CFG->anonforum_allowforcedreadtracking = 0;
     // On user with force off.
     $result = anonforum_tp_get_untracked_anonforums($useron->id, $course->id);
     $this->assertEquals(3, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     $this->assertEquals(true, isset($result[$anonforumforce->id]));
     // Off user with force off.
     $result = anonforum_tp_get_untracked_anonforums($useroff->id, $course->id);
     $this->assertEquals(3, count($result));
     $this->assertEquals(true, isset($result[$anonforumoff->id]));
     $this->assertEquals(true, isset($result[$anonforumoptional->id]));
     $this->assertEquals(true, isset($result[$anonforumforce->id]));
 }
 /**
  * Test mod_anonforum_observer methods.
  */
 public function test_observers()
 {
     global $DB, $CFG;
     require_once $CFG->dirroot . '/mod/anonforum/lib.php';
     $anonforumgen = $this->getDataGenerator()->get_plugin_generator('mod_anonforum');
     $course = $this->getDataGenerator()->create_course();
     $trackedrecord = array('course' => $course->id, 'type' => 'general', 'forcesubscribe' => ANONFORUM_INITIALSUBSCRIBE);
     $untrackedrecord = array('course' => $course->id, 'type' => 'general');
     $trackedanonforum = $this->getDataGenerator()->create_module('anonforum', $trackedrecord);
     $untrackedanonforum = $this->getDataGenerator()->create_module('anonforum', $untrackedrecord);
     // Used functions don't require these settings; adding
     // them just in case there are APIs changes in future.
     $user = $this->getDataGenerator()->create_user(array('maildigest' => 1, 'trackanonforums' => 1));
     $manplugin = enrol_get_plugin('manual');
     $manualenrol = $DB->get_record('enrol', array('courseid' => $course->id, 'enrol' => 'manual'));
     $student = $DB->get_record('role', array('shortname' => 'student'));
     // The role_assign observer does it's job adding the anonforum_subscriptions record.
     $manplugin->enrol_user($manualenrol, $user->id, $student->id);
     // They are not required, but in a real environment they are supposed to be required;
     // adding them just in case there are APIs changes in future.
     set_config('anonforum_trackingtype', 1);
     set_config('anonforum_trackreadposts', 1);
     $record = array();
     $record['course'] = $course->id;
     $record['anonforum'] = $trackedanonforum->id;
     $record['userid'] = $user->id;
     $discussion = $anonforumgen->create_discussion($record);
     $record = array();
     $record['discussion'] = $discussion->id;
     $record['userid'] = $user->id;
     $post = $anonforumgen->create_post($record);
     anonforum_tp_add_read_record($user->id, $post->id);
     anonforum_set_user_maildigest($trackedanonforum, 2, $user);
     anonforum_tp_stop_tracking($untrackedanonforum->id, $user->id);
     $this->assertEquals(1, $DB->count_records('anonforum_subscriptions'));
     $this->assertEquals(1, $DB->count_records('anonforum_digests'));
     $this->assertEquals(1, $DB->count_records('anonforum_track_prefs'));
     $this->assertEquals(1, $DB->count_records('anonforum_read'));
     // The course_module_created observer does it's job adding a subscription.
     $anonforumrecord = array('course' => $course->id, 'type' => 'general', 'forcesubscribe' => ANONFORUM_INITIALSUBSCRIBE);
     $extraanonforum = $this->getDataGenerator()->create_module('anonforum', $anonforumrecord);
     $this->assertEquals(2, $DB->count_records('anonforum_subscriptions'));
     $manplugin->unenrol_user($manualenrol, $user->id);
     $this->assertEquals(0, $DB->count_records('anonforum_digests'));
     $this->assertEquals(0, $DB->count_records('anonforum_subscriptions'));
     $this->assertEquals(0, $DB->count_records('anonforum_track_prefs'));
     $this->assertEquals(0, $DB->count_records('anonforum_read'));
 }