From cd2be9b1f70f8616da43377b18d7d1960bc21d53 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Tue, 12 Jun 2018 17:14:57 -0300 Subject: [PATCH 01/11] mpv1_tk8 --- api/tests/test_article.py | 64 +++++++++++++++++++++++++- api/views/article.py | 19 +++++++- managers/__init__.py | 21 +++++++++ managers/article_manager.py | 10 +++- managers/tests/test_article_manager.py | 38 ++++++++++++++- persistence/databases.py | 4 ++ 6 files changed, 152 insertions(+), 4 deletions(-) diff --git a/api/tests/test_article.py b/api/tests/test_article.py index 46dcaa4..30a2805 100644 --- a/api/tests/test_article.py +++ b/api/tests/test_article.py @@ -6,12 +6,14 @@ from pyramid.httpexceptions import ( HTTPInternalServerError, HTTPNotFound, - HTTPBadRequest + HTTPBadRequest, + HTTPServiceUnavailable, ) from webob.multidict import MultiDict import managers from api.views.article import ArticleAPI, ArticleXML, ArticleAsset +from persistence.databases import DBFailed, UpdateFailure def _get_file_property(filename, content, size): @@ -419,3 +421,63 @@ def test_post_article_returns_article_version_url(mocked_post_article, assert response.status_code == 201 assert response.json is not None assert response.json.get('url').endswith(xml_file.filename) + + +@patch.object(managers, 'delete_article') +def test_http_article_calls_delete_article_service_unavailable( + mocked_delete_article, + dummy_request): + mocked_delete_article.side_effect = DBFailed + dummy_request.DELETE = MultiDict( + [('id', 'ID')] + ) + article_api = ArticleAPI(dummy_request) + with pytest.raises(HTTPServiceUnavailable): + article_api.delete() + + +@patch.object(managers, 'delete_article') +def test_http_article_calls_delete_article_not_found( + mocked_delete_article, + dummy_request): + mocked_delete_article.side_effect = \ + managers.article_manager.ArticleManagerException( + message='Article ID not registered' + ) + dummy_request.DELETE = MultiDict( + [('id', 'ID')] + ) + article_api = ArticleAPI(dummy_request) + with pytest.raises(HTTPNotFound): + article_api.delete() + + +@patch.object(managers, 'delete_article') +def test_http_article_calls_delete_article_bad_request( + mocked_delete_article, + dummy_request): + error_msg = 'Article ID is not allowed to delete' + mocked_delete_article.side_effect = \ + UpdateFailure( + message=error_msg + ) + dummy_request.DELETE = MultiDict( + [('id', 'ID')] + ) + article_api = ArticleAPI(dummy_request) + with pytest.raises(HTTPBadRequest) as excinfo: + article_api.delete() + assert excinfo.value.message == error_msg + + +@patch.object(managers, 'delete_article') +def test_http_article_calls_delete_article_success( + mocked_delete_article, + dummy_request): + dummy_request.DELETE = MultiDict( + [('id', 'ID')] + ) + article_api = ArticleAPI(dummy_request) + response = article_api.delete() + assert response.status_code == 200 + assert response.json is not None diff --git a/api/views/article.py b/api/views/article.py index 4ef0066..bbf4ee7 100644 --- a/api/views/article.py +++ b/api/views/article.py @@ -4,13 +4,15 @@ from pyramid.httpexceptions import ( HTTPNotFound, HTTPInternalServerError, - HTTPBadRequest + HTTPBadRequest, + HTTPServiceUnavailable, ) from pyramid.response import Response from cornice.resource import resource from prometheus_client import Summary import managers +import persistence REQUEST_TIME_API_ARTICLE_GET = Summary( @@ -104,6 +106,21 @@ def get(self): except managers.article_manager.ArticleManagerException as e: raise HTTPNotFound(detail=e.message) + def delete(self): + """Delete Article.""" + try: + article_data = managers.delete_article( + article_id=self.request.DELETE['id'], + **self.request.db_settings + ) + return Response(status_code=200, json=article_data) + except managers.article_manager.ArticleManagerException as e: + raise HTTPNotFound(detail=e.message) + except persistence.databases.UpdateFailure as e: + raise HTTPBadRequest(detail=e.message) + except persistence.databases.DBFailed as e: + raise HTTPServiceUnavailable() + @resource(path='/articles/{id}/xml', renderer='xml') class ArticleXML: diff --git a/managers/__init__.py b/managers/__init__.py index 1514abd..81ccbb9 100644 --- a/managers/__init__.py +++ b/managers/__init__.py @@ -93,6 +93,27 @@ def put_article(article_id, xml_file, assets_files=[], **db_settings): files=assets_files) +def delete_article(article_id, **db_settings): + """ + Marca o Documento de Artigo como "apagado" + + :param article_id: ID do Documento do tipo Artigo, para identificação + referencial + :param revision_id: indica a revisão do registro + :param db_settings: dicionário com as configurações do banco de dados. + Deve conter: + - database_uri: URI do banco de dados (host:porta) + - database_username: usuário do banco de dados + - database_password: senha do banco de dados + + :returns: + - HTTPServiceUnavailable + """ + article_manager = _get_article_manager(**db_settings) + return article_manager.delete_article( + article_id=article_id) + + def get_article_data(article_id, **db_settings): """ Recupera metadados do Documento de Artigo, usados para controle de diff --git a/managers/article_manager.py b/managers/article_manager.py index 3eadba8..76b624b 100644 --- a/managers/article_manager.py +++ b/managers/article_manager.py @@ -4,7 +4,7 @@ get_record, RecordType, ) -from persistence.databases import DocumentNotFound +from persistence.databases import DocumentNotFound, DBFailed, UpdateFailure from persistence.services import DatabaseService from .models.article_model import ( ArticleDocument, @@ -31,6 +31,14 @@ def __init__(self, articles_db_manager, changes_services): self.article_db_service = DatabaseService( articles_db_manager, changes_services) + def delete_article(self, article_id): + try: + document_record = self.article_db_service.read(article_id) + self.article_db_service.delete(article_id, document_record) + except UpdateFailure as e: + raise UpdateFailure(e.message) + raise DBFailed + def receive_package(self, id, xml_file, files=None): article = self.receive_xml_file(id, xml_file) self.receive_asset_files(article, files) diff --git a/managers/tests/test_article_manager.py b/managers/tests/test_article_manager.py index 5266339..d1b0948 100644 --- a/managers/tests/test_article_manager.py +++ b/managers/tests/test_article_manager.py @@ -2,7 +2,7 @@ import pytest -from persistence.databases import DocumentNotFound +from persistence.databases import DocumentNotFound, DBFailed, UpdateFailure from persistence.services import DatabaseService from persistence.models import RecordType from managers.article_manager import ( @@ -208,3 +208,39 @@ def test_get_asset_files(databaseservice_params, test_package_A): assert len(msg) == 0 for asset in files: assert asset.content in asset_contents + + +@patch.object(DatabaseService, 'delete', side_effect=DBFailed) +def test_delete_article_db_failed( + mocked_dataservices_delete, + setup, + databaseservice_params, + inmemory_receive_package): + article_id = 'ID' + article_manager = ArticleManager( + databaseservice_params[0], + databaseservice_params[1] + ) + pytest.raises( + DBFailed, + article_manager.delete_article, + article_id) + + +@patch.object(DatabaseService, 'delete') +def test_delete_article_update_failure( + mocked_dataservices_delete, + setup, + databaseservice_params, + inmemory_receive_package): + article_id = 'ID' + error_msg = 'Article ID not allowed to delete' + article_manager = ArticleManager( + databaseservice_params[0], + databaseservice_params[1] + ) + mocked_dataservices_delete.side_effect = \ + UpdateFailure(error_msg) + with pytest.raises(UpdateFailure) as excinfo: + article_manager.delete_article(article_id) + assert excinfo.value.message == error_msg diff --git a/persistence/databases.py b/persistence/databases.py index 01c5519..8075e3e 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -17,6 +17,10 @@ class DocumentNotFound(Exception): pass +class DBFailed(Exception): + pass + + class QueryOperator(Enum): GREATER_THAN = 'gt' GREATER_THAN_EQUAL = 'ge' From 1b6db8c967701289526d307ab44a808208cbb527 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Wed, 13 Jun 2018 17:36:49 -0300 Subject: [PATCH 02/11] mpv1_tk8 (draft) --- managers/article_manager.py | 3 +- managers/tests/test_article_manager.py | 16 +++++ persistence/databases.py | 25 ++++++++ persistence/services.py | 31 +++++++--- persistence/tests/test_databases.py | 76 +++++++++-------------- persistence/tests/test_services.py | 83 ++++++++++++++++++++++++++ 6 files changed, 177 insertions(+), 57 deletions(-) diff --git a/managers/article_manager.py b/managers/article_manager.py index 76b624b..ea1031d 100644 --- a/managers/article_manager.py +++ b/managers/article_manager.py @@ -37,7 +37,8 @@ def delete_article(self, article_id): self.article_db_service.delete(article_id, document_record) except UpdateFailure as e: raise UpdateFailure(e.message) - raise DBFailed + except DBFailed: + raise DBFailed def receive_package(self, id, xml_file, files=None): article = self.receive_xml_file(id, xml_file) diff --git a/managers/tests/test_article_manager.py b/managers/tests/test_article_manager.py index d1b0948..ebefa44 100644 --- a/managers/tests/test_article_manager.py +++ b/managers/tests/test_article_manager.py @@ -244,3 +244,19 @@ def test_delete_article_update_failure( with pytest.raises(UpdateFailure) as excinfo: article_manager.delete_article(article_id) assert excinfo.value.message == error_msg + + +@patch.object(DatabaseService, 'delete') +@patch.object(DatabaseService, 'read') +def test_delete_article_success( + mocked_dataservices_read, + mocked_dataservices_delete, + setup, + databaseservice_params, + inmemory_receive_package): + article_id = 'ID' + article_manager = ArticleManager( + databaseservice_params[0], + databaseservice_params[1] + ) + assert article_manager.delete_article(article_id) is None diff --git a/persistence/databases.py b/persistence/databases.py index 8075e3e..dbf95c4 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -118,6 +118,7 @@ def drop_database(self): def create(self, id, document): document['revision'] = 1 + document['_rev'] = 1 self.database.update({id: document}) def read(self, id): @@ -125,6 +126,8 @@ def read(self, id): if not doc: raise DocumentNotFound doc['document_rev'] = doc['revision'] + doc['_rev'] = doc['_rev'] + return doc def update(self, id, document): @@ -136,6 +139,15 @@ def update(self, id, document): _document['revision'] += 1 self.database.update({id: _document}) + def new_update(self, id, document): + _document = self.read(id) + if _document.get('_rev') != document.get('_rev'): + raise UpdateFailure( + 'UpdateFailure') + _document.update(document) + _document['_rev'] += 1 + self.database.update({id: _document}) + def delete(self, id): self.read(id) del self.database[id] @@ -277,6 +289,19 @@ def read(self, id): raise DocumentNotFound return doc + def new_update(self, id, document): + """ + Para atualizar documento no CouchDB, é necessário informar a + revisão do documento atual. Por isso, é obtido o documento atual + para que os dados dele sejam atualizados com o registro informado. + """ + try: + self.database[id] = document + except couchdb.http.ResourceNotFound: + raise DocumentNotFound + except: + raise UpdateFailure('UpdateFailure') + def update(self, id, document): """ Para atualizar documento no CouchDB, é necessário informar a diff --git a/persistence/services.py b/persistence/services.py index 1b5a5e5..b97737b 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -3,7 +3,7 @@ from prometheus_client import Summary -from .databases import QueryOperator +from .databases import QueryOperator, DocumentNotFound, UpdateFailure REQUEST_TIME_CHANGES_UPD = Summary( @@ -126,11 +126,14 @@ def read(self, document_id): DocumentNotFound: documento não encontrado na base de dados. """ document = self.db_manager.read(document_id) + if 'deleted_date' in document.keys(): + raise DocumentNotFound document_record = { 'document_id': document['document_id'], 'document_type': document['document_type'], 'content': document['content'], 'created_date': document['created_date'], + '_rev': document['document_rev'] or document['_rev'], 'document_rev': document['document_rev'], } if document.get('updated_date'): @@ -157,9 +160,12 @@ def update(self, document_id, document_record): document_record.update({ 'updated_date': str(datetime.utcnow().timestamp()) }) - self.db_manager.update(document_id, document_record) - self.changes_service.register_change( - document_record, ChangeType.UPDATE) + try: + self.db_manager.update(document_id, document_record) + self.changes_service.register_change( + document_record, ChangeType.UPDATE) + except DocumentNotFound: + raise DocumentNotFound def delete(self, document_id, document_record): """ @@ -169,12 +175,21 @@ def delete(self, document_id, document_record): document_id: ID do documento a ser deletado document_record: registro de documento a ser deletado - Erro: + Erros: DocumentNotFound: documento não encontrado na base de dados. + UpdateFailure: documento não apagado da base de dados. """ - self.db_manager.delete(document_id) - self.changes_service.register_change( - document_record, ChangeType.DELETE) + document_record.update({ + 'deleted_date': str(datetime.utcnow().timestamp()), + }) + try: + __ = self.read(document_id) + self.db_manager.new_update(document_id, document_record) + self.changes_service.register_change( + document_record, ChangeType.DELETE) + except UpdateFailure: + raise UpdateFailure( + 'Document {} not allowed to delete'.format(document_id)) @REQUEST_TIME_DOC_FIND.time() def find(self, selector, fields, sort): diff --git a/persistence/tests/test_databases.py b/persistence/tests/test_databases.py index 6bab4f5..8d40bb4 100644 --- a/persistence/tests/test_databases.py +++ b/persistence/tests/test_databases.py @@ -4,7 +4,7 @@ from datetime import datetime from uuid import uuid4 -from persistence.databases import DocumentNotFound, sort_results +from persistence.databases import DocumentNotFound, sort_results, UpdateFailure from persistence.services import ( ChangesService, ChangeType) @@ -116,55 +116,10 @@ def test_update_document_register_change(mocked_register_change, def test_update_document_not_found(database_service): article_record = get_article_record({'Test': 'Test4'}) + database_service.db_manager.drop_database() pytest.raises( DocumentNotFound, - database_service.delete, - article_record['document_id'], - article_record - ) - - -def test_delete_document(database_service): - article_record = get_article_record({'Test': 'Test5'}) - database_service.register( - article_record['document_id'], - article_record - ) - - record_check = database_service.read(article_record['document_id']) - database_service.delete( - article_record['document_id'], - record_check - ) - pytest.raises(DocumentNotFound, - database_service.read, - article_record['document_id']) - - -@patch.object(ChangesService, 'register_change') -def test_delete_document_register_change(mocked_register_change, - database_service): - article_record = get_article_record({'Test': 'Test5'}) - database_service.register( - article_record['document_id'], - article_record - ) - - record_check = database_service.read(article_record['document_id']) - database_service.delete( - article_record['document_id'], - record_check - ) - - mocked_register_change.assert_called_with(record_check, - ChangeType.DELETE) - - -def test_delete_document_not_found(database_service): - article_record = get_article_record({'Test': 'Test6'}) - pytest.raises( - DocumentNotFound, - database_service.delete, + database_service.update, article_record['document_id'], article_record ) @@ -489,3 +444,28 @@ def compare_documents(document, expected): assert document[k] == expected[k] else: assert document == expected + + +def test_databases_update(database_service): + article_record = get_article_record({'teste': 'teste'}) + database_service.db_manager.create( + article_record['document_id'], + article_record + ) + read1 = database_service.db_manager.read( + article_record['document_id'] + ) + read2 = database_service.db_manager.read( + article_record['document_id'] + ) + read1.update({'text': 'read1'}) + read2.update({'text': 'read2'}) + + database_service.db_manager.update(article_record['document_id'], read2) + + pytest.raises( + UpdateFailure, + database_service.db_manager.update, + article_record['document_id'], + read1 + ) diff --git a/persistence/tests/test_services.py b/persistence/tests/test_services.py index cdd2901..3fddbe3 100644 --- a/persistence/tests/test_services.py +++ b/persistence/tests/test_services.py @@ -3,6 +3,26 @@ from persistence.databases import QueryOperator from persistence.services import ChangeType, SortOrder +from unittest.mock import patch + +import pytest +from datetime import datetime +from uuid import uuid4 + +from persistence.models import get_record, RecordType +from persistence.databases import DocumentNotFound, UpdateFailure +from persistence.services import ( + ChangesService, +) + + +def get_article_record(content={'Test': 'Test'}): + document_id = uuid4().hex + return get_record(document_id=document_id, + document_type=RecordType.ARTICLE, + content=content, + created_date=datetime.utcnow()) + def test_list_changes_calls_db_manager_find(inmemory_db_setup, test_changes_records, @@ -113,3 +133,66 @@ def test_list_changes_returns_db_manager_find_no_changes(inmemory_db_setup, check_list = inmemory_db_setup.list_changes(last_sequence=last_sequence, limit=limit) assert len(check_list) == 0 + + +def test_delete_document(database_service): + article_record = get_article_record({'Test': 'Test5'}) + database_service.register( + article_record['document_id'], + article_record + ) + + record_check = database_service.read(article_record['document_id']) + database_service.delete( + article_record['document_id'], + record_check + ) + pytest.raises(DocumentNotFound, + database_service.read, + article_record['document_id']) + + +@patch.object(ChangesService, 'register_change') +def test_delete_document_register_change(mocked_register_change, + database_service): + article_record = get_article_record({'Test': 'Test5'}) + database_service.register( + article_record['document_id'], + article_record + ) + + record_check = database_service.read(article_record['document_id']) + database_service.delete( + article_record['document_id'], + record_check + ) + + mocked_register_change.assert_called_with(record_check, + ChangeType.DELETE) + + +def test_delete_document_not_found(database_service): + article_record = get_article_record({'Test': 'Test6'}) + pytest.raises( + DocumentNotFound, + database_service.delete, + article_record['document_id'], + article_record + ) + + +def test_delete_document_update_failure(database_service): + article_record = get_article_record({'Test': 'Test10'}) + database_service.register( + article_record['document_id'], + article_record + ) + read = database_service.read(article_record['document_id']) + updated = read.copy() + database_service.db_manager.new_update( + article_record['document_id'], updated) + + error_msg = 'Document {} not allowed to delete'.format( + article_record['document_id']) + with pytest.raises(UpdateFailure, message=error_msg): + database_service.delete(article_record['document_id'], read) From c3597314f72fa2e782fe3ae13acf491bedcb77b4 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Thu, 14 Jun 2018 10:15:10 -0300 Subject: [PATCH 03/11] mpv1_tk8 --- persistence/databases.py | 22 +++++++++--------- persistence/services.py | 36 +++++++++++++++++++++++++---- persistence/tests/test_databases.py | 20 ++++++++-------- persistence/tests/test_services.py | 2 +- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/persistence/databases.py b/persistence/databases.py index dbf95c4..f4b976d 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -32,6 +32,8 @@ class QueryOperator(Enum): class BaseDBManager(metaclass=abc.ABCMeta): _attachments_properties_key = 'attachments_properties' + rev_key = 'document_rev' + _rev_key = '_rev' @abc.abstractmethod def drop_database(self) -> None: @@ -104,6 +106,7 @@ def __init__(self, **kwargs): self._database_name = kwargs['database_name'] self._attachments_key = 'attachments' self._attachments_properties_key = 'attachments_properties' + self._rev_key = 'revision' self._database = {} @property @@ -117,35 +120,32 @@ def drop_database(self): self._database = {} def create(self, id, document): - document['revision'] = 1 - document['_rev'] = 1 + document[self._rev_key] = 1 self.database.update({id: document}) def read(self, id): doc = self.database.get(id) if not doc: raise DocumentNotFound - doc['document_rev'] = doc['revision'] - doc['_rev'] = doc['_rev'] - + doc[self.rev_key] = doc[self._rev_key] return doc def update(self, id, document): _document = self.read(id) - if _document.get('revision') != document.get('document_rev'): + if _document.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( 'You are trying to update a record which data is out of date') _document.update(document) - _document['revision'] += 1 + _document[self._rev_key] += 1 self.database.update({id: _document}) def new_update(self, id, document): _document = self.read(id) - if _document.get('_rev') != document.get('_rev'): + if _document.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( 'UpdateFailure') _document.update(document) - _document['_rev'] += 1 + _document[self._rev_key] += 1 self.database.update({id: _document}) def delete(self, id): @@ -284,7 +284,7 @@ def create(self, id, document): def read(self, id): try: doc = dict(self.database[id]) - doc['document_rev'] = doc['_rev'] + doc[self.rev_key] = doc[self._rev_key] except couchdb.http.ResourceNotFound: raise DocumentNotFound return doc @@ -309,7 +309,7 @@ def update(self, id, document): para que os dados dele sejam atualizados com o registro informado. """ doc = self.read(id) - if doc.get('_rev') != document.get('document_rev'): + if doc.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( 'You are trying to update a record which data is out of date') diff --git a/persistence/services.py b/persistence/services.py index b97737b..00e1bd2 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -126,7 +126,7 @@ def read(self, document_id): DocumentNotFound: documento não encontrado na base de dados. """ document = self.db_manager.read(document_id) - if 'deleted_date' in document.keys(): + if 'deleted_date' in document: raise DocumentNotFound document_record = { 'document_id': document['document_id'], @@ -136,14 +136,38 @@ def read(self, document_id): '_rev': document['document_rev'] or document['_rev'], 'document_rev': document['document_rev'], } - if document.get('updated_date'): - document_record['updated_date'] = document['updated_date'] + for optional in ['updated_date', 'deleted_date']: + if optional in document.keys(): + document_record[optional] = document[optional] attachments = self.db_manager.list_attachments(document_id) if attachments: document_record['attachments'] = \ self.db_manager.list_attachments(document_id) return document_record + @REQUEST_TIME_DOC_UPD.time() + def new_update(self, document_id, document_record): + """ + Atualiza o registro de um documento e a mudança na base de dados. + + Params: + document_id: ID do documento a ser atualizado + document_record: registro de documento a ser atualizado + + Erro: + DocumentNotFound: documento não encontrado na base de dados. + UpdateFailure: dados do document_record estão desatualizados. + """ + document_record.update({ + 'updated_date': str(datetime.utcnow().timestamp()) + }) + try: + self.db_manager.new_update(document_id, document_record) + self.changes_service.register_change( + document_record, ChangeType.UPDATE) + except DocumentNotFound: + raise DocumentNotFound + @REQUEST_TIME_DOC_UPD.time() def update(self, document_id, document_record): """ @@ -179,11 +203,15 @@ def delete(self, document_id, document_record): DocumentNotFound: documento não encontrado na base de dados. UpdateFailure: documento não apagado da base de dados. """ + # tenta ler o registro + read = self.db_manager.read(document_id) + if 'deleted_date' in read.keys(): + raise DocumentNotFound + document_record.update({ 'deleted_date': str(datetime.utcnow().timestamp()), }) try: - __ = self.read(document_id) self.db_manager.new_update(document_id, document_record) self.changes_service.register_change( document_record, ChangeType.DELETE) diff --git a/persistence/tests/test_databases.py b/persistence/tests/test_databases.py index 8d40bb4..11380b1 100644 --- a/persistence/tests/test_databases.py +++ b/persistence/tests/test_databases.py @@ -438,34 +438,32 @@ def test_find_documents_by_selected_field_returns_according_to_filter( def compare_documents(document, expected): if document == expected: assert document == expected - elif len(document) == len(expected) + 1: - # para ignorar "revision" + else: for k in expected.keys(): assert document[k] == expected[k] - else: - assert document == expected -def test_databases_update(database_service): +def test_databases_new_update(database_service): article_record = get_article_record({'teste': 'teste'}) database_service.db_manager.create( article_record['document_id'], article_record ) - read1 = database_service.db_manager.read( - article_record['document_id'] - ) - read2 = database_service.db_manager.read( + read = database_service.db_manager.read( article_record['document_id'] ) + read1 = read.copy() + read2 = read.copy() + read1.update({'text': 'read1'}) read2.update({'text': 'read2'}) - database_service.db_manager.update(article_record['document_id'], read2) + database_service.db_manager.new_update( + article_record['document_id'], read2) pytest.raises( UpdateFailure, - database_service.db_manager.update, + database_service.db_manager.new_update, article_record['document_id'], read1 ) diff --git a/persistence/tests/test_services.py b/persistence/tests/test_services.py index 3fddbe3..31d5616 100644 --- a/persistence/tests/test_services.py +++ b/persistence/tests/test_services.py @@ -189,7 +189,7 @@ def test_delete_document_update_failure(database_service): ) read = database_service.read(article_record['document_id']) updated = read.copy() - database_service.db_manager.new_update( + database_service.update( article_record['document_id'], updated) error_msg = 'Document {} not allowed to delete'.format( From a715b6eb2a2005ff68e6a5002887b7f016e3dbaa Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Thu, 14 Jun 2018 10:54:02 -0300 Subject: [PATCH 04/11] mpv1_tk8 --- persistence/databases.py | 1 + persistence/services.py | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/persistence/databases.py b/persistence/databases.py index f4b976d..7fc0d88 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -295,6 +295,7 @@ def new_update(self, id, document): revisão do documento atual. Por isso, é obtido o documento atual para que os dados dele sejam atualizados com o registro informado. """ + document[self._rev_key] = document[self.rev_key] try: self.database[id] = document except couchdb.http.ResourceNotFound: diff --git a/persistence/services.py b/persistence/services.py index 00e1bd2..2670cbf 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -133,7 +133,6 @@ def read(self, document_id): 'document_type': document['document_type'], 'content': document['content'], 'created_date': document['created_date'], - '_rev': document['document_rev'] or document['_rev'], 'document_rev': document['document_rev'], } for optional in ['updated_date', 'deleted_date']: @@ -204,9 +203,7 @@ def delete(self, document_id, document_record): UpdateFailure: documento não apagado da base de dados. """ # tenta ler o registro - read = self.db_manager.read(document_id) - if 'deleted_date' in read.keys(): - raise DocumentNotFound + self.read(document_id) document_record.update({ 'deleted_date': str(datetime.utcnow().timestamp()), From 8a03f333af78c2333f5aa877f111202c47a3f778 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Thu, 14 Jun 2018 17:06:08 -0300 Subject: [PATCH 05/11] mpv1_tk8 --- managers/article_manager.py | 11 ++------- managers/tests/test_article_manager.py | 30 ++++++++++++++----------- persistence/databases.py | 3 +-- persistence/services.py | 18 +++++---------- persistence/tests/test_databases.py | 31 ++++++++++++++++++++++++-- persistence/tests/test_services.py | 23 +++++++++++++++++++ 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/managers/article_manager.py b/managers/article_manager.py index 8f7e31a..4a49ac7 100644 --- a/managers/article_manager.py +++ b/managers/article_manager.py @@ -6,8 +6,6 @@ ) from persistence.databases import ( DocumentNotFound, - DBFailed, - UpdateFailure, ) from persistence.services import DatabaseService from .models.article_model import ( @@ -36,13 +34,8 @@ def __init__(self, articles_db_manager, changes_services): articles_db_manager, changes_services) def delete_article(self, article_id): - try: - document_record = self.article_db_service.read(article_id) - self.article_db_service.delete(article_id, document_record) - except UpdateFailure as e: - raise UpdateFailure(e.message) - except DBFailed: - raise DBFailed + document_record = self.article_db_service.read(article_id) + self.article_db_service.delete(article_id, document_record) def receive_package(self, id, xml_file, files=None): article = self.receive_xml_file(id, xml_file) diff --git a/managers/tests/test_article_manager.py b/managers/tests/test_article_manager.py index bb3ed54..61d3ed3 100644 --- a/managers/tests/test_article_manager.py +++ b/managers/tests/test_article_manager.py @@ -8,7 +8,7 @@ UpdateFailure, ) from persistence.services import DatabaseService - +from persistence.models import get_record, RecordType from managers.models.article_model import ( ArticleDocument, ) @@ -228,13 +228,13 @@ def test_get_asset_files(databaseservice_params, test_package_A): assert asset.content in asset_contents -@patch.object(DatabaseService, 'delete', side_effect=DBFailed) +@patch.object(DatabaseService, 'read') def test_delete_article_db_failed( - mocked_dataservices_delete, + mocked_dataservices_read, setup, - databaseservice_params, - inmemory_receive_package): + databaseservice_params): article_id = 'ID' + mocked_dataservices_read.side_effect = DBFailed article_manager = ArticleManager( databaseservice_params[0], databaseservice_params[1] @@ -249,14 +249,18 @@ def test_delete_article_db_failed( def test_delete_article_update_failure( mocked_dataservices_delete, setup, - databaseservice_params, - inmemory_receive_package): + databaseservice_params): article_id = 'ID' error_msg = 'Article ID not allowed to delete' article_manager = ArticleManager( databaseservice_params[0], databaseservice_params[1] ) + article_manager.article_db_service.register( + article_id, + get_record(article_id) + ) + mocked_dataservices_delete.side_effect = \ UpdateFailure(error_msg) with pytest.raises(UpdateFailure) as excinfo: @@ -264,17 +268,17 @@ def test_delete_article_update_failure( assert excinfo.value.message == error_msg -@patch.object(DatabaseService, 'delete') -@patch.object(DatabaseService, 'read') def test_delete_article_success( - mocked_dataservices_read, - mocked_dataservices_delete, setup, - databaseservice_params, - inmemory_receive_package): + databaseservice_params): article_id = 'ID' article_manager = ArticleManager( databaseservice_params[0], databaseservice_params[1] ) + article_record = get_record(article_id) + article_manager.article_db_service.register( + article_id, + article_record + ) assert article_manager.delete_article(article_id) is None diff --git a/persistence/databases.py b/persistence/databases.py index 96e7a41..478b554 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -294,8 +294,7 @@ def read(self, id): def new_update(self, id, document): """ Para atualizar documento no CouchDB, é necessário informar a - revisão do documento atual. Por isso, é obtido o documento atual - para que os dados dele sejam atualizados com o registro informado. + revisão do documento atual. """ document[self._rev_key] = document[self.rev_key] try: diff --git a/persistence/services.py b/persistence/services.py index 2670cbf..5585a60 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -160,12 +160,9 @@ def new_update(self, document_id, document_record): document_record.update({ 'updated_date': str(datetime.utcnow().timestamp()) }) - try: - self.db_manager.new_update(document_id, document_record) - self.changes_service.register_change( - document_record, ChangeType.UPDATE) - except DocumentNotFound: - raise DocumentNotFound + self.db_manager.new_update(document_id, document_record) + self.changes_service.register_change( + document_record, ChangeType.UPDATE) @REQUEST_TIME_DOC_UPD.time() def update(self, document_id, document_record): @@ -183,12 +180,9 @@ def update(self, document_id, document_record): document_record.update({ 'updated_date': str(datetime.utcnow().timestamp()) }) - try: - self.db_manager.update(document_id, document_record) - self.changes_service.register_change( - document_record, ChangeType.UPDATE) - except DocumentNotFound: - raise DocumentNotFound + self.db_manager.update(document_id, document_record) + self.changes_service.register_change( + document_record, ChangeType.UPDATE) def delete(self, document_id, document_record): """ diff --git a/persistence/tests/test_databases.py b/persistence/tests/test_databases.py index d4af0de..3ed2433 100644 --- a/persistence/tests/test_databases.py +++ b/persistence/tests/test_databases.py @@ -61,7 +61,8 @@ def test_read_document(database_service): article_record ) - record_check = database_service.read(article_record['document_id']) + record_check = database_service.db_manager.read( + article_record['document_id']) assert record_check is not None assert record_check['document_id'] == article_record['document_id'] assert record_check['document_type'] == article_record['document_type'] @@ -81,7 +82,7 @@ def test_db_failed(article_db_settings): def test_read_document_not_found(database_service): pytest.raises( DocumentNotFound, - database_service.read, + database_service.db_manager.read, '336abebdd31894idnaoexistente' ) @@ -482,3 +483,29 @@ def test_databases_new_update(database_service): article_record['document_id'], read1 ) + + +def test_databases_read_not_found(database_service): + article_record = get_article_record({'teste': 'teste'}) + database_service.db_manager.create( + article_record['document_id'], + article_record + ) + read = database_service.db_manager.read( + article_record['document_id'] + ) + read1 = read.copy() + read2 = read.copy() + + read1.update({'text': 'read1'}) + read2.update({'text': 'read2'}) + + database_service.db_manager.new_update( + article_record['document_id'], read2) + + pytest.raises( + UpdateFailure, + database_service.db_manager.new_update, + article_record['document_id'], + read1 + ) diff --git a/persistence/tests/test_services.py b/persistence/tests/test_services.py index 31d5616..871b060 100644 --- a/persistence/tests/test_services.py +++ b/persistence/tests/test_services.py @@ -24,6 +24,29 @@ def get_article_record(content={'Test': 'Test'}): created_date=datetime.utcnow()) +def test_read_document(database_service): + article_record = get_article_record({'Test': 'Test2'}) + database_service.register( + article_record['document_id'], + article_record + ) + + record_check = database_service.read(article_record['document_id']) + assert record_check is not None + assert record_check['document_id'] == article_record['document_id'] + assert record_check['document_type'] == article_record['document_type'] + assert record_check['content'] == article_record['content'] + assert record_check['created_date'] is not None + + +def test_read_document_not_found(database_service): + pytest.raises( + DocumentNotFound, + database_service.read, + '336abebdd31894idnaoexistente' + ) + + def test_list_changes_calls_db_manager_find(inmemory_db_setup, test_changes_records, xml_test): From d72806c045f81adcfa109b75428f5d1813287693 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Thu, 14 Jun 2018 17:21:11 -0300 Subject: [PATCH 06/11] mpv1_tk8 --- persistence/tests/test_databases.py | 62 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/persistence/tests/test_databases.py b/persistence/tests/test_databases.py index 3ed2433..e0d1928 100644 --- a/persistence/tests/test_databases.py +++ b/persistence/tests/test_databases.py @@ -25,34 +25,13 @@ def get_article_record(content={'Test': 'Test'}): created_date=datetime.utcnow()) -def test_register_document(database_service): - article_record = get_article_record() - database_service.register( - article_record['document_id'], - article_record - ) - - check_list = database_service.find({}, [], []) - assert isinstance(check_list[0], dict) - article_check = check_list[0] - assert article_check['document_id'] == article_record['document_id'] - assert article_check['document_type'] == article_record['document_type'] - assert article_check['content'] == article_record['content'] - assert article_check['created_date'] is not None - - -@patch.object(ChangesService, 'register_change') -def test_register_document_register_change(mocked_register_change, - database_service): - article_record = get_article_record() - database_service.register( - article_record['document_id'], - article_record +def test_read_document_not_found(database_service): + pytest.raises( + DocumentNotFound, + database_service.db_manager.read, + '336abebdd31894idnaoexistente' ) - mocked_register_change.assert_called_with(article_record, - ChangeType.CREATE) - def test_read_document(database_service): article_record = get_article_record({'Test': 'Test2'}) @@ -79,13 +58,34 @@ def test_db_failed(article_db_settings): db_manager.database -def test_read_document_not_found(database_service): - pytest.raises( - DocumentNotFound, - database_service.db_manager.read, - '336abebdd31894idnaoexistente' +def test_register_document(database_service): + article_record = get_article_record() + database_service.register( + article_record['document_id'], + article_record ) + check_list = database_service.find({}, [], []) + assert isinstance(check_list[0], dict) + article_check = check_list[0] + assert article_check['document_id'] == article_record['document_id'] + assert article_check['document_type'] == article_record['document_type'] + assert article_check['content'] == article_record['content'] + assert article_check['created_date'] is not None + + +@patch.object(ChangesService, 'register_change') +def test_register_document_register_change(mocked_register_change, + database_service): + article_record = get_article_record() + database_service.register( + article_record['document_id'], + article_record + ) + + mocked_register_change.assert_called_with(article_record, + ChangeType.CREATE) + def test_update_document(database_service): article_record = get_article_record({'Test': 'Test3'}) From a59b901146cad4cfc6cb8c3ee18f6e9bdee5d48d Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Fri, 15 Jun 2018 08:44:33 -0300 Subject: [PATCH 07/11] mpv1_tk8 --- persistence/databases.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/persistence/databases.py b/persistence/databases.py index 478b554..e0ad31b 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -130,20 +130,20 @@ def read(self, id): doc[self.rev_key] = doc[self._rev_key] return doc - def update(self, id, document): + def new_update(self, id, document): _document = self.read(id) if _document.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( - 'You are trying to update a record which data is out of date') + 'You are trying to update a record which is out of date') _document.update(document) _document[self._rev_key] += 1 self.database.update({id: _document}) - def new_update(self, id, document): + def update(self, id, document): _document = self.read(id) if _document.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( - 'UpdateFailure') + 'You are trying to update a record which is out of date') _document.update(document) _document[self._rev_key] += 1 self.database.update({id: _document}) @@ -294,7 +294,7 @@ def read(self, id): def new_update(self, id, document): """ Para atualizar documento no CouchDB, é necessário informar a - revisão do documento atual. + revisão do documento atual. A revisão vem em document. """ document[self._rev_key] = document[self.rev_key] try: @@ -302,7 +302,8 @@ def new_update(self, id, document): except couchdb.http.ResourceNotFound: raise DocumentNotFound except: - raise UpdateFailure('UpdateFailure') + raise UpdateFailure( + 'You are trying to update a record which is out of date') def update(self, id, document): """ @@ -313,7 +314,7 @@ def update(self, id, document): doc = self.read(id) if doc.get(self._rev_key) != document.get(self.rev_key): raise UpdateFailure( - 'You are trying to update a record which data is out of date') + 'You are trying to update a record which is out of date') doc.update(document) self.database[id] = doc From fc9f04fa37f9f5d0f0fd8e7950e99f95868fabc3 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Fri, 15 Jun 2018 10:06:17 -0300 Subject: [PATCH 08/11] mpv1_tk8 --- persistence/databases.py | 43 ++++++++++------------------- persistence/services.py | 25 +---------------- persistence/tests/test_databases.py | 32 ++------------------- 3 files changed, 19 insertions(+), 81 deletions(-) diff --git a/persistence/databases.py b/persistence/databases.py index e0ad31b..943f86e 100644 --- a/persistence/databases.py +++ b/persistence/databases.py @@ -130,15 +130,6 @@ def read(self, id): doc[self.rev_key] = doc[self._rev_key] return doc - def new_update(self, id, document): - _document = self.read(id) - if _document.get(self._rev_key) != document.get(self.rev_key): - raise UpdateFailure( - 'You are trying to update a record which is out of date') - _document.update(document) - _document[self._rev_key] += 1 - self.database.update({id: _document}) - def update(self, id, document): _document = self.read(id) if _document.get(self._rev_key) != document.get(self.rev_key): @@ -291,34 +282,30 @@ def read(self, id): raise DocumentNotFound return doc - def new_update(self, id, document): - """ - Para atualizar documento no CouchDB, é necessário informar a - revisão do documento atual. A revisão vem em document. - """ - document[self._rev_key] = document[self.rev_key] - try: - self.database[id] = document - except couchdb.http.ResourceNotFound: - raise DocumentNotFound - except: - raise UpdateFailure( - 'You are trying to update a record which is out of date') - def update(self, id, document): """ Para atualizar documento no CouchDB, é necessário informar a revisão do documento atual. Por isso, é obtido o documento atual para que os dados dele sejam atualizados com o registro informado. + + Retorno. Uma das opções: + - DocumentNotFound + - Falha de atualização """ - doc = self.read(id) - if doc.get(self._rev_key) != document.get(self.rev_key): + read = self.read(id) + + if self._rev_key not in document.keys(): + if self.rev_key in document.keys(): + document[self._rev_key] = document[self.rev_key] + read.update(document) + document = read + + try: + self.database[id] = document + except: raise UpdateFailure( 'You are trying to update a record which is out of date') - doc.update(document) - self.database[id] = doc - def delete(self, id): doc = self.read(id) self.database.delete(doc) diff --git a/persistence/services.py b/persistence/services.py index 5585a60..c9d9e7b 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -144,26 +144,6 @@ def read(self, document_id): self.db_manager.list_attachments(document_id) return document_record - @REQUEST_TIME_DOC_UPD.time() - def new_update(self, document_id, document_record): - """ - Atualiza o registro de um documento e a mudança na base de dados. - - Params: - document_id: ID do documento a ser atualizado - document_record: registro de documento a ser atualizado - - Erro: - DocumentNotFound: documento não encontrado na base de dados. - UpdateFailure: dados do document_record estão desatualizados. - """ - document_record.update({ - 'updated_date': str(datetime.utcnow().timestamp()) - }) - self.db_manager.new_update(document_id, document_record) - self.changes_service.register_change( - document_record, ChangeType.UPDATE) - @REQUEST_TIME_DOC_UPD.time() def update(self, document_id, document_record): """ @@ -196,14 +176,11 @@ def delete(self, document_id, document_record): DocumentNotFound: documento não encontrado na base de dados. UpdateFailure: documento não apagado da base de dados. """ - # tenta ler o registro - self.read(document_id) - document_record.update({ 'deleted_date': str(datetime.utcnow().timestamp()), }) try: - self.db_manager.new_update(document_id, document_record) + self.db_manager.update(document_id, document_record) self.changes_service.register_change( document_record, ChangeType.DELETE) except UpdateFailure: diff --git a/persistence/tests/test_databases.py b/persistence/tests/test_databases.py index e0d1928..7109890 100644 --- a/persistence/tests/test_databases.py +++ b/persistence/tests/test_databases.py @@ -459,7 +459,7 @@ def compare_documents(document, expected): assert document[k] == expected[k] -def test_databases_new_update(database_service): +def test_databases_update(database_service): article_record = get_article_record({'teste': 'teste'}) database_service.db_manager.create( article_record['document_id'], @@ -474,38 +474,12 @@ def test_databases_new_update(database_service): read1.update({'text': 'read1'}) read2.update({'text': 'read2'}) - database_service.db_manager.new_update( + database_service.db_manager.update( article_record['document_id'], read2) pytest.raises( UpdateFailure, - database_service.db_manager.new_update, - article_record['document_id'], - read1 - ) - - -def test_databases_read_not_found(database_service): - article_record = get_article_record({'teste': 'teste'}) - database_service.db_manager.create( - article_record['document_id'], - article_record - ) - read = database_service.db_manager.read( - article_record['document_id'] - ) - read1 = read.copy() - read2 = read.copy() - - read1.update({'text': 'read1'}) - read2.update({'text': 'read2'}) - - database_service.db_manager.new_update( - article_record['document_id'], read2) - - pytest.raises( - UpdateFailure, - database_service.db_manager.new_update, + database_service.db_manager.update, article_record['document_id'], read1 ) From ef65c2f454966b3f288a264bd0dc2eb82d6c0a7f Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Fri, 15 Jun 2018 10:11:46 -0300 Subject: [PATCH 09/11] mpv1_tk8 --- managers/__init__.py | 1 - managers/tests/test_article_manager.py | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/managers/__init__.py b/managers/__init__.py index a8a8c09..f696145 100644 --- a/managers/__init__.py +++ b/managers/__init__.py @@ -99,7 +99,6 @@ def delete_article(article_id, **db_settings): :param article_id: ID do Documento do tipo Artigo, para identificação referencial - :param revision_id: indica a revisão do registro :param db_settings: dicionário com as configurações do banco de dados. Deve conter: - database_uri: URI do banco de dados (host:porta) diff --git a/managers/tests/test_article_manager.py b/managers/tests/test_article_manager.py index 61d3ed3..60abeab 100644 --- a/managers/tests/test_article_manager.py +++ b/managers/tests/test_article_manager.py @@ -282,3 +282,7 @@ def test_delete_article_success( article_record ) assert article_manager.delete_article(article_id) is None + pytest.raises( + DocumentNotFound, + article_manager.article_db_service.read, + article_id) From 048d23f8423627af465cf7d1f03d20ef21298882 Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Fri, 15 Jun 2018 11:01:18 -0300 Subject: [PATCH 10/11] mpv1_tk8 --- managers/models/article_model.py | 2 ++ managers/tests/test_article_manager.py | 7 +++---- persistence/services.py | 4 +--- persistence/tests/test_services.py | 15 ++------------- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/managers/models/article_model.py b/managers/models/article_model.py index 783360d..e916226 100644 --- a/managers/models/article_model.py +++ b/managers/models/article_model.py @@ -154,6 +154,8 @@ def _v0_to_v1(self, record): version['assets'] = assets versions = [version] _record['versions'] = versions + if record.get('deleted_date'): + _record['is_removed'] = 'True' return _record def set_data(self, data): diff --git a/managers/tests/test_article_manager.py b/managers/tests/test_article_manager.py index 60abeab..3450706 100644 --- a/managers/tests/test_article_manager.py +++ b/managers/tests/test_article_manager.py @@ -282,7 +282,6 @@ def test_delete_article_success( article_record ) assert article_manager.delete_article(article_id) is None - pytest.raises( - DocumentNotFound, - article_manager.article_db_service.read, - article_id) + + deleted = article_manager.get_article_document(article_id) + assert deleted.manifest.get('is_removed') == 'True' diff --git a/persistence/services.py b/persistence/services.py index c9d9e7b..d29e18f 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -3,7 +3,7 @@ from prometheus_client import Summary -from .databases import QueryOperator, DocumentNotFound, UpdateFailure +from .databases import QueryOperator, UpdateFailure REQUEST_TIME_CHANGES_UPD = Summary( @@ -126,8 +126,6 @@ def read(self, document_id): DocumentNotFound: documento não encontrado na base de dados. """ document = self.db_manager.read(document_id) - if 'deleted_date' in document: - raise DocumentNotFound document_record = { 'document_id': document['document_id'], 'document_type': document['document_type'], diff --git a/persistence/tests/test_services.py b/persistence/tests/test_services.py index 871b060..e17a361 100644 --- a/persistence/tests/test_services.py +++ b/persistence/tests/test_services.py @@ -170,9 +170,8 @@ def test_delete_document(database_service): article_record['document_id'], record_check ) - pytest.raises(DocumentNotFound, - database_service.read, - article_record['document_id']) + deleted = database_service.read(article_record['document_id']) + assert 'deleted_date' in deleted.keys() @patch.object(ChangesService, 'register_change') @@ -194,16 +193,6 @@ def test_delete_document_register_change(mocked_register_change, ChangeType.DELETE) -def test_delete_document_not_found(database_service): - article_record = get_article_record({'Test': 'Test6'}) - pytest.raises( - DocumentNotFound, - database_service.delete, - article_record['document_id'], - article_record - ) - - def test_delete_document_update_failure(database_service): article_record = get_article_record({'Test': 'Test10'}) database_service.register( From 1f99b4d40bb601f1b7d9d1d0d140cd7b1108435d Mon Sep 17 00:00:00 2001 From: robertatakenaka Date: Mon, 18 Jun 2018 11:57:18 -0300 Subject: [PATCH 11/11] mpv1_tk8 --- managers/models/article_model.py | 2 +- persistence/services.py | 4 ++-- persistence/tests/test_services.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/managers/models/article_model.py b/managers/models/article_model.py index e916226..11ec47a 100644 --- a/managers/models/article_model.py +++ b/managers/models/article_model.py @@ -154,7 +154,7 @@ def _v0_to_v1(self, record): version['assets'] = assets versions = [version] _record['versions'] = versions - if record.get('deleted_date'): + if record.get('deleted_date') or record.get('is_removed'): _record['is_removed'] = 'True' return _record diff --git a/persistence/services.py b/persistence/services.py index d29e18f..abe9cd3 100644 --- a/persistence/services.py +++ b/persistence/services.py @@ -133,7 +133,7 @@ def read(self, document_id): 'created_date': document['created_date'], 'document_rev': document['document_rev'], } - for optional in ['updated_date', 'deleted_date']: + for optional in ['updated_date', 'is_removed']: if optional in document.keys(): document_record[optional] = document[optional] attachments = self.db_manager.list_attachments(document_id) @@ -175,7 +175,7 @@ def delete(self, document_id, document_record): UpdateFailure: documento não apagado da base de dados. """ document_record.update({ - 'deleted_date': str(datetime.utcnow().timestamp()), + 'is_removed': 'True', }) try: self.db_manager.update(document_id, document_record) diff --git a/persistence/tests/test_services.py b/persistence/tests/test_services.py index e17a361..77d1572 100644 --- a/persistence/tests/test_services.py +++ b/persistence/tests/test_services.py @@ -171,7 +171,7 @@ def test_delete_document(database_service): record_check ) deleted = database_service.read(article_record['document_id']) - assert 'deleted_date' in deleted.keys() + assert deleted['is_removed'] == 'True' @patch.object(ChangesService, 'register_change')