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