def test_dependencies_synced(self): main_task = task(gid="98", name="Is a dependency for 99", dependents=[task(gid="99")]) dependent_task = task(gid="99", name="Requires task 98", dependencies=[task(gid="98")]) # When processed, tasks get modified in place; # we need to pass the original twice. dependent_copy = dependent_task.copy(), dependent_task.copy() self.command.client.tasks.find_all.return_value = [ main_task, dependent_task ] self.command.client.tasks.find_by_id.side_effect = [ main_task, dependent_task, dependent_copy, ] self.command.handle(interactive=False) self.assertTrue(Task.objects.filter(remote_id=98).exists()) self.assertTrue(Task.objects.filter(remote_id=99).exists()) main_task = Task.objects.get(remote_id=98) dependent_task = Task.objects.get(remote_id=99) self.assertTrue(main_task in dependent_task.dependencies.all()) self.assertTrue(dependent_task in main_task.dependents.all())
def test_project_deleted(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) data = { 'events': [ { 'action': 'removed', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': None, 'resource': { 'gid': '3', 'resource_type': 'project', }, 'user': { 'gid': '1123', 'resource_type': 'user', }, }, ] } mock_client.access_token().projects.find_by_id.return_value = project() mock_client.access_token().tasks.find_by_id.return_value = task( parent=task()) response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) self.assertFalse('x-hook-secret' in response) with self.assertRaises(models.Project.DoesNotExist): models.Project.objects.get(pk=self.project.pk)
def test_task_with_parent(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) parent_task = task(id=10, assignee=user()) child_task = task(id=11, assignee=user(), parent=parent_task.copy()) mock_client.access_token().tasks.find_all.return_value = [child_task] mock_client.access_token().tasks.find_by_id.side_effect = [ child_task, parent_task ] data = { 'events': [ { 'action': 'added', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': { 'id': 10 }, 'resource': 1337, 'type': 'task', 'user': 1123 }, ] } message = json.dumps(data) signature = sign_sha256_hmac(self.secret, message) request = self.factory.post('', content_type='application/json', data=message, **{'X-Hook-Signature': signature}) views.WebhookView.as_view()(request, remote_id=3) self.assertEqual(2, models.Task.objects.count()) parent, child = tuple(models.Task.objects.order_by('remote_id')) self.assertEqual(parent, child.parent)
def test_project_deleted(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) data = { "events": [ { "action": "removed", "created_at": "2017-08-21T18:20:37.972Z", "parent": None, "resource": { "gid": "3", "resource_type": "project", }, "user": { "gid": "1123", "resource_type": "user", }, }, ] } mock_client.access_token().projects.find_by_id.return_value = project() mock_client.access_token().tasks.find_by_id.return_value = task( parent=task()) response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) self.assertFalse("x-hook-secret" in response) with self.assertRaises(models.Project.DoesNotExist): models.Project.objects.get(pk=self.project.pk)
def setUp(self): self.command = Command() self.command.client = MagicMock() self.command.client.workspaces.find_all.return_value = [workspace()] self.command.client.workspaces.find_by_id.return_value = workspace() self.command.client.projects.find_all.return_value = [project()] self.command.client.projects.find_by_id.return_value = project() self.command.client.tasks.find_all.return_value = [task()] self.command.client.tasks.find_by_id.return_value = task() self.command.client.tasks.subtasks.return_value = []
def test_subtasks_synced(self): parent_task = task() child_task = task(id=99, name='Subtask', parent=task()) # When processed, tasks get modified in place; we need to pass the original twice. child_copy = child_task.copy() self.command.client.tasks.find_all.return_value = [parent_task, child_task] self.command.client.tasks.find_by_id.side_effect = [parent_task, child_task, child_copy] self.command.client.tasks.subtasks.side_effect = [[child_task], [], []] self.command.handle(interactive=False) self.assertTrue(Task.objects.filter(remote_id=99, name='Subtask').exists())
def test_subtask(self): """Asserts subtask (task related to a task but not a project) is supported.""" parent_task = task(projects=None) # Parent is also a subtask subtask = task(id=2, projects=None, parent=parent_task.copy()) self.command.client.tasks.find_all.return_value = [parent_task.copy()] self.command.client.tasks.subtasks.side_effect = [[subtask.copy()], []] self.command.client.tasks.find_by_id.side_effect = [parent_task.copy(), subtask.copy()] self.command.handle(interactive=False, workspace=['Test Workspace']) self.assertEqual(2, Task.objects.count())
def test_task_with_parent(self): # When processed, tasks get modified in place; we need to pass the original twice. parent_task = task() parent_copy = parent_task.copy() child_task = task(id=2, parent=parent_task) self.command.client.tasks.find_all.return_value = [child_task, parent_task] self.command.client.tasks.find_by_id.side_effect = [child_task, parent_task, parent_copy] self.command.handle(interactive=False, project=['Test Project']) self.assertEqual(2, Task.objects.count()) parent, child = tuple(Task.objects.order_by('remote_id')) self.assertEqual(parent, child.parent)
def test_valid_request(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) task_ = models.Task.objects.create(remote_id=99, name='Old task Name') mock_client.access_token().tasks.find_by_id.return_value = task(id=99) mock_client.access_token().attachments.find_by_task.return_value = [ attachment() ] mock_client.access_token( ).attachments.find_by_id.return_value = attachment() data = { 'events': [ { 'action': 'changed', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': None, 'resource': 99, 'type': 'task', 'user': 1123 }, ] } response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) self.assertFalse('x-hook-secret' in response) task_.refresh_from_db() self.assertEqual('Test Task', task_.name) try: models.Attachment.objects.get(remote_id=1) except models.Attachment.DoesNotExist: self.fail('Attachment not created')
def test_refresh_from_asana(self, mock_connect): mock_client = mock_connect.return_value task = fixtures.task(gid='4') mock_client.tasks.find_by_id.return_value = task self.task.refresh_from_asana() self.assertTrue(mock_client.tasks.find_by_id.called) self.task.refresh_from_db() self.assertEqual(task['name'], self.task.name)
def _get_mock_response(self, mock_client, data): message = json.dumps(data) signature = sign_sha256_hmac(self.secret, message) mock_client.access_token().projects.find_by_id.return_value = project() mock_client.access_token().tasks.find_by_id.return_value = task() request = self.factory.post('', content_type='application/json', data=message, **{'X-Hook-Signature': signature}) return views.WebhookView.as_view()(request, remote_id=3)
def setup_task_for_delete(mock_client): mock_client.access_token().tasks.find_by_id.return_value = task() mock_client.access_token().attachments.find_by_task.return_value = [ attachment() ] mock_client.access_token( ).attachments.find_by_id.return_value = attachment() mock_client.access_token().stories.find_by_task.return_value = [ story() ] mock_client.access_token().stories.find_by_id.return_value = story()
def test_task_with_parent(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) parent_task = task(id=10, assignee=user()) child_task = task(id=11, assignee=user(), parent=parent_task.copy()) mock_client.access_token().tasks.find_all.return_value = [child_task] mock_client.access_token().tasks.find_by_id.side_effect = [ child_task, parent_task, ] data = { "events": [ { "action": "added", "created_at": "2017-08-21T18:20:37.972Z", "parent": { "gid": "10" }, "resource": { "gid": "1337", "resource_type": "task", }, "user": { "gid": "1123", "resource_type": "user", }, }, ] } message = json.dumps(data) signature = sign_sha256_hmac(self.secret, message) request = self.factory.post("", content_type="application/json", data=message, **{"X-Hook-Signature": signature}) views.WebhookView.as_view()(request, remote_id=3) self.assertEqual(2, models.Task.objects.count()) parent, child = tuple(models.Task.objects.order_by("remote_id")) self.assertEqual(parent, child.parent)
def test_task_deleted(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) task_ = models.Task.objects.create(remote_id=1337, name='Old task Name') mock_client.access_token().tasks.find_by_id.return_value = task() mock_client.access_token().attachments.find_by_task.return_value = [ attachment() ] mock_client.access_token( ).attachments.find_by_id.return_value = attachment() mock_client.access_token().stories.find_by_task.return_value = [ story() ] mock_client.access_token().stories.find_by_id.return_value = story() data = self.data.copy() data['events'][0]['action'] = 'removed' response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) self.assertFalse('x-hook-secret' in response) with self.assertRaises(models.Task.DoesNotExist): models.Task.objects.get(pk=task_.pk)
def test_valid_request(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) task_ = models.Task.objects.create(remote_id=99, name="Old task Name") mock_client.access_token().tasks.find_by_id.return_value = task( gid="99") mock_client.access_token().attachments.find_by_task.return_value = [ attachment() ] mock_client.access_token( ).attachments.find_by_id.return_value = attachment() data = { "events": [ { "action": "changed", "created_at": "2017-08-21T18:20:37.972Z", "parent": None, "resource": { "gid": "99", "resource_type": "task", }, "user": { "gid": "1123", "resource_type": "user", }, }, ] } response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) self.assertFalse("x-hook-secret" in response) task_.refresh_from_db() self.assertEqual("Test Task", task_.name) try: models.Attachment.objects.get(remote_id=1) except models.Attachment.DoesNotExist: self.fail("Attachment not created")
def test_sync_to_asana_(self, mock_connect): mock_client = mock_connect.return_value mock_client.tasks.sync_to_asana.return_value = fixtures.task() self.task.sync_to_asana() self.assertTrue(mock_client.tasks.update.called)