Skip to content

Commit

Permalink
Jkmarx/node api v2 unit test (#2913)
Browse files Browse the repository at this point in the history
* Move node related to data_set_manager app

* Move node v1 api to data_set_manager.

* Update api v1 url dependency.

* Move node v1 api tests to correct directory.

* Remove unused get.

* Add unit tests.

* Add unit tests and add more responses to api.

* Update client call.

* Update text.

* Fix import order.
  • Loading branch information
jkmarx committed Jul 30, 2018
1 parent 6c8144c commit ab9c8aa
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 20 deletions.
71 changes: 70 additions & 1 deletion refinery/data_set_manager/test_views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import mock
from urlparse import urljoin
import uuid

from django.conf import settings
Expand All @@ -9,7 +10,10 @@
force_authenticate)
from factory_boy.utils import create_dataset_with_necessary_models

from .views import AddFileToNodeView
from core.test_views import APIV2TestCase
from file_store.models import FileStoreItem

from .views import AddFileToNodeView, NodeViewSet


class AddFileToNodeViewTests(APITestCase):
Expand Down Expand Up @@ -165,3 +169,68 @@ def test_non_aws_post_file_store_item_source_translated(self,
self.assertEqual(self.node.get_file_store_item().source,
file_store_item_source)
self.assertTrue(update_solr_mock.called)


class NodeViewAPIV2Tests(APIV2TestCase):
def setUp(self, **kwargs):
super(NodeViewAPIV2Tests, self).setUp(
api_base_name="nodes/",
view=NodeViewSet.as_view()
)
self.data_set = create_dataset_with_necessary_models(user=self.user)
self.node = self.data_set.get_nodes()[0]

@mock.patch('data_set_manager.models.Node.update_solr_index')
def test_patch_remove_data_file_200_status(self, mock_index):
patch_request = self.factory.patch(
urljoin(self.url_root, self.node.uuid),
{"file_uuid": ''}
)
force_authenticate(patch_request, user=self.user)
patch_response = self.view(patch_request, self.node.uuid)
self.assertTrue(mock_index.called)
self.assertEqual(patch_response.status_code, 200)

@mock.patch('core.models.DataSet.is_clean')
def test_patch_not_clean_400_status(self, mock_clean):
mock_clean.return_value = False
patch_request = self.factory.patch(
urljoin(self.url_root, self.node.uuid),
{"file_uuid": ''}
)
force_authenticate(patch_request, user=self.user)
patch_response = self.view(patch_request, self.node.uuid)
self.assertEqual(patch_response.status_code, 400)

def test_patch_missing_file_store_item_400_status(self):
file_store_item = FileStoreItem.objects.get(uuid=self.node.file_uuid)
file_store_item.delete()

patch_request = self.factory.patch(
urljoin(self.url_root, self.node.uuid),
{"file_uuid": ''}
)
force_authenticate(patch_request, user=self.user)
patch_response = self.view(patch_request, self.node.uuid)
self.assertEqual(patch_response.status_code, 400)

def test_patch_non_owner_401_status(self):
self.non_owner = User.objects.create_user('Random User',
'rand_user@fake.com',
self.password)
patch_request = self.factory.patch(
urljoin(self.url_root, self.node.uuid),
{"file_uuid": ''}
)
force_authenticate(patch_request, user=self.non_owner)
patch_response = self.view(patch_request, self.node.uuid)
self.assertEqual(patch_response.status_code, 401)

def test_patch_edit_field_405_status(self):
patch_request = self.factory.patch(
urljoin(self.url_root, self.node.uuid),
{"name": 'New Node Name'}
)
force_authenticate(patch_request, user=self.user)
patch_response = self.view(patch_request, self.node.uuid)
self.assertEqual(patch_response.status_code, 405)
29 changes: 11 additions & 18 deletions refinery/data_set_manager/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1137,7 +1137,7 @@ class NodeViewSet(APIView):
required: false
...
"""
http_method_names = ['get', 'patch']
http_method_names = ['patch']

def get_object(self, uuid):
try:
Expand All @@ -1149,18 +1149,6 @@ def get_object(self, uuid):
logger.error(e)
raise APIException("Multiple objects returned.")

def get(self, request, uuid):
node = self.get_object(uuid)
data_set = node.study.get_dataset()
public_group = ExtendedGroup.objects.public_group()

if request.user.has_perm('core.read_dataset', data_set) or \
'read_dataset' in get_perms(public_group, data_set):
serializer = NodeSerializer(node)
return Response(serializer.data)

return Response(uuid, status=status.HTTP_401_UNAUTHORIZED)

def patch(self, request, uuid):
node = self.get_object(uuid)
new_file_uuid = request.data.get('file_uuid')
Expand All @@ -1176,21 +1164,26 @@ def patch(self, request, uuid):
if data_set.get_owner() == request.user:
# to remove the data file, we need to delete it and update index,
# the file store item uuid should remain
if new_file_uuid is None:
if new_file_uuid == '':

try:
file_store_item = FileStoreItem.objects.get(
uuid=node.file_uuid
)
except (FileStoreItem.DoesNotExist,
FileStoreItem.MultipleObjectsReturned) as e:
logger.error(e)
return Response('Missing file store item.',
status=status.HTTP_400_BAD_REQUEST)
else:
file_store_item.delete_datafile()

node.update_solr_index()
return Response(
NodeSerializer(node).data, status=status.HTTP_200_OK
)
node.update_solr_index()
return Response(
NodeSerializer(node).data, status=status.HTTP_200_OK
)
return Response('Currently, you can only remove node files.',
status=status.HTTP_405_METHOD_NOT_ALLOWED)

return Response(uuid, status=status.HTTP_401_UNAUTHORIZED)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
vm.isLoading = true;
nodesV2Service.partial_update({
uuid: vm.resolve.config.nodeObj.uuid,
file_uuid: null
file_uuid: ''
}).$promise.then(function () {
vm.isLoading = false;
vm.alertType = 'success';
Expand Down

0 comments on commit ab9c8aa

Please sign in to comment.