diff --git a/test/functional/WorkerRemoveUsersFromGroupTest.php b/test/functional/WorkerRemoveUsersFromGroupTest.php new file mode 100644 index 00000000..06bb743e --- /dev/null +++ b/test/functional/WorkerRemoveUsersFromGroupTest.php @@ -0,0 +1,70 @@ +getPIGroup(); + $this->assertTrue($pi->isPI()); + $this->assertEqualsCanonicalizing([$pi->uid], $pi_group->getGroupMemberUIDs(true)); + $this->assertEqualsCanonicalizing([$pi->uid], $pi_group->getGroupMemberUIDs(false)); + $this->assertEqualsCanonicalizing([], $pi_group->getRequests()); + $uids = getSomeUIDsOfQualifiedUsersNotRequestedAccountDeletion(); + $uids_to_remove = array_slice($uids, 0, 3); + $expected_new_uids = array_diff(array_merge([$pi->uid], $uids), $uids_to_remove); + $remove_uids_file = $this->writeLinesToTmpFile($uids_to_remove); + $remove_uids_file_path = stream_get_meta_data($remove_uids_file)["uri"]; + try { + foreach ($uids as $uid) { + $user = new UnityUser($uid, $LDAP, $SQL, $MAILER, $REDIS, $WEBHOOK); + $pi_group->newUserRequest($user, false); + $pi_group->approveUser($user, false); + } + [$_, $output] = executeWorker( + "remove-users-from-group.php", + "$pi_group->gid $remove_uids_file_path", + ); + print implode("\n", $output); + // our $LDAP is not aware of changes made by worker subprocess, so throw it out + unset($GLOBALS["ldapconn"]); + switchUser(...getUserIsPIHasNoMembersNoMemberRequests()); + $pi = $USER; + $pi_group = $USER->getPIGroup(); + $this->assertEqualsCanonicalizing( + $expected_new_uids, + $pi_group->getGroupMemberUIDs(false), + ); + $this->assertEqualsCanonicalizing( + $expected_new_uids, + $pi_group->getGroupMemberUIDs(true), + ); + } finally { + foreach ($uids as $uid) { + $user = new UnityUser($uid, $LDAP, $SQL, $MAILER, $REDIS, $WEBHOOK); + $pi_group->removeUser($user); + } + } + } +} diff --git a/test/functional/WorkerUpdateLDAPCacheTest.php b/test/functional/WorkerUpdateLDAPCacheTest.php new file mode 100644 index 00000000..47837e02 --- /dev/null +++ b/test/functional/WorkerUpdateLDAPCacheTest.php @@ -0,0 +1,25 @@ +getPIGroup()->getGroupMemberUIDs(false); + [$_, $output_lines] = executeWorker("update-ldap-cache.php", "-f"); + error_log(implode("\n", $output_lines)); + // switchUser(...getUserIsPIHasAtLeastOneMember()); // refresh $REDIS + $after_flush_value = $REDIS->getCache($USER->getPIGroup()->gid, "members"); + $this->assertEqualsCanonicalizing([], $after_flush_value); + [$_, $output_lines] = executeWorker("update-ldap-cache.php"); + error_log(implode("\n", $output_lines)); + // switchUser(...getUserIsPIHasAtLeastOneMember()); // refresh $REDIS + $after_update_value = $REDIS->getCache($USER->getPIGroup()->gid, "members"); + $this->assertEqualsCanonicalizing($initial_value, $after_update_value); + } +} diff --git a/test/phpunit-bootstrap.php b/test/phpunit-bootstrap.php index 2091029e..303d2642 100644 --- a/test/phpunit-bootstrap.php +++ b/test/phpunit-bootstrap.php @@ -158,6 +158,30 @@ function http_get(string $phpfile, array $get_data = []): void } } +/** + * runs a worker script + * @throws RuntimeException + * @return [return code, output lines] + */ +function executeWorker(string $basename, string $args = "", bool $doThrowIfNonzero = true): array +{ + $command = sprintf("%s %s/../workers/%s %s 2>&1", PHP_BINARY, __DIR__, $basename, $args); + $output = []; + $rc = null; + exec($command, $output, $rc); + if ($doThrowIfNonzero && $rc !== 0) { + throw new RuntimeException( + sprintf( + "command failed! command='%s' rc=%d output=%s", + $command, + $rc, + jsonEncode($output), + ), + ); + } + return [$rc, $output]; +} + // delete requests made by that user // delete user entry // delete user group entry @@ -216,6 +240,7 @@ function ensureUserNotInPIGroup(UnityGroup $pi_group) $pi_group->removeUser($USER); ensure(!$pi_group->memberExists($USER)); } + // FIXME removeUser already removes the uid from this redis, this shouldn't be necessary $REDIS->removeCacheArray( $pi_group->gid, "members", @@ -338,3 +363,17 @@ function getAdminUser() { return ["user1@org1.test", "foo", "bar", "user1@org1.test"]; } + +function getSomeUIDsOfQualifiedUsersNotRequestedAccountDeletion() +{ + return [ + "user1_org1_test", + "user3_org1_test", + "user6_org1_test", + "user7_org1_test", + "user8_org1_test", + "user9_org3_test", + "user10_org1_test", + "user11_org1_test", + ]; +} diff --git a/workers/clear-audit-log.php b/workers/clear-audit-log.php index c7cfebf8..908fb2ac 100755 --- a/workers/clear-audit-log.php +++ b/workers/clear-audit-log.php @@ -1,8 +1,6 @@ #!/usr/bin/env php exists()) { - _die("No such group '$gid'\n"); + _die("No such group '$gid'\n", 1); } -($handle = fopen($filename, "r")) or _die("Can't open '$filename'\n"); +($handle = fopen($filename, "r")) or _die("Can't open '$filename'\n", 1); while (($line = fgets($handle)) !== false) { $uid = trim($line); $user = new UnityUser($uid, $LDAP, $SQL, $MAILER, $REDIS, $WEBHOOK); diff --git a/workers/update-ldap-cache.php b/workers/update-ldap-cache.php index d4e5c396..124bc40c 100755 --- a/workers/update-ldap-cache.php +++ b/workers/update-ldap-cache.php @@ -1,8 +1,6 @@ #!/usr/bin/env php