{
  "tests": [
    {
      "name": "test/groups.js | Groups .list() should list the groups present",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .get() with no options, should show group information",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .get() should return null if group does not exist",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return empty array if query is falsy",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return the groups when search query is empty",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return the \"Test\" group when searched for",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return the \"Test\" group when searched for and sort by member count",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return the \"Test\" group when searched for and sort by creation time",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should return all users if no query",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should search group members",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .search() should not return hidden groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .isMember() should return boolean true when a user is in a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .isMember() should return boolean false when a user is not in a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .isMember() should return true for uid 0 and guests group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .isMemberOfGroupList should report that a user is part of a groupList, if they are",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .isMemberOfGroupList should report that a user is not part of a groupList, if they are not",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .exists() should verify that the test group exists",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .exists() should verify that a fake group does not exist",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .exists() should check if group exists using an array",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should create another group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should create a hidden group if hidden is 1",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should create a visible group if hidden is 0",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should create a visible group if hidden is not passed in",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should fail to create group with duplicate group name",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should fail to create group if slug is empty",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should fail if group name is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should not create a system group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .create() should return falsy for userTitleEnabled",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .hide() should mark the group as hidden",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should change an aspect of a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should rename a group and not break navigation routes",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should fail if system groups is being renamed",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should fail to rename if group name is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should fail to rename if group name is too short",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should fail to rename if group name is too long",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .update() should fail to rename group to an existing group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .destroy() should destroy a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .destroy() should also remove the members set",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .destroy() should remove group from privilege groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should add a user to a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should fail to add user to admin group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should fail to add user to group if group name is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should fail to add user to group if uid is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should add user to Global Moderators group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should add user to multiple groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should set group title when user joins the group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should fail to add user to system group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .join() should allow admins to join private groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .leave() should remove a user from a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .leaveAllGroups() should remove a user from all groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .show() should make a group visible",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups .hide() should make a group hidden",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should error if data is null",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should not error if data is valid",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should return error if not logged in",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should return error if group name is special",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should error if group does not exist",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should join test group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should error if not logged in",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should leave test group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to join if group is private and join requests are disabled",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to leave if group is private and leave is disabled",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should join if user is admin",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should request membership for regular user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should reject membership of user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should error if not owner or admin",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should accept membership of user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should reject/accept all memberships requests",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should issue invite to user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should issue mass invite to users",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should rescind invite",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should error if user is not invited",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should accept invite",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should reject invite",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should grant ownership to user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should rescind ownership from user",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to kick user with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should kick user from group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to create group with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to create group if group creation is disabled",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to create group if name is privilege group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should create/update group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to create a group with name guests",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to rename guests group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should delete group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to delete group if name is special",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to load more groups with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should load more groups",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should fail to load more members with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups socket methods should load more members",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should fail to create group with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should fail to create group if group name is privilege group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should create a group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should fail to join with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should add user to group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should not error if user is already member",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods it should fail with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods it should fail if admin tries to remove self",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should not error if user is not member",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should fail if trying to remove someone else from group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should remove user from group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should fail with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups admin socket methods should update group",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should fail if user is not logged in or not owner",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should upload group cover image from file",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should upload group cover image from data",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should fail to upload group cover with invalid image",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should update group cover position",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should fail to update cover position if group name is missing",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should fail to remove cover if not logged in",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should fail to remove cover if not owner",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User should get admins and mods",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User should allow user to login even if password is weak",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should be created properly",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should have a valid email, if using an email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should error with invalid password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should error with a too long password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should error if username is already taken or rename user",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .create(), when created should error if email is already taken",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .uniqueUsername() should deal with collisions",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isModerator() should return false",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isModerator() should return two false results",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .getModeratorUids() should retrieve all users with moderator bit in category privilege",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isReadyToPost() should error when a user makes two posts in quick succession",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isReadyToPost() should allow a post if the last post time is > 10 seconds",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isReadyToPost() should error when a new user posts if the last post time is 10 < 30 seconds",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .isReadyToPost() should not error if a non-newbie user posts if the last post time is 10 < 30 seconds",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should return an object containing an array of matching users",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should search user",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should error for guest",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should error with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should error for unprivileged user",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should search users by ip",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should search users by uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should search users by fullname",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should return empty array if query is empty",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should filter users",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .search() should sort results by username",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .delete() should delete a user account",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .delete() should not re-add user to users:postcount if post is deleted after user deletion",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .delete() should not re-add user to users:reputation if post is upvoted after user deletion",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User .delete() should delete user even if they started a chat",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .generate() should generate a new reset code",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .generate() should invalidate a previous generated reset code",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .validate() should ensure that this new code is valid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .validate() should correctly identify an invalid code",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .send() should create a new reset code and reset password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .commit() should update the user's password and confirm their email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset .should error if same password is used for reset",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User passwordReset should not validate email if password reset is due to expiry",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return uid from email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return uid from username",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return uid from userslug",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should get user data even if one uid is NaN",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should not return private user data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should not return password even if explicitly requested",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return an icon text and valid background if username and picture is explicitly requested",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return a valid background, even if an invalid background colour is set",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return private data if field is whitelisted",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should return 0 as uid if username is falsy",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should get username by userslug",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should get uids by emails",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should not get groupTitle for guests",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hash methods should load guest data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User not logged in should return error if not logged in",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should return error if data is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should return error if data is missing uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should update a user's profile",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should change a user's password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not let user change another user's password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not let user change admin's password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should let admin change another users password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not let admin change their password if current password is incorrect",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should change username",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not let setting an empty username",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should let updating profile if current username is above max length and it is not being changed",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not update a user's username if it did not change",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should not update a user's username if a password is not supplied",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should change email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should error if email is identical",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should update cover image",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should remove cover image",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should set user status",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should fail for invalid status",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should get user status",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should change user picture",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should fail to change user picture with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should fail to change user picture with invalid uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should set user picture to uploaded",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should return error if profile image uploads disabled",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should return error if profile image has no mime type",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should load profile page",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should load settings page",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should load edit page",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should load edit/email page",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods should load user's groups page",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should upload cropped profile picture",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should upload cropped profile picture in chunks",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should error if both file and imageData are missing",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should error if file size is too big",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should not allow image data with bad MIME type to be passed in",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should get profile pictures",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should get default profile avatar",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should fail to get profile pictures with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should remove uploaded picture",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User profile methods user.uploadCroppedPicture should fail to remove uploaded picture with invalid-data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should return error if there is no ban reason",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should get history from set",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should return the correct ban reason",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should ban user permanently",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should ban user temporarily",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should error if until is NaN",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should be member of \"banned-users\" system group only after a ban",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should restore system group memberships after an unban (for an unverified user)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user info should restore system group memberships after an unban (for a verified user)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User Digest.getSubscribers should accurately build digest list given ACP default \"null\" (not set)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User Digest.getSubscribers should accurately build digest list given ACP default \"day\"",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User Digest.getSubscribers should accurately build digest list given ACP default \"week\"",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User Digest.getSubscribers should accurately build digest list given ACP default \"off\"",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests should send digests",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests should not send digests",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should unsubscribe from digest if one-click unsubscribe is POSTed",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should unsubscribe from notifications if one-click unsubscribe is POSTed",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should return errors on missing template in token",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should return errors on wrong template in token",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should return errors on missing token",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User digests unsubscribe via POST should return errors on token signed with wrong secret (verify-failure)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should fail with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should return true if user/group exists",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should return false if user/group does not exists",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should delete user",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should clean profile images after account deletion",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should fail to delete user with wrong password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should delete user with correct password",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should fail to delete user if account deletion is not allowed",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should fail if data is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should return true if email exists",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should return false if email does not exist",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should error if requireEmailConfirmation is disabled",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should send email confirm",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should send reset email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should return invalid-data error",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should not error",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should commit reset",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should save user settings",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should properly escape homePageRoute",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should error if language is invalid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User socket methods should set moderation note",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should add user to approval queue",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should fail to add user to queue if username is taken",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should fail to add user to queue if email is taken",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should reject user registration",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should accept user registration",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User approval queue should trim username and add user to registration queue",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter is not an admin and does not have invite privilege should error if user does not have invite privilege",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter is not an admin and does not have invite privilege should error out if user tries to use an inviter's uid via the API",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if user is not admin and type is admin-invite-only",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should send invitation email (without groups to be joined)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should send multiple invitation emails (with a public group to be joined)",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if the user has not permission to invite to the group",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if a non-admin tries to invite to the administrators group",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should to invite to own private group",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should to invite to multiple groups",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if tries to invite to hidden group",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if ouf of invitations",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should send invitation email after maximumInvites increased",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if invite is sent via API with a different UID",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter has invite privilege should error if email exists",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter is an admin should escape email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites when inviter is an admin should invite to the administrators group if inviter is an admin",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should get user's invites",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should get all invites",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should fail to verify invitation with invalid data",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should fail to verify invitation with invalid email",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should verify installation with no errors",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should error with invalid username",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should delete invitation",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should delete invitation key",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites after invites checks should joined the groups from invitation after registration",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites invite groups should show a list of groups for adding to an invite",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User invites invite groups should error out if you request invite groups for another uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User email confirm should error with invalid code",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User email confirm should confirm email of user",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User email confirm should confirm email of user by uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user jobs should start user jobs",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user jobs should stop user jobs",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user jobs should send digest",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hideEmail/hideFullname should hide email and fullname",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User hideEmail/hideFullname should hide fullname in topic list and topic",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .toggle() should toggle block",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .add() should block a uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .add() should automatically increment corresponding user field",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .add() should error if you try to block the same uid again",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .remove() should unblock a uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .remove() should automatically decrement corresponding user field",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .remove() should error if you try to unblock the same uid again",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .is() should return a Boolean with blocked status for the queried uid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .list() should return a list of blocked uids",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .filter() should remove entries by blocked uids and return filtered set",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .filter() should allow property argument to be passed in to customise checked property",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .filter() should not process invalid sets",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .filter() should process plain sets that just contain uids",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User user blocking methods .filter() should filter uids that are blocking targetUid",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User status/online should return offline if user is guest",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User status/online should return true",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User isPrivilegedOrSelf should return not error if self",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User isPrivilegedOrSelf should not error if privileged",
      "status": "PASSED"
    },
    {
      "name": "test/user.js | User isPrivilegedOrSelf should error if not privileged",
      "status": "PASSED"
    },
    {
      "name": "test/groups.js | Groups groups cover should remove cover",
      "status": "FAILED"
    }
  ]
}