コード例 #1
0
    def test_when_sponsor_has_only_50_percent_sos(self):
        for i in range(0, 10):  # This test is flaky so repeat it
            sponsor = Member(first_name="sponsor",
                             sos_percentage=50,
                             family=100,
                             sponsor_for_family=200)
            sponsored = Member(first_name="sponsored",
                               sos_percentage=100,
                               family=200,
                               sponsored_by_family=100)

            members = self._large_list_of_members
            members.extend([sponsor, sponsored])
            generator = Generator(members, self._basic_mock_work_day_service,
                                  10)

            generator.generate()
            sos_days = generator.sos_days

            found_sponsor = 0
            found_sponsored = 0
            for day in sos_days:
                if sponsor in day.members:
                    found_sponsor += 1
                if sponsored in day.members:
                    found_sponsored += 1

            self.assertEqual(
                found_sponsor, 1,
                "Sponsor should only have 1 SOS since they have 50% SOS")
            self.assertEqual(
                found_sponsored, 1,
                "Sponsored should only have 1 SOS since they need to be with sponsor"
            )
コード例 #2
0
    def test_sponsor_is_on_same_day_as_sponsored(self):
        sponsor = Member(first_name="sponsor",
                         sos_percentage=50,
                         family=100,
                         sponsor_for_family=200)
        sponsored = Member(first_name="sponsored",
                           sos_percentage=50,
                           family=200,
                           sponsored_by_family=100)

        members = self._large_list_of_members
        members.extend([sponsor, sponsored])
        generator = Generator(members, self._basic_mock_work_day_service, 10)

        generator.generate()
        sos_days = generator.sos_days

        found_sponsor = False
        found_sponsored = False
        for day in sos_days:
            if sponsor in day.members:
                found_sponsor = True
            if sponsored in day.members:
                found_sponsored = True

        self.assertTrue(found_sponsor, "Sponsor not in list")
        self.assertTrue(found_sponsored, "Sponsored not in list")

        for day in sos_days:
            if sponsor in day.members or sponsored in day.members:
                self.assertListEqual(sorted(day.members),
                                     sorted([sponsor, sponsored]))
                return

        self.fail("Sponsor was not in list of days")
コード例 #3
0
 def test_members_family_not_allowed_more_than_once_in_holy_period(self):
     m1 = Member(family=1)
     m2 = Member(family=1)
     m3 = Member(family=1)
     generator = Generator([m1, m2, m3], self._basic_mock_work_day_service,
                           10)
     generator.sos_days.append_member(m1)
     generator.sos_days.append_member(m2)
     self.assertTrue(generator._is_members_family_in_holy_period(m3))
コード例 #4
0
 def test_generator_retries_if_deadlock_occurs(self):
     m1 = Member(family=1)
     m2 = Member(family=1)
     generator = Generator([m1, m2],
                           self._basic_mock_work_day_service,
                           10,
                           number_of_retries=10)
     with self.assertRaises(NotPossibleToGenerateSosError):
         generator.generate()
     self.assertEqual(generator.number_of_retries_done, 10)
コード例 #5
0
 def test_member_is_not_allowed_to_have_sos_in_end_grace_period(self):
     m1 = Member(sos_percentage=50, family=1)
     m2 = Member(sos_percentage=50, family=2)
     m3 = Member(sos_percentage=50, family=3, end_date="2017-01-03")
     generator = Generator([m1, m2, m3], self._basic_mock_work_day_service,
                           0)
     generator.sos_days.append_member(m1)
     generator.sos_days.append_member(m2)
     generator.sos_days.append_member(m3)
     self.assertFalse(m3 in generator.sos_days.members)
コード例 #6
0
 def test_append_member_when_list_is_empty(self):
     dl = DayList(work_days_service=MockWorkDaysService(start_after_date="2017-01-02",
                                                        closed_days_dao=MockClosedDaysDAO(),
                                                        dryg_dao=MockDrygDAO()))
     m = Member(first_name="Kalle", last_name="Kula")
     dl.append_member(m)
     self.assertTrue(m in dl[0].members)
コード例 #7
0
 def _large_list_of_members(self):
     members = []
     for index, name in enumerate(
             "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ1234567890"
     ):
         members.append(
             Member(first_name=name, sos_percentage=50, family=index))
     return members
コード例 #8
0
    def test_when_sponsored_starts_far_far_in_the_future(self):
        sponsor = Member(first_name="sponsor",
                         sos_percentage=100,
                         family=100,
                         sponsor_for_family=200)

        mock_work_days_service = self._basic_mock_work_day_service
        start_after_date = mock_work_days_service.start_after_date

        # 120 days is a reasonable number indicating far in the future.
        # The case is when generating SOS in July and member starts in November
        the_future = datetime.strptime(start_after_date,
                                       '%Y-%m-%d').date() + timedelta(days=120)
        sponsored = Member(first_name="sponsored",
                           sos_percentage=100,
                           family=200,
                           sponsored_by_family=100,
                           start_date=the_future)

        members = self._large_list_of_members
        members.extend([sponsor, sponsored])
        generator = Generator(members, mock_work_days_service, 10)

        generator.generate()
        sos_days = generator.sos_days

        found_sponsor = 0
        found_sponsored = 0
        for day in sos_days:
            if sponsor in day.members:
                found_sponsor += 1
            if sponsored in day.members:
                found_sponsored += 1

        self.assertEqual(found_sponsor, 2,
                         "Sponsor have all their SOS, just as usual")
        self.assertEqual(
            found_sponsored, 0,
            "Sponsored should have no SOS since they have not started on Nätet yet"
        )
コード例 #9
0
    def test_list_is_random(self):
        names_ordered = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"
        members = []
        for index, name in enumerate(names_ordered):
            members.append(
                Member(first_name=name, sos_percentage=50, family=index))

        generator = Generator(members, self._basic_mock_work_day_service, 10)
        generator.generate()
        names = ""
        for day in generator.sos_days:
            for m in day.members:
                names += m.first_name
        self.assertNotEqual(names, names_ordered)
コード例 #10
0
 def test_create_from_dict(self):
     dict = {
         "id": 123,
         "first_name": "Kalle",
         "last_name": "Kanon",
         "sos_percentage": 50,
         "family": 42,
         "end_date": "2018-01-01"
     }
     m = Member(**dict)
     self.assertEqual(m.id, dict.get("id"))
     self.assertEqual(m.first_name, dict.get("first_name"))
     self.assertEqual(m.last_name, dict.get("last_name"))
     self.assertEqual(m.sos_percentage, dict.get("sos_percentage"))
     self.assertEqual(m.family, dict.get("family"))
     self.assertEqual(m.end_date, datetime.strptime(dict.get("end_date"), "%Y-%m-%d").date())
コード例 #11
0
 def test_generator_proportion_0_gives_no_sos(self):
     m = Member()
     m.sos_percentage = 0
     generator = Generator([m], self._basic_mock_work_day_service, 10)
     self.assertEqual(len(generator.pot), 0)
コード例 #12
0
 def test_generator_proportion_50_gives_one_sos(self):
     m = Member()
     m.sos_percentage = 50
     generator = Generator([m], self._basic_mock_work_day_service, 10)
     generator._populate_pot()
     self.assertEqual(len(generator.pot), 1)
コード例 #13
0
 def test_last_day_is_full(self):
     m = Member(sos_percentage=50, family=1)
     generator = Generator([m], self._basic_mock_work_day_service, 0)
     generator.generate()
     self.assertListEqual([], generator.sos_days)
コード例 #14
0
 def test_member_is_not_allowed_on_day_when_end_date_is_within_grace_period(self):
     member = Member(end_date="2017-01-15")
     day = Day("2017-01-01")
     self.assertTrue(DayList.is_day_within_members_end_grace_period(member=member, day=day))
コード例 #15
0
 def test_tallen_property_is_set_when_day_has_two_members(self):
     d = Day("2017-01-01", [Member(), Member()])
     self.assertIsNotNone(d.tallen)
コード例 #16
0
 def test_name(self):
     m = Member()
     m.first_name = 'Lisa'
     m.last_name = 'Svensson'
     self.assertEqual(m.name, 'Lisa Svensson')
コード例 #17
0
 def test_member_is_allowed_on_day_when_no_end_date_is_set(self):
     member = Member(end_date=None)
     day = Day("2017-01-01")
     self.assertFalse(DayList.is_day_within_members_end_grace_period(member=member, day=day))