From 27346948be0ea7f8f0bd363594e701196e92634f Mon Sep 17 00:00:00 2001 From: Johnny Reichman Date: Tue, 29 Mar 2022 16:05:54 -0500 Subject: [PATCH 1/2] add legal service and related integration tests --- README.md | 11 ++- osdu/client/_base.py | 9 ++- osdu/services/legal.py | 98 +++++++++++++++++++++++ tests/integration.py | 58 ++++++++++++++ tests/test_data/test_create_legaltag.json | 16 ++++ tests/test_data/test_update_legaltag.json | 6 ++ 6 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 osdu/services/legal.py create mode 100644 tests/test_data/test_create_legaltag.json create mode 100644 tests/test_data/test_update_legaltag.json diff --git a/README.md b/README.md index f1cf51c..911a0bc 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,15 @@ For OSDU on AWS, this client is useful in the case where you may want to perform - add_group_member - delete_group_member - create_group +- [legal](osdu/services/legal.py) + - get_legaltag + - create_legaltag + - delete_legaltag + - get_legaltags + - update_legaltag + - batch_retrive_legaltags + - validate_legaltags + - get_legaltag_properties ## Installation @@ -342,4 +351,4 @@ query = { "role": "OWNER", } result = osdu_client.entitlements.delete_group_member('service.search.admin@osdu.example.com',query) -``` +``` \ No newline at end of file diff --git a/osdu/client/_base.py b/osdu/client/_base.py index b080a85..d08608a 100644 --- a/osdu/client/_base.py +++ b/osdu/client/_base.py @@ -7,6 +7,7 @@ from ..services.storage import StorageService from ..services.dataset import DatasetService from ..services.entitlements import EntitlementsService +from ..services.legal import LegalService class BaseOsduClient: @@ -39,6 +40,10 @@ def delivery(self): @property def dataset(self): return self._dataset + + @property + def legal(self): + return self.__legal @property def data_partition_id(self): @@ -65,8 +70,7 @@ def __init__(self, data_partition_id, api_url: str = None): self._storage = StorageService(self) self._dataset = DatasetService(self) self._entitlements = EntitlementsService(self) - # TODO: Implement these services. - # self.__legal = LegaService(self) + self.__legal = LegalService(self) def _need_update_token(self): return hasattr(self, "_token_expiration") and self._token_expiration < time() or self._access_token is None @@ -93,4 +97,3 @@ def _ensure_valid_token(self): def _update_token(self): pass #each client has their own update_token method - diff --git a/osdu/services/legal.py b/osdu/services/legal.py new file mode 100644 index 0000000..548bde8 --- /dev/null +++ b/osdu/services/legal.py @@ -0,0 +1,98 @@ +""" Provides a simple Python interface to the OSDU Legal API. +""" +from typing import List +import requests +from .base import BaseService + + +class LegalService(BaseService): + + def __init__(self, client): + super().__init__(client, service_name='legal', service_version=1) + + def get_legaltag(self, legaltag_name: str): + """Returns information about the given legaltag. + + param legaltag_name: the name of the legaltag of interest + """ + url = f'{self._service_url}/legaltags/{legaltag_name}' + response = self.__execute_request('get', url) + + return response.json() + + def create_legaltag(self, legaltag: dict): + """Create a new legaltag. + + param legaltag: a JSON representation of a legaltag + """ + url = f'{self._service_url}/legaltags' + response = self.__execute_request('post', url, json=legaltag) + + return response.json() + + def delete_legaltag(self, legaltag_name: str) -> bool: + """Deletes the given legaltag. This operation cannot be reverted (except by re-creating the legaltag). + + :param legaltag_name: the name of the legaltag to delete + :returns: True if legaltag deleted successfully. Otherwise False. + """ + url = f'{self._service_url}/legaltags/{legaltag_name}' + response = self.__execute_request('delete', url) + + return response.status_code == 204 + + def get_legaltags(self, valid: bool = True): + """Fetches all matching legaltags. + + :param valid: Boolean to restrict results to only valid legaltags (true) or only invalid legal tags (false). Default is true + """ + url = f'{self._service_url}/legaltags/' + ('?valid=true' if valid else '?valid=false') + response = self.__execute_request('get', url) + + return response.json() + + def update_legaltag(self, legaltag: dict): + """Updates a legaltag. Empty properties are ignored, not deleted. + + :param legaltag: dictionary of properties to add/change to an existing legaltag + """ + url = f'{self._service_url}/legaltags' + response = self.__execute_request('put', url, json=legaltag) + + return response.json() + + def batch_retrive_legaltags(self, legaltag_names: List[str]): + """Retrieves information about a list of legaltags + + :param legaltag_names: List of legaltag names to fetch information about + """ + url = f'{self._service_url}/legaltags:batchRetrieve' + payload = {'names': legaltag_names} + response = self.__execute_request('post', url, json=payload) + + return response.json() + + def validate_legaltags(self, legaltag_names: List[str]): + """Validates the given legaltags--returning a list of which legaltags are invalid. + + :param legaltag_names: List of legaltag names to validate + """ + url = f'{self._service_url}/legaltags:validate' + payload = {'names': legaltag_names} + response = self.__execute_request('post', url, json=payload) + + return response.json() + + def get_legaltag_properties(self): + """Fetch information about possible values for legaltag properties""" + url = f'{self._service_url}/legaltags:properties' + response = self.__execute_request('get', url) + + return response.json() + + def __execute_request(self, method: str, url: str, json=None): + headers = self._headers() + response = requests.request(method, url, headers=headers, json=json) + response.raise_for_status() + + return response \ No newline at end of file diff --git a/tests/integration.py b/tests/integration.py index 9bbec91..8ac485c 100644 --- a/tests/integration.py +++ b/tests/integration.py @@ -324,3 +324,61 @@ def tearDownClass(cls): for record_id in cls.test_records: cls.osdu.storage.purge_record(record_id) super().tearDownClass() + +class TestLegalService(TestOsduServiceBase): + + def test_get_legaltags(self): + result = self.osdu.legal.get_legaltags() + + self.assertTrue(len(result['legalTags']) > 0) + + def test_validate_legaltags(self): + legaltag_names = ["osdu-public-usa-dataset", "osdu-testing-legal-tag-plz-delete"] + result = self.osdu.legal.validate_legaltags(legaltag_names) + + self.assertIsNotNone(result['invalidLegalTags']) + + def test_get_legaltag_properties(self): + result = self.osdu.legal.get_legaltag_properties() + + self.assertIsNotNone(result['dataTypes']) + +class TestLegalService_WithSideEffects(TestOsduServiceBase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + create_legaltag_data_file = 'tests/test_data/test_create_legaltag.json' + with open(create_legaltag_data_file, 'r') as _file: + cls.legaltag_to_create = json.load(_file) + + update_legaltag_data_file = 'tests/test_data/test_update_legaltag.json' + with open(update_legaltag_data_file, 'r') as _file: + cls.legaltag_to_update = json.load(_file) + + def test_001_create_legaltag(self): + result = self.osdu.legal.create_legaltag(self.legaltag_to_create) + + self.assertIsNotNone(result["name"]) + + def test_002_get_legaltag(self): + legaltag = self.osdu.legal.get_legaltag(self.legaltag_to_create['name']) + + self.assertIsNotNone(legaltag["name"]) + + def test_003_batch_retrieve_legaltag(self): + legaltag_names = ["osdu-public-usa-dataset", self.legaltag_to_create['name']] + result = self.osdu.legal.batch_retrive_legaltags(legaltag_names) + + self.assertTrue(len(result['legalTags']) > 0) + + def test_004_update_legaltag(self): + result = self.osdu.legal.update_legaltag(self.legaltag_to_update) + + self.assertEqual(result['description'], self.legaltag_to_update['description']) + + def test_005_delete_legaltag(self): + tag_was_deleted = self.osdu.legal.delete_legaltag(self.legaltag_to_create['name']) + + self.assertTrue(tag_was_deleted) + diff --git a/tests/test_data/test_create_legaltag.json b/tests/test_data/test_create_legaltag.json new file mode 100644 index 0000000..5a69d76 --- /dev/null +++ b/tests/test_data/test_create_legaltag.json @@ -0,0 +1,16 @@ +{ + "name": "osdu-testing-legal-tag-plz-delete", + "description": "Another default legal tag", + "properties": { + "countryOfOrigin": [ + "US" + ], + "contractId": "A1234", + "expirationDate": "2040-06-02", + "originator": "Default", + "dataType": "Public Domain Data", + "securityClassification": "Public", + "personalData": "No Personal Data", + "exportClassification": "EAR99" + } +} \ No newline at end of file diff --git a/tests/test_data/test_update_legaltag.json b/tests/test_data/test_update_legaltag.json new file mode 100644 index 0000000..e11cc01 --- /dev/null +++ b/tests/test_data/test_update_legaltag.json @@ -0,0 +1,6 @@ +{ + "name": "osdu-testing-legal-tag-plz-delete", + "contractId":"A1234", + "expirationDate":2222222222222, + "description": "new description" +} \ No newline at end of file From 2d1dc48cd0423ed7517af4aebf7eef79a5f0ddfb Mon Sep 17 00:00:00 2001 From: Johnny Reichman Date: Wed, 30 Mar 2022 11:14:44 -0500 Subject: [PATCH 2/2] clean up testdata --- tests/integration.py | 2 +- tests/test_data/test_create_legaltag.json | 2 +- tests/test_data/test_update_legaltag.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration.py b/tests/integration.py index 8ac485c..3e4bfa4 100644 --- a/tests/integration.py +++ b/tests/integration.py @@ -333,7 +333,7 @@ def test_get_legaltags(self): self.assertTrue(len(result['legalTags']) > 0) def test_validate_legaltags(self): - legaltag_names = ["osdu-public-usa-dataset", "osdu-testing-legal-tag-plz-delete"] + legaltag_names = ["osdu-public-usa-dataset", "osdu-testing-legal-tag"] result = self.osdu.legal.validate_legaltags(legaltag_names) self.assertIsNotNone(result['invalidLegalTags']) diff --git a/tests/test_data/test_create_legaltag.json b/tests/test_data/test_create_legaltag.json index 5a69d76..8fed992 100644 --- a/tests/test_data/test_create_legaltag.json +++ b/tests/test_data/test_create_legaltag.json @@ -1,5 +1,5 @@ { - "name": "osdu-testing-legal-tag-plz-delete", + "name": "osdu-testing-legal-tag", "description": "Another default legal tag", "properties": { "countryOfOrigin": [ diff --git a/tests/test_data/test_update_legaltag.json b/tests/test_data/test_update_legaltag.json index e11cc01..dc484fd 100644 --- a/tests/test_data/test_update_legaltag.json +++ b/tests/test_data/test_update_legaltag.json @@ -1,6 +1,6 @@ { - "name": "osdu-testing-legal-tag-plz-delete", + "name": "osdu-testing-legal-tag", "contractId":"A1234", - "expirationDate":2222222222222, + "expirationDate":"2040-06-12", "description": "new description" } \ No newline at end of file