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_sync_events(self): workspace_ = Workspace.objects.create(remote_id=1, name="New Workspace") team_ = Team.objects.create(remote_id=2, name="New Team") project_ = Project.objects.create( remote_id=1, name="New Project", public=True, team=team_, workspace=workspace_, ) SyncToken.objects.create(sync="foo", project=project_) data = { "data": [ { "action": "changed", "created_at": "2017-08-21T18:20:37.972Z", "parent": None, "resource": { "gid": "1", "name": "Test Project" }, "type": "project", "user": "******", }, { "action": "changed", "created_at": "2017-08-21T18:20:37.972Z", "parent": None, "resource": { "gid": "1337", "name": "Test Task" }, "type": "task", "user": "******", }, { "action": "added", "created_at": "2017-08-21T18:20:37.972Z", "parent": None, "resource": { "gid": "1", "name": "Test Story" }, "type": "story", "user": "******", }, ] } self.command.client.events.get.return_value = data self.command.client.projects.find_by_id.return_value = project() self.command.client.tasks.find_by_id.side_effect = task self.command.client.stories.find_by_id.return_value = story() self.command.handle(interactive=False) project_.refresh_from_db() self.assertEqual("Test Project", project_.name) try: Story.objects.get(remote_id=1) except Story.DoesNotExist: self.fail("Story not created")
def test_custom_fields(self): workspace_ = Workspace.objects.create(remote_id=1, name="Workspace") team_ = Team.objects.create(remote_id=2, name="Team") Project.objects.create( remote_id=3, name="New Project", public=True, team=team_, workspace=workspace_, ) self.command.client.custom_fields.find_by_id.return_value = ( custom_field().copy()) self.command.client.projects.find_by_id.return_value = project( gid="3", custom_field_settings=[{ "gid": "258147", "custom_field": custom_field().copy(), "project": { "gid": "3", "name": "New Project" }, }], workspace={ "gid": "1", "name": "Workspace" }, ) self.command._sync_project_id(project_id=3, models=[]) self.assertTrue( CustomField.objects.filter(remote_id=1, name="Test Custom Field").exists()) self.assertTrue( CustomFieldSetting.objects.filter(remote_id=258147, project_id=3).exists())
def test_custom_fields(self): workspace_ = Workspace.objects.create(remote_id=1, name='Workspace') team_ = Team.objects.create(remote_id=2, name='Team') Project.objects.create(remote_id=3, name='New Project', public=True, team=team_, workspace=workspace_) self.command.client.custom_fields.find_by_id.return_value = custom_field( ).copy() self.command.client.projects.find_by_id.return_value = project( gid='3', custom_field_settings=[{ 'gid': '258147', 'custom_field': custom_field().copy(), 'project': { 'gid': '3', 'name': 'New Project' } }], workspace={ 'gid': '1', 'name': 'Workspace' }) self.command._sync_project_id(project_id=3, models=[]) self.assertTrue( CustomField.objects.filter(remote_id=1, name='Test Custom Field').exists()) self.assertTrue( CustomFieldSetting.objects.filter(remote_id=258147, project_id=3).exists())
def test_custom_fields(self): workspace_ = Workspace.objects.create(remote_id=1, name='Workspace') team_ = Team.objects.create(remote_id=2, name='Team') Project.objects.create(remote_id=3, name='New Project', public=True, team=team_, workspace=workspace_) self.command.client.projects.find_by_id.return_value = project( custom_field_settings=[{ 'id': 258147, 'custom_field': { 'id': 1646, 'name': 'Priority', 'type': 'enum' }, 'project': { 'id': 3, 'name': 'New Project' } }], workspace={ 'id': 1, 'name': 'Workspace' }) self.command._sync_project_id(project_id=3, workspace=workspace_, models=[]) self.assertTrue( CustomField.objects.filter(remote_id=1646, name='Priority').exists()) self.assertTrue( CustomFieldSettings.objects.filter(remote_id=258147, project_id=3).exists())
def test_new_story(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) data = { 'events': [ { 'action': 'added', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': { 'gid': '1337', 'resource_type': 'task', }, 'resource': { 'gid': '12', 'resource_type': 'story', 'resource_subtype': 'comment_added', }, 'user': { 'gid': '1123', 'resource_type': 'user', }, }, ] } mock_client.access_token().projects.find_by_id.return_value = project() mock_client.access_token().stories.find_by_id.return_value = story() response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) try: models.Story.objects.get(remote_id=12) except models.Story.DoesNotExist: self.fail('Story not created')
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_new_story(self, mock_client): models.Webhook.objects.create(project=self.project, secret=self.secret) data = { "events": [ { "action": "added", "created_at": "2017-08-21T18:20:37.972Z", "parent": { "gid": "1337", "resource_type": "task", }, "resource": { "gid": "12", "resource_type": "story", "resource_subtype": "comment_added", }, "user": { "gid": "1123", "resource_type": "user", }, }, ] } mock_client.access_token().projects.find_by_id.return_value = project() mock_client.access_token().stories.find_by_id.return_value = story() response = self._get_mock_response(mock_client, data) self.assertEqual(200, response.status_code) try: models.Story.objects.get(remote_id=12) except models.Story.DoesNotExist: self.fail("Story not created")
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 _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 test_sync_events(self): workspace_ = Workspace.objects.create(remote_id=1, name='New Workspace') team_ = Team.objects.create(remote_id=2, name='New Team') project_ = Project.objects.create( remote_id=1, name='New Project', public=True, team=team_, workspace=workspace_) SyncToken.objects.create(sync='foo', project=project_) data = { 'data': [ { 'action': 'changed', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': None, 'resource': { 'id': 1, 'name': 'Test Project' }, 'type': 'project', 'user': 1123 }, { 'action': 'changed', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': None, 'resource': { 'id': 1337, 'name': 'Test Task' }, 'type': 'task', 'user': 1123 }, { 'action': 'added', 'created_at': '2017-08-21T18:20:37.972Z', 'parent': None, 'resource': { 'id': 1, 'name': 'Test Story' }, 'type': 'story', 'user': 1123 } ] } self.command.client.events.get.return_value = data self.command.client.projects.find_by_id.return_value = project() self.command.client.tasks.find_by_id.side_effect = task self.command.client.stories.find_by_id.return_value = story() self.command.handle(interactive=False) project_.refresh_from_db() self.assertEqual('Test Project', project_.name) try: Story.objects.get(remote_id=1) except Story.DoesNotExist: self.fail('Story not created')
def test_task_not_in_asana_is_deleted(self): workspace_ = Workspace.objects.create(remote_id=1, name='Workspace') team_ = Team.objects.create(remote_id=2, name='Team') project_ = Project.objects.create( remote_id=3, name='Another Project', public=True, team=team_, workspace=workspace_) task_ = Task.objects.create(remote_id=4, name='Orphan Task', completed=False) task_.projects.add(project_) project_dict = project(id=3) self.command.client.projects.find_all.return_value = [project_dict] self.command.client.projects.find_by_id.return_value = project_dict self.command.client.tasks.find_all.return_value = [] self.command.handle(interactive=False, project=['Test Project']) self.assertFalse(Task.objects.filter(pk=task_.pk).exists())
def test_redundant_webhooks_are_deleted(self): workspace_ = Workspace.objects.create(remote_id=1, name='Workspace') team_ = Team.objects.create(remote_id=2, name='Team') project_ = Project.objects.create( remote_id=3, name='Test Project', public=True, team=team_, workspace=workspace_) secret = 'x' * 32 Webhook.objects.create(secret=secret, project=project_) Webhook.objects.create(secret=secret, project=project_) project_dict = project(id=3) self.command.client.projects.find_all.return_value = [project_dict] self.command.client.projects.find_by_id.return_value = project_dict webhook_ = webhook(project=project_dict) self.command.client.webhooks.get_all.return_value = [webhook_, webhook_] self.command.handle(interactive=False, project=['Test Project']) self.assertEqual(2, self.command.client.webhooks.delete_by_id.call_count) self.assertEqual(1, Webhook.objects.filter(project=project_).count())
def test_skip_archived_project(self): self.command.client.projects.find_by_id.return_value = project(archived='true') self.command.handle(interactive=False) self.assertEqual(1, Project.objects.count()) self.assertEqual(0, Task.objects.count())