From 5cc46db713dcdd716f0d0cdee6441851edf3798f Mon Sep 17 00:00:00 2001
From: jrybicki-jsc <j.rybicki@fz-juelich.de>
Date: Tue, 1 Jun 2021 12:56:31 +0200
Subject: [PATCH] storage more less tested

---
 apiserver/storage/JsonFileStorageAdapter.py | 40 ++++++-----------
 tests/storage_tests/test_jsonbackend.py     | 50 ++++++++++++++++-----
 2 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/apiserver/storage/JsonFileStorageAdapter.py b/apiserver/storage/JsonFileStorageAdapter.py
index 8d36b0b..71b5101 100644
--- a/apiserver/storage/JsonFileStorageAdapter.py
+++ b/apiserver/storage/JsonFileStorageAdapter.py
@@ -8,13 +8,8 @@ from apiserver.config import ApiserverSettings
 from .LocationStorage import (AbstractLocationDataStorageAdapter, LocationData,
                               LocationDataType)
 
-#from dataclasses import dataclass, asdict
-#perhaps even that: 
-#from dataclasses_json import dataclass_json
-
 from pydantic import BaseModel
 
-#@dataclass
 class StoredData(BaseModel):
     actualData: LocationData
     users: List[str]
@@ -49,6 +44,9 @@ class JsonFileStorageAdapter(AbstractLocationDataStorageAdapter):
         if not os.path.isfile(fullpath):
             raise FileNotFoundError(f"The requested object ({oid}) does not exist.")
         return fullpath
+    
+    def __load_object(self, path):
+        return StoredData.parse_file(path)
 
     def __get_unique_id(self, path: str) -> str:
         oid = str(uuid.uuid4())
@@ -58,15 +56,12 @@ class JsonFileStorageAdapter(AbstractLocationDataStorageAdapter):
 
     def get_list(self, n_type: LocationDataType) -> List:
         local_path = self.__setup_path(n_type.value)
-        allFiles = [f for f in os.listdir(
-            local_path) if os.path.isfile(os.path.join(local_path, f))]
-        # now each file has to be checked for its filename (= oid) 
-        # and the LocationData name (which is inside the json)
         retList = []
-        for f in allFiles:
-            data = StoredData.parse_file(os.path.join(local_path, f))
-            #with open(os.path.join(local_path, f)) as file:
-            #    data = json.load(file)
+        for f in os.listdir(local_path):
+            p = os.path.join(local_path, f)
+            if not os.path.isfile(p):
+                continue
+            data = self.__load_object(p)
             retList.append({data.actualData.name: f})
         return retList
 
@@ -78,27 +73,20 @@ class JsonFileStorageAdapter(AbstractLocationDataStorageAdapter):
             json.dump(toStore.dict(), json_file)
         return (oid, data)
 
-    def __load_object(self, path):
-        # move to data class? 
-        with open(path, 'r') as f:
-            data = json.load(f)
-        return data
-
-
     def get_details(self, n_type: LocationDataType, oid: str):
         full_path = self.__get_object_path(value=n_type.value, oid=oid)
         obj = self.__load_object(path=full_path)
-        return obj['actualData']
+        return obj.actualData
         
 
     def update_details(self, n_type: LocationDataType, oid: str, data: LocationData, usr: str):
+        # TODO: usr is ignored here? 
         full_path = self.__get_object_path(value=n_type.value, oid=oid)
-        old_data = self.__load_object(path=full_path)
-        old_data['actualData']=data
+        obj = self.__load_object(path=full_path)
+        obj.actualData = data
 
-        full_path = self.__get_object_path(value=n_type.value, oid=oid)
-        with open(full_path, 'w') as file:
-            json.dump(old_data.json(), file)
+        with open(full_path, 'w') as f:
+            json.dump(obj.dict(), f)
 
         return (oid, data)
 
diff --git a/tests/storage_tests/test_jsonbackend.py b/tests/storage_tests/test_jsonbackend.py
index b0c8cbf..510f55a 100644
--- a/tests/storage_tests/test_jsonbackend.py
+++ b/tests/storage_tests/test_jsonbackend.py
@@ -2,7 +2,7 @@ import unittest
 
 from apiserver.storage.JsonFileStorageAdapter import JsonFileStorageAdapter, StoredData
 from apiserver.storage import LocationDataType, LocationData
-from collections import namedtuple 
+from collections import namedtuple
 import os
 import pathlib
 import shutil
@@ -10,12 +10,13 @@ import shutil
 
 class SomeTests(unittest.TestCase):
     def setUp(self):
-        Settings =  namedtuple('Settings',['json_storage_path'])
+        Settings = namedtuple('Settings', ['json_storage_path'])
         self.test_config = Settings('/tmp/json_test/')
-        pathlib.Path(self.test_config.json_storage_path).mkdir(parents=True, exist_ok=True)
+        pathlib.Path(self.test_config.json_storage_path).mkdir(
+            parents=True, exist_ok=True)
 
         self.store = JsonFileStorageAdapter(self.test_config)
-    
+
     def tearDown(self):
         if os.path.exists(self.test_config.json_storage_path):
             print('Path exists. Removing')
@@ -27,31 +28,56 @@ class SomeTests(unittest.TestCase):
         self.assertEqual(lst, [],  'Id should not be none')
 
     def test_not_path(self):
-        Settings =  namedtuple('Settings',['json_storage_path'])
+        Settings = namedtuple('Settings', ['json_storage_path'])
         test_config = Settings('/tmp/json_test/blah/')
         self.assertRaises(Exception, JsonFileStorageAdapter, test_config)
 
     def test_add_new(self):
         d = LocationData(name='bla', url='local')
-        (oid, data) = self.store.add_new(n_type=LocationDataType.DATASET, data=d, usr='test_user')
+        (oid, data) = self.store.add_new(
+            n_type=LocationDataType.DATASET, data=d, usr='test_user')
         self.assertEquals(d, data, "Data should be equal")
         self.assertIsNotNone(oid)
 
     def test_add_and_read(self):
         l_data = LocationData(name='test1', url='http://n.go', metadata=[])
-        (oid, data) = self.store.add_new(n_type=LocationDataType.DATASET, data=l_data, usr='test_user')
+        (oid, data) = self.store.add_new(
+            n_type=LocationDataType.DATASET, data=l_data, usr='test_user')
         self.assertEquals(l_data, data, "Data should be equal")
         self.assertIsNotNone(oid)
-        print(data)
 
         lst = self.store.get_list(n_type=LocationDataType.DATASET)
         self.assertEqual(len(lst), 1,  'One should be there')
+        m_o = lst[0]
+        self.assertEquals(list(m_o.keys())[0], l_data.name)
+        self.assertEquals(list(m_o.values())[0], oid)
 
+    def test_get_details(self):
+        # get_details(self, n_type: LocationDataType, oid: str):
+        l_data = LocationData(name='test1', url='http://n.go', metadata=[])
+        (oid, data) = self.store.add_new(
+            n_type=LocationDataType.DATASET, data=l_data, usr='test_user')
+        self.assertEquals(l_data, data, "Data should be equal")
+        self.assertIsNotNone(oid)
 
+        details = self.store.get_details(
+            n_type=LocationDataType.DATASET, oid=oid)
+        self.assertEquals(l_data, details)
 
+    def test_nonexisting_details(self):
+        self.assertRaises(FileNotFoundError, self.store.get_details,
+                          LocationDataType.DATASET, '42')
 
+    def test_update_details(self):
+        l_data = LocationData(name='test1', url='http://n.go', metadata=[])
+        new_data = LocationData(
+            name='test2', url='http://go.n', metadata={'key': 'value'})
+        (oid, data) = self.store.add_new(
+            n_type=LocationDataType.DATASET, data=l_data, usr='test_user')
+        self.assertEquals(l_data, data, "Data should be equal")
+        self.assertIsNotNone(oid)
 
-
-
-
-        
\ No newline at end of file
+        (oid2, r) = self.store.update_details(n_type=LocationDataType.DATASET, oid=oid,
+                                              data=new_data, usr='tst2')
+        self.assertEquals(new_data, r)
+        self.assertEquals(oid, oid2)
-- 
GitLab