def create( self, name, version, status=REGISTERED, creation_date=0.0, deprecation_date=0.0, task_list=None, child_policy=CHILD_POLICIES.TERMINATE, execution_timeout="300", decision_tasks_timeout="300", description=None, *args, **kwargs ): """Creates a new remote workflow type and returns the created WorkflowType model instance. :param name: name of the workflow type :type name: String :param version: workflow type version :type version: String :param status: workflow type status :type status: swf.core.ConnectedSWFObject.{REGISTERED, DEPRECATED} :param creation_date: creation date of the current WorkflowType :type creation_date: float (timestamp) :param deprecation_date: deprecation date of WorkflowType :type deprecation_date: float (timestamp) :param task_list: task list to use for scheduling decision tasks for executions of this workflow type :type task_list: String :param child_policy: policy to use for the child workflow executions when a workflow execution of this type is terminated :type child_policy: CHILD_POLICIES.{TERMINATE | REQUEST_CANCEL | ABANDON} :param execution_timeout: maximum duration for executions of this workflow type :type execution_timeout: String :param decision_tasks_timeout: maximum duration of decision tasks for this workflow type :type decision_tasks_timeout: String :param description: Textual description of the workflow type :type description: String """ workflow_type = WorkflowType( self.domain, name, version, status=status, creation_date=creation_date, deprecation_date=deprecation_date, task_list=task_list, child_policy=child_policy, execution_timeout=execution_timeout, decision_tasks_timeout=decision_tasks_timeout, description=description, ) workflow_type.save() return workflow_type
class TestWorkflowType(unittest.TestCase, CustomAssertions): def setUp(self): self.domain = Domain("test-domain") self.wt = WorkflowType(self.domain, "TestType", "1.0") def tearDown(self): pass def test_init_with_invalid_child_policy(self): with self.assertRaises(ValueError): WorkflowType(self.domain, "TestType", "1.0", child_policy="FAILING_POLICY") def test___diff_with_different_workflow_type(self): with patch.object( Layer1, "describe_workflow_type", mock_describe_workflow_type, ): workflow_type = WorkflowType( self.domain, "different-workflow-type", version="different-version" ) diffs = workflow_type._diff() self.assertIsNotNone(diffs) self.assertLength(diffs, 6) self.assertTrue(hasattr(diffs[0], "attr")) self.assertTrue(hasattr(diffs[0], "local")) self.assertTrue(hasattr(diffs[0], "upstream")) def test_workflow_type__diff_with_identical_workflow_type(self): with patch.object( Layer1, "describe_workflow_type", mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked["typeInfo"]["workflowType"]["name"], version=mocked["typeInfo"]["workflowType"]["version"], status=mocked["typeInfo"]["status"], creation_date=mocked["typeInfo"]["creationDate"], deprecation_date=mocked["typeInfo"]["deprecationDate"], task_list=mocked["configuration"]["defaultTaskList"]["name"], child_policy=mocked["configuration"]["defaultChildPolicy"], execution_timeout=mocked["configuration"][ "defaultExecutionStartToCloseTimeout" ], decision_tasks_timeout=mocked["configuration"][ "defaultTaskStartToCloseTimeout" ], description=mocked["typeInfo"]["description"], ) diffs = workflow_type._diff() self.assertLength(diffs, 0) def test_exists_with_existing_workflow_type(self): with patch.object(Layer1, "describe_workflow_type"): self.assertTrue(self.wt.exists) def test_exists_with_non_existent_workflow_type(self): with patch.object(self.wt.connection, "describe_workflow_type") as mock: mock.side_effect = SWFResponseError( 400, "Bad Request:", { "__type": "com.amazonaws.swf.base.model#UnknownResourceFault", "message": "Unknown type: WorkflowType=[workflowId=blah, runId=test]", }, "UnknownResourceFault", ) self.assertFalse(self.wt.exists) # TODO: fix test when no network (probably hits real SWF endpoints) @unittest.skip("Skip it in case there's no network connection.") def test_workflow_type_exists_with_whatever_error(self): with patch.object(self.wt.connection, "describe_workflow_type") as mock: with self.assertRaises(ResponseError): mock.side_effect = SWFResponseError( 400, "mocking exception", {"__type": "WhateverError", "message": "Whatever"}, ) dummy = self.domain.exists def test_is_synced_with_unsynced_workflow_type(self): pass def test_is_synced_with_synced_workflow_type(self): pass def test_is_synced_over_non_existent_workflow_type(self): with patch.object( Layer1, "describe_workflow_type", mock_describe_workflow_type ): workflow_type = WorkflowType( self.domain, "non-existent-workflow-type", version="non-existent-version", ) self.assertFalse(workflow_type.is_synced) def test_changes_with_different_workflow_type(self): with patch.object( Layer1, "describe_workflow_type", mock_describe_workflow_type, ): workflow_type = WorkflowType( self.domain, "different-workflow-type-type", version="different-workflow-type-type-version", ) diffs = workflow_type.changes self.assertIsNotNone(diffs) self.assertLength(diffs, 6) self.assertTrue(hasattr(diffs[0], "attr")) self.assertTrue(hasattr(diffs[0], "local")) self.assertTrue(hasattr(diffs[0], "upstream")) def test_workflow_type_changes_with_identical_workflow_type(self): with patch.object( Layer1, "describe_workflow_type", mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked["typeInfo"]["workflowType"]["name"], version=mocked["typeInfo"]["workflowType"]["version"], status=mocked["typeInfo"]["status"], creation_date=mocked["typeInfo"]["creationDate"], deprecation_date=mocked["typeInfo"]["deprecationDate"], task_list=mocked["configuration"]["defaultTaskList"]["name"], child_policy=mocked["configuration"]["defaultChildPolicy"], execution_timeout=mocked["configuration"][ "defaultExecutionStartToCloseTimeout" ], decision_tasks_timeout=mocked["configuration"][ "defaultTaskStartToCloseTimeout" ], description=mocked["typeInfo"]["description"], ) diffs = workflow_type.changes self.assertLength(diffs, 0) def test_save_already_existing_type(self): with patch.object(self.wt.connection, "register_workflow_type") as mock: with self.assertRaises(AlreadyExistsError): mock.side_effect = SWFTypeAlreadyExistsError(400, "mocked exception") self.wt.save() def test_save_with_response_error(self): with patch.object(self.wt.connection, "register_workflow_type") as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", {"__type": "UnknownResourceFault", "message": "Whatever"}, ) self.wt.save() def test_delete_non_existent_type(self): with patch.object(self.wt.connection, "deprecate_workflow_type") as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", {"__type": "UnknownResourceFault", "message": "Whatever"}, ) self.wt.delete() def test_delete_deprecated_type(self): with patch.object(self.wt.connection, "deprecate_workflow_type") as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", {"__type": "TypeDeprecatedFault", "message": "Whatever"}, ) self.wt.delete()
def create(self, name, version, status=REGISTERED, creation_date=0.0, deprecation_date=0.0, task_list=None, child_policy=CHILD_POLICIES.TERMINATE, execution_timeout='300', decision_tasks_timeout='300', description=None, *args, **kwargs): """Creates a new remote workflow type and returns the created WorkflowType model instance. :param name: name of the workflow type :type name: String :param version: workflow type version :type version: String :param status: workflow type status :type status: swf.core.ConnectedSWFObject.{REGISTERED, DEPRECATED} :param creation_date: creation date of the current WorkflowType :type creation_date: float (timestamp) :param deprecation_date: deprecation date of WorkflowType :type deprecation_date: float (timestamp) :param task_list: task list to use for scheduling decision tasks for executions of this workflow type :type task_list: String :param child_policy: policy to use for the child workflow executions when a workflow execution of this type is terminated :type child_policy: CHILD_POLICIES.{TERMINATE | REQUEST_CANCEL | ABANDON} :param execution_timeout: maximum duration for executions of this workflow type :type execution_timeout: String :param decision_tasks_timeout: maximum duration of decision tasks for this workflow type :type decision_tasks_timeout: String :param description: Textual description of the workflow type :type description: String """ workflow_type = WorkflowType( self.domain, name, version, status=status, creation_date=creation_date, deprecation_date=deprecation_date, task_list=task_list, child_policy=child_policy, execution_timeout=execution_timeout, decision_tasks_timeout=decision_tasks_timeout, description=description ) workflow_type.save() return workflow_type
class TestWorkflowType(unittest2.TestCase): def setUp(self): self.domain = Domain("test-domain") self.wt = WorkflowType(self.domain, "TestType", "1.0") def tearDown(self): pass def test_init_with_invalid_child_policy(self): with self.assertRaises(ValueError): WorkflowType( self.domain, "TestType", "1.0", child_policy="FAILING_POLICY" ) def test___diff_with_different_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): workflow_type = WorkflowType( self.domain, "different-workflow-type", version="different-version" ) diffs = workflow_type._diff() self.assertIsNotNone(diffs) self.assertEqual(len(diffs), 6) self.assertTrue(hasattr(diffs[0], 'attr')) self.assertTrue(hasattr(diffs[0], 'local')) self.assertTrue(hasattr(diffs[0], 'upstream')) def test_workflow_type__diff_with_identical_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked['typeInfo']['workflowType']['name'], version=mocked['typeInfo']['workflowType']['version'], status=mocked['typeInfo']['status'], creation_date=mocked['typeInfo']['creationDate'], deprecation_date=mocked['typeInfo']['deprecationDate'], task_list=mocked['configuration']['defaultTaskList']['name'], child_policy=mocked['configuration']['defaultChildPolicy'], execution_timeout=mocked['configuration']['defaultExecutionStartToCloseTimeout'], decision_tasks_timeout=mocked['configuration']['defaultTaskStartToCloseTimeout'], description=mocked['typeInfo']['description'], ) diffs = workflow_type._diff() self.assertEqual(len(diffs), 0) def test_exists_with_existing_workflow_type(self): with patch.object(Layer1, 'describe_workflow_type'): self.assertTrue(self.wt.exists) def test_exists_with_non_existent_workflow_type(self): with patch.object(self.wt.connection, 'describe_workflow_type') as mock: mock.side_effect = SWFResponseError( 400, "Bad Request:", {'__type': 'com.amazonaws.swf.base.model#UnknownResourceFault', 'message': 'Unknown type: WorkflowType=[workflowId=blah, runId=test]'}, 'UnknownResourceFault', ) self.assertFalse(self.wt.exists) def test_workflow_type_exists_with_whatever_error(self): with patch.object(self.wt.connection, 'describe_workflow_type') as mock: with self.assertRaises(ResponseError): mock.side_effect = SWFResponseError( 400, "mocking exception", { '__type': 'WhateverError', 'message': 'Whatever' } ) self.domain.exists def test_is_synced_with_unsynced_workflow_type(self): pass def test_is_synced_with_synced_workflow_type(self): pass def test_is_synced_over_non_existent_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type ): workflow_type = WorkflowType( self.domain, "non-existent-workflow-type", version="non-existent-version" ) self.assertFalse(workflow_type.is_synced) def test_changes_with_different_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): workflow_type = WorkflowType( self.domain, "different-workflow-type-type", version="different-workflow-type-type-version" ) diffs = workflow_type.changes self.assertIsNotNone(diffs) self.assertEqual(len(diffs), 6) self.assertTrue(hasattr(diffs[0], 'attr')) self.assertTrue(hasattr(diffs[0], 'local')) self.assertTrue(hasattr(diffs[0], 'upstream')) def test_workflow_type_changes_with_identical_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked['typeInfo']['workflowType']['name'], version=mocked['typeInfo']['workflowType']['version'], status=mocked['typeInfo']['status'], creation_date=mocked['typeInfo']['creationDate'], deprecation_date=mocked['typeInfo']['deprecationDate'], task_list=mocked['configuration']['defaultTaskList']['name'], child_policy=mocked['configuration']['defaultChildPolicy'], execution_timeout=mocked['configuration']['defaultExecutionStartToCloseTimeout'], decision_tasks_timeout=mocked['configuration']['defaultTaskStartToCloseTimeout'], description=mocked['typeInfo']['description'], ) diffs = workflow_type.changes self.assertEqual(len(diffs), 0) def test_save_already_existing_type(self): with patch.object(self.wt.connection, 'register_workflow_type') as mock: with self.assertRaises(AlreadyExistsError): mock.side_effect = SWFTypeAlreadyExistsError(400, "mocked exception") self.wt.save() def test_save_with_response_error(self): with patch.object(self.wt.connection, 'register_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", { "__type": "UnknownResourceFault", "message": "Whatever" } ) self.wt.save() def test_delete_non_existent_type(self): with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", { "__type": "UnknownResourceFault", "message": "Whatever" } ) self.wt.delete() def test_delete_deprecated_type(self): with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError( 400, "mocked exception", { "__type": "TypeDeprecatedFault", "message": "Whatever" } ) self.wt.delete()
class TestWorkflowType(unittest.TestCase): def setUp(self): self.domain = Domain("test-domain") self.wt = WorkflowType(self.domain, "TestType", "1.0") def tearDown(self): pass def test_init_with_invalid_child_policy(self): with self.assertRaises(ValueError): WorkflowType(self.domain, "TestType", "1.0", child_policy="FAILING_POLICY") def test___diff_with_different_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): workflow_type = WorkflowType(self.domain, "different-workflow-type", version="different-version") diffs = workflow_type._diff() self.assertIsNotNone(diffs) self.assertEqual(len(diffs), 6) self.assertTrue(hasattr(diffs[0], 'attr')) self.assertTrue(hasattr(diffs[0], 'local')) self.assertTrue(hasattr(diffs[0], 'upstream')) def test_workflow_type__diff_with_identical_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked['typeInfo']['workflowType']['name'], version=mocked['typeInfo']['workflowType']['version'], status=mocked['typeInfo']['status'], creation_date=mocked['typeInfo']['creationDate'], deprecation_date=mocked['typeInfo']['deprecationDate'], task_list=mocked['configuration']['defaultTaskList']['name'], child_policy=mocked['configuration']['defaultChildPolicy'], execution_timeout=mocked['configuration'] ['defaultExecutionStartToCloseTimeout'], decision_tasks_timeout=mocked['configuration'] ['defaultTaskStartToCloseTimeout'], description=mocked['typeInfo']['description'], ) diffs = workflow_type._diff() self.assertEqual(len(diffs), 0) def test_exists_with_existing_workflow_type(self): with patch.object(Layer1, 'describe_workflow_type'): self.assertTrue(self.wt.exists) def test_exists_with_non_existent_workflow_type(self): with patch.object(self.wt.connection, 'describe_workflow_type') as mock: mock.side_effect = SWFResponseError( 400, "Bad Request:", { '__type': 'com.amazonaws.swf.base.model#UnknownResourceFault', 'message': 'Unknown type: WorkflowType=[workflowId=blah, runId=test]' }, 'UnknownResourceFault', ) self.assertFalse(self.wt.exists) def test_workflow_type_exists_with_whatever_error(self): with patch.object(self.wt.connection, 'describe_workflow_type') as mock: with self.assertRaises(ResponseError): mock.side_effect = SWFResponseError(400, "mocking exception", { '__type': 'WhateverError', 'message': 'Whatever' }) self.domain.exists def test_is_synced_with_unsynced_workflow_type(self): pass def test_is_synced_with_synced_workflow_type(self): pass def test_is_synced_over_non_existent_workflow_type(self): with patch.object(Layer1, 'describe_workflow_type', mock_describe_workflow_type): workflow_type = WorkflowType(self.domain, "non-existent-workflow-type", version="non-existent-version") self.assertFalse(workflow_type.is_synced) def test_changes_with_different_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): workflow_type = WorkflowType( self.domain, "different-workflow-type-type", version="different-workflow-type-type-version") diffs = workflow_type.changes self.assertIsNotNone(diffs) self.assertEqual(len(diffs), 6) self.assertTrue(hasattr(diffs[0], 'attr')) self.assertTrue(hasattr(diffs[0], 'local')) self.assertTrue(hasattr(diffs[0], 'upstream')) def test_workflow_type_changes_with_identical_workflow_type(self): with patch.object( Layer1, 'describe_workflow_type', mock_describe_workflow_type, ): mocked = mock_describe_workflow_type() workflow_type = WorkflowType( self.domain, name=mocked['typeInfo']['workflowType']['name'], version=mocked['typeInfo']['workflowType']['version'], status=mocked['typeInfo']['status'], creation_date=mocked['typeInfo']['creationDate'], deprecation_date=mocked['typeInfo']['deprecationDate'], task_list=mocked['configuration']['defaultTaskList']['name'], child_policy=mocked['configuration']['defaultChildPolicy'], execution_timeout=mocked['configuration'] ['defaultExecutionStartToCloseTimeout'], decision_tasks_timeout=mocked['configuration'] ['defaultTaskStartToCloseTimeout'], description=mocked['typeInfo']['description'], ) diffs = workflow_type.changes self.assertEqual(len(diffs), 0) def test_save_already_existing_type(self): with patch.object(self.wt.connection, 'register_workflow_type') as mock: with self.assertRaises(AlreadyExistsError): mock.side_effect = SWFTypeAlreadyExistsError( 400, "mocked exception") self.wt.save() def test_save_with_response_error(self): with patch.object(self.wt.connection, 'register_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError(400, "mocked exception", { "__type": "UnknownResourceFault", "message": "Whatever" }) self.wt.save() def test_delete_non_existent_type(self): with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError(400, "mocked exception", { "__type": "UnknownResourceFault", "message": "Whatever" }) self.wt.delete() def test_delete_deprecated_type(self): with patch.object(self.wt.connection, 'deprecate_workflow_type') as mock: with self.assertRaises(DoesNotExistError): mock.side_effect = SWFResponseError(400, "mocked exception", { "__type": "TypeDeprecatedFault", "message": "Whatever" }) self.wt.delete()