fixing test_basic
This commit is contained in:
parent
1e32b74b8f
commit
bb3145f3d8
|
@ -13,6 +13,7 @@ from ereuse_devicehub.resources.action.models import ToErased
|
||||||
from ereuse_devicehub.resources.documents.models import Document
|
from ereuse_devicehub.resources.documents.models import Document
|
||||||
from ereuse_devicehub.resources.device.models import DataStorage
|
from ereuse_devicehub.resources.device.models import DataStorage
|
||||||
from ereuse_devicehub.resources.documents.schemas import Document as sh_document
|
from ereuse_devicehub.resources.documents.schemas import Document as sh_document
|
||||||
|
from ereuse_devicehub.resources.hash_reports import ReportHash
|
||||||
|
|
||||||
|
|
||||||
class ErasedView():
|
class ErasedView():
|
||||||
|
@ -39,6 +40,9 @@ class ErasedView():
|
||||||
doc_data['type'] = 'ToErased'
|
doc_data['type'] = 'ToErased'
|
||||||
self.document = Document(**doc_data)
|
self.document = Document(**doc_data)
|
||||||
db.session.add(self.document)
|
db.session.add(self.document)
|
||||||
|
|
||||||
|
db_hash = ReportHash(hash3=self.document.file_hash)
|
||||||
|
db.session.add(db_hash)
|
||||||
|
|
||||||
def insert_action(self, data):
|
def insert_action(self, data):
|
||||||
[data.pop(x, None) for x in ['url', 'documentId', 'filename', 'hash']]
|
[data.pop(x, None) for x in ['url', 'documentId', 'filename', 'hash']]
|
||||||
|
|
|
@ -696,6 +696,25 @@ class Computer(Device):
|
||||||
if privacy
|
if privacy
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def external_document_erasure(self):
|
||||||
|
"""Returns the external ``DataStorage`` proof of erasure.
|
||||||
|
"""
|
||||||
|
from ereuse_devicehub.resources.action.models import ToErased
|
||||||
|
urls = set()
|
||||||
|
try:
|
||||||
|
ev = self.last_action_of(ToErased)
|
||||||
|
urls.add(ev.document.url.to_text())
|
||||||
|
except LookupError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
for comp in self.components:
|
||||||
|
if isinstance(comp, DataStorage):
|
||||||
|
doc = comp.external_document_erasure
|
||||||
|
if doc:
|
||||||
|
urls.add(doc)
|
||||||
|
return urls
|
||||||
|
|
||||||
def add_mac_to_hid(self, components_snap=None):
|
def add_mac_to_hid(self, components_snap=None):
|
||||||
"""Returns the Naming.hid with the first mac of network adapter,
|
"""Returns the Naming.hid with the first mac of network adapter,
|
||||||
following an alphabetical order.
|
following an alphabetical order.
|
||||||
|
@ -879,6 +898,17 @@ class DataStorage(JoinedComponentTableMixin, Component):
|
||||||
v += ' – {} GB'.format(self.size // 1000 if self.size else '?')
|
v += ' – {} GB'.format(self.size // 1000 if self.size else '?')
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
@property
|
||||||
|
def external_document_erasure(self):
|
||||||
|
"""Returns the external ``DataStorage`` proof of erasure.
|
||||||
|
"""
|
||||||
|
from ereuse_devicehub.resources.action.models import ToErased
|
||||||
|
try:
|
||||||
|
ev = self.last_action_of(ToErased)
|
||||||
|
return ev.document.url.to_text()
|
||||||
|
except LookupError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class HardDrive(DataStorage):
|
class HardDrive(DataStorage):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -90,6 +90,7 @@ class DocumentView(DeviceView):
|
||||||
res = flask.make_response(template)
|
res = flask.make_response(template)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def erasure(query: db.Query):
|
def erasure(query: db.Query):
|
||||||
def erasures():
|
def erasures():
|
||||||
|
@ -114,6 +115,34 @@ class DocumentView(DeviceView):
|
||||||
}
|
}
|
||||||
return flask.render_template('documents/erasure.html', **params)
|
return flask.render_template('documents/erasure.html', **params)
|
||||||
|
|
||||||
|
class ExternalErasureDocumentView(DeviceView):
|
||||||
|
@cache(datetime.timedelta(minutes=1))
|
||||||
|
def find(self, args: dict):
|
||||||
|
query = (x for x in self.query(args) if x.owner_id == g.user.id)
|
||||||
|
return self.generate_post_csv(query)
|
||||||
|
|
||||||
|
def generate_post_csv(self, query):
|
||||||
|
"""Get device query and put information in csv format."""
|
||||||
|
data = StringIO()
|
||||||
|
cw = csv.writer(data, delimiter=';', lineterminator="\n", quotechar='"')
|
||||||
|
cw.writerow(['Urls'])
|
||||||
|
for device in query:
|
||||||
|
if isinstance(device, devs.Computer):
|
||||||
|
urls = device.external_document_erasure
|
||||||
|
if urls:
|
||||||
|
cw.writerow(urls)
|
||||||
|
elif isinstance(device, devs.DataStorage):
|
||||||
|
url = device.external_document_erasure
|
||||||
|
if url:
|
||||||
|
cw.writerow(set(url))
|
||||||
|
|
||||||
|
bfile = data.getvalue().encode('utf-8')
|
||||||
|
output = make_response(bfile)
|
||||||
|
insert_hash(bfile)
|
||||||
|
output.headers['Content-Disposition'] = 'attachment; filename=export_urls_external_proof.csv'
|
||||||
|
output.headers['Content-type'] = 'text/csv'
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
class DevicesDocumentView(DeviceView):
|
class DevicesDocumentView(DeviceView):
|
||||||
@cache(datetime.timedelta(minutes=1))
|
@cache(datetime.timedelta(minutes=1))
|
||||||
|
@ -291,7 +320,6 @@ class InternalStatsView(DeviceView):
|
||||||
evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate')))
|
evs.Action.type.in_(('Snapshot', 'Live', 'Allocate', 'Deallocate')))
|
||||||
return self.generate_post_csv(query)
|
return self.generate_post_csv(query)
|
||||||
|
|
||||||
|
|
||||||
def generate_post_csv(self, query):
|
def generate_post_csv(self, query):
|
||||||
d = {}
|
d = {}
|
||||||
for ac in query:
|
for ac in query:
|
||||||
|
@ -417,6 +445,12 @@ class DocumentDef(Resource):
|
||||||
self.add_url_rule('/internalstats/', defaults=d, view_func=internalstats_view,
|
self.add_url_rule('/internalstats/', defaults=d, view_func=internalstats_view,
|
||||||
methods=get)
|
methods=get)
|
||||||
|
|
||||||
|
externalErasureDocument_view = ExternalErasureDocumentView.as_view(
|
||||||
|
'ExternalErasureDocumentView', definition=self, auth=app.auth)
|
||||||
|
externalErasureDocument_view = app.auth.requires_auth(externalErasureDocument_view)
|
||||||
|
self.add_url_rule('/externalErasureDocuments/', defaults=d,
|
||||||
|
view_func=externalErasureDocument_view, methods=get)
|
||||||
|
|
||||||
actions_view = ActionsDocumentView.as_view('ActionsDocumentView',
|
actions_view = ActionsDocumentView.as_view('ActionsDocumentView',
|
||||||
definition=self,
|
definition=self,
|
||||||
auth=app.auth)
|
auth=app.auth)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import copy
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
from io import BytesIO
|
||||||
from dateutil.tz import tzutc
|
from dateutil.tz import tzutc
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import Tuple, Type
|
from typing import Tuple, Type
|
||||||
|
@ -2412,10 +2413,13 @@ def test_trade_case14(user: UserClient, user2: UserClient):
|
||||||
|
|
||||||
@pytest.mark.mvp
|
@pytest.mark.mvp
|
||||||
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
||||||
def test_action_web_erase(user: UserClient):
|
def test_action_web_erase(user: UserClient, client: Client):
|
||||||
# import pdb; pdb.set_trace()
|
import hashlib
|
||||||
|
from ereuse_devicehub.resources.documents import documents
|
||||||
|
bfile = BytesIO(b'abc')
|
||||||
|
hash3 = hashlib.sha3_256(bfile.read()).hexdigest()
|
||||||
snap, _ = user.post(file('acer.happy.battery.snapshot'), res=models.Snapshot)
|
snap, _ = user.post(file('acer.happy.battery.snapshot'), res=models.Snapshot)
|
||||||
request = {'type': 'ToErased', 'devices': [snap['device']['id']], 'name': 'borrado universal', 'severity': 'Info', 'description': 'nada que describir', 'url': 'http://www.google.com/', 'documentId': '33', 'endTime': '2021-07-07T22:00:00.000Z', 'filename': 'Certificado de borrado1.pdf', 'hash': 'fedbcbd057d25df9915ca9758b7537794148b896b66b3bbc972fe966dcced34b'}
|
request = {'type': 'ToErased', 'devices': [snap['device']['id']], 'name': 'borrado universal', 'severity': 'Info', 'description': 'nada que describir', 'url': 'http://www.google.com/', 'documentId': '33', 'endTime': '2021-07-07T22:00:00.000Z', 'filename': 'Certificado de borrado1.pdf', 'hash': hash3}
|
||||||
|
|
||||||
user.post(res=models.Action, data=request)
|
user.post(res=models.Action, data=request)
|
||||||
action = models.ToErased.query.one()
|
action = models.ToErased.query.one()
|
||||||
|
@ -2423,3 +2427,14 @@ def test_action_web_erase(user: UserClient):
|
||||||
assert action in dev.actions
|
assert action in dev.actions
|
||||||
|
|
||||||
assert action.document.file_hash == request['hash']
|
assert action.document.file_hash == request['hash']
|
||||||
|
|
||||||
|
bfile = BytesIO(b'abc')
|
||||||
|
response, _ = client.post(res=documents.DocumentDef.t,
|
||||||
|
item='stamps/',
|
||||||
|
content_type='multipart/form-data',
|
||||||
|
accept='text/html',
|
||||||
|
data={'docUpload': [(bfile, 'example.csv')]},
|
||||||
|
status=200)
|
||||||
|
assert "alert alert-info" in response
|
||||||
|
assert "100% coincidence." in response
|
||||||
|
assert not "alert alert-danger" in response
|
||||||
|
|
|
@ -40,6 +40,7 @@ def test_api_docs(client: Client):
|
||||||
'/documents/erasures/',
|
'/documents/erasures/',
|
||||||
'/documents/devices/',
|
'/documents/devices/',
|
||||||
'/documents/stamps/',
|
'/documents/stamps/',
|
||||||
|
'/documents/externalErasureDocuments/',
|
||||||
'/documents/wbconf/{wbtype}',
|
'/documents/wbconf/{wbtype}',
|
||||||
'/documents/internalstats/',
|
'/documents/internalstats/',
|
||||||
'/documents/stock/',
|
'/documents/stock/',
|
||||||
|
|
Reference in New Issue