def test_get_by_child(self):
        departments = [DepartmentFactory(), DepartmentFactory()]
        persons = [PersonFactory(), PersonFactory()]

        # Not on wainting list yet
        self.assertEqual(len(WaitingList.get_by_child(persons[0])), 0)

        # Sign up for waiting LIst
        WaitingListFactory(person=persons[0], department=departments[0])
        WaitingListFactory(person=persons[1], department=departments[0])

        self.assertEqual(WaitingList.get_by_child(persons[0]),
                         [(departments[0], 1)])
        self.assertEqual(WaitingList.get_by_child(persons[1]),
                         [(departments[0], 2)])

        # Sign up for more
        WaitingListFactory(person=persons[1], department=departments[1])
        WaitingListFactory(person=persons[0], department=departments[1])

        # Checks for Ordering
        self.assertEqual(
            WaitingList.get_by_child(persons[0]),
            [(departments[0], 1), (departments[1], 1)],
        )
        self.assertEqual(
            WaitingList.get_by_child(persons[1]),
            [(departments[0], 2), (departments[1], 2)],
        )
 def test_position_on_waitinglist_computed_correctly(self):
     department = DepartmentFactory()
     subscription0 = WaitingListFactory(department=department,
                                  person__added = datetime(2017, 1, 1, tzinfo=TIMEZONE))
     self.assertEqual(1, subscription0.number_on_waiting_list())
     subscription1 = WaitingListFactory(department=department,
                                  person__added = datetime(2015, 1, 1, tzinfo=TIMEZONE))
     self.assertEqual(2, subscription0.number_on_waiting_list())
     self.assertEqual(1, subscription1.number_on_waiting_list())
    def test_different_waitinglists_does_not_interfere(self):
        department0 = DepartmentFactory()
        department1 = DepartmentFactory()
        person = PersonFactory()
        subscription0 = WaitingListFactory(person=person,
                                           department=department0)
        subscription1 = WaitingListFactory(person=person,
                                           department=department1)

        self.assertEqual(1, subscription0.number_on_waiting_list())
        self.assertEqual(1, subscription1.number_on_waiting_list())

        fake = faker.Faker()

        # Add a lot of people with random sign-up dates to the second
        # list.
        # NB. fake.date_time() only returns past datetimes, thus all
        # subscriptions will be added infront of our new person, not
        # after
        n = 30
        for i in range(n):
            WaitingListFactory(person__added=fake.date_time(tzinfo=TIMEZONE),
                               department=department1)

        # Should not interfere with position on the first list
        self.assertEqual(1, subscription0.number_on_waiting_list())

        # We are placed last on the second waiting list
        self.assertEqual(n + 1, subscription1.number_on_waiting_list())
    def test_people_are_added_to_waiting_list_in_signup_order(self):
        department = DepartmentFactory()
        subscription0 = WaitingListFactory(department=department)
        with freeze_time(datetime.now() + timedelta(seconds=60)):
            subscription1 = WaitingListFactory(department=department)
        with freeze_time(datetime.now() + timedelta(seconds=120)):
            subscription2 = WaitingListFactory(department=department)

        subscriptions = WaitingList.objects.all()

        self.assertEqual(3, subscriptions.count())
        self.assertEqual(subscription0, subscriptions[0])
        self.assertEqual(subscription1, subscriptions[1])
        self.assertEqual(subscription2, subscriptions[2])
    def test_waiting_list_is_sorted_by_person_signup_date(self):
        department = DepartmentFactory()
        subscription0 = WaitingListFactory(person__added=datetime(
            2017, 1, 1, tzinfo=TIMEZONE),
                                           department=department)
        subscription1 = WaitingListFactory(person__added=datetime(
            2015, 1, 1, tzinfo=TIMEZONE),
                                           department=department)
        subscription2 = WaitingListFactory(person__added=datetime(
            2019, 1, 1, tzinfo=TIMEZONE),
                                           department=department)

        subscriptions = WaitingList.objects.all()

        self.assertEqual(3, subscriptions.count())
        self.assertEqual(subscription1, subscriptions[0])
        self.assertEqual(subscription0, subscriptions[1])
        self.assertEqual(subscription2, subscriptions[2])
    def setUp(self):
        self.nr_closed_Departments = randint(1, 30)
        DepartmentFactory.create_batch(self.nr_closed_Departments)

        self.nr_departments = randint(1, 30)
        departments = DepartmentFactory.create_batch(self.nr_departments,
                                                     closed_dtm=None)

        self.testDepartments = []
        for department in departments:
            testDepartment = {"department": department}

            # creates activites
            testDepartment["nrActivities"] = randint(1, 30)
            testDepartment["isActive"] = [
                randint(0, 1) == 1
                for _ in range(testDepartment["nrActivities"])
            ]
            testDepartment["nrActive"] = sum(testDepartment["isActive"])
            testDepartment["nr_participants"] = randint(0, 100)
            testDepartment["activities"] = [
                ActivityFactory(
                    department=testDepartment["department"],
                    union=testDepartment["department"].union,
                    active=active,
                ) for active in testDepartment["isActive"]
            ]
            testDepartment["nr_active_participants"] = 0
            testDepartment["nr_members"] = 0
            testDepartment["participants"] = []
            for i in range(testDepartment["nr_participants"]):
                activityIndex = randint(0, testDepartment["nrActivities"] - 1)
                testDepartment["participants"].append(
                    ActivityParticipantFactory(
                        activity=testDepartment["activities"][activityIndex]))
                if testDepartment["isActive"][activityIndex]:
                    testDepartment["nr_active_participants"] += 1

                if testDepartment["activities"][
                        activityIndex].member_justified:
                    testDepartment["nr_members"] += 1

            testDepartment["nr_waitinglist"] = randint(1, 100)
            waitlist = WaitingListFactory.create_batch(
                testDepartment["nr_waitinglist"],
                department=testDepartment["department"],
            )
            testDepartment["waitingtime"] = timezone.now() - min(
                [wait.on_waiting_list_since for wait in waitlist])
            testDepartment["nr_volunteers"] = len(
                VolunteerFactory.create_batch(
                    randint(0, 50), department=testDepartment["department"]))

            self.testDepartments.append(testDepartment)
    def test_different_waitinglists_does_not_interfere(self):
        department0 = DepartmentFactory()
        department1 = DepartmentFactory()
        person = PersonFactory()
        subscription0 = WaitingListFactory(person = person, department=department0)
        subscription1 = WaitingListFactory(person = person, department=department1)


        self.assertEqual(1, subscription0.number_on_waiting_list())
        self.assertEqual(1, subscription1.number_on_waiting_list())

        fake = faker.Faker()

        # Add a lot of people with random sign-up dates to the second
        # list.
        # NB. fake.date_time() only returns past datetimes, thus all
        # subscriptions will be added infront of our new person, not
        # after
        n = 30
        for i in range(n):
            WaitingListFactory(person__added = fake.date_time(tzinfo=TIMEZONE),
                               department=department1)

        # Should not interfere with position on the first list
        self.assertEqual(1, subscription0.number_on_waiting_list())

        # We are placed last on the second waiting list
        self.assertEqual(n+1, subscription1.number_on_waiting_list())
 def test_position_on_waitinglist_computed_correctly(self):
     department = DepartmentFactory()
     subscription0 = WaitingListFactory(department=department,
                                        person__added=datetime(
                                            2017, 1, 1, tzinfo=TIMEZONE))
     self.assertEqual(1, subscription0.number_on_waiting_list())
     subscription1 = WaitingListFactory(department=department,
                                        person__added=datetime(
                                            2015, 1, 1, tzinfo=TIMEZONE))
     self.assertEqual(2, subscription0.number_on_waiting_list())
     self.assertEqual(1, subscription1.number_on_waiting_list())