本文整理汇总了Python中integration.ggrc_workflows.generator.WorkflowsGenerator.activate_workflow方法的典型用法代码示例。如果您正苦于以下问题:Python WorkflowsGenerator.activate_workflow方法的具体用法?Python WorkflowsGenerator.activate_workflow怎么用?Python WorkflowsGenerator.activate_workflow使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类integration.ggrc_workflows.generator.WorkflowsGenerator
的用法示例。
在下文中一共展示了WorkflowsGenerator.activate_workflow方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: activate
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
def activate(self):
""" activate workflows just once after the class has been initialized
This should be in setUpClass method, but we can't access the server
context from there."""
gen = WorkflowsGenerator()
# generate cycle for the only one time wf
wf1 = Workflow.query.filter_by(status="Draft", slug="wf-1").first()
if wf1:
gen.generate_cycle(wf1)
workflows = Workflow.query.filter_by(status="Draft").all()
for wf in workflows:
gen.activate_workflow(wf)
示例2: TestRecurringCycleNotifications
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestRecurringCycleNotifications(TestCase):
def setUp(self):
super(TestRecurringCycleNotifications, self).setUp()
self.api = Api()
self.generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
_, self.assignee = self.object_generator.generate_person(
user_role="Administrator")
self.create_test_cases()
def tearDown(self):
pass
def test_cycle_starts_in_less_than_X_days(self):
with freeze_time("2015-02-01"):
_, wf = self.generator.generate_workflow(self.quarterly_wf_1)
response, wf = self.generator.activate_workflow(wf)
self.assert200(response)
assignee = Person.query.get(self.assignee.id)
with freeze_time("2015-01-01"):
_, notif_data = common.get_daily_notifications()
self.assertNotIn(assignee.email, notif_data)
with freeze_time("2015-01-29"):
_, notif_data = common.get_daily_notifications()
self.assertIn(assignee.email, notif_data)
with freeze_time("2015-02-01"):
_, notif_data = common.get_daily_notifications()
self.assertIn(assignee.email, notif_data)
# TODO: this should mock google email api.
@patch("ggrc.notifications.common.send_email")
def test_marking_sent_notifications(self, mail_mock):
mail_mock.return_value = True
with freeze_time("2015-02-01"):
_, wf = self.generator.generate_workflow(self.quarterly_wf_1)
response, wf = self.generator.activate_workflow(wf)
self.assert200(response)
assignee = Person.query.get(self.assignee.id)
with freeze_time("2015-01-01"):
_, notif_data = common.get_daily_notifications()
self.assertNotIn(assignee.email, notif_data)
with freeze_time("2015-01-29"):
common.send_daily_digest_notifications()
_, notif_data = common.get_daily_notifications()
self.assertNotIn(assignee.email, notif_data)
with freeze_time("2015-02-01"):
_, notif_data = common.get_daily_notifications()
self.assertNotIn(assignee.email, notif_data)
def create_test_cases(self):
def person_dict(person_id):
return {
"href": "/api/people/%d" % person_id,
"id": person_id,
"type": "Person"
}
self.quarterly_wf_1 = {
"title": "quarterly wf 1",
"description": "",
# admin will be current user with id == 1
"unit": "month",
"repeat_every": 3,
"notify_on_change": True,
"task_groups": [{
"title": "tg_1",
"contact": person_dict(self.assignee.id),
"task_group_tasks": [{
"contact": person_dict(self.assignee.id),
"description": factories.random_str(100),
},
],
},
]
}
self.all_workflows = [
self.quarterly_wf_1,
]
示例3: TestMonthlyWorkflowNotification
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestMonthlyWorkflowNotification(TestCase):
""" This class contains simple one time workflow tests that are not
in the gsheet test grid
"""
def setUp(self):
super(TestMonthlyWorkflowNotification, self).setUp()
self.api = Api()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.random_objects = self.object_generator.generate_random_objects()
_, self.person_1 = self.object_generator.generate_person(
user_role="Administrator")
_, self.person_2 = self.object_generator.generate_person(
user_role="Administrator")
self.create_test_cases()
def init_decorator(init):
def new_init(self, *args, **kwargs):
init(self, *args, **kwargs)
if hasattr(self, "created_at"):
self.created_at = dt.datetime.now()
return new_init
Notification.__init__ = init_decorator(Notification.__init__)
@patch("ggrc.notifications.common.send_email")
def test_auto_generate_cycle(self, mock_mail):
person_1_email = Person.query.get(self.person_1.id).email
with freeze_time("2015-04-01"):
_, wf = self.wf_generator.generate_workflow(self.monthly_workflow_1)
self.wf_generator.activate_workflow(wf)
_, notif_data = common.get_daily_notifications()
self.assertNotIn(person_1_email, notif_data)
with freeze_time("2015-04-02"):
self.api.client.get("nightly_cron_endpoint")
_, notif_data = common.get_daily_notifications()
self.assertNotIn(person_1_email, notif_data)
start_recurring_cycles()
_, notif_data = common.get_daily_notifications()
self.assertNotIn(person_1_email, notif_data)
# cycle starts on monday - 6th, and not on 5th
with freeze_time("2015-04-03"):
start_recurring_cycles()
_, notif_data = common.get_daily_notifications()
self.assertIn(person_1_email, notif_data)
self.assertIn("cycle_started", notif_data[person_1_email])
with freeze_time("2015-04-15"): # one day befor due date
_, notif_data = common.get_daily_notifications()
self.assertIn(person_1_email, notif_data)
with freeze_time("2015-04-25"): # due date
_, notif_data = common.get_daily_notifications()
self.assertIn(person_1_email, notif_data)
@patch("ggrc.notifications.common.send_email")
def test_manual_generate_cycle(self, mock_mail):
with freeze_time("2015-04-01"):
_, wf = self.wf_generator.generate_workflow(self.monthly_workflow_1)
self.wf_generator.activate_workflow(wf)
person_1 = Person.query.get(self.person_1.id)
with freeze_time("2015-04-03"):
_, notif_data = common.get_daily_notifications()
with freeze_time("2015-04-03"):
_, cycle = self.wf_generator.generate_cycle(wf)
_, notif_data = common.get_daily_notifications()
person_1 = Person.query.get(self.person_1.id)
self.assertIn("cycle_started", notif_data[person_1.email])
with freeze_time("2015-05-03"): # two days befor due date
_, notif_data = common.get_daily_notifications()
person_1 = Person.query.get(self.person_1.id)
self.assertIn(person_1.email, notif_data)
def create_test_cases(self):
def person_dict(person_id):
return {
"href": "/api/people/%d" % person_id,
"id": person_id,
"type": "Person"
}
self.monthly_workflow_1 = {
"title": "test monthly wf notifications",
"notify_on_change": True,
"description": "some test workflow",
# admin will be current user with id == 1
"unit": "month",
"recurrences": True,
"repeat_every": 1,
#.........这里部分代码省略.........
示例4: TestCycleTaskStatusChange
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestCycleTaskStatusChange(TestCase):
""" This class contains simple one time workflow tests that are not
in the gsheet test grid
"""
def setUp(self):
super(TestCycleTaskStatusChange, self).setUp()
self.api = Api()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
Notification.query.delete()
self.random_objects = self.object_generator.generate_random_objects(2)
_, self.user = self.object_generator.generate_person(
user_role="Administrator")
self.create_test_cases()
def init_decorator(init):
def new_init(self, *args, **kwargs):
init(self, *args, **kwargs)
if hasattr(self, "created_at"):
self.created_at = datetime.now()
return new_init
Notification.__init__ = init_decorator(Notification.__init__)
def test_task_declined_notification_created(self):
with freeze_time("2015-05-01"):
_, workflow = self.wf_generator.generate_workflow(
self.one_time_workflow_1)
_, cycle = self.wf_generator.generate_cycle(workflow)
self.wf_generator.activate_workflow(workflow)
cycle = Cycle.query.get(cycle.id)
task1 = CycleTaskGroupObjectTask.query.get(
cycle.cycle_task_group_object_tasks[0].id)
self.task_change_status(task1, "Declined")
notif = db.session.query(Notification).filter(and_(
Notification.object_id == task1.id,
Notification.object_type == task1.type,
Notification.sent_at == None, # noqa
Notification.notification_type == self.get_notification_type(
"cycle_task_declined"
)
)).all()
self.assertEqual(len(notif), 1, "notifications: {}".format(str(notif)))
def test_all_tasks_finished_notification_created(self):
with freeze_time("2015-05-01"):
_, workflow = self.wf_generator.generate_workflow(
self.one_time_workflow_1)
_, cycle = self.wf_generator.generate_cycle(workflow)
self.wf_generator.activate_workflow(workflow)
cycle = Cycle.query.get(cycle.id)
task1 = CycleTaskGroupObjectTask.query.get(
cycle.cycle_task_group_object_tasks[0].id)
self.task_change_status(task1)
notif = db.session.query(Notification).filter(and_(
Notification.object_id == cycle.id,
Notification.object_type == cycle.type,
Notification.sent_at == None, # noqa
Notification.notification_type == self.get_notification_type(
"all_cycle_tasks_completed"
)
)).all()
self.assertEqual(len(notif), 1, "notifications: {}".format(str(notif)))
notif = db.session.query(Notification).filter(and_(
Notification.object_id == task1.id,
Notification.object_type == task1.type,
Notification.sent_at == None, # noqa
Notification.notification_type != self.get_notification_type(
"all_cycle_tasks_completed"
)
)).all()
self.assertEqual(notif, [])
def test_multi_all_tasks_finished_notification_created(self):
with freeze_time("2015-05-01"):
_, workflow = self.wf_generator.generate_workflow(
self.one_time_workflow_2)
_, cycle = self.wf_generator.generate_cycle(workflow)
self.wf_generator.activate_workflow(workflow)
cycle = Cycle.query.get(cycle.id)
task1 = CycleTaskGroupObjectTask.query.get(
cycle.cycle_task_group_object_tasks[0].id)
#.........这里部分代码省略.........
示例5: TestOneTimeWfEndDateChange
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestOneTimeWfEndDateChange(TestCase):
""" This class contains simple one time workflow tests that are not
in the gsheet test grid
"""
def setUp(self):
super(TestOneTimeWfEndDateChange, self).setUp()
self.api = Api()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
Notification.query.delete()
self.random_objects = self.object_generator.generate_random_objects(2)
_, self.user = self.object_generator.generate_person(
user_role="Administrator")
self.create_test_cases()
def init_decorator(init):
def new_init(self, *args, **kwargs):
init(self, *args, **kwargs)
if hasattr(self, "created_at"):
self.created_at = datetime.now()
return new_init
Notification.__init__ = init_decorator(Notification.__init__)
@patch("ggrc.notifications.common.send_email")
def test_no_date_change(self, mock_mail):
def get_person(person_id):
return db.session.query(Person).filter(Person.id == person_id).one()
with freeze_time("2015-04-10 03:21:34"):
_, workflow = self.wf_generator.generate_workflow(
self.one_time_workflow_1)
_, cycle = self.wf_generator.generate_cycle(workflow)
self.wf_generator.activate_workflow(workflow)
with freeze_time("2015-04-11 03:21:34"):
user = get_person(self.user.id)
_, notif_data = common.get_daily_notifications()
self.assertIn("cycle_started", notif_data[user.email])
with freeze_time("2015-05-02 03:21:34"):
_, notif_data = common.get_daily_notifications()
self.assertIn(user.email, notif_data)
self.assertIn("cycle_started", notif_data[user.email])
self.assertNotIn("due_in", notif_data[user.email])
self.assertNotIn("due_today", notif_data[user.email])
with freeze_time("2015-05-02 03:21:34"):
common.send_daily_digest_notifications()
_, notif_data = common.get_daily_notifications()
self.assertEqual(notif_data, {})
# one email to owner and one to assigne
self.assertEqual(mock_mail.call_count, 2)
with freeze_time("2015-05-04 03:21:34"): # one day before due date
_, notif_data = common.get_daily_notifications()
user = get_person(self.user.id)
self.assertIn("due_in", notif_data[user.email])
self.assertEqual(len(notif_data[user.email]["due_in"]), 2)
with freeze_time("2015-05-04 03:21:34"): # one day before due date
common.send_daily_digest_notifications()
_, notif_data = common.get_daily_notifications()
self.assertEqual(notif_data, {})
# one email to owner and one to assigne
self.assertEqual(mock_mail.call_count, 3)
with freeze_time("2015-05-05 03:21:34"): # due date
_, notif_data = common.get_daily_notifications()
self.assertIn("due_today", notif_data[user.email])
self.assertEqual(len(notif_data[user.email]["due_today"]), 2)
@patch("ggrc.notifications.common.send_email")
def test_move_end_date_to_future(self, mock_mail):
"""
test moving the end date to the future, befor due_in and due_today
notifications have been sent
"""
def get_person(person_id):
return db.session.query(Person).filter(Person.id == person_id).one()
with freeze_time("2015-04-10 03:21:34"):
_, workflow = self.wf_generator.generate_workflow(
self.one_time_workflow_1)
_, cycle = self.wf_generator.generate_cycle(workflow)
self.wf_generator.activate_workflow(workflow)
with freeze_time("2015-04-11 03:21:34"):
user = get_person(self.user.id)
_, notif_data = common.get_daily_notifications()
self.assertIn("cycle_started", notif_data[user.email])
with freeze_time("2015-05-02 03:21:34"):
#.........这里部分代码省略.........
示例6: TestWorkflowCycleStatePropagantion
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestWorkflowCycleStatePropagantion(TestCase):
"""Test case for cycle task to cycle task group status propagation"""
def setUp(self):
super(TestWorkflowCycleStatePropagantion, self).setUp()
self.api = Api()
self.generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.weekly_wf = {
"title": "weekly thingy",
"description": "start this many a time",
"frequency": "weekly",
"task_groups": [{
"title": "weekly task group",
"task_group_tasks": [{
"title": "weekly task 1",
"relative_end_day": 1,
"relative_end_month": None,
"relative_start_day": 5,
"relative_start_month": None,
}, {
"title": "weekly task 1",
"relative_end_day": 1,
"relative_end_month": None,
"relative_start_day": 1,
"relative_start_month": None,
}
]},
]
}
def test_weekly_state_transitions_assigned_inprogress(self):
"Test that starting one cycle task changes cycle task group"
_, wf = self.generator.generate_workflow(self.weekly_wf)
with freeze_time("2016-6-10 13:00:00"): # Friday, 6/10/2016
self.generator.activate_workflow(wf)
ctg = db.session.query(CycleTaskGroup).join(
Cycle).join(Workflow).filter(Workflow.id == wf.id).all()[0]
self.assertEqual(ctg.status, "Assigned")
cycle_tasks = db.session.query(CycleTaskGroupObjectTask).join(
Cycle).join(Workflow).filter(Workflow.id == wf.id).all()
first_ct, second_ct = cycle_tasks
for cycle_task in cycle_tasks:
self.assertEqual(cycle_task.status, "Assigned")
# Move one task to InProgress
_, first_ct = self.generator.modify_object(
first_ct, {"status": "InProgress"})
self.assertEqual(first_ct.status, "InProgress")
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "InProgress")
# Undo operation
_, first_ct = self.generator.modify_object(
first_ct, {"status": "Assigned"})
self.assertEqual(first_ct.status, "Assigned")
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "Assigned")
# Move both to in progress
for cycle_task in cycle_tasks:
self.generator.modify_object(
cycle_task, {"status": "InProgress"})
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "InProgress")
# Undo one cycle task
_, first_ct = self.generator.modify_object(
first_ct, {"status": "Assigned"})
second_ct = db.session.query(CycleTaskGroupObjectTask).get(second_ct.id)
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(first_ct.status, "Assigned")
self.assertEqual(second_ct.status, "InProgress")
self.assertEqual(ctg.status, "InProgress")
# Undo second cycle task
_, second_ct = self.generator.modify_object(
second_ct, {"status": "Assigned"})
first_ct = db.session.query(CycleTaskGroupObjectTask).get(first_ct.id)
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(first_ct.status, "Assigned")
self.assertEqual(second_ct.status, "Assigned")
self.assertEqual(ctg.status, "Assigned")
def test_weekly_state_transitions_inprogress_finished(self):
"Test In Progress to Finished transitions"
_, wf = self.generator.generate_workflow(self.weekly_wf)
with freeze_time("2016-6-10 13:00:00"): # Friday, 6/10/2016
self.generator.activate_workflow(wf)
#.........这里部分代码省略.........
示例7: TestCycleTaskImportUpdate
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestCycleTaskImportUpdate(BaseTestCycleTaskImportUpdate):
""" This class contains simple cycle task update tests using import
functionality
"""
CSV_DIR = join(abspath(dirname(__file__)), "test_csvs/")
def setUp(self):
super(TestCycleTaskImportUpdate, self).setUp()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.random_objects = self.object_generator.generate_random_objects(2)
_, self.person_1 = self.object_generator.generate_person(
user_role="Administrator")
self.ftime_active = "2016-07-01"
self.ftime_historical = "2014-05-01"
self._create_test_cases_data()
# It is needed because cycle-tasks are generated automatically with
# 'slug' based on auto_increment 'id' field.
# At start of each test we suppose that created cycle-task's 'slug'
# lie in range from 1 to 10.
db.session.execute('ALTER TABLE cycle_task_group_object_tasks '
'AUTO_INCREMENT = 1')
def test_cycle_task_correct(self):
"""Test cycle task update via import with correct data"""
self._generate_cycle_tasks()
with freeze_time(self.ftime_active):
response = self.import_file("cycle_task_correct.csv")
self._check_csv_response(response, {})
self._cmp_tasks(self.expected_cycle_task_correct)
def test_cycle_task_warnings(self):
"""Test cycle task update via import with data which is the reason of
warnings about non-importable columns."""
self._generate_cycle_tasks()
with freeze_time(self.ftime_active):
response = self.import_file("cycle_task_warnings.csv")
self._check_csv_response(response, self.expected_warnings)
self._cmp_tasks(self.expected_cycle_task_correct)
def test_cycle_task_create_error(self):
"""Test cycle task update via import with data which is the reason of
errors about new cycle task creation."""
self._generate_cycle_tasks()
with freeze_time(self.ftime_active):
response = self.import_file("cycle_task_create_error.csv")
self._check_csv_response(response, self.expected_create_error)
self._cmp_tasks(self.expected_cycle_task_correct)
def test_cycle_task_date_error(self):
"""Test cycle task update via import with data which is the reason of
errors about incorrect dates in csv file."""
self._generate_cycle_tasks()
with freeze_time(self.ftime_active):
response = self.import_file("cycle_task_date_error.csv")
self._check_csv_response(response, self.expected_date_error)
self._cmp_tasks(self.expected_cycle_task_date_error)
def test_cycle_task_permission_error(self):
"""Test cycle task update via import with non-admin user which is the
reason of error. Only admin can update cycle tasks via import."""
self._generate_cycle_tasks()
with freeze_time(self.ftime_active):
_, creator = self.object_generator.generate_person(user_role="Creator")
response = self.import_file("cycle_task_correct.csv", person=creator)
self._check_csv_response(response, self.expected_permission_error)
# Cycle tasks' data shouldn't be changed in test DB after import run from
# non-admin user
expected_cycle_task_permission_error = {}
expected_cycle_task_permission_error.update(
self.generated_cycle_tasks_active)
expected_cycle_task_permission_error.update(
self.generated_cycle_tasks_historical)
self._cmp_tasks(expected_cycle_task_permission_error)
def _cmp_tasks(self, expected_ctasks):
"""Compare tasks values from argument's list and test DB."""
for ctask in db.session.query(CycleTaskGroupObjectTask).all():
if ctask.slug not in expected_ctasks:
continue
exp_task = expected_ctasks[ctask.slug]
for attr, val in exp_task.iteritems():
self.assertEqual(str(getattr(ctask, attr, None)), val)
# pylint: disable=too-many-arguments
def _activate_workflow(self, ftime, workflow, task_group, task_group_tasks,
random_object, cycle_tasks):
"""Helper which is responsible for active cycle-tasks creation"""
with freeze_time(ftime):
_, wf = self.wf_generator.generate_workflow(workflow)
_, tg = self.wf_generator.generate_task_group(wf, task_group)
for task in task_group_tasks:
self.wf_generator.generate_task_group_task(tg, task)
self.wf_generator.generate_task_group_object(tg, random_object)
_, cycle = self.wf_generator.generate_cycle(wf)
self.wf_generator.activate_workflow(wf)
#.........这里部分代码省略.........
示例8: TestNotificationsForDeletedObjects
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestNotificationsForDeletedObjects(TestCase):
""" This class contains simple one time workflow tests that are not
in the gsheet test grid
"""
def setUp(self):
super(TestNotificationsForDeletedObjects, self).setUp()
self.api = Api()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
Notification.query.delete()
self.random_objects = self.object_generator.generate_random_objects(2)
_, self.user = self.object_generator.generate_person(
user_role="Administrator")
self.create_test_cases()
def init_decorator(init):
def new_init(self, *args, **kwargs):
init(self, *args, **kwargs)
if hasattr(self, "created_at"):
self.created_at = datetime.now()
return new_init
Notification.__init__ = init_decorator(Notification.__init__)
@patch("ggrc.notifications.common.send_email")
def test_delete_activated_workflow(self, mock_mail):
with freeze_time("2015-02-01 13:39:20"):
_, workflow = self.wf_generator.generate_workflow(self.quarterly_wf_1)
response, workflow = self.wf_generator.activate_workflow(workflow)
self.assert200(response)
user = Person.query.get(self.user.id)
with freeze_time("2015-01-01 13:39:20"):
_, notif_data = common.get_daily_notifications()
self.assertNotIn(user.email, notif_data)
with freeze_time("2015-01-29 13:39:20"):
_, notif_data = common.get_daily_notifications()
self.assertIn(user.email, notif_data)
self.assertIn("cycle_starts_in", notif_data[user.email])
workflow = Workflow.query.get(workflow.id)
response = self.wf_generator.api.delete(workflow)
self.assert200(response)
_, notif_data = common.get_daily_notifications()
user = Person.query.get(self.user.id)
self.assertNotIn(user.email, notif_data)
def create_test_cases(self):
def person_dict(person_id):
return {
"href": "/api/people/%d" % person_id,
"id": person_id,
"type": "Person"
}
self.quarterly_wf_1 = {
"title": "quarterly wf 1",
"notify_on_change": True,
"description": "",
"owners": [person_dict(self.user.id)],
"unit": "month",
"repeat_every": 3,
"task_groups": [{
"title": "tg_1",
"contact": person_dict(self.user.id),
"task_group_tasks": [{
"contact": person_dict(self.user.id),
"description": factories.random_str(100),
},
],
},
]
}
示例9: TestRecurringWorkflowRevisions
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestRecurringWorkflowRevisions(TestCase):
"""Starting start recurring cycle should generate revisions."""
def setUp(self):
super(TestRecurringWorkflowRevisions, self).setUp()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.random_objects = self.object_generator.generate_random_objects()
_, self.person_1 = self.object_generator.generate_person(
user_role="Administrator")
_, self.person_2 = self.object_generator.generate_person(
user_role="Administrator")
def person_dict(person_id):
return {
"href": "/api/people/%d" % person_id,
"id": person_id,
"type": "Person"
}
self.monthly_workflow = {
"title": "test monthly wf notifications",
"notify_on_change": True,
"description": "some test workflow",
"owners": [person_dict(self.person_2.id)],
"unit": "month",
"repeat_every": 1,
"task_groups": [{
"title": "one time task group",
"contact": person_dict(self.person_1.id),
"task_group_tasks": [{
"title": "task 1",
"description": "some task",
"contact": person_dict(self.person_1.id),
}, {
"title": "task 2",
"description": "some task",
"contact": person_dict(self.person_1.id),
}],
"task_group_objects": self.random_objects[:2]
}, {
"title": "another one time task group",
"contact": person_dict(self.person_1.id),
"task_group_tasks": [{
"title": "task 1 in tg 2",
"description": "some task",
"contact": person_dict(self.person_1.id),
}, {
"title": "task 2 in tg 2",
"description": "some task",
"contact": person_dict(self.person_2.id),
}],
"task_group_objects": []
}]
}
@unittest.skip("Required to fix log event procedure for new calculator")
@patch("ggrc.notifications.common.send_email")
def test_revisions(self, mock_mail): # pylint: disable=unused-argument
with freeze_time("2015-04-01"):
_, workflow = self.wf_generator.generate_workflow(self.monthly_workflow)
self.wf_generator.activate_workflow(workflow)
event_count = Event.query.count()
revision_query = Revision.query.filter_by(
resource_type='CycleTaskGroupObjectTask',
)
revision_count = revision_query.count()
# cycle starts on monday - 6th, and not on 5th
with freeze_time("2015-04-03"):
start_recurring_cycles()
self.assertEqual(event_count + 1, Event.query.count())
self.assertNotEqual(revision_count, revision_query.count())
示例10: TestWorkflowCycleStatePropagation
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestWorkflowCycleStatePropagation(TestCase):
"""Test case for cycle task to cycle task group status propagation"""
def setUp(self):
super(TestWorkflowCycleStatePropagation, self).setUp()
self.api = Api()
self.generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.weekly_wf = {
"title": "weekly thingy",
"description": "start this many a time",
"unit": "week",
"repeat_every": 1,
"task_groups": [{
"title": "weekly task group",
"task_group_tasks": [{
"title": "weekly task 1",
"start_date": dtm.date(2016, 6, 10),
"end_date": dtm.date(2016, 6, 13),
}, {
"title": "weekly task 1",
"start_date": dtm.date(2016, 6, 10),
"end_date": dtm.date(2016, 6, 13),
}]},
]
}
def test_weekly_state_transitions_assigned_inprogress(self):
"""Test that starting one cycle task changes cycle task group"""
with freeze_time("2016-6-10 13:00:00"): # Friday, 6/10/2016
_, wf = self.generator.generate_workflow(self.weekly_wf)
self.generator.activate_workflow(wf)
ctg = db.session.query(CycleTaskGroup).join(
Cycle).join(Workflow).filter(Workflow.id == wf.id).all()[0]
self.assertEqual(ctg.status, "Assigned")
cycle_tasks = db.session.query(CycleTaskGroupObjectTask).join(
Cycle).join(Workflow).filter(Workflow.id == wf.id).all()
first_ct, second_ct = cycle_tasks
for cycle_task in cycle_tasks:
self.assertEqual(cycle_task.status, "Assigned")
# Move one task to InProgress
_, first_ct = self.generator.modify_object(
first_ct, {"status": "InProgress"})
self.assertEqual(first_ct.status, "InProgress")
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "InProgress")
# Undo operation
_, first_ct = self.generator.modify_object(
first_ct, {"status": "Assigned"})
self.assertEqual(first_ct.status, "Assigned")
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "Assigned")
# Move both to in progress
for cycle_task in cycle_tasks:
self.generator.modify_object(
cycle_task, {"status": "InProgress"})
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(ctg.status, "InProgress")
# Undo one cycle task
_, first_ct = self.generator.modify_object(
first_ct, {"status": "Assigned"})
second_ct = db.session.query(CycleTaskGroupObjectTask).get(second_ct.id)
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(first_ct.status, "Assigned")
self.assertEqual(second_ct.status, "InProgress")
self.assertEqual(ctg.status, "InProgress")
# Undo second cycle task
_, second_ct = self.generator.modify_object(
second_ct, {"status": "Assigned"})
first_ct = db.session.query(CycleTaskGroupObjectTask).get(first_ct.id)
ctg = db.session.query(CycleTaskGroup).get(ctg.id)
self.assertEqual(first_ct.status, "Assigned")
self.assertEqual(second_ct.status, "Assigned")
self.assertEqual(ctg.status, "Assigned")
def test_weekly_state_transitions_inprogress_finished(self):
"""Test In Progress to Finished transitions"""
with freeze_time("2016-6-10 13:00:00"): # Friday, 6/10/2016
_, wf = self.generator.generate_workflow(self.weekly_wf)
self.generator.activate_workflow(wf)
ctg = db.session.query(CycleTaskGroup).join(
Cycle).join(Workflow).filter(Workflow.id == wf.id).all()[0]
#.........这里部分代码省略.........
示例11: TestOneTimeWorkflowNotification
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestOneTimeWorkflowNotification(TestCase):
""" Tests are defined in the g-sheet test grid under:
WF EMAILS for unit tests (middle level)
"""
def setUp(self):
super(TestOneTimeWorkflowNotification, self).setUp()
self.api = Api()
self.wf_generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.random_objects = self.object_generator.generate_random_objects()
self.random_people = [
self.object_generator.generate_person(user_role="Administrator")[1]
for _ in range(5)]
self.create_test_cases()
self.create_users()
db.session.query(Notification).delete()
def init_decorator(init):
def new_init(self, *args, **kwargs):
init(self, *args, **kwargs)
if hasattr(self, "created_at"):
self.created_at = datetime.now()
return new_init
Notification.__init__ = init_decorator(Notification.__init__)
def tearDown(self):
db.session.query(Notification).delete()
def short_dict(self, obj, plural):
return {
"href": "/api/%s/%d" % (plural, obj.id),
"id": obj.id,
"type": obj.__class__.__name__,
}
def test_one_time_wf(self):
# setup
with freeze_time("2015-04-07 03:21:34"):
wf_response, wf = self.wf_generator.generate_workflow(data={
# admin will be the current user
"notify_on_change": True, # force real time updates
"title": "One-time WF",
"notify_custom_message": textwrap.dedent("""\
Hi all.
Did you know that Irelnd city namd Newtownmountkennedy has 19
letters? But it's not the longest one. The recordsman is the
city in New Zealand that contains 97 letter."""),
})
_, tg = self.wf_generator.generate_task_group(wf, data={
"title": "TG #1 for the One-time WF",
"contact": self.short_dict(self.tgassignee1, "people"),
})
self.wf_generator.generate_task_group_task(tg, {
"title": "task #1 for one-time workflow",
"contact": self.short_dict(self.member1, "people"),
"start_date": "04/07/2015",
"end_date": "04/15/2015",
})
self.wf_generator.generate_task_group_object(tg, self.random_objects[0])
self.wf_generator.generate_task_group_object(tg, self.random_objects[1])
# test
with freeze_time("2015-04-07 03:21:34"):
cycle_response, cycle = self.wf_generator.generate_cycle(wf)
self.wf_generator.activate_workflow(wf)
common.get_daily_notifications()
def create_test_cases(self):
def person_dict(person_id):
return {
"href": "/api/people/%d" % person_id,
"id": person_id,
"type": "Person"
}
self.one_time_workflow_1 = {
"title": "one time test workflow",
"description": "some test workflow",
# admin will be current user with id == 1
"task_groups": [{
"title": "one time task group",
"task_group_tasks": [{
"title": "task 1",
"description": "some task",
"contact": person_dict(self.random_people[0].id),
"start_date": date(2015, 5, 1), # friday
"end_date": date(2015, 5, 5),
}, {
"title": "task 2",
"description": "some task",
#.........这里部分代码省略.........
示例12: TestWorkflowsCycleGeneration
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestWorkflowsCycleGeneration(TestCase):
"""
Tests for Cycle generation logic
"""
def setUp(self):
super(TestWorkflowsCycleGeneration, self).setUp()
self.api = Api()
self.generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
def tearDown(self):
pass
@ddt.data(
True, False
)
def test_recurring_without_tgts_skip(self, has_tg):
"""Test that Active Workflow without TGTs is skipped on cron job"""
with freeze_time(dtm.date(2017, 9, 25)):
with factories.single_commit():
workflow = wf_factories.WorkflowFactory(repeat_every=1,
unit=Workflow.MONTH_UNIT)
workflow_id = workflow.id
group = wf_factories.TaskGroupFactory(workflow=workflow)
wf_factories.TaskGroupTaskFactory(
task_group=group,
start_date=dtm.date(2017, 9, 26),
end_date=dtm.date(2017, 9, 26) + dtm.timedelta(days=4))
self.generator.activate_workflow(workflow)
active_wf = db.session.query(Workflow).filter(
Workflow.id == workflow_id).one()
self.assertEqual(active_wf.next_cycle_start_date, dtm.date(2017, 9, 26))
self.assertEqual(active_wf.recurrences, True)
self.assertEqual(len(active_wf.cycles), 0)
TaskGroupTask.query.delete()
if not has_tg:
TaskGroup.query.delete()
db.session.commit()
with freeze_time(dtm.date(2017, 10, 25)):
start_recurring_cycles()
active_wf = db.session.query(Workflow).filter(
Workflow.id == workflow_id).one()
self.assertEqual(active_wf.next_cycle_start_date, dtm.date(2017, 9, 26))
self.assertEqual(active_wf.recurrences, True)
self.assertEqual(len(active_wf.cycles), 0)
@ddt.data(
# (expected, setup_date),
(dtm.date(2017, 2, 28), dtm.date(2017, 2, 28)),
(dtm.date(2017, 3, 3), dtm.date(2017, 3, 3)),
(dtm.date(2017, 8, 4), dtm.date(2017, 8, 5)),
(dtm.date(2017, 7, 21), dtm.date(2017, 7, 22)),
)
@ddt.unpack
def test_one_time_wf_start_date_shifting(self, expected, setup_date):
"""Test case for correct cycle task start_ dates for one_time wf"""
with factories.single_commit():
workflow = wf_factories.WorkflowFactory()
group = wf_factories.TaskGroupFactory(workflow=workflow)
wf_factories.TaskGroupTaskFactory(
task_group=group,
start_date=setup_date,
end_date=setup_date + dtm.timedelta(days=4))
self.generator.generate_cycle(workflow)
self.generator.activate_workflow(workflow)
active_wf = db.session.query(Workflow).filter(
Workflow.status == 'Active').one()
self.assertEqual(1,
len(active_wf.cycles[0].cycle_task_group_object_tasks))
cycle_task = active_wf.cycles[0].cycle_task_group_object_tasks[0]
adj_start_date = cycle_task.start_date
self.assertEqual(expected, adj_start_date)
@ddt.data(
# (expected, end_date),
(dtm.date(2017, 2, 28), dtm.date(2017, 2, 28)),
(dtm.date(2017, 3, 3), dtm.date(2017, 3, 3)),
(dtm.date(2017, 8, 4), dtm.date(2017, 8, 5)),
(dtm.date(2017, 7, 21), dtm.date(2017, 7, 22)),
)
@ddt.unpack
def test_one_time_wf_end_date_shifting(self, expected, setup_date):
"""Test case for correct cycle task end_ dates for one_time wf"""
with factories.single_commit():
workflow = wf_factories.WorkflowFactory()
group = wf_factories.TaskGroupFactory(workflow=workflow)
wf_factories.TaskGroupTaskFactory(
task_group=group,
start_date=setup_date - dtm.timedelta(days=4),
end_date=setup_date)
self.generator.generate_cycle(workflow)
self.generator.activate_workflow(workflow)
active_wf = db.session.query(Workflow).filter(
Workflow.status == 'Active').one()
self.assertEqual(1,
len(active_wf.cycles[0].cycle_task_group_object_tasks))
cycle_task = active_wf.cycles[0].cycle_task_group_object_tasks[0]
adj_end_date = cycle_task.end_date
self.assertEqual(expected, adj_end_date)
#.........这里部分代码省略.........
示例13: TestBasicWorkflowActions
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestBasicWorkflowActions(TestCase):
"""
Tests for basic workflow actions
"""
def setUp(self):
super(TestBasicWorkflowActions, self).setUp()
self.api = Api()
self.generator = WorkflowsGenerator()
self.object_generator = ObjectGenerator()
self.random_objects = self.object_generator.generate_random_objects()
self.create_test_cases()
def tearDown(self):
pass
def test_create_workflows(self):
_, wflow = self.generator.generate_workflow(self.one_time_workflow_1)
self.assertIsInstance(wflow, Workflow)
task_groups = db.session.query(TaskGroup)\
.filter(TaskGroup.workflow_id == wflow.id).all()
self.assertEqual(len(task_groups),
len(self.one_time_workflow_1["task_groups"]))
def test_workflows(self):
for workflow in self.all_workflows:
_, wflow = self.generator.generate_workflow(workflow)
self.assertIsInstance(wflow, Workflow)
task_groups = db.session.query(TaskGroup)\
.filter(TaskGroup.workflow_id == wflow.id).all()
self.assertEqual(len(task_groups),
len(workflow["task_groups"]))
def test_activate_wf(self):
for workflow in self.all_workflows:
_, wflow = self.generator.generate_workflow(workflow)
response, wflow = self.generator.activate_workflow(wflow)
self.assert200(response)
def test_one_time_workflow_edits(self):
_, wflow = self.generator.generate_workflow(self.one_time_workflow_1)
wf_dict = {"title": "modified one time wf"}
self.generator.modify_workflow(wflow, data=wf_dict)
modified_wf = db.session.query(Workflow).filter(
Workflow.id == wflow.id).one()
self.assertEqual(wf_dict["title"], modified_wf.title)
def test_one_time_wf_activate(self):
_, wflow = self.generator.generate_workflow(self.one_time_workflow_1)
self.generator.generate_cycle(wflow)
self.generator.activate_workflow(wflow)
tasks = [len(tg.get("task_group_tasks", []))
for tg in self.one_time_workflow_1["task_groups"]]
cycle_tasks = db.session.query(CycleTaskGroupObjectTask).join(
Cycle).join(Workflow).filter(Workflow.id == wflow.id).all()
active_wf = db.session.query(Workflow).filter(
Workflow.id == wflow.id).one()
self.assertEqual(sum(tasks), len(cycle_tasks))
self.assertEqual(active_wf.status, "Active")
def test_one_time_wf_state_transition_dates(self):
_, wflow = self.generator.generate_workflow(self.one_time_workflow_1)
self.generator.generate_cycle(wflow)
self.generator.activate_workflow(wflow)
cycle_tasks = db.session.query(CycleTaskGroupObjectTask).join(
Cycle).join(Workflow).filter(Workflow.id == wflow.id).all()
with freeze_time("2015-6-9 13:00:00"):
today = dtm.datetime.now()
transitions = [
("InProgress", None, None),
("Finished", today, None),
("Declined", None, None),
("Finished", today, None),
("Verified", today, today),
("Finished", today, None),
]
# Iterate over possible transitions and check if dates got set correctly
for (status, expected_finished, expected_verified) in transitions:
cycle_task = cycle_tasks[0]
_, task = self.generator.modify_object(cycle_task, {"status": status})
self.assertEqual(task.finished_date, expected_finished)
self.assertEqual(task.verified_date, expected_verified)
def test_delete_calls(self):
_, workflow = self.generator.generate_workflow()
self.generator.generate_task_group(workflow)
_, task_group = self.generator.generate_task_group(workflow)
task_groups = db.session.query(TaskGroup).filter(
TaskGroup.workflow_id == workflow.id).all()
#.........这里部分代码省略.........
示例14: TestTaskDueNotifications
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
#.........这里部分代码省略.........
models.all_models.AccessControlRole.name == "Task Assignees",
models.all_models.AccessControlRole.object_type == "TaskGroupTask",
).one().id
self.one_time_workflow = {
"title": "one time test workflow",
"notify_on_change": True,
"description": "some test workflow",
"is_verification_needed": False,
# admin will be current user with id == 1
"task_groups": [{
"title": "one time task group",
"contact": {
"href": "/api/people/{}".format(self.user.id),
"id": self.user.id,
"type": "Person",
},
"task_group_tasks": [{
"title": "task 1",
"description": "some task",
"access_control_list": [
acl_helper.get_acl_json(role_id, self.user.id)],
"start_date": date(2017, 5, 15),
"end_date": date(2017, 6, 11),
}, {
"title": "task 2",
"description": "some task 2",
"access_control_list": [
acl_helper.get_acl_json(role_id, self.user.id)],
"start_date": date(2017, 5, 8),
"end_date": date(2017, 6, 12),
}, {
"title": "task 3",
"description": "some task 3",
"access_control_list": [
acl_helper.get_acl_json(role_id, self.user.id)],
"start_date": date(2017, 5, 31),
"end_date": date(2017, 6, 13),
}, {
"title": "task 4",
"description": "some task 4",
"access_control_list": [
acl_helper.get_acl_json(role_id, self.user.id)],
"start_date": date(2017, 6, 2),
"end_date": date(2017, 6, 14),
}, {
"title": "task 5",
"description": "some task 5",
"access_control_list": [
acl_helper.get_acl_json(role_id, self.user.id)],
"start_date": date(2017, 6, 8),
"end_date": date(2017, 6, 15),
}],
"task_group_objects": self.random_objects
}]
}
@ddt.unpack
@ddt.data(
("2017-06-12 12:12:12", ["task 1"], ["task 2"], ["task 3"]),
("2017-06-13 13:13:13", ["task 1", "task 2"], ["task 3"], ["task 4"]),
)
@patch("ggrc.notifications.common.send_email")
def test_creating_obsolete_notifications(
self, fake_now, expected_overdue, expected_due_today, expected_due_in, _
):
"""Notifications already obsolete on creation date should not be created.
"""
with freeze_time("2017-06-12 09:39:32"):
tmp = self.one_time_workflow.copy()
_, workflow = self.wf_generator.generate_workflow(tmp)
self.wf_generator.generate_cycle(workflow)
response, workflow = self.wf_generator.activate_workflow(workflow)
self.assert200(response)
user = models.Person.query.get(self.user.id)
with freeze_time(fake_now):
# mark all yeasterday notifications as sent
models.all_models.Notification.query.filter(
sa.func.DATE(models.all_models.Notification.send_on) < date.today()
).update({models.all_models.Notification.sent_at:
datetime.now() - timedelta(1)},
synchronize_session="fetch")
_, notif_data = common.get_daily_notifications()
user_notifs = notif_data.get(user.email, {})
actual_overdue = [n['title'] for n in
user_notifs.get("task_overdue", {}).itervalues()]
actual_overdue.sort()
self.assertEqual(actual_overdue, expected_overdue)
self.assertEqual(
[n['title'] for n in user_notifs.get("due_today", {}).itervalues()],
expected_due_today)
self.assertEqual(
[n['title'] for n in user_notifs.get("due_in", {}).itervalues()],
expected_due_in)
示例15: TestTaskOverdueNotificationsUsingImports
# 需要导入模块: from integration.ggrc_workflows.generator import WorkflowsGenerator [as 别名]
# 或者: from integration.ggrc_workflows.generator.WorkflowsGenerator import activate_workflow [as 别名]
class TestTaskOverdueNotificationsUsingImports(TestTaskOverdueNotifications):
"""Tests for overdue notifications when changing Tasks via imports."""
# pylint: disable=invalid-name
CSV_DIR = join(abspath(dirname(__file__)), "../converters/test_csvs/")
def setUp(self):
self.wf_generator = WorkflowsGenerator()
self._fix_notification_init()
@patch("ggrc.notifications.common.send_email")
def test_creating_overdue_notifications_for_new_tasks(self, _):
"""Overdue notifications should be created for tasks created with imports.
"""
Workflow.query.delete()
models.Notification.query.delete()
db.session.commit()
filename = join(self.CSV_DIR, "workflow_small_sheet.csv")
self.import_file(filename)
workflow = Workflow.query.one()
self.wf_generator.generate_cycle(workflow)
response, workflow = self.wf_generator.activate_workflow(workflow)
user = models.Person.query.filter(
models.Person.email == '[email protected]').one()
with freeze_time("2020-01-01 00:00:00"): # afer all tasks' due dates
_, notif_data = common.get_daily_notifications()
user_notifs = notif_data.get(user.email, {})
self.assertIn("task_overdue", user_notifs)
self.assertEqual(len(user_notifs["task_overdue"]), 4)
@patch("ggrc.notifications.common.send_email")
def test_overdue_notifications_when_task_due_date_is_changed(self, _):
"""Overdue notifications should adjust to task due date changes."""
Workflow.query.delete()
models.Notification.query.delete()
db.session.commit()
filename = join(self.CSV_DIR, "workflow_small_sheet.csv")
self.import_file(filename)
workflow = Workflow.query.one()
self.wf_generator.generate_cycle(workflow)
response, workflow = self.wf_generator.activate_workflow(workflow)
user = models.Person.query.filter(
models.Person.email == '[email protected]').one()
with freeze_time("2015-01-01 00:00:00"): # before all tasks' due dates
_, notif_data = common.get_daily_notifications()
user_notifs = notif_data.get(user.email, {})
self.assertNotIn("task_overdue", user_notifs)
# now modify task's due date and check if overdue notification appears
task = CycleTaskGroupObjectTask.query.filter(
CycleTaskGroupObjectTask.title == "task for wf-2").one()
task_id, task_code = task.id, task.slug
response = self.import_data(OrderedDict((
("object_type", "CycleTask"),
("Code*", task_code),
("Start Date", "12/15/2014"),
("Due Date", "12/31/2014"),
)))
self._check_csv_response(response, expected_messages={})
_, notif_data = common.get_daily_notifications()
user_notifs = notif_data.get(user.email, {})
self.assertIn("task_overdue", user_notifs)
self.assertEqual(len(user_notifs["task_overdue"]), 1)
self.assertIn(task_id, user_notifs["task_overdue"])