public function test_tag_discussion() { global $DB, $USER, $SITE, $CFG; require_once $CFG->dirroot . '/tag/lib.php'; $this->resetAfterTest(true); $this->setAdminUser(); // Create the generator object and do standard checks. $generator = self::getDataGenerator()->get_plugin_generator('mod_forumng'); // Create course. $record = new stdClass(); $record->shortname = 'testcourse'; $course = self::getDataGenerator()->create_course($record); // Create groups. $group1 = $this->get_new_group($course->id); $group2 = $this->get_new_group($course->id); // Create forum. $forumrecord = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum = mod_forumng::get_from_id($forumrecord->id, mod_forumng::CLONE_DIRECT, true); // Set use tag. $CFG->usetags = true; // Set forum to tag enabling. $this->assertTrue($CFG->usetags); $this->assertEquals(true, $forum->get_tags_enabled()); // Start a discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids1 = $generator->create_discussion($record); // Start a second discussion in forum (group1). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group1->id; $record->userid = $USER->id; $record->timestart = time(); $ids2 = $generator->create_discussion($record); // Start a third discussion in forum (group2). $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids3 = $generator->create_discussion($record); // Set up tags in each discussion. $discussionid = $ids1[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings($discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, $discussion::NOCHANGE, array('tag1', 'tag2', 'tag3')); $tags1 = $discussion->get_tags(); $this->assertCount(3, $tags1); $discussion1 = $discussion; $discussionid = $ids2[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1', 'tag2')); $tags2 = $discussion->get_tags(); $this->assertCount(2, $tags2); $discussion2 = $discussion; $discussionid = $ids3[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('tag1')); $tags3 = $discussion->get_tags(); $this->assertCount(1, $tags3); $discussion3 = $discussion; // Create a discussion with no tags for later use. $record = new stdClass(); $record->course = $course->id; $record->forum = $forum->get_id(); $record->groupid = $group2->id; $record->userid = $USER->id; $record->timestart = time(); $ids4 = $generator->create_discussion($record); // Get id of 'tag1'. $tagid = array_search('tag1', $tags3); // Get all tags and check on numbers for each tag. $tagsused = $forum->get_tags_used(); $this->assertCount(3, $tagsused); $tagsused1 = $forum->get_tags_used($group1->id); $this->assertCount(3, $tagsused1); $tagsused2 = $forum->get_tags_used($group2->id); $this->assertCount(1, $tagsused2); $this->assertArrayHasKey($tagid, $tagsused2); $this->assertObjectHasAttribute('displayname', $tagsused2[$tagid]); $this->assertObjectHasAttribute('count', $tagsused2[$tagid]); $this->assertEquals('tag1', $tagsused2[$tagid]->displayname); $this->assertEquals(1, $tagsused2[$tagid]->count); // Get all discussions featuring 'tag1'. $list = $forum->get_discussion_list(mod_forumng::ALL_GROUPS, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(3, $taggedlist); // Get all discussions featuring 'tag1'.for group1. $list1 = $forum->get_discussion_list($group1->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist1 = $list1->get_normal_discussions(); $this->assertCount(2, $taggedlist1); // Get all discussions featuring 'tag1'.for group2. $list2 = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist2 = $list2->get_normal_discussions(); $this->assertCount(1, $taggedlist2); // Get all discussions featuring 'tag3'.for group2 - which should be none. $tagid = array_search('tag3', $tags1); $list = $forum->get_discussion_list($group2->id, $forum->can_view_hidden(), 1, mod_forumng::SORT_DATE, false, 0, true, $tagid); $taggedlist = $list->get_normal_discussions(); $this->assertCount(0, $taggedlist); // Set tags specifically for group 1. $forumng = new stdClass(); $forumng->settags = array('g1 vamp', 'g1 zomb', 'g1 mumm', 'g1 damm'); $forumng->id = $forum->get_id(); $forumng->instance = $forum->get_id(); $forumng->tags = 1; forumng_update_instance($forumng); $context = $forum->get_context(); mod_forumng::set_group_tags($forum->get_id(), $group1->id, $forumng->settags); $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id); $this->assertCount(4, $tagsused1); // Set tags for group 2 (should return main set tags also). $g2tags = array('g2 ghost', 'g2 ghoul', 'g2 googl', 'g2 welf', 'g2 gobb'); mod_forumng::set_group_tags($forum->get_id(), $group2->id, $g2tags); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id); $this->assertCount(9, $tagsused2); $tagsused3 = $forum::get_set_tags($forumng->id); $this->assertCount(4, $tagsused3); // Test that group only tags can be returned. $tagsused1 = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(4, $tagsused1); $tagsused2 = $forum::get_set_tags($forumng->id, $group2->id, true); $this->assertCount(5, $tagsused2); // Need to test permanently delete. $discussionid = $ids4[0]; $discussion = mod_forumng_discussion::get_from_id($discussionid, 0); $this->assertEmpty($discussion->get_tags()); // Edit discussion settings. $discussion->edit_settings(mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, mod_forumng_discussion::NOCHANGE, array('t1', 't2', 't3')); $tags4 = $discussion->get_tags(); $this->assertCount(3, $tags4); $discussion4 = $discussion; // Delete discussion. $discussion4->permanently_delete(false); $this->assertFalse($DB->get_record('forumng_discussions', array('id' => $discussion->get_id()))); $this->assertEmpty($DB->get_records('tag_instance', array('itemid' => $discussion->get_id(), 'itemtype' => 'forumng discussions'))); // Test group tag setting. $user2 = $this->get_new_user(); $this->setUser($user2); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1', 'tnew')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(2, $tagsused); mod_forumng::set_group_tags($forumng->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumng->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags. $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should use another user). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); $tagsused = $forum::get_set_tags($forumrecord2->id, $group1->id, true); $this->assertCount(1, $tagsused); // Create a new forum and add same group tags (should fail as ou of users). $forumrecord2 = $generator->create_instance(array('course' => $course->id, 'tags' => true, 'groupmode' => VISIBLEGROUPS)); $forum2 = mod_forumng::get_from_id($forumrecord2->id, mod_forumng::CLONE_DIRECT, true); $this->setExpectedException('moodle_exception'); mod_forumng::set_group_tags($forumrecord2->id, $group1->id, array('t1')); // Do not add any tests after this point as exception called above. }
public function test_rating() { global $USER, $DB; $this->resetAfterTest(); $generator = $this->getDataGenerator()->get_plugin_generator('mod_forumng'); $course = $this->get_new_course(); $course2 = $this->get_new_course(); $suser = $this->get_new_user('student', $course->id); $this->setAdminUser(); $forum = $this->get_new_forumng($course->id, array('name' => 'TEST', 'intro' => 'abc123', 'enableratings' => mod_forumng::FORUMNG_STANDARD_RATING, 'ratingscale' => 10)); $forum2 = $this->get_new_forumng($course->id, array('name' => 'TEST2', 'intro' => 'abc123', 'enableratings' => mod_forumng::FORUMNG_NO_RATING)); $forum3 = $this->get_new_forumng($course2->id, array('name' => 'TEST', 'intro' => 'abc123', 'enableratings' => mod_forumng::FORUMNG_STANDARD_RATING, 'ratingscale' => 10)); $did1 = $generator->create_discussion(array('course' => $course, 'forum' => $forum->get_id(), 'userid' => $suser->id)); $did2 = $generator->create_discussion(array('course' => $course, 'forum' => $forum->get_id(), 'userid' => $suser->id)); $did3 = $generator->create_discussion(array('course' => $course, 'forum' => $forum->get_id(), 'userid' => $suser->id)); $did4 = $generator->create_discussion(array('course' => $course, 'forum' => $forum->get_id(), 'userid' => $suser->id)); // Add rating to all 3 discussions. $rm = new rating_manager(); $params = new stdClass(); $params->context = $forum->get_context(); $params->component = 'mod_forumng'; $params->ratingarea = 'post'; $params->scaleid = $forum->get_rating_scale(); $params->userid = $USER->id; $params->itemid = $did1[1]; $rating = new rating($params); $rating->update_rating(5); $params->itemid = $did2[1]; $rating = new rating($params); $rating->update_rating(5); $params->itemid = $did3[1]; $rating = new rating($params); $rating->update_rating(5); // Check rating object gets added where expected. $post = mod_forumng_post::get_from_id($did1[1], mod_forumng::CLONE_DIRECT, false, false); $ratings = $post->get_ratings(); $this->assertNotNull($ratings); $this->assertEquals($did1[1], $ratings->itemid); $post = mod_forumng_post::get_from_id($did1[1], mod_forumng::CLONE_DIRECT, true, false); $ratings = $post->get_ratings(); $this->assertNotNull($ratings); $this->assertEquals($did1[1], $ratings->itemid); $post = mod_forumng_post::get_from_id($did1[1], mod_forumng::CLONE_DIRECT, true, true); $ratings = $post->get_ratings(); $this->assertNotNull($ratings); $this->assertEquals($did1[1], $ratings->itemid); $ratedposts = $forum->get_all_posts_by_user($suser->id, null, 'fp.id', null, null, true); $this->assertCount(3, $ratedposts); $allposts = $forum->get_all_posts_by_user($suser->id, null); $this->assertCount(4, $allposts); $this->assertNotNull($allposts[$did1[1]]->get_ratings()); // Update grades (does nothing). $forum->update_grades(); // Enable rating grading, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum->get_id(), 'grading' => mod_forumng::GRADING_SUM)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); // Note sum is set to 10 not 15 as max grade is 10. $this->assertEquals(10, abs($grades->items[0]->grades[$suser->id]->grade)); // Enable rating grading, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum->get_id(), 'grading' => mod_forumng::GRADING_COUNT)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); $this->assertEquals(3, abs($grades->items[0]->grades[$suser->id]->grade)); // Check get_rated_posts_by_user. $extrapost = $generator->create_post(array('discussionid' => $did1[0], 'parentpostid' => $did1[1], 'userid' => $suser->id, 'created' => 1388589745)); $extraposts = $forum->get_rated_posts_by_user($forum, $suser->id, -1, 'fp.id', null, null); $this->assertCount(0, $extraposts); $extraposts = $forum->get_rated_posts_by_user($forum, $USER->id, -1, 'fp.id', null, null); $this->assertCount(3, $extraposts); $params->itemid = $extrapost->id; $rating = new rating($params); $rating->update_rating(10); $extraposts = $forum->get_rated_posts_by_user($forum, $USER->id, -1, 'fp.id', null, null); $this->assertCount(4, $extraposts); // Now filter out the 'old' extrapost. $extraposts = $forum->get_rated_posts_by_user($forum, $USER->id, -1, 'fp.id', null, null, 1388600000); $this->assertCount(3, $extraposts); // Check discussion delete. $discuss = mod_forumng_discussion::get_from_id($did1[0], mod_forumng::CLONE_DIRECT); $discuss->permanently_delete(); $rating = $DB->get_record('rating', array('itemid' => $did1[1])); $this->assertFalse($rating); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); $this->assertEquals(2, abs($grades->items[0]->grades[$suser->id]->grade)); // Check discussion move. $discuss = mod_forumng_discussion::get_from_id($did2[0], mod_forumng::CLONE_DIRECT); $discuss->move($forum2, 0); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); $this->assertEquals(1, abs($grades->items[0]->grades[$suser->id]->grade)); forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_COUNT, 'enableratings' => mod_forumng::FORUMNG_STANDARD_RATING, 'ratingscale' => 10)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $suser->id); $this->assertEquals(1, abs($grades->items[0]->grades[$suser->id]->grade)); $rating = $DB->get_record('rating', array('itemid' => $did2[1])); $this->assertNotEmpty($rating); $this->assertEquals($forum2->get_context(true)->id, $rating->contextid); // Check discussion copy. $discuss = mod_forumng_discussion::get_from_id($did3[0], mod_forumng::CLONE_DIRECT); $discuss->copy($forum3, 0); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); $this->assertEquals(1, abs($grades->items[0]->grades[$suser->id]->grade)); // Check rating didn't copy as forum in another course. $ratingtotal = $DB->get_records('rating'); $this->assertCount(2, $ratingtotal); // Check rating does copy to foum in same course. $discuss->copy($forum2, 0); $ratingtotal = $DB->get_records('rating'); $this->assertCount(3, $ratingtotal); // Check forum deleting. course_delete_module($forum->get_course_module_id()); $ratingtotal = $DB->get_records('rating'); $this->assertCount(2, $ratingtotal); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum->get_id(), $suser->id); $this->assertEmpty($grades->items); }
/** * Tests the grading functions in mod_forumng. * Note manual grading is handled in feature/user posts and not tested here... */ public function test_grading() { global $USER, $DB; $this->resetAfterTest(true); $this->setAdminUser(); $adminid = $USER->id; $generator = $this->getDataGenerator()->get_plugin_generator('mod_forumng'); $course = $this->get_new_course(); $user1 = $this->get_new_user('editingteacher', $course->id); $forum1 = $this->get_new_forumng($course->id, array('grading' => mod_forumng::GRADING_MANUAL, 'gradingscale' => 50)); $forum1->update_grades($USER->id); // Should do nothing and throw no excpetion... $forum2 = $this->get_new_forumng($course->id, array('grading' => mod_forumng::GRADING_COUNT, 'gradingscale' => 5, 'ratingscale' => 5)); list($discuss, $postid) = $generator->create_discussion(array('course' => $course->id, 'forum' => $forum2->get_id(), 'userid' => $USER->id)); $post = mod_forumng_post::get_from_id($postid, 0); $post->rate(1); // Calls update_grades(). $post = $generator->create_post(array('discussionid' => $discuss, 'userid' => $USER->id, 'parentpostid' => $postid)); $post = mod_forumng_post::get_from_id($post->id, 0); $post->rate(3); // Calls update_grades(). $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEquals(2, abs($grades->items[0]->grades[$USER->id]->grade)); // Try another grading type, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_MAX)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEquals(3, abs($grades->items[0]->grades[$USER->id]->grade)); // Try another grading type, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_MIN)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEquals(1, abs($grades->items[0]->grades[$USER->id]->grade)); // Try another grading type, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_SUM)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEquals(4, abs($grades->items[0]->grades[$USER->id]->grade)); // Try another grading type, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_AVERAGE)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEquals(2, abs($grades->items[0]->grades[$USER->id]->grade)); // Try another grading type, forumng_update_instance() should update grades. forumng_update_instance((object) array('instance' => $forum2->get_id(), 'grading' => mod_forumng::GRADING_NONE)); $grades = grade_get_grades($course->id, 'mod', 'forumng', $forum2->get_id(), $USER->id); $this->assertEmpty($grades->items[0]->grades[$USER->id]->grade); }