All files / server/src/features/assignment/utils getRandomAndPadgInput.ts

100% Statements 16/16
100% Branches 4/4
100% Functions 1/1
100% Lines 16/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                    45x       79x   79x 10x                 73x           69x     69x           69x     69x   69x 69x 69x 327x 73x   254x       69x                
import { getLotterySignups } from "server/features/assignment/utils/getLotterySignups";
import { getLotterySignupProgramItems } from "server/features/assignment/utils/getLotterySignupProgramItems";
import { getGroupCreators } from "server/features/assignment/utils/getGroupCreators";
import { getAttendeeGroups } from "server/features/assignment/utils/getAttendeeGroups";
import { getGroupMembersWithCreatorLotterySignups } from "server/features/assignment/utils/getGroupMembers";
import { User } from "shared/types/models/user";
import { ProgramItem } from "shared/types/models/programItem";
import { RunRandomAndPadgInput } from "server/types/resultTypes";
 
// TODO: When using PADG+random, this is called twice - lift higher
export const getRandomAndPadgInput = (
  users: readonly User[],
  startingProgramItems: readonly ProgramItem[],
): RunRandomAndPadgInput => {
  const lotterySignups = getLotterySignups(users);
 
  if (lotterySignups.length === 0) {
    return {
      lotterySignupProgramItems: [],
      attendeeGroups: [],
      allAttendees: [],
      numberOfIndividuals: 0,
      numberOfGroups: 0,
    };
  }
 
  const lotterySignupProgramItems = getLotterySignupProgramItems(
    startingProgramItems,
    lotterySignups,
  );
 
  // Get group creators, selected users are group creators since group members don't have signups yet
  const groupCreators = getGroupCreators(users, startingProgramItems);
 
  // Get group members based on group creators
  const groupMembers = getGroupMembersWithCreatorLotterySignups(
    groupCreators,
    users,
  );
 
  // Combine group creators and group members
  const allAttendees = [...groupCreators, ...groupMembers];
 
  // Combine users to groups, single user is size 1 group
  const attendeeGroups = getAttendeeGroups(allAttendees);
 
  let numberOfIndividuals = 0;
  let numberOfGroups = 0;
  for (const attendeeGroup of attendeeGroups) {
    if (attendeeGroup.length > 1) {
      numberOfGroups += 1;
    } else {
      numberOfIndividuals += 1;
    }
  }
 
  return {
    lotterySignupProgramItems,
    attendeeGroups,
    allAttendees,
    numberOfIndividuals,
    numberOfGroups,
  };
};