/** * Test the current get_ratings method main sql */ function test_get_ratings_sql() { // We load 3 items. Each is rated twice. For simplicity itemid == user id of the item owner $ctxid = $this->syscontext->id; $this->load_test_data('rating', array('contextid', 'component', 'ratingarea', 'itemid', 'scaleid', 'rating', 'userid', 'timecreated', 'timemodified'), array( //user 1's items. Average == 2 array( $ctxid , 'mod_forum', 'post', 1 , 10 , 1 , 2 , 1 , 1), array( $ctxid , 'mod_forum', 'post', 1 , 10 , 3 , 3 , 1 , 1), //user 2's items. Average == 3 array( $ctxid , 'mod_forum', 'post', 2 , 10 , 1 , 1 , 1 , 1), array( $ctxid , 'mod_forum', 'post', 2 , 10 , 5 , 3 , 1 , 1), //user 3's items. Average == 4 array( $ctxid , 'mod_forum', 'post', 3 , 10 , 3 , 1 , 1 , 1), array( $ctxid , 'mod_forum', 'post', 3 , 10 , 5 , 2 , 1 , 1) )); // a post (item) by user 1 (rated above by user 2 and 3 with average = 2) $user1posts = array( (object)array('id' => 1, 'userid' => 1, 'message' => 'hello')); // a post (item) by user 2 (rated above by user 1 and 3 with average = 3) $user2posts = array( (object)array('id' => 2, 'userid' => 2, 'message' => 'world')); // a post (item) by user 3 (rated above by user 1 and 2 with average = 4) $user3posts = array( (object)array('id' => 3, 'userid' => 3, 'message' => 'moodle')); // Prepare the default options $defaultoptions = array ( 'context' => $this->syscontext, 'component' => 'mod_forum', 'ratingarea' => 'post', 'scaleid' => 10, 'aggregate' => RATING_AGGREGATE_AVERAGE); $rm = new mockup_rating_manager(); // STEP 1: Retreive ratings using the current user // Get results for user 1's item (expected average 1 + 3 / 2 = 2) $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($user1posts)); $this->assertEqual($result[0]->id, $user1posts[0]->id); $this->assertEqual($result[0]->userid, $user1posts[0]->userid); $this->assertEqual($result[0]->message, $user1posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 2); // Note that $result[0]->rating->rating is somewhat random // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests // Get results for items of user 2 (expected average 1 + 5 / 2 = 3) $toptions = (object)array_merge($defaultoptions, array('items' => $user2posts)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($user2posts)); $this->assertEqual($result[0]->id, $user2posts[0]->id); $this->assertEqual($result[0]->userid, $user2posts[0]->userid); $this->assertEqual($result[0]->message, $user2posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 3); // Note that $result[0]->rating->rating is somewhat random // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests // Get results for items of user 3 (expected average 3 + 5 / 2 = 4) $toptions = (object)array_merge($defaultoptions, array('items' => $user3posts)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($user3posts)); $this->assertEqual($result[0]->id, $user3posts[0]->id); $this->assertEqual($result[0]->userid, $user3posts[0]->userid); $this->assertEqual($result[0]->message, $user3posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 4); // Note that $result[0]->rating->rating is somewhat random // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests // Get results for items of user 1 & 2 together (expected averages are 2 and 3, as tested above) $posts = array_merge($user1posts, $user2posts); $toptions = (object)array_merge($defaultoptions, array('items' => $posts)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($posts)); $this->assertEqual($result[0]->id, $posts[0]->id); $this->assertEqual($result[0]->userid, $posts[0]->userid); $this->assertEqual($result[0]->message, $posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 2); // Note that $result[0]->rating->rating is somewhat random // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests $this->assertEqual($result[1]->id, $posts[1]->id); $this->assertEqual($result[1]->userid, $posts[1]->userid); $this->assertEqual($result[1]->message, $posts[1]->message); $this->assertEqual($result[1]->rating->count, 2); $this->assertEqual($result[1]->rating->aggregate, 3); // Note that $result[0]->rating->rating is somewhat random // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests // STEP 2: Retrieve ratings by a specified user // We still expect complete aggregations and counts // Get results for items of user 1 rated by user 2 (avg 2, rating 1) $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 2)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($user1posts)); $this->assertEqual($result[0]->id, $user1posts[0]->id); $this->assertEqual($result[0]->userid, $user1posts[0]->userid); $this->assertEqual($result[0]->message, $user1posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 2); $this->assertEqual($result[0]->rating->rating, 1); //user 2 rated user 1 "1" $this->assertEqual($result[0]->rating->userid, $toptions->userid); // Must be the passed userid // Get results for items of user 1 rated by user 3 $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 3)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($user1posts)); $this->assertEqual($result[0]->id, $user1posts[0]->id); $this->assertEqual($result[0]->userid, $user1posts[0]->userid); $this->assertEqual($result[0]->message, $user1posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 2); $this->assertEqual($result[0]->rating->rating, 3); //user 3 rated user 1 "3" $this->assertEqual($result[0]->rating->userid, $toptions->userid); // Must be the passed userid // Get results for items of user 1 & 2 together rated by user 3 $posts = array_merge($user1posts, $user2posts); $toptions = (object)array_merge($defaultoptions, array('items' => $posts, 'userid' => 3)); $result = $rm->get_ratings($toptions); $this->assertEqual(count($result), count($posts)); $this->assertEqual($result[0]->id, $posts[0]->id); $this->assertEqual($result[0]->userid, $posts[0]->userid); $this->assertEqual($result[0]->message, $posts[0]->message); $this->assertEqual($result[0]->rating->count, 2); $this->assertEqual($result[0]->rating->aggregate, 2); $this->assertEqual($result[0]->rating->rating, 3); //user 3 rated user 1 "3" $this->assertEqual($result[0]->rating->userid, $toptions->userid); // Must be the passed userid $this->assertEqual($result[1]->id, $posts[1]->id); $this->assertEqual($result[1]->userid, $posts[1]->userid); $this->assertEqual($result[1]->message, $posts[1]->message); $this->assertEqual($result[1]->rating->count, 2); $this->assertEqual($result[1]->rating->aggregate, 3); $this->assertEqual($result[0]->rating->rating, 3); //user 3 rated user 2 "5" $this->assertEqual($result[1]->rating->userid, $toptions->userid); // Must be the passed userid // STEP 3: Some special cases // Get results for user 1's items (expected average 1 + 3 / 2 = 2) // supplying a non-existent user id so no rating from that user should be found $toptions = (object)array_merge($defaultoptions, array('items' => $user1posts)); $toptions->userid = 123456; //non-existent user $result = $rm->get_ratings($toptions); $this->assertNull($result[0]->rating->userid); $this->assertNull($result[0]->rating->rating); $this->assertEqual($result[0]->rating->aggregate, 2);//should still get the aggregate // Get results for items of user 2 (expected average 1 + 5 / 2 = 3) // Supplying the user id of the user who owns the items so no rating should be found $toptions = (object)array_merge($defaultoptions, array('items' => $user2posts)); $toptions->userid = 2; //user 2 viewing the ratings of their own item $result = $rm->get_ratings($toptions); //these should be null as the user is viewing their own item and thus cannot rate $this->assertNull($result[0]->rating->userid); $this->assertNull($result[0]->rating->rating); $this->assertEqual($result[0]->rating->aggregate, 3);//should still get the aggregate }
/** * Test the current get_ratings method main sql */ public function test_get_ratings_sql() { global $DB; // We load 3 items. Each is rated twice. For simplicity itemid == user id of the item owner. $ctxid = context_system::instance()->id; $ratings = array(array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 1, 'scaleid' => 10, 'rating' => 1, 'userid' => 2, 'timecreated' => 1, 'timemodified' => 1), array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 1, 'scaleid' => 10, 'rating' => 3, 'userid' => 3, 'timecreated' => 1, 'timemodified' => 1), array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 2, 'scaleid' => 10, 'rating' => 1, 'userid' => 1, 'timecreated' => 1, 'timemodified' => 1), array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 2, 'scaleid' => 10, 'rating' => 5, 'userid' => 3, 'timecreated' => 1, 'timemodified' => 1), array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 3, 'scaleid' => 10, 'rating' => 3, 'userid' => 1, 'timecreated' => 1, 'timemodified' => 1), array('contextid' => $ctxid, 'component' => 'mod_forum', 'ratingarea' => 'post', 'itemid' => 3, 'scaleid' => 10, 'rating' => 5, 'userid' => 2, 'timecreated' => 1, 'timemodified' => 1)); foreach ($ratings as $rating) { $DB->insert_record('rating', $rating); } // A post (item) by user 1 (rated above by user 2 and 3 with average = 2). $user1posts = array((object) array('id' => 1, 'userid' => 1, 'message' => 'hello')); // A post (item) by user 2 (rated above by user 1 and 3 with average = 3). $user2posts = array((object) array('id' => 2, 'userid' => 2, 'message' => 'world')); // A post (item) by user 3 (rated above by user 1 and 2 with average = 4). $user3posts = array((object) array('id' => 3, 'userid' => 3, 'message' => 'moodle')); // Prepare the default options. $defaultoptions = array('context' => context_system::instance(), 'component' => 'mod_forum', 'ratingarea' => 'post', 'scaleid' => 10, 'aggregate' => RATING_AGGREGATE_AVERAGE); $rm = new mockup_rating_manager(); // STEP 1: Retreive ratings using the current user. // Get results for user 1's item (expected average 1 + 3 / 2 = 2). $toptions = (object) array_merge($defaultoptions, array('items' => $user1posts)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($user1posts)); $this->assertEquals($result[0]->id, $user1posts[0]->id); $this->assertEquals($result[0]->userid, $user1posts[0]->userid); $this->assertEquals($result[0]->message, $user1posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 2); // Note that $result[0]->rating->rating is somewhat random. // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests. // Get results for items of user 2 (expected average 1 + 5 / 2 = 3). $toptions = (object) array_merge($defaultoptions, array('items' => $user2posts)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($user2posts)); $this->assertEquals($result[0]->id, $user2posts[0]->id); $this->assertEquals($result[0]->userid, $user2posts[0]->userid); $this->assertEquals($result[0]->message, $user2posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 3); // Note that $result[0]->rating->rating is somewhat random. // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests. // Get results for items of user 3 (expected average 3 + 5 / 2 = 4). $toptions = (object) array_merge($defaultoptions, array('items' => $user3posts)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($user3posts)); $this->assertEquals($result[0]->id, $user3posts[0]->id); $this->assertEquals($result[0]->userid, $user3posts[0]->userid); $this->assertEquals($result[0]->message, $user3posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 4); // Note that $result[0]->rating->rating is somewhat random. // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests. // Get results for items of user 1 & 2 together (expected averages are 2 and 3, as tested above). $posts = array_merge($user1posts, $user2posts); $toptions = (object) array_merge($defaultoptions, array('items' => $posts)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($posts)); $this->assertEquals($result[0]->id, $posts[0]->id); $this->assertEquals($result[0]->userid, $posts[0]->userid); $this->assertEquals($result[0]->message, $posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 2); // Note that $result[0]->rating->rating is somewhat random. // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests. $this->assertEquals($result[1]->id, $posts[1]->id); $this->assertEquals($result[1]->userid, $posts[1]->userid); $this->assertEquals($result[1]->message, $posts[1]->message); $this->assertEquals($result[1]->rating->count, 2); $this->assertEquals($result[1]->rating->aggregate, 3); // Note that $result[0]->rating->rating is somewhat random. // We didn't supply a user ID so $USER was used which will vary depending on who runs the tests. // STEP 2: Retrieve ratings by a specified user. // We still expect complete aggregations and counts. // Get results for items of user 1 rated by user 2 (avg 2, rating 1). $toptions = (object) array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 2)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($user1posts)); $this->assertEquals($result[0]->id, $user1posts[0]->id); $this->assertEquals($result[0]->userid, $user1posts[0]->userid); $this->assertEquals($result[0]->message, $user1posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 2); $this->assertEquals($result[0]->rating->rating, 1); // User 2 rated user 1 "1". $this->assertEquals($result[0]->rating->userid, $toptions->userid); // Must be the passed userid. // Get results for items of user 1 rated by user 3. $toptions = (object) array_merge($defaultoptions, array('items' => $user1posts, 'userid' => 3)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($user1posts)); $this->assertEquals($result[0]->id, $user1posts[0]->id); $this->assertEquals($result[0]->userid, $user1posts[0]->userid); $this->assertEquals($result[0]->message, $user1posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 2); $this->assertEquals($result[0]->rating->rating, 3); // User 3 rated user 1 "3". $this->assertEquals($result[0]->rating->userid, $toptions->userid); // Must be the passed userid. // Get results for items of user 1 & 2 together rated by user 3. $posts = array_merge($user1posts, $user2posts); $toptions = (object) array_merge($defaultoptions, array('items' => $posts, 'userid' => 3)); $result = $rm->get_ratings($toptions); $this->assertEquals(count($result), count($posts)); $this->assertEquals($result[0]->id, $posts[0]->id); $this->assertEquals($result[0]->userid, $posts[0]->userid); $this->assertEquals($result[0]->message, $posts[0]->message); $this->assertEquals($result[0]->rating->count, 2); $this->assertEquals($result[0]->rating->aggregate, 2); $this->assertEquals($result[0]->rating->rating, 3); // User 3 rated user 1 "3". $this->assertEquals($result[0]->rating->userid, $toptions->userid); // Must be the passed userid. $this->assertEquals($result[1]->id, $posts[1]->id); $this->assertEquals($result[1]->userid, $posts[1]->userid); $this->assertEquals($result[1]->message, $posts[1]->message); $this->assertEquals($result[1]->rating->count, 2); $this->assertEquals($result[1]->rating->aggregate, 3); $this->assertEquals($result[0]->rating->rating, 3); // User 3 rated user 2 "5". $this->assertEquals($result[1]->rating->userid, $toptions->userid); // Must be the passed userid. // STEP 3: Some special cases. // Get results for user 1's items (expected average 1 + 3 / 2 = 2). // Supplying a non-existent user id so no rating from that user should be found. $toptions = (object) array_merge($defaultoptions, array('items' => $user1posts)); $toptions->userid = 123456; // Non-existent user. $result = $rm->get_ratings($toptions); $this->assertNull($result[0]->rating->userid); $this->assertNull($result[0]->rating->rating); $this->assertEquals($result[0]->rating->aggregate, 2); // Should still get the aggregate. // Get results for items of user 2 (expected average 1 + 5 / 2 = 3). // Supplying the user id of the user who owns the items so no rating should be found. $toptions = (object) array_merge($defaultoptions, array('items' => $user2posts)); $toptions->userid = 2; // User 2 viewing the ratings of their own item. $result = $rm->get_ratings($toptions); // These should be null as the user is viewing their own item and thus cannot rate. $this->assertNull($result[0]->rating->userid); $this->assertNull($result[0]->rating->rating); $this->assertEquals($result[0]->rating->aggregate, 3); // Should still get the aggregate. }