2022-04-19 16:39:05 +00:00
|
|
|
import csv
|
|
|
|
import json
|
|
|
|
from io import BytesIO
|
|
|
|
from pathlib import Path
|
|
|
|
|
2022-03-15 18:57:54 +00:00
|
|
|
import pytest
|
2022-03-15 10:17:05 +00:00
|
|
|
from flask.testing import FlaskClient
|
2022-03-15 18:57:54 +00:00
|
|
|
from flask_wtf.csrf import generate_csrf
|
2022-03-15 10:17:05 +00:00
|
|
|
|
2022-03-17 10:50:57 +00:00
|
|
|
from ereuse_devicehub.client import UserClient, UserClientFlask
|
2022-03-15 10:17:05 +00:00
|
|
|
from ereuse_devicehub.devicehub import Devicehub
|
2022-04-19 16:39:05 +00:00
|
|
|
from ereuse_devicehub.resources.action.models import Snapshot
|
|
|
|
from ereuse_devicehub.resources.lot.models import Lot
|
2022-03-15 18:57:54 +00:00
|
|
|
from tests import conftest
|
2022-03-15 10:17:05 +00:00
|
|
|
|
|
|
|
|
2022-03-15 18:57:54 +00:00
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
2022-03-15 10:17:05 +00:00
|
|
|
def test_login(user: UserClient, app: Devicehub):
|
|
|
|
"""Checks a simple login"""
|
|
|
|
|
2022-03-15 18:57:54 +00:00
|
|
|
client = FlaskClient(app, use_cookies=True)
|
|
|
|
|
2022-03-15 10:17:05 +00:00
|
|
|
body, status, headers = client.get('/login/')
|
|
|
|
body = next(body).decode("utf-8")
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Login to Your Account" in body
|
|
|
|
|
2022-03-15 18:57:54 +00:00
|
|
|
data = {
|
|
|
|
'email': user.email,
|
|
|
|
'password': 'foo',
|
|
|
|
'remember': False,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
body, status, headers = client.post('/login/', data=data, follow_redirects=True)
|
2022-03-15 10:17:05 +00:00
|
|
|
|
|
|
|
body = next(body).decode("utf-8")
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Login to Your Account" not in body
|
2022-03-15 18:57:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
2022-03-17 10:50:57 +00:00
|
|
|
def test_inventory(user3: UserClientFlask):
|
|
|
|
body, status = user3.get('/inventory/device/')
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Unassgined" in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_add_lot(user3: UserClientFlask):
|
|
|
|
body, status = user3.get('/inventory/lot/add/')
|
|
|
|
|
2022-04-19 16:39:05 +00:00
|
|
|
lot_name = "lot1"
|
2022-03-17 10:50:57 +00:00
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Add a new lot" in body
|
2022-04-19 16:39:05 +00:00
|
|
|
assert lot_name not in body
|
2022-03-17 10:50:57 +00:00
|
|
|
|
2022-03-15 18:57:54 +00:00
|
|
|
data = {
|
2022-04-19 16:39:05 +00:00
|
|
|
'name': lot_name,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
body, status = user3.post('/inventory/lot/add/', data=data)
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert lot_name in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_del_lot(user3: UserClientFlask):
|
|
|
|
body, status = user3.get('/inventory/lot/add/')
|
|
|
|
|
|
|
|
lot_name = "lot1"
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Add a new lot" in body
|
|
|
|
assert lot_name not in body
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'name': lot_name,
|
2022-03-15 18:57:54 +00:00
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
2022-03-17 10:50:57 +00:00
|
|
|
body, status = user3.post('/inventory/lot/add/', data=data)
|
2022-03-15 18:57:54 +00:00
|
|
|
|
|
|
|
assert status == '200 OK'
|
2022-04-19 16:39:05 +00:00
|
|
|
assert lot_name in body
|
|
|
|
|
|
|
|
lot = Lot.query.filter_by(name=lot_name).one()
|
|
|
|
uri = '/inventory/lot/{id}/del/'.format(id=lot.id)
|
|
|
|
body, status = user3.get(uri)
|
|
|
|
assert lot_name not in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_update_lot(user3: UserClientFlask):
|
|
|
|
user3.get('/inventory/lot/add/')
|
|
|
|
|
|
|
|
# Add lot
|
|
|
|
# import pdb; pdb.set_trace()
|
|
|
|
data = {
|
|
|
|
'name': "lot1",
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
user3.post('/inventory/lot/add/', data=data)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'name': "lot2",
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
|
|
|
|
lot = Lot.query.one()
|
|
|
|
uri = '/inventory/lot/{uuid}/'.format(uuid=lot.id)
|
|
|
|
body, status = user3.post(uri, data=data)
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "lot2" in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_upload_snapshot(user3: UserClientFlask):
|
|
|
|
uri = '/inventory/upload-snapshot/'
|
|
|
|
file_name = 'real-eee-1001pxd.snapshot.12.json'
|
|
|
|
body, status = user3.get(uri)
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Select a Snapshot file" in body
|
|
|
|
|
|
|
|
snapshot = conftest.yaml2json(file_name.split(".json")[0])
|
|
|
|
b_snapshot = bytes(json.dumps(snapshot), 'utf-8')
|
|
|
|
file_snap = (BytesIO(b_snapshot), file_name)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'snapshot': file_snap,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
body, status = user3.post(uri, data=data, content_type="multipart/form-data")
|
|
|
|
|
|
|
|
txt = f"{file_name}: Ok"
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert txt in body
|
|
|
|
db_snapthot = Snapshot.query.one()
|
|
|
|
dev = db_snapthot.device
|
|
|
|
assert str(db_snapthot.uuid) == snapshot['uuid']
|
|
|
|
assert dev.type == 'Laptop'
|
|
|
|
assert dev.serial_number == 'b8oaas048285'
|
|
|
|
assert len(dev.actions) == 12
|
|
|
|
assert len(dev.components) == 9
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_inventory_with_device(user3: UserClientFlask):
|
|
|
|
uri = '/inventory/upload-snapshot/'
|
|
|
|
file_name = 'real-eee-1001pxd.snapshot.12.json'
|
|
|
|
snapshot = conftest.yaml2json(file_name.split(".json")[0])
|
|
|
|
b_snapshot = bytes(json.dumps(snapshot), 'utf-8')
|
|
|
|
file_snap = (BytesIO(b_snapshot), file_name)
|
|
|
|
user3.get(uri)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'snapshot': file_snap,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
|
|
|
|
|
|
|
body, status = user3.get('/inventory/device/')
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Unassgined" in body
|
|
|
|
db_snapthot = Snapshot.query.one()
|
|
|
|
assert db_snapthot.device.devicehub_id in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_inventory_filter(user3: UserClientFlask):
|
|
|
|
uri = '/inventory/upload-snapshot/'
|
|
|
|
file_name = 'real-eee-1001pxd.snapshot.12.json'
|
|
|
|
snapshot = conftest.yaml2json(file_name.split(".json")[0])
|
|
|
|
b_snapshot = bytes(json.dumps(snapshot), 'utf-8')
|
|
|
|
file_snap = (BytesIO(b_snapshot), file_name)
|
|
|
|
user3.get(uri)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'snapshot': file_snap,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
|
|
|
|
|
|
|
csrf = generate_csrf()
|
|
|
|
body, status = user3.get(f'/inventory/device/?filter=Laptop&csrf_token={csrf}')
|
|
|
|
|
|
|
|
assert status == '200 OK'
|
|
|
|
assert "Unassgined" in body
|
|
|
|
db_snapthot = Snapshot.query.one()
|
|
|
|
assert db_snapthot.device.devicehub_id in body
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mvp
|
|
|
|
@pytest.mark.usefixtures(conftest.app_context.__name__)
|
|
|
|
def test_export_devices(user3: UserClientFlask):
|
|
|
|
uri = '/inventory/upload-snapshot/'
|
|
|
|
file_name = 'real-eee-1001pxd.snapshot.12.json'
|
|
|
|
snapshot = conftest.yaml2json(file_name.split(".json")[0])
|
|
|
|
b_snapshot = bytes(json.dumps(snapshot), 'utf-8')
|
|
|
|
file_snap = (BytesIO(b_snapshot), file_name)
|
|
|
|
user3.get(uri)
|
|
|
|
|
|
|
|
data = {
|
|
|
|
'snapshot': file_snap,
|
|
|
|
'csrf_token': generate_csrf(),
|
|
|
|
}
|
|
|
|
user3.post(uri, data=data, content_type="multipart/form-data")
|
|
|
|
|
|
|
|
snap = Snapshot.query.one()
|
|
|
|
uri = "/inventory/export/devices/?ids={id}".format(id=snap.device.devicehub_id)
|
|
|
|
|
|
|
|
body, status = user3.get(uri)
|
|
|
|
assert status == '200 OK'
|
|
|
|
|
|
|
|
export_csv = [line.split(";") for line in body.split("\n")]
|
|
|
|
|
|
|
|
with Path(__file__).parent.joinpath('files').joinpath(
|
|
|
|
'export_devices.csv'
|
|
|
|
).open() as csv_file:
|
|
|
|
obj_csv = csv.reader(csv_file, delimiter=';', quotechar='"')
|
|
|
|
fixture_csv = list(obj_csv)
|
|
|
|
|
|
|
|
assert fixture_csv[0] == export_csv[0], 'Headers are not equal'
|
|
|
|
assert (
|
|
|
|
fixture_csv[1][:19] == export_csv[1][:19]
|
|
|
|
), 'Computer information are not equal'
|
|
|
|
assert fixture_csv[1][20] == export_csv[1][20], 'Computer information are not equal'
|
|
|
|
assert (
|
|
|
|
fixture_csv[1][22:82] == export_csv[1][22:82]
|
|
|
|
), 'Computer information are not equal'
|
|
|
|
assert fixture_csv[1][83] == export_csv[1][83], 'Computer information are not equal'
|
|
|
|
assert (
|
|
|
|
fixture_csv[1][86:] == export_csv[1][86:]
|
|
|
|
), 'Computer information are not equal'
|