def test_same_state_keeps_counter(self):
        # Arrange
        test_project = Project()
        test_project.tasks_mapped = 0

        test_user = User()
        test_user.tasks_mapped = 0

        # Act
        test_project, test_user = StatsService._update_tasks_stats(
            test_project, test_user, TaskStatus.MAPPED, TaskStatus.MAPPED)

        # Assert
        self.assertEqual(test_project.tasks_mapped, 0)
        self.assertEqual(test_user.tasks_mapped, 0)
    def test_update_after_mapping_increments_counter(self):
        # Arrange
        test_project = Project()
        test_project.tasks_mapped = 0

        test_user = User()
        test_user.tasks_mapped = 0

        # Act
        test_project, test_user = StatsService._update_tasks_stats(
            test_project, test_user, TaskStatus.READY, TaskStatus.MAPPED)

        # Assert
        self.assertEqual(test_project.tasks_mapped, 1)
        self.assertEqual(test_user.tasks_mapped, 1)
    def test_tasks_state_representation(self):

        # Arrange
        test_project = Project()
        test_project.tasks_mapped = 0
        test_project.tasks_validated = 0
        test_project.tasks_bad_imagery = 0

        test_mapper = User()
        test_mapper.tasks_mapped = 0
        test_mapper.tasks_validated = 0
        test_mapper.tasks_invalidated = 0

        test_validator = User()
        test_validator.tasks_mapped = 0
        test_validator.tasks_validated = 0
        test_validator.tasks_invalidated = 0

        test_admin = User()
        test_admin.tasks_mapped = 0
        test_admin.tasks_validated = 0
        test_admin.tasks_invalidated = 0

        # Mapper marks task as mapped
        test_project, test_mapper = StatsService._update_tasks_stats(
            test_project, test_mapper, TaskStatus.READY, TaskStatus.MAPPED)

        # Validator marks task as bad imagery
        test_project, test_validator = StatsService._update_tasks_stats(
            test_project, test_validator, TaskStatus.MAPPED,
            TaskStatus.BADIMAGERY)

        # Admin undos marking task as bad imagery
        test_project, test_admin = StatsService._update_tasks_stats(
            test_project, test_admin, TaskStatus.BADIMAGERY, TaskStatus.MAPPED,
            "undo")

        # Validator marks task as invalid
        test_project, test_validator = StatsService._update_tasks_stats(
            test_project, test_validator, TaskStatus.MAPPED,
            TaskStatus.INVALIDATED)

        # Mapper marks task as mapped
        test_project, test_mapper = StatsService._update_tasks_stats(
            test_project, test_mapper, TaskStatus.INVALIDATED,
            TaskStatus.MAPPED)

        # Admin undos marking task as mapped (test_mapper is given to the function though, as the author of the
        # last_change - compare with MappingServer.undo_mapping() method)
        test_project, test_mapper = StatsService._update_tasks_stats(
            test_project, test_mapper, TaskStatus.MAPPED,
            TaskStatus.INVALIDATED, "undo")

        # Mapper marks task as mapped
        test_project, test_mapper = StatsService._update_tasks_stats(
            test_project, test_mapper, TaskStatus.INVALIDATED,
            TaskStatus.MAPPED)

        # Validator marks task as valid
        test_project, test_validator = StatsService._update_tasks_stats(
            test_project, test_validator, TaskStatus.MAPPED,
            TaskStatus.VALIDATED)

        # Assert
        self.assertEqual(test_project.tasks_mapped, 0)
        self.assertEqual(test_project.tasks_validated, 1)
        self.assertEqual(test_project.tasks_bad_imagery, 0)
        self.assertEqual(test_mapper.tasks_mapped, 2)
        self.assertEqual(test_mapper.tasks_validated, 0)
        self.assertEqual(test_mapper.tasks_invalidated, 0)
        self.assertEqual(test_validator.tasks_mapped, 0)
        self.assertEqual(test_validator.tasks_validated, 1)
        self.assertEqual(test_validator.tasks_invalidated, 1)
        self.assertEqual(test_admin.tasks_mapped, 0)
        self.assertEqual(test_admin.tasks_validated, 0)
        self.assertEqual(test_admin.tasks_invalidated, 0)