mirror of
https://github.com/Doctorado-ML/beflask.git
synced 2025-08-15 23:25:51 +00:00
continue tests
This commit is contained in:
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -4,8 +4,9 @@
|
|||||||
},
|
},
|
||||||
"python.formatting.provider": "none",
|
"python.formatting.provider": "none",
|
||||||
"python.testing.pytestArgs": [
|
"python.testing.pytestArgs": [
|
||||||
"tests"
|
"tests",
|
||||||
|
"-s"
|
||||||
],
|
],
|
||||||
"python.testing.unittestEnabled": false,
|
"python.testing.unittestEnabled": false,
|
||||||
"python.testing.pytestEnabled": true
|
"python.testing.pytestEnabled": true,
|
||||||
}
|
}
|
51
Makefile
Normal file
51
Makefile
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
SHELL := /bin/bash
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
.PHONY: coverage deps help lint push test doc build
|
||||||
|
|
||||||
|
deps: ## Install dependencies
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
run: ## Install dependencies
|
||||||
|
python run.py
|
||||||
|
|
||||||
|
devdeps: ## Install development dependencies
|
||||||
|
pip install black pip-audit flake8 coverage
|
||||||
|
|
||||||
|
lint: ## Lint and static-check
|
||||||
|
black beflask
|
||||||
|
flake8 beflask
|
||||||
|
|
||||||
|
push: ## Push code with tags
|
||||||
|
git push && git push --tags
|
||||||
|
|
||||||
|
test: ## Run tests
|
||||||
|
pytest
|
||||||
|
|
||||||
|
build: ## Build package
|
||||||
|
rm -fr dist/*
|
||||||
|
rm -fr build/*
|
||||||
|
python setup.py sdist bdist_wheel
|
||||||
|
|
||||||
|
audit: ## Audit pip
|
||||||
|
pip-audit
|
||||||
|
|
||||||
|
version:
|
||||||
|
@echo "Current Python version .....: $(shell python --version)"
|
||||||
|
@echo "Current Benchmark version ..: $(shell python -c "from benchmark import _version; print(_version.__version__)")"
|
||||||
|
|
||||||
|
help: ## Show help message
|
||||||
|
@IFS=$$'\n' ; \
|
||||||
|
help_lines=(`fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##/:/'`); \
|
||||||
|
printf "%s\n\n" "Usage: make [task]"; \
|
||||||
|
printf "%-20s %s\n" "task" "help" ; \
|
||||||
|
printf "%-20s %s\n" "------" "----" ; \
|
||||||
|
for help_line in $${help_lines[@]}; do \
|
||||||
|
IFS=$$':' ; \
|
||||||
|
help_split=($$help_line) ; \
|
||||||
|
help_command=`echo $${help_split[0]} | sed -e 's/^ *//' -e 's/ *$$//'` ; \
|
||||||
|
help_info=`echo $${help_split[2]} | sed -e 's/^ *//' -e 's/ *$$//'` ; \
|
||||||
|
printf '\033[36m'; \
|
||||||
|
printf "%-20s %s" $$help_command ; \
|
||||||
|
printf '\033[0m'; \
|
||||||
|
printf "%s\n" $$help_info; \
|
||||||
|
done
|
@@ -4,7 +4,6 @@ from wtforms import (
|
|||||||
PasswordField,
|
PasswordField,
|
||||||
BooleanField,
|
BooleanField,
|
||||||
SubmitField,
|
SubmitField,
|
||||||
SelectField,
|
|
||||||
)
|
)
|
||||||
from wtforms.validators import (
|
from wtforms.validators import (
|
||||||
DataRequired,
|
DataRequired,
|
||||||
|
@@ -3,7 +3,7 @@ from wtforms import SubmitField, SelectField, TextAreaField
|
|||||||
from benchmark.Arguments import ALL_METRICS
|
from benchmark.Arguments import ALL_METRICS
|
||||||
|
|
||||||
|
|
||||||
##### NOT USED #####
|
# ----- NOT USED ----- #
|
||||||
class RankingForm(FlaskForm):
|
class RankingForm(FlaskForm):
|
||||||
score = SelectField("Score", choices=ALL_METRICS)
|
score = SelectField("Score", choices=ALL_METRICS)
|
||||||
output = TextAreaField("Output")
|
output = TextAreaField("Output")
|
||||||
|
@@ -105,4 +105,6 @@ def login():
|
|||||||
def logout():
|
def logout():
|
||||||
if current_user.is_authenticated:
|
if current_user.is_authenticated:
|
||||||
logout_user()
|
logout_user()
|
||||||
|
else:
|
||||||
|
flash("You are not logged in.", "danger")
|
||||||
return redirect(url_for(current_app.config["INDEX"]))
|
return redirect(url_for(current_app.config["INDEX"]))
|
||||||
|
@@ -18,9 +18,6 @@ class User(UserMixin, db.Model):
|
|||||||
date_created = db.Column(db.DateTime, default=db.func.now())
|
date_created = db.Column(db.DateTime, default=db.func.now())
|
||||||
last_login = db.Column(db.DateTime, default=db.func.now())
|
last_login = db.Column(db.DateTime, default=db.func.now())
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<User {} {}>".format(self.username, self.email)
|
|
||||||
|
|
||||||
def set_password(self, password):
|
def set_password(self, password):
|
||||||
self.password_hash = generate_password_hash(password)
|
self.password_hash = generate_password_hash(password)
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
from beflask.models import Benchmark, db, User
|
from beflask.models import Benchmark, db, User
|
||||||
from beflask import app
|
from beflask import app
|
||||||
|
|
||||||
app = app.create_app()
|
_, app = app.create_app()
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
db.drop_all()
|
db.drop_all()
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
from beflask.models import Benchmark, db, User
|
from beflask.models import Benchmark, db, User
|
||||||
from beflask import app
|
from beflask import app
|
||||||
|
|
||||||
app = app.create_app()
|
_, app = app.create_app()
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
db.drop_all()
|
db.drop_all()
|
||||||
|
@@ -47,6 +47,7 @@ branch = true
|
|||||||
source = ["beflask"]
|
source = ["beflask"]
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
|
addopts = "--cov --cov-report html --cov-report term-missing" #--cov-fail-under 95 "
|
||||||
testpaths = ["tests"]
|
testpaths = ["tests"]
|
||||||
|
|
||||||
[tool.black]
|
[tool.black]
|
||||||
|
@@ -5,20 +5,28 @@ from beflask.models import Benchmark, User, db
|
|||||||
|
|
||||||
|
|
||||||
class AuthActions(object):
|
class AuthActions(object):
|
||||||
|
guest_user = "guest"
|
||||||
|
guest_password = "patata"
|
||||||
|
|
||||||
def __init__(self, client):
|
def __init__(self, client):
|
||||||
self._client = client
|
self._client = client
|
||||||
|
|
||||||
def login(
|
def login(
|
||||||
self, username="guest", password="patata", follow_redirects=False
|
self,
|
||||||
|
username=None,
|
||||||
|
password=None,
|
||||||
|
follow_redirects=False,
|
||||||
):
|
):
|
||||||
|
username = username or self.guest_user
|
||||||
|
password = password or self.guest_password
|
||||||
return self._client.post(
|
return self._client.post(
|
||||||
"/login",
|
"/login",
|
||||||
data={"username": username, "password": password},
|
data={"username": username, "password": password},
|
||||||
follow_redirects=follow_redirects,
|
follow_redirects=follow_redirects,
|
||||||
)
|
)
|
||||||
|
|
||||||
def logout(self):
|
def logout(self, follow_redirects=False):
|
||||||
return self._client.get("/logout")
|
return self._client.get("/logout", follow_redirects=follow_redirects)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
@@ -27,11 +35,11 @@ def auth(client):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def app():
|
def app(admin_user, admin_password):
|
||||||
socketio, app = application.create_app("testing")
|
socketio, app = application.create_app("testing")
|
||||||
app.test_client_class = FlaskLoginClient
|
app.test_client_class = FlaskLoginClient
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
db_seed(db)
|
db_seed(db, admin_user, admin_password)
|
||||||
return socketio, app
|
return socketio, app
|
||||||
|
|
||||||
|
|
||||||
@@ -45,13 +53,33 @@ def runner(app):
|
|||||||
return app[1].test_cli_runner()
|
return app[1].test_cli_runner()
|
||||||
|
|
||||||
|
|
||||||
def db_seed(db):
|
@pytest.fixture
|
||||||
|
def admin_user():
|
||||||
|
return "rmontanana"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def admin_password():
|
||||||
|
return "patito"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def guest_user():
|
||||||
|
return AuthActions.guest_user
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def guest_password():
|
||||||
|
return AuthActions.guest_password
|
||||||
|
|
||||||
|
|
||||||
|
def db_seed(db, admin_user, admin_password):
|
||||||
db.drop_all()
|
db.drop_all()
|
||||||
db.create_all()
|
db.create_all()
|
||||||
b = Benchmark(
|
b = Benchmark(
|
||||||
name="discretizbench",
|
name="discretizbench",
|
||||||
folder="/Users/rmontanana/Code/discretizbench",
|
folder="/Users/rmontanana/Code/discretizbench",
|
||||||
description="Experiments with local discretization and Bayesian "
|
description="Experiments with local discretization and Bayesian"
|
||||||
"classifiers",
|
"classifiers",
|
||||||
)
|
)
|
||||||
db.session.add(b)
|
db.session.add(b)
|
||||||
@@ -68,19 +96,19 @@ def db_seed(db):
|
|||||||
)
|
)
|
||||||
db.session.add(b)
|
db.session.add(b)
|
||||||
u = User(
|
u = User(
|
||||||
username="rmontanana",
|
username=admin_user,
|
||||||
email="rmontanana@gmail.com",
|
email="rmontanana@gmail.com",
|
||||||
admin=True,
|
admin=True,
|
||||||
benchmark_id=1,
|
benchmark_id=1,
|
||||||
)
|
)
|
||||||
u.set_password("patito")
|
u.set_password(admin_password)
|
||||||
u1 = User(
|
u1 = User(
|
||||||
username="guest",
|
username=AuthActions.guest_user,
|
||||||
email="guest@example.com",
|
email="guest@example.com",
|
||||||
admin=False,
|
admin=False,
|
||||||
benchmark_id=1,
|
benchmark_id=1,
|
||||||
)
|
)
|
||||||
u1.set_password("patata")
|
u1.set_password(AuthActions.guest_password)
|
||||||
db.session.add(b)
|
db.session.add(b)
|
||||||
db.session.add(u)
|
db.session.add(u)
|
||||||
db.session.add(u1)
|
db.session.add(u1)
|
||||||
|
@@ -1,35 +1,78 @@
|
|||||||
import pytest
|
from flask import session, g, url_for
|
||||||
from urllib.parse import urlparse
|
|
||||||
from flask import session, g
|
|
||||||
|
|
||||||
|
|
||||||
def test_login(client, auth):
|
def test_login(app, client, auth, admin_user, admin_password):
|
||||||
assert client.get("/login").status_code == 200
|
with app[1].test_request_context():
|
||||||
|
url_login = url_for("main.login")
|
||||||
|
url_index = url_for("main.index")
|
||||||
|
|
||||||
|
assert client.get(url_login).status_code == 200
|
||||||
response = auth.login()
|
response = auth.login()
|
||||||
assert response.headers["Location"] == "/index"
|
assert response.headers["Location"] == url_index
|
||||||
auth.logout()
|
auth.logout()
|
||||||
|
|
||||||
response = auth.login(username="rmontanana", password="patito")
|
response = auth.login(username=admin_user, password=admin_password)
|
||||||
assert response.headers["Location"] == "/index"
|
assert response.headers["Location"] == url_index
|
||||||
|
|
||||||
with client:
|
with client:
|
||||||
client.get("/index")
|
client.get(url_index)
|
||||||
assert session["_user_id"] == "1"
|
assert session["_user_id"] == "1"
|
||||||
assert g._login_user.username == "rmontanana"
|
assert g._login_user.username == admin_user
|
||||||
|
# Check if an already logged in user is redirected to index
|
||||||
|
assert client.get(url_login).status_code == 302
|
||||||
|
response = client.get(url_login)
|
||||||
|
assert response.status_code == 302
|
||||||
|
assert response.headers["Location"] == url_index
|
||||||
auth.logout()
|
auth.logout()
|
||||||
|
|
||||||
|
|
||||||
def test_login_invalid(client, auth):
|
def test_login_invalid(auth, admin_user):
|
||||||
response = auth.login(
|
response = auth.login(
|
||||||
username="rmontanana", password="patato", follow_redirects=True
|
username=admin_user, password="wrong_password", follow_redirects=True
|
||||||
)
|
)
|
||||||
assert b"Invalid username or password" in response.data
|
assert b"Invalid username or password" in response.data
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
def test_logout(client, auth):
|
def test_access_page_not_logged(client, app, auth, guest_user, guest_password):
|
||||||
auth.login()
|
with app[1].test_request_context():
|
||||||
|
url_login = url_for("main.login")
|
||||||
|
url_config = url_for("main.config")
|
||||||
|
# Check if a not logged in user is redirected to login with next param
|
||||||
|
response = client.get(url_config)
|
||||||
|
header_login = f"{url_login}?next=%2Fconfig"
|
||||||
|
assert response.headers["Location"] == header_login
|
||||||
|
assert response.status_code == 302
|
||||||
|
# Check if a not logged in user is redirected to login
|
||||||
|
response = client.get("/config", follow_redirects=True)
|
||||||
|
assert b"Please log in to access this page." in response.data
|
||||||
|
assert response.status_code == 200
|
||||||
|
with client:
|
||||||
|
data = {"username": guest_user, "password": guest_password}
|
||||||
|
response = client.post(header_login, data=data, follow_redirects=True)
|
||||||
|
assert response.status_code == 200
|
||||||
|
responses = {
|
||||||
|
"score": "Deafult score if none is provided",
|
||||||
|
"platform": "Name of the platform running benchmarks",
|
||||||
|
"model": "Default model used if none is provided",
|
||||||
|
}
|
||||||
|
for key, value in responses.items():
|
||||||
|
assert bytes(key, "utf-8") in response.data
|
||||||
|
assert bytes(value, "utf-8") in response.data
|
||||||
|
|
||||||
|
|
||||||
|
def test_logout_logged(client, auth):
|
||||||
|
response = auth.login()
|
||||||
with client:
|
with client:
|
||||||
auth.logout()
|
auth.logout()
|
||||||
assert "user_id" not in session
|
assert "user_id" not in session
|
||||||
|
assert response.headers["Location"] == url_for("main.index")
|
||||||
|
|
||||||
|
|
||||||
|
def test_logout_not_logged(client, auth):
|
||||||
|
with client:
|
||||||
|
response = auth.logout()
|
||||||
|
assert response.status_code == 302
|
||||||
|
assert "user_id" not in session
|
||||||
|
assert response.headers["Location"] == url_for("main.index")
|
||||||
|
response = auth.logout(follow_redirects=True)
|
||||||
|
assert b"You are not logged in." in response.data
|
||||||
|
@@ -1,12 +1,104 @@
|
|||||||
|
from flask import url_for, g
|
||||||
from beflask import app
|
from beflask import app
|
||||||
|
|
||||||
|
|
||||||
def test_config():
|
# def test_config_init():
|
||||||
assert not app.create_app()[1].testing
|
# assert not app.create_app()[1].testing
|
||||||
assert app.create_app("testing")[1].testing
|
# assert app.create_app("testing")[1].testing
|
||||||
|
|
||||||
|
|
||||||
def test_index(client):
|
def test_index(client):
|
||||||
response = client.get("/")
|
response = client.get("/")
|
||||||
# check image is in the response
|
# check image is in the response
|
||||||
assert b"img/robert-lukeman-_RBcxo9AU-U-unsplash.jpg" in response.data
|
assert b"img/robert-lukeman-_RBcxo9AU-U-unsplash.jpg" in response.data
|
||||||
|
|
||||||
|
|
||||||
|
def test_index_logged(client, auth):
|
||||||
|
assert auth.login(follow_redirects=True).status_code == 200
|
||||||
|
with client:
|
||||||
|
response = client.get("/")
|
||||||
|
assert (
|
||||||
|
b"img/robert-lukeman-_RBcxo9AU-U-unsplash.jpg" not in response.data
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
b"Experiments with local discretization and Bayesian"
|
||||||
|
in response.data
|
||||||
|
)
|
||||||
|
assert b"discretizbench" in response.data
|
||||||
|
auth.logout()
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_benchmark_guest(client, auth, app):
|
||||||
|
assert auth.login(follow_redirects=True).status_code == 200
|
||||||
|
with app[1].test_request_context():
|
||||||
|
url = url_for("main.set_benchmark", benchmark_id=1)
|
||||||
|
with client:
|
||||||
|
response = client.get(url, follow_redirects=True)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert g._login_user.benchmark_id == 1
|
||||||
|
assert b"Benchmark already selected." in response.data
|
||||||
|
response = client.get("/set_benchmark/2", follow_redirects=True)
|
||||||
|
assert g._login_user.benchmark_id == 1
|
||||||
|
assert b"discretizbench" in response.data
|
||||||
|
assert b"You are not an admin." in response.data
|
||||||
|
auth.logout
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_benchmark_admin(client, auth, app, admin_user, admin_password):
|
||||||
|
assert (
|
||||||
|
auth.login(
|
||||||
|
username=admin_user, password=admin_password, follow_redirects=True
|
||||||
|
).status_code
|
||||||
|
== 200
|
||||||
|
)
|
||||||
|
with app[1].test_request_context():
|
||||||
|
url = url_for("main.set_benchmark", benchmark_id=1)
|
||||||
|
with client:
|
||||||
|
response = client.get(url, follow_redirects=True)
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert g._login_user.benchmark_id == 1
|
||||||
|
assert b"Benchmark already selected." in response.data
|
||||||
|
response = client.get("/set_benchmark/2", follow_redirects=True)
|
||||||
|
assert g._login_user.benchmark_id == 2
|
||||||
|
assert b"odtebench" in response.data
|
||||||
|
assert (
|
||||||
|
b"Experiments with STree and Ensemble classifiers"
|
||||||
|
in response.data
|
||||||
|
)
|
||||||
|
response = client.get("/set_benchmark/31", follow_redirects=True)
|
||||||
|
assert g._login_user.benchmark_id == 2
|
||||||
|
assert b"odtebench" in response.data
|
||||||
|
assert (
|
||||||
|
b"Experiments with STree and Ensemble classifiers"
|
||||||
|
in response.data
|
||||||
|
)
|
||||||
|
assert b"Benchmark not found." in response.data
|
||||||
|
auth.logout
|
||||||
|
|
||||||
|
|
||||||
|
def test_config(app, client, auth):
|
||||||
|
explanations = {
|
||||||
|
"score": "Deafult score if none is provided",
|
||||||
|
"platform": "Name of the platform running benchmarks",
|
||||||
|
"model": "Default model used if none is provided",
|
||||||
|
"stratified": "Wether or not to split data in a stratified way",
|
||||||
|
"source_data": "Type of datasets",
|
||||||
|
"discretize": "Discretize of not datasets before training",
|
||||||
|
"fit_features": "Wheter or not to include features names in fit",
|
||||||
|
"seeds": "Seeds used to train/test models",
|
||||||
|
"nodes": "Label for nodes in report",
|
||||||
|
"leaves": "Label for leaves in report",
|
||||||
|
"depth": "Label for depth in report",
|
||||||
|
"margin": "Margin to add to ZeroR classifier in binary classes "
|
||||||
|
"datasets",
|
||||||
|
"framework": "HTML Framework default used in be_flask command",
|
||||||
|
}
|
||||||
|
assert auth.login(follow_redirects=True).status_code == 200
|
||||||
|
with app[1].test_request_context():
|
||||||
|
url = url_for("main.config")
|
||||||
|
with client:
|
||||||
|
response = client.get(url)
|
||||||
|
assert response.status_code == 200
|
||||||
|
for key, value in explanations.items():
|
||||||
|
assert bytes(key, "utf-8") in response.data
|
||||||
|
assert bytes(value, "utf-8") in response.data
|
||||||
|
Reference in New Issue
Block a user