diff --git a/enrol/lti/tests/local/ltiadvantage/repository/user_repository_test.php b/enrol/lti/tests/local/ltiadvantage/repository/user_repository_test.php index cd690379330..3ba923237da 100644 --- a/enrol/lti/tests/local/ltiadvantage/repository/user_repository_test.php +++ b/enrol/lti/tests/local/ltiadvantage/repository/user_repository_test.php @@ -31,9 +31,10 @@ class user_repository_test extends \advanced_testcase { * Helper to generate a new user instance. * * @param int $mockresourceid used to spoof a published resource, to which this user is associated. + * @param array $userfields user information like city, timezone which would normally come from the tool configuration. * @return user a user instance */ - protected function generate_user(int $mockresourceid = 1): user { + protected function generate_user(int $mockresourceid = 1, array $userfields = []): user { global $CFG; $registration = application_registration::create( 'Test', @@ -63,16 +64,35 @@ class user_repository_test extends \advanced_testcase { $savedcontext->get_id()); $savedresourcelink = $resourcelinkrepo->save($resourcelink); - $user = $this->getDataGenerator()->create_user(); + // Create a user using the DB defaults to simulate what would have occurred during an auth_lti user auth. + $user = $this->getDataGenerator()->create_user([ + 'city' => '', + 'country' => '', + 'institution' => '', + 'timezone' => '99', + 'maildisplay' => 2, + 'lang' => 'en' + ]); + + $userdefaultvalues = [ + 'lang' => $CFG->lang, + 'city' => '', + 'country' => '', + 'institution' => '', + 'timezone' => '99', + 'maildisplay' => 2 + ]; + if (empty($userfields)) { + // If userfields is omitted, assume the tool default configuration values (as if 'User default values' are unchanged). + $userfields = $userdefaultvalues; + } else { + // If they have been provided, merge and override the defaults. + $userfields = array_merge($userdefaultvalues, $userfields); + } $ltiuser = $savedresourcelink->add_user( $user->id, 'source-id-123', - $CFG->lang, - 'Perth', - 'AU', - 'An Example Institution', - '99', - 2, + ...array_values($userfields) ); $ltiuser->set_lastgrade(67.33333333); @@ -141,19 +161,45 @@ class user_repository_test extends \advanced_testcase { } /** - * Tests adding a user to the store. + * Tests adding a user to the store, assuming that the user has been created using the default 'user default values'. * * @covers ::save */ - public function test_save_new() { + public function test_save_new_unchanged_user_defaults() { $this->resetAfterTest(); $user = $this->generate_user(); $userrepo = new user_repository(); + $sink = $this->redirectEvents(); $saveduser = $userrepo->save($user); + $events = $sink->get_events(); + $sink->close(); $this->assertIsInt($saveduser->get_id()); $this->assert_same_user_values($user, $saveduser, true); $this->assert_user_db_values($saveduser); + // No change to underlying user: city, etc. take on default values matching those of the existing user record. + $this->assertEmpty($events); + } + + /** + * Tests adding a user to the store, assuming that the user has been created using modified 'user default values'. + * + * @covers ::save + */ + public function test_save_new_changed_user_defaults() { + $this->resetAfterTest(); + $user = $this->generate_user(1, ['city' => 'Perth']); + $userrepo = new user_repository(); + $sink = $this->redirectEvents(); + $saveduser = $userrepo->save($user); + $events = $sink->get_events(); + $sink->close(); + + $this->assertIsInt($saveduser->get_id()); + $this->assert_same_user_values($user, $saveduser, true); + $this->assert_user_db_values($saveduser); + // The underlying user record will change: city ('Perth') differs from that of the existing user (''). + $this->assertInstanceOf(\core\event\user_updated::class, $events[0]); } /** @@ -165,16 +211,25 @@ class user_repository_test extends \advanced_testcase { $this->resetAfterTest(); $user = $this->generate_user(); $userrepo = new user_repository(); + $sink = $this->redirectEvents(); $saveduser = $userrepo->save($user); + $events = $sink->get_events(); + $sink->close(); + $this->assertEmpty($events); // No event for the first save, since the underlying user record is unchanged. $saveduser->set_city('New City'); $saveduser->set_country('NZ'); $saveduser->set_lastgrade(99.99999999); + $sink = $this->redirectEvents(); $saveduser2 = $userrepo->save($saveduser); + $events = $sink->get_events(); + $sink->close(); $this->assertEquals($saveduser->get_id(), $saveduser2->get_id()); $this->assert_same_user_values($saveduser, $saveduser2, true); $this->assert_user_db_values($saveduser2); + // The underlying user record will change now, since city and country have changed. + $this->assertInstanceOf(\core\event\user_updated::class, $events[0]); } /**