def setUp(self):
        """
        """
        today = date.today()
        tomorrow = today + timedelta(days=1)

        self.trace = Stattrace()
        self.trace.complete_objective("registration", today, "user1")
        self.trace.complete_objective("registration", today, "user2")
        self.trace.complete_objective("registration", today, "user3")

        self.trace.complete_objective("registration", tomorrow, "user4")
        self.trace.complete_objective("registration", tomorrow, "user5")
    def setUp(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        self.trace = Stattrace()

        self.trace.complete_objective("registration", today, "user1")
        self.trace.complete_objective("registration", today, "user2")
        self.trace.complete_objective("registration", today, "user3")

        self.trace.complete_objective("registration", tomorrow, "user4")
        self.trace.complete_objective("registration", tomorrow, "user5")

        self.trace.complete_objective("order", today, "user1")
        self.trace.complete_objective("order", today, "user2")

        self.trace.complete_objective("order", tomorrow, "user3")
        self.trace.complete_objective("order", tomorrow, "user4")
class TestCompleteObjective(TestCase):
    """
    """

    def setUp(self):
        """
        """
        self.trace = Stattrace()

    def tearDown(self):
        """
        """
        self.trace.clear()

    def test_complete_objective_with_all_information(self):
        """
        """
        today = date.today()
        self.assertTrue(self.trace.complete_objective("registration", today, "user1"))

    def test_complete_objective_without_objective(self):
        """
        """
        today = date.today()
        self.assertFalse(self.trace.complete_objective(None, today, "user1"))

    def test_complete_objective_without_current_date(self):
        """
        """
        self.assertFalse(self.trace.complete_objective("registration", None, "user1"))

    def test_complete_objective_without_identifier(self):
        """
        """
        today = date.today()
        self.assertFalse(self.trace.complete_objective("registration", today, None))
class TestStatsForObjective(TestCase):
    """
    """
    def setUp(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        self.trace = Stattrace()

        self.trace.complete_objective("registration", today, "user1")
        self.trace.complete_objective("registration", today, "user2")
        self.trace.complete_objective("registration", today, "user3")

        self.trace.complete_objective("registration", tomorrow, "user4")
        self.trace.complete_objective("registration", tomorrow, "user5")

        self.trace.complete_objective("order", today, "user1")
        self.trace.complete_objective("order", today, "user2")

        self.trace.complete_objective("order", tomorrow, "user3")
        self.trace.complete_objective("order", tomorrow, "user4")

    def tearDown(self):
        """
        """
        self.trace.clear()

    def test_stats_for_objective_with_dates(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        expected_results = {
            str(today): 3,
            str(tomorrow): 2
        }

        self.assertEquals(self.trace.stats_for_objective("registration", start_date=yesterday, end_date=tomorrow), expected_results)
        self.assertEquals(self.trace.stats_for_objective("registration", end_date=tomorrow), expected_results)
        self.assertEquals(self.trace.stats_for_objective("registration", start_date=today), expected_results)

    def test_stats_for_objective_with_same_dates(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        expected_results = {
            str(tomorrow): 2
        }

        self.assertEquals(self.trace.stats_for_objective("registration", start_date=tomorrow, end_date=tomorrow), expected_results)

    def test_stats_for_objective_without_dates(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        expected_results = {
            str(today): 3,
            str(tomorrow): 2
        }

        self.assertEquals(self.trace.stats_for_objective("registration"), expected_results)

    def test_stats_for_objective_with_unknown_objective(self):
        """
        """
        yesterday, today, tomorrow = get_dates()

        expected_results = {}

        self.assertEquals(self.trace.stats_for_objective("eat"), expected_results)
class TestReachObjective(TestCase):
    """
    """
    def setUp(self):
        """
        """
        today = date.today()
        tomorrow = today + timedelta(days=1)

        self.trace = Stattrace()
        self.trace.complete_objective("registration", today, "user1")
        self.trace.complete_objective("registration", today, "user2")
        self.trace.complete_objective("registration", today, "user3")

        self.trace.complete_objective("registration", tomorrow, "user4")
        self.trace.complete_objective("registration", tomorrow, "user5")

    def tearDown(self):
        """
        """
        self.trace.clear()

    def test_reach_objective_with_all_information(self):
        """
        """
        today = date.today()
        tomorrow = today + timedelta(days=1)

        self.assertEqual(self.trace.reach_objective(objective="registration", start_date=today), {"user1", "user2", "user3", "user4", "user5"})
        self.assertEqual(self.trace.reach_objective(objective="registration", start_date=tomorrow), {"user4", "user5"})

    def test_reach_objective_without_date(self):
        """
        """
        self.assertEqual(self.trace.reach_objective("registration"), {"user1", "user2", "user3", "user4", "user5"})

    def test_reach_objective_without_objective(self):
        """
        """
        today = date.today()
        self.assertEqual(self.trace.reach_objective(objective=None, start_date=today), set())

    def test_reach_objective_without_all_information(self):
        """
        """
        self.assertEqual(self.trace.reach_objective(objective=None, start_date=None), set())
class TestreacherObjectives(TestCase):
    """
    """
    def setUp(self):
        """
        """
        today = date.today()
        tomorrow = today + timedelta(days=1)

        self.trace = Stattrace()
        self.trace.complete_objective("registration", today, "user1")
        self.trace.complete_objective("registration", today, "user2")
        self.trace.complete_objective("registration", today, "user3")

        self.trace.complete_objective("registration", tomorrow, "user4")
        self.trace.complete_objective("registration", tomorrow, "user5")

        self.trace.complete_objective("order", today, "user1")
        self.trace.complete_objective("order", today, "user2")

        self.trace.complete_objective("order", tomorrow, "user3")
        self.trace.complete_objective("order", tomorrow, "user4")

    def tearDown(self):
        """
        """
        self.trace.clear()

    def test_reach_objectives_with_dates(self):
        """
        """
        today = date.today()
        tomorrow = today + timedelta(days=1)

        self.assertEqual(self.trace.reach_objectives(objectives=["registration", "order"], start_date=today, end_date=today), {"user1", "user2"})
        self.assertEqual(self.trace.reach_objectives(objectives=["registration", "order"], start_date=today), {"user1", "user2", "user3", "user4"})
        self.assertEqual(self.trace.reach_objectives(objectives=["registration", "order"], start_date=tomorrow), {"user4"})

    def test_reach_objectives_without_date(self):
        """
        """
        self.assertEqual(self.trace.reach_objectives(objectives=["registration", "order"]), {"user1", "user2", "user3", "user4"})

    def test_reach_objectives_without_objectives(self):
        """
        """
        self.assertEqual(self.trace.reach_objectives(objectives=[]), set())

    def test_reach_objectives_with_unknown_objectives(self):
        """
        """
        self.assertEqual(self.trace.reach_objectives(objectives=["died", "order"]), set())
 def setUp(self):
     """
     """
     self.trace = Stattrace()