def test_unlock_of_not_locked_for_mapping_raises_error(self, mock_task): # Arrange mock_task.return_value = self.task_stub # Act / Assert with self.assertRaises(MappingServiceError): MappingService.unlock_task_after_mapping(MagicMock())
def test_cant_unlock_a_task_you_dont_own(self, mock_task): # Arrange self.task_stub.task_status = TaskStatus.LOCKED_FOR_MAPPING.value self.task_stub.locked_by = 12 mock_task.return_value = self.task_stub # Act / Assert with self.assertRaises(MappingServiceError): MappingService.unlock_task_after_mapping(self.mapped_task_dto)
def test_if_new_state_not_acceptable_raise_error(self, mock_task): # Arrange self.task_stub.task_status = TaskStatus.LOCKED_FOR_MAPPING.value mock_task.return_value = self.task_stub self.mapped_task_dto.status = TaskStatus.LOCKED_FOR_VALIDATION.name # Act / Assert with self.assertRaises(MappingServiceError): MappingService.unlock_task_after_mapping(self.mapped_task_dto)
def test_unlock_with_status_change_sets_history( self, mock_task, mock_history, mock_update, mock_stats, mock_instructions, mock_state, ): # Arrange self.task_stub.task_status = TaskStatus.LOCKED_FOR_MAPPING.value mock_task.return_value = self.task_stub mock_state.return_value = TaskStatus.LOCKED_FOR_MAPPING # Act test_task = MappingService.unlock_task_after_mapping(self.mapped_task_dto) # Assert self.assertEqual(TaskAction.STATE_CHANGE.name, test_task.task_history[0].action) self.assertEqual(test_task.task_history[0].action_text, TaskStatus.MAPPED.name) self.assertEqual(TaskStatus.MAPPED.name, test_task.task_status)
def test_unlock_with_comment_sets_history( self, mock_task, mock_history, mock_update, mock_stats, mock_instructions, mock_state, ): # Arrange self.task_stub.task_status = TaskStatus.LOCKED_FOR_MAPPING.value self.mapped_task_dto.comment = "Test comment" mock_task.return_value = self.task_stub mock_state.return_value = TaskStatus.LOCKED_FOR_MAPPING # Act test_task = MappingService.unlock_task_after_mapping(self.mapped_task_dto) # Assert self.assertEqual(TaskAction.COMMENT.name, test_task.task_history[0].action) self.assertEqual(test_task.task_history[0].action_text, "Test comment")
def post(self, project_id, task_id): """ Set a task as mapped --- tags: - tasks produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== - name: project_id in: path description: Project ID the task is associated with required: true type: integer default: 1 - name: task_id in: path description: Unique task ID required: true type: integer default: 1 - in: body name: body required: true description: JSON object for unlocking a task schema: id: TaskUpdateUnlock required: - status properties: status: type: string description: The new status for the task default: MAPPED comment: type: string description: Optional user comment about the task default: Comment about the mapping responses: 200: description: Task unlocked 400: description: Client Error 401: description: Unauthorized - Invalid credentials 403: description: Forbidden 404: description: Task not found 500: description: Internal Server Error """ try: authenticated_user_id = token_auth.current_user() mapped_task = MappedTaskDTO(request.get_json()) mapped_task.user_id = authenticated_user_id mapped_task.task_id = task_id mapped_task.project_id = project_id mapped_task.validate() except DataError as e: current_app.logger.error(f"Error validating request: {str(e)}") return {"Error": "Task unlock failed"}, 400 try: task = MappingService.unlock_task_after_mapping(mapped_task) return task.to_primitive(), 200 except NotFound: return {"Error": "Task Not Found"}, 404 except MappingServiceError: return {"Error": "Task unlock failed"}, 403 except Exception as e: error_msg = f"Task Lock API - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": "Task unlock failed"}, 500 finally: # Refresh mapper level after mapping UserService.check_and_update_mapper_level(authenticated_user_id)