16
16
# along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
#
18
18
#########################################################################
19
+ from io import BytesIO
19
20
import logging
20
21
21
22
from unittest .mock import patch
28
29
from geonode .geoserver .createlayer .utils import create_dataset
29
30
from guardian .shortcuts import assign_perm , get_anonymous_user
30
31
32
+ from django .conf import settings
31
33
from geonode .layers .models import Dataset , Attribute
32
34
from geonode .base .populate_test_data import create_models , create_single_dataset
33
35
from geonode .maps .models import Map , MapLayer
@@ -44,6 +46,7 @@ class DatasetsApiTests(APITestCase):
44
46
]
45
47
46
48
def setUp (self ):
49
+ self .exml_path = f"{ settings .PROJECT_ROOT } /base/fixtures/test_xml.xml"
47
50
create_models (b'document' )
48
51
create_models (b'map' )
49
52
create_models (b'dataset' )
@@ -312,3 +315,96 @@ def test_layer_replace_should_work(self, _validate_input_source):
312
315
layer .refresh_from_db ()
313
316
# evaluate that the number of available layer is not changed
314
317
self .assertEqual (Dataset .objects .count (), cnt )
318
+
319
+ def test_metadata_update_for_not_supported_method (self ):
320
+ layer = Dataset .objects .first ()
321
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
322
+ self .client .login (username = "admin" , password = "admin" )
323
+
324
+ response = self .client .post (url )
325
+ self .assertEqual (405 , response .status_code )
326
+
327
+ response = self .client .get (url )
328
+ self .assertEqual (405 , response .status_code )
329
+
330
+ def test_metadata_update_for_not_authorized_user (self ):
331
+ layer = Dataset .objects .first ()
332
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
333
+
334
+ response = self .client .put (url )
335
+ self .assertEqual (403 , response .status_code )
336
+
337
+ def test_unsupported_file_throws_error (self ):
338
+ layer = Dataset .objects .first ()
339
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
340
+ self .client .login (username = "admin" , password = "admin" )
341
+
342
+ data = '<?xml version="1.0" encoding="UTF-8"?><invalid></invalid>'
343
+ f = BytesIO (bytes (data , encoding = 'utf-8' ))
344
+ f .name = 'metadata.xml'
345
+ put_data = {'metadata_file' : f }
346
+ response = self .client .put (url , data = put_data )
347
+ self .assertEqual (500 , response .status_code )
348
+
349
+ def test_valid_metadata_file_with_different_uuid (self ):
350
+ layer = Dataset .objects .first ()
351
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
352
+ self .client .login (username = "admin" , password = "admin" )
353
+
354
+ f = open (self .exml_path , 'r' )
355
+ put_data = {'metadata_file' : f }
356
+ response = self .client .put (url , data = put_data )
357
+ self .assertEqual (500 , response .status_code )
358
+
359
+ def test_permissions_for_not_permitted_user (self ):
360
+ get_user_model ().objects .create_user (
361
+ username = "some_user" ,
362
+ password = "some_password" ,
363
+
364
+ )
365
+ layer = Dataset .objects .first ()
366
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
367
+ self .client .login (username = "some_user" , password = "some_password" )
368
+
369
+ uuid = layer .uuid
370
+ data = open (self .exml_path ).read ()
371
+ data = data .replace ('7cfbc42c-efa7-431c-8daa-1399dff4cd19' , uuid )
372
+ f = BytesIO (bytes (data , encoding = 'utf-8' ))
373
+ f .name = 'metadata.xml'
374
+ put_data = {'metadata_file' : f }
375
+ response = self .client .put (url , data = put_data )
376
+ self .assertEqual (403 , response .status_code )
377
+
378
+ def test_permissions_for_permitted_user (self ):
379
+ another_non_admin_user = get_user_model ().objects .create_user (
380
+ username = "some_other_user" ,
381
+ password = "some_other_password" ,
382
+
383
+ )
384
+ layer = Dataset .objects .first ()
385
+ assign_perm ("base.change_resourcebase_metadata" , another_non_admin_user , layer .get_self_resource ())
386
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
387
+ self .client .login (username = "some_other_user" , password = "some_other_password" )
388
+
389
+ uuid = layer .uuid
390
+ data = open (self .exml_path ).read ()
391
+ data = data .replace ('7cfbc42c-efa7-431c-8daa-1399dff4cd19' , uuid )
392
+ f = BytesIO (bytes (data , encoding = 'utf-8' ))
393
+ f .name = 'metadata.xml'
394
+ put_data = {'metadata_file' : f }
395
+ response = self .client .put (url , data = put_data )
396
+ self .assertEqual (200 , response .status_code )
397
+
398
+ def test_valid_metadata_file (self ):
399
+ layer = Dataset .objects .first ()
400
+ url = reverse ("datasets-replace-metadata" , args = (layer .id ,))
401
+ self .client .login (username = "admin" , password = "admin" )
402
+
403
+ uuid = layer .uuid
404
+ data = open (self .exml_path ).read ()
405
+ data = data .replace ('7cfbc42c-efa7-431c-8daa-1399dff4cd19' , uuid )
406
+ f = BytesIO (bytes (data , encoding = 'utf-8' ))
407
+ f .name = 'metadata.xml'
408
+ put_data = {'metadata_file' : f }
409
+ response = self .client .put (url , data = put_data )
410
+ self .assertEqual (200 , response .status_code )
0 commit comments