mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
change(aurweb): add parallel tests and improve aurweb.db
This change utilizes pytest-xdist to perform a multiproc test run and reworks aurweb.db's code. We no longer use a global engine, session or Session, but we now use a memo of engines and sessions as they are requested, based on the PYTEST_CURRENT_TEST environment variable, which is available during testing. Additionally, this change strips several SQLite components out of the Python code-base. SQLite is still compatible with PHP and sharness tests, but not with our FastAPI implementation. More changes: ------------ - Remove use of aurweb.db.session global in other code. - Use new aurweb.db.name() dynamic db name function in env.py. - Added 'addopts' to pytest.ini which utilizes multiprocessing. - Highly recommended to leave this be or modify `-n auto` to `-n {cpu_threads}` where cpu_threads is at least 2. Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
07aac768d6
commit
fa43f6bc3e
55 changed files with 781 additions and 884 deletions
255
aurweb/db.py
255
aurweb/db.py
|
@ -1,29 +1,34 @@
|
||||||
import functools
|
import functools
|
||||||
|
import hashlib
|
||||||
import math
|
import math
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from typing import Iterable, NewType
|
from typing import Iterable, NewType
|
||||||
|
|
||||||
from sqlalchemy import event
|
import sqlalchemy
|
||||||
from sqlalchemy.orm import Query, scoped_session
|
|
||||||
|
from sqlalchemy import create_engine, event
|
||||||
|
from sqlalchemy.engine.base import Engine
|
||||||
|
from sqlalchemy.engine.url import URL
|
||||||
|
from sqlalchemy.orm import Query, Session, SessionTransaction, scoped_session, sessionmaker
|
||||||
|
|
||||||
import aurweb.config
|
import aurweb.config
|
||||||
import aurweb.util
|
import aurweb.util
|
||||||
|
|
||||||
# See get_engine.
|
from aurweb import logging
|
||||||
engine = None
|
|
||||||
|
|
||||||
# ORM Session class.
|
logger = logging.get_logger(__name__)
|
||||||
Session = None
|
|
||||||
|
|
||||||
# Global ORM Session object.
|
DRIVERS = {
|
||||||
session = None
|
"mysql": "mysql+mysqldb"
|
||||||
|
}
|
||||||
|
|
||||||
# Global introspected object memo.
|
# Global introspected object memo.
|
||||||
introspected = dict()
|
introspected = dict()
|
||||||
|
|
||||||
# A mocked up type.
|
# Some types we don't get access to in this module.
|
||||||
Base = NewType("aurweb.models.declarative_base.Base", "Base")
|
Base = NewType("Base", "aurweb.models.declarative_base.Base")
|
||||||
|
|
||||||
|
|
||||||
def make_random_value(table: str, column: str):
|
def make_random_value(table: str, column: str):
|
||||||
|
@ -56,14 +61,85 @@ def make_random_value(table: str, column: str):
|
||||||
length = col.type.length
|
length = col.type.length
|
||||||
|
|
||||||
string = aurweb.util.make_random_string(length)
|
string = aurweb.util.make_random_string(length)
|
||||||
while session.query(table).filter(column == string).first():
|
while query(table).filter(column == string).first():
|
||||||
string = aurweb.util.make_random_string(length)
|
string = aurweb.util.make_random_string(length)
|
||||||
return string
|
return string
|
||||||
|
|
||||||
|
|
||||||
def get_session():
|
def test_name() -> str:
|
||||||
|
"""
|
||||||
|
Return the unhashed database name.
|
||||||
|
|
||||||
|
The unhashed database name is determined (lower = higher priority) by:
|
||||||
|
-------------------------------------------
|
||||||
|
1. {test_suite} portion of PYTEST_CURRENT_TEST
|
||||||
|
2. aurweb.config.get("database", "name")
|
||||||
|
|
||||||
|
During `pytest` runs, the PYTEST_CURRENT_TEST environment variable
|
||||||
|
is set to the current test in the format `{test_suite}::{test_func}`.
|
||||||
|
|
||||||
|
This allows tests to use a suite-specific database for its runs,
|
||||||
|
which decouples database state from test suites.
|
||||||
|
|
||||||
|
:return: Unhashed database name
|
||||||
|
"""
|
||||||
|
db = os.environ.get("PYTEST_CURRENT_TEST",
|
||||||
|
aurweb.config.get("database", "name"))
|
||||||
|
return db.split(":")[0]
|
||||||
|
|
||||||
|
|
||||||
|
def name() -> str:
|
||||||
|
"""
|
||||||
|
Return sanitized database name that can be used for tests or production.
|
||||||
|
|
||||||
|
If test_name() starts with "test/", the database name is SHA-1 hashed,
|
||||||
|
prefixed with 'db', and returned. Otherwise, test_name() is passed
|
||||||
|
through and not hashed at all.
|
||||||
|
|
||||||
|
:return: SHA1-hashed database name prefixed with 'db'
|
||||||
|
"""
|
||||||
|
dbname = test_name()
|
||||||
|
if not dbname.startswith("test/"):
|
||||||
|
return dbname
|
||||||
|
sha1 = hashlib.sha1(dbname.encode()).hexdigest()
|
||||||
|
return "db" + sha1
|
||||||
|
|
||||||
|
|
||||||
|
# Module-private global memo used to store SQLAlchemy sessions.
|
||||||
|
_sessions = dict()
|
||||||
|
|
||||||
|
|
||||||
|
def get_session(engine: Engine = None) -> Session:
|
||||||
""" Return aurweb.db's global session. """
|
""" Return aurweb.db's global session. """
|
||||||
return session
|
dbname = name()
|
||||||
|
|
||||||
|
global _sessions
|
||||||
|
if dbname not in _sessions:
|
||||||
|
|
||||||
|
if not engine: # pragma: no cover
|
||||||
|
engine = get_engine()
|
||||||
|
|
||||||
|
Session = scoped_session(
|
||||||
|
sessionmaker(autocommit=True, autoflush=False, bind=engine))
|
||||||
|
_sessions[dbname] = Session()
|
||||||
|
|
||||||
|
# If this is the first grab of this session, log out the
|
||||||
|
# database name used.
|
||||||
|
raw_dbname = test_name()
|
||||||
|
logger.debug(f"DBName({raw_dbname}): {dbname}")
|
||||||
|
|
||||||
|
return _sessions.get(dbname)
|
||||||
|
|
||||||
|
|
||||||
|
def pop_session(dbname: str) -> None:
|
||||||
|
"""
|
||||||
|
Pop a Session out of the private _sessions memo.
|
||||||
|
|
||||||
|
:param dbname: Database name
|
||||||
|
:raises KeyError: When `dbname` does not exist in the memo
|
||||||
|
"""
|
||||||
|
global _sessions
|
||||||
|
_sessions.pop(dbname)
|
||||||
|
|
||||||
|
|
||||||
def refresh(model: Base) -> Base:
|
def refresh(model: Base) -> Base:
|
||||||
|
@ -121,41 +197,40 @@ def add(model: Base) -> Base:
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
def begin():
|
def begin() -> SessionTransaction:
|
||||||
""" Begin an SQLAlchemy SessionTransaction. """
|
""" Begin an SQLAlchemy SessionTransaction. """
|
||||||
return get_session().begin()
|
return get_session().begin()
|
||||||
|
|
||||||
|
|
||||||
def get_sqlalchemy_url():
|
def get_sqlalchemy_url() -> URL:
|
||||||
"""
|
"""
|
||||||
Build an SQLAlchemy for use with create_engine based on the aurweb configuration.
|
Build an SQLAlchemy URL for use with create_engine.
|
||||||
"""
|
|
||||||
import sqlalchemy
|
|
||||||
|
|
||||||
constructor = sqlalchemy.engine.url.URL
|
:return: sqlalchemy.engine.url.URL
|
||||||
|
"""
|
||||||
|
constructor = URL
|
||||||
|
|
||||||
parts = sqlalchemy.__version__.split('.')
|
parts = sqlalchemy.__version__.split('.')
|
||||||
major = int(parts[0])
|
major = int(parts[0])
|
||||||
minor = int(parts[1])
|
minor = int(parts[1])
|
||||||
if major == 1 and minor >= 4: # pragma: no cover
|
if major == 1 and minor >= 4: # pragma: no cover
|
||||||
constructor = sqlalchemy.engine.url.URL.create
|
constructor = URL.create
|
||||||
|
|
||||||
aur_db_backend = aurweb.config.get('database', 'backend')
|
aur_db_backend = aurweb.config.get('database', 'backend')
|
||||||
if aur_db_backend == 'mysql':
|
if aur_db_backend == 'mysql':
|
||||||
if aurweb.config.get_with_fallback('database', 'port', fallback=None):
|
param_query = {}
|
||||||
port = aurweb.config.get('database', 'port')
|
port = aurweb.config.get_with_fallback("database", "port", None)
|
||||||
param_query = None
|
if not port:
|
||||||
else:
|
param_query["unix_socket"] = aurweb.config.get(
|
||||||
port = None
|
"database", "socket")
|
||||||
param_query = {
|
|
||||||
'unix_socket': aurweb.config.get('database', 'socket')
|
|
||||||
}
|
|
||||||
return constructor(
|
return constructor(
|
||||||
'mysql+mysqldb',
|
DRIVERS.get(aur_db_backend),
|
||||||
username=aurweb.config.get('database', 'user'),
|
username=aurweb.config.get('database', 'user'),
|
||||||
password=aurweb.config.get('database', 'password'),
|
password=aurweb.config.get_with_fallback('database', 'password',
|
||||||
|
fallback=None),
|
||||||
host=aurweb.config.get('database', 'host'),
|
host=aurweb.config.get('database', 'host'),
|
||||||
database=aurweb.config.get('database', 'name'),
|
database=name(),
|
||||||
port=port,
|
port=port,
|
||||||
query=param_query
|
query=param_query
|
||||||
)
|
)
|
||||||
|
@ -168,58 +243,83 @@ def get_sqlalchemy_url():
|
||||||
raise ValueError('unsupported database backend')
|
raise ValueError('unsupported database backend')
|
||||||
|
|
||||||
|
|
||||||
def get_engine(echo: bool = False):
|
def sqlite_regexp(regex, item) -> bool: # pragma: no cover
|
||||||
"""
|
""" Method which mimics SQL's REGEXP for SQLite. """
|
||||||
Return the global SQLAlchemy engine.
|
|
||||||
|
|
||||||
The engine is created on the first call to get_engine and then stored in the
|
|
||||||
`engine` global variable for the next calls.
|
|
||||||
"""
|
|
||||||
from sqlalchemy import create_engine
|
|
||||||
from sqlalchemy.orm import sessionmaker
|
|
||||||
|
|
||||||
global engine, session, Session
|
|
||||||
|
|
||||||
if engine is None:
|
|
||||||
connect_args = dict()
|
|
||||||
|
|
||||||
db_backend = aurweb.config.get("database", "backend")
|
|
||||||
if db_backend == "sqlite":
|
|
||||||
# check_same_thread is for a SQLite technicality
|
|
||||||
# https://fastapi.tiangolo.com/tutorial/sql-databases/#note
|
|
||||||
connect_args["check_same_thread"] = False
|
|
||||||
|
|
||||||
engine = create_engine(get_sqlalchemy_url(),
|
|
||||||
connect_args=connect_args,
|
|
||||||
echo=echo)
|
|
||||||
|
|
||||||
Session = scoped_session(
|
|
||||||
sessionmaker(autocommit=True, autoflush=False, bind=engine))
|
|
||||||
session = Session()
|
|
||||||
|
|
||||||
if db_backend == "sqlite":
|
|
||||||
# For SQLite, we need to add some custom functions as
|
|
||||||
# they are used in the reference graph method.
|
|
||||||
def regexp(regex, item):
|
|
||||||
return bool(re.search(regex, str(item)))
|
return bool(re.search(regex, str(item)))
|
||||||
|
|
||||||
|
|
||||||
|
def setup_sqlite(engine: Engine) -> None: # pragma: no cover
|
||||||
|
""" Perform setup for an SQLite engine. """
|
||||||
@event.listens_for(engine, "connect")
|
@event.listens_for(engine, "connect")
|
||||||
def do_begin(conn, record):
|
def do_begin(conn, record):
|
||||||
create_deterministic_function = functools.partial(
|
create_deterministic_function = functools.partial(
|
||||||
conn.create_function,
|
conn.create_function,
|
||||||
deterministic=True
|
deterministic=True
|
||||||
)
|
)
|
||||||
create_deterministic_function("REGEXP", 2, regexp)
|
create_deterministic_function("REGEXP", 2, sqlite_regexp)
|
||||||
|
|
||||||
return engine
|
|
||||||
|
|
||||||
|
|
||||||
def kill_engine():
|
# Module-private global memo used to store SQLAlchemy engines.
|
||||||
global engine, Session, session
|
_engines = dict()
|
||||||
if engine:
|
|
||||||
|
|
||||||
|
def get_engine(dbname: str = None, echo: bool = False) -> Engine:
|
||||||
|
"""
|
||||||
|
Return the SQLAlchemy engine for `dbname`.
|
||||||
|
|
||||||
|
The engine is created on the first call to get_engine and then stored in the
|
||||||
|
`engine` global variable for the next calls.
|
||||||
|
|
||||||
|
:param dbname: Database name (default: aurweb.db.name())
|
||||||
|
:param echo: Flag passed through to sqlalchemy.create_engine
|
||||||
|
:return: SQLAlchemy Engine instance
|
||||||
|
"""
|
||||||
|
if not dbname:
|
||||||
|
dbname = name()
|
||||||
|
|
||||||
|
global _engines
|
||||||
|
if dbname not in _engines:
|
||||||
|
db_backend = aurweb.config.get("database", "backend")
|
||||||
|
connect_args = dict()
|
||||||
|
|
||||||
|
is_sqlite = bool(db_backend == "sqlite")
|
||||||
|
if is_sqlite: # pragma: no cover
|
||||||
|
connect_args["check_same_thread"] = False
|
||||||
|
|
||||||
|
kwargs = {
|
||||||
|
"echo": echo,
|
||||||
|
"connect_args": connect_args
|
||||||
|
}
|
||||||
|
_engines[dbname] = create_engine(get_sqlalchemy_url(), **kwargs)
|
||||||
|
|
||||||
|
if is_sqlite: # pragma: no cover
|
||||||
|
setup_sqlite(_engines.get(dbname))
|
||||||
|
|
||||||
|
return _engines.get(dbname)
|
||||||
|
|
||||||
|
|
||||||
|
def pop_engine(dbname: str) -> None:
|
||||||
|
"""
|
||||||
|
Pop an Engine out of the private _engines memo.
|
||||||
|
|
||||||
|
:param dbname: Database name
|
||||||
|
:raises KeyError: When `dbname` does not exist in the memo
|
||||||
|
"""
|
||||||
|
global _engines
|
||||||
|
_engines.pop(dbname)
|
||||||
|
|
||||||
|
|
||||||
|
def kill_engine() -> None:
|
||||||
|
""" Close the current session and dispose of the engine. """
|
||||||
|
dbname = name()
|
||||||
|
|
||||||
|
session = get_session()
|
||||||
session.close()
|
session.close()
|
||||||
|
pop_session(dbname)
|
||||||
|
|
||||||
|
engine = get_engine()
|
||||||
engine.dispose()
|
engine.dispose()
|
||||||
engine = Session = session = None
|
pop_engine(dbname)
|
||||||
|
|
||||||
|
|
||||||
def connect():
|
def connect():
|
||||||
|
@ -248,7 +348,9 @@ class ConnectionExecutor:
|
||||||
def paramstyle(self):
|
def paramstyle(self):
|
||||||
return self._paramstyle
|
return self._paramstyle
|
||||||
|
|
||||||
def execute(self, query, params=()):
|
def execute(self, query, params=()): # pragma: no cover
|
||||||
|
# TODO: SQLite support has been removed in FastAPI. It remains
|
||||||
|
# here to fund its support for PHP until it is removed.
|
||||||
if self._paramstyle in ('format', 'pyformat'):
|
if self._paramstyle in ('format', 'pyformat'):
|
||||||
query = query.replace('%', '%%').replace('?', '%s')
|
query = query.replace('%', '%%').replace('?', '%s')
|
||||||
elif self._paramstyle == 'qmark':
|
elif self._paramstyle == 'qmark':
|
||||||
|
@ -278,16 +380,19 @@ class Connection:
|
||||||
if aur_db_backend == 'mysql':
|
if aur_db_backend == 'mysql':
|
||||||
import MySQLdb
|
import MySQLdb
|
||||||
aur_db_host = aurweb.config.get('database', 'host')
|
aur_db_host = aurweb.config.get('database', 'host')
|
||||||
aur_db_name = aurweb.config.get('database', 'name')
|
aur_db_name = name()
|
||||||
aur_db_user = aurweb.config.get('database', 'user')
|
aur_db_user = aurweb.config.get('database', 'user')
|
||||||
aur_db_pass = aurweb.config.get('database', 'password')
|
aur_db_pass = aurweb.config.get_with_fallback(
|
||||||
|
'database', 'password', str())
|
||||||
aur_db_socket = aurweb.config.get('database', 'socket')
|
aur_db_socket = aurweb.config.get('database', 'socket')
|
||||||
self._conn = MySQLdb.connect(host=aur_db_host,
|
self._conn = MySQLdb.connect(host=aur_db_host,
|
||||||
user=aur_db_user,
|
user=aur_db_user,
|
||||||
passwd=aur_db_pass,
|
passwd=aur_db_pass,
|
||||||
db=aur_db_name,
|
db=aur_db_name,
|
||||||
unix_socket=aur_db_socket)
|
unix_socket=aur_db_socket)
|
||||||
elif aur_db_backend == 'sqlite':
|
elif aur_db_backend == 'sqlite': # pragma: no cover
|
||||||
|
# TODO: SQLite support has been removed in FastAPI. It remains
|
||||||
|
# here to fund its support for PHP until it is removed.
|
||||||
import sqlite3
|
import sqlite3
|
||||||
aur_db_name = aurweb.config.get('database', 'name')
|
aur_db_name = aurweb.config.get('database', 'name')
|
||||||
self._conn = sqlite3.connect(aur_db_name)
|
self._conn = sqlite3.connect(aur_db_name)
|
||||||
|
|
|
@ -6,7 +6,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse
|
||||||
|
|
||||||
import aurweb.config
|
import aurweb.config
|
||||||
|
|
||||||
from aurweb import cookies
|
from aurweb import cookies, db
|
||||||
from aurweb.auth import auth_required
|
from aurweb.auth import auth_required
|
||||||
from aurweb.l10n import get_translator_for_request
|
from aurweb.l10n import get_translator_for_request
|
||||||
from aurweb.models import User
|
from aurweb.models import User
|
||||||
|
@ -45,9 +45,7 @@ async def login_post(request: Request,
|
||||||
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
|
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST,
|
||||||
detail=_("Bad Referer header."))
|
detail=_("Bad Referer header."))
|
||||||
|
|
||||||
from aurweb.db import session
|
user = db.query(User).filter(User.Username == user).first()
|
||||||
|
|
||||||
user = session.query(User).filter(User.Username == user).first()
|
|
||||||
if not user:
|
if not user:
|
||||||
return await login_template(request, next,
|
return await login_template(request, next,
|
||||||
errors=["Bad username or password."])
|
errors=["Bad username or password."])
|
||||||
|
|
|
@ -1014,8 +1014,8 @@ def pkgbase_disown_instance(request: Request, pkgbase: models.PackageBase):
|
||||||
models.PackageComaintainer.Priority.asc()
|
models.PackageComaintainer.Priority.asc()
|
||||||
).limit(1).first()
|
).limit(1).first()
|
||||||
|
|
||||||
if co:
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
|
if co:
|
||||||
pkgbase.Maintainer = co.User
|
pkgbase.Maintainer = co.User
|
||||||
db.delete(co)
|
db.delete(co)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -16,13 +16,13 @@ db_backend = aurweb.config.get("database", "backend")
|
||||||
|
|
||||||
|
|
||||||
@compiles(TINYINT, 'sqlite')
|
@compiles(TINYINT, 'sqlite')
|
||||||
def compile_tinyint_sqlite(type_, compiler, **kw):
|
def compile_tinyint_sqlite(type_, compiler, **kw): # pragma: no cover
|
||||||
"""TINYINT is not supported on SQLite. Substitute it with INTEGER."""
|
"""TINYINT is not supported on SQLite. Substitute it with INTEGER."""
|
||||||
return 'INTEGER'
|
return 'INTEGER'
|
||||||
|
|
||||||
|
|
||||||
@compiles(BIGINT, 'sqlite')
|
@compiles(BIGINT, 'sqlite')
|
||||||
def compile_bigint_sqlite(type_, compiler, **kw):
|
def compile_bigint_sqlite(type_, compiler, **kw): # pragma: no cover
|
||||||
"""
|
"""
|
||||||
For SQLite's AUTOINCREMENT to work on BIGINT columns, we need to map BIGINT
|
For SQLite's AUTOINCREMENT to work on BIGINT columns, we need to map BIGINT
|
||||||
to INTEGER. Aside from that, BIGINT is the same as INTEGER for SQLite.
|
to INTEGER. Aside from that, BIGINT is the same as INTEGER for SQLite.
|
||||||
|
|
|
@ -1,26 +1,6 @@
|
||||||
from itertools import chain
|
|
||||||
|
|
||||||
import aurweb.db
|
import aurweb.db
|
||||||
|
|
||||||
|
from aurweb import models
|
||||||
def references_graph(table):
|
|
||||||
""" Taken from Django's sqlite3/operations.py. """
|
|
||||||
query = """
|
|
||||||
WITH tables AS (
|
|
||||||
SELECT :table name
|
|
||||||
UNION
|
|
||||||
SELECT sqlite_master.name
|
|
||||||
FROM sqlite_master
|
|
||||||
JOIN tables ON (sql REGEXP :regexp_1 || tables.name || :regexp_2)
|
|
||||||
) SELECT name FROM tables;
|
|
||||||
"""
|
|
||||||
params = {
|
|
||||||
"table": table,
|
|
||||||
"regexp_1": r'(?i)\s+references\s+("|\')?',
|
|
||||||
"regexp_2": r'("|\')?\s*\(',
|
|
||||||
}
|
|
||||||
cursor = aurweb.db.get_session().execute(query, params=params)
|
|
||||||
return [row[0] for row in cursor.fetchall()]
|
|
||||||
|
|
||||||
|
|
||||||
def setup_test_db(*args):
|
def setup_test_db(*args):
|
||||||
|
@ -47,22 +27,38 @@ def setup_test_db(*args):
|
||||||
aurweb.db.get_engine()
|
aurweb.db.get_engine()
|
||||||
|
|
||||||
tables = list(args)
|
tables = list(args)
|
||||||
|
if not tables:
|
||||||
|
tables = [
|
||||||
|
models.AcceptedTerm.__tablename__,
|
||||||
|
models.ApiRateLimit.__tablename__,
|
||||||
|
models.Ban.__tablename__,
|
||||||
|
models.Group.__tablename__,
|
||||||
|
models.License.__tablename__,
|
||||||
|
models.OfficialProvider.__tablename__,
|
||||||
|
models.Package.__tablename__,
|
||||||
|
models.PackageBase.__tablename__,
|
||||||
|
models.PackageBlacklist.__tablename__,
|
||||||
|
models.PackageComaintainer.__tablename__,
|
||||||
|
models.PackageComment.__tablename__,
|
||||||
|
models.PackageDependency.__tablename__,
|
||||||
|
models.PackageGroup.__tablename__,
|
||||||
|
models.PackageKeyword.__tablename__,
|
||||||
|
models.PackageLicense.__tablename__,
|
||||||
|
models.PackageNotification.__tablename__,
|
||||||
|
models.PackageRelation.__tablename__,
|
||||||
|
models.PackageRequest.__tablename__,
|
||||||
|
models.PackageSource.__tablename__,
|
||||||
|
models.PackageVote.__tablename__,
|
||||||
|
models.Session.__tablename__,
|
||||||
|
models.SSHPubKey.__tablename__,
|
||||||
|
models.Term.__tablename__,
|
||||||
|
models.TUVote.__tablename__,
|
||||||
|
models.TUVoteInfo.__tablename__,
|
||||||
|
models.User.__tablename__,
|
||||||
|
]
|
||||||
|
|
||||||
db_backend = aurweb.config.get("database", "backend")
|
|
||||||
|
|
||||||
if db_backend != "sqlite": # pragma: no cover
|
|
||||||
aurweb.db.get_session().execute("SET FOREIGN_KEY_CHECKS = 0")
|
aurweb.db.get_session().execute("SET FOREIGN_KEY_CHECKS = 0")
|
||||||
else:
|
|
||||||
# We're using sqlite, setup tables to be deleted without violating
|
|
||||||
# foreign key constraints by graphing references.
|
|
||||||
tables = set(chain.from_iterable(
|
|
||||||
references_graph(table) for table in tables))
|
|
||||||
|
|
||||||
for table in tables:
|
for table in tables:
|
||||||
aurweb.db.get_session().execute(f"DELETE FROM {table}")
|
aurweb.db.get_session().execute(f"DELETE FROM {table}")
|
||||||
|
|
||||||
if db_backend != "sqlite": # pragma: no cover
|
|
||||||
aurweb.db.get_session().execute("SET FOREIGN_KEY_CHECKS = 1")
|
aurweb.db.get_session().execute("SET FOREIGN_KEY_CHECKS = 1")
|
||||||
|
|
||||||
# Expunge all objects from SQLAlchemy's IdentityMap.
|
|
||||||
aurweb.db.get_session().expunge_all()
|
aurweb.db.get_session().expunge_all()
|
||||||
|
|
|
@ -41,8 +41,8 @@ def run_migrations_offline():
|
||||||
script output.
|
script output.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
db_name = aurweb.config.get("database", "name")
|
dbname = aurweb.db.name()
|
||||||
logging.info(f"Performing offline migration on database '{db_name}'.")
|
logging.info(f"Performing offline migration on database '{dbname}'.")
|
||||||
context.configure(
|
context.configure(
|
||||||
url=aurweb.db.get_sqlalchemy_url(),
|
url=aurweb.db.get_sqlalchemy_url(),
|
||||||
target_metadata=target_metadata,
|
target_metadata=target_metadata,
|
||||||
|
@ -61,8 +61,8 @@ def run_migrations_online():
|
||||||
and associate a connection with the context.
|
and associate a connection with the context.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
db_name = aurweb.config.get("database", "name")
|
dbname = aurweb.db.name()
|
||||||
logging.info(f"Performing online migration on database '{db_name}'.")
|
logging.info(f"Performing online migration on database '{dbname}'.")
|
||||||
connectable = sqlalchemy.create_engine(
|
connectable = sqlalchemy.create_engine(
|
||||||
aurweb.db.get_sqlalchemy_url(),
|
aurweb.db.get_sqlalchemy_url(),
|
||||||
poolclass=sqlalchemy.pool.NullPool,
|
poolclass=sqlalchemy.pool.NullPool,
|
||||||
|
|
|
@ -8,3 +8,9 @@
|
||||||
# https://bugs.python.org/issue45097
|
# https://bugs.python.org/issue45097
|
||||||
filterwarnings =
|
filterwarnings =
|
||||||
ignore::DeprecationWarning:asyncio.base_events
|
ignore::DeprecationWarning:asyncio.base_events
|
||||||
|
|
||||||
|
# Build in coverage and pytest-xdist multiproc testing.
|
||||||
|
addopts = --cov=aurweb --cov-append --dist load --dist loadfile -n auto
|
||||||
|
|
||||||
|
# Our pytest units are located in the ./test/ directory.
|
||||||
|
testpaths = test
|
||||||
|
|
178
test/conftest.py
Normal file
178
test/conftest.py
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
"""
|
||||||
|
pytest configuration.
|
||||||
|
|
||||||
|
The conftest.py file is used to define pytest-global fixtures
|
||||||
|
or actions run before tests.
|
||||||
|
|
||||||
|
Module scoped fixtures:
|
||||||
|
----------------------
|
||||||
|
- setup_database
|
||||||
|
- db_session (depends: setup_database)
|
||||||
|
|
||||||
|
Function scoped fixtures:
|
||||||
|
------------------------
|
||||||
|
- db_test (depends: db_session)
|
||||||
|
|
||||||
|
Tests in aurweb which access the database **must** use the `db_test`
|
||||||
|
function fixture. Most database tests simply require this fixture in
|
||||||
|
an autouse=True setup fixture, or for fixtures used in DB tests example:
|
||||||
|
|
||||||
|
# In scenarios which there are no other database fixtures
|
||||||
|
# or other database fixtures dependency paths don't always
|
||||||
|
# hit `db_test`.
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def setup(db_test):
|
||||||
|
return
|
||||||
|
|
||||||
|
# In scenarios where we can embed the `db_test` fixture in
|
||||||
|
# specific fixtures that already exist.
|
||||||
|
@pytest.fixture
|
||||||
|
def user(db_test):
|
||||||
|
with db.begin():
|
||||||
|
user = db.create(User, ...)
|
||||||
|
yield user
|
||||||
|
|
||||||
|
The `db_test` fixture triggers our module-level database fixtures,
|
||||||
|
then clears the database for each test function run in that module.
|
||||||
|
It is done this way because migration has a large cost; migrating
|
||||||
|
ahead of each function takes too long when compared to this method.
|
||||||
|
"""
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from filelock import FileLock
|
||||||
|
from sqlalchemy import create_engine
|
||||||
|
from sqlalchemy.engine import URL
|
||||||
|
from sqlalchemy.engine.base import Engine
|
||||||
|
from sqlalchemy.orm import scoped_session
|
||||||
|
|
||||||
|
import aurweb.config
|
||||||
|
import aurweb.db
|
||||||
|
|
||||||
|
from aurweb import initdb, logging, testing
|
||||||
|
|
||||||
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def test_engine() -> Engine:
|
||||||
|
"""
|
||||||
|
Return a privileged SQLAlchemy engine with no database.
|
||||||
|
|
||||||
|
This method is particularly useful for providing an engine that
|
||||||
|
can be used to create and drop databases from an SQL server.
|
||||||
|
|
||||||
|
:return: SQLAlchemy Engine instance (not connected to a database)
|
||||||
|
"""
|
||||||
|
unix_socket = aurweb.config.get_with_fallback("database", "socket", None)
|
||||||
|
kwargs = {
|
||||||
|
"username": aurweb.config.get("database", "user"),
|
||||||
|
"password": aurweb.config.get_with_fallback(
|
||||||
|
"database", "password", None),
|
||||||
|
"host": aurweb.config.get("database", "host"),
|
||||||
|
"port": aurweb.config.get_with_fallback("database", "port", None),
|
||||||
|
"query": {
|
||||||
|
"unix_socket": unix_socket
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
backend = aurweb.config.get("database", "backend")
|
||||||
|
driver = aurweb.db.DRIVERS.get(backend)
|
||||||
|
return create_engine(URL.create(driver, **kwargs))
|
||||||
|
|
||||||
|
|
||||||
|
class AlembicArgs:
|
||||||
|
"""
|
||||||
|
Masquerade an ArgumentParser like structure.
|
||||||
|
|
||||||
|
This structure is needed to pass conftest-specific arguments
|
||||||
|
to initdb.run duration database creation.
|
||||||
|
"""
|
||||||
|
verbose = False
|
||||||
|
use_alembic = True
|
||||||
|
|
||||||
|
|
||||||
|
def _create_database(engine: Engine, dbname: str) -> None:
|
||||||
|
"""
|
||||||
|
Create a test database.
|
||||||
|
|
||||||
|
:param engine: Engine returned by test_engine()
|
||||||
|
:param dbname: Database name to create
|
||||||
|
"""
|
||||||
|
conn = engine.connect()
|
||||||
|
conn.execute(f"CREATE DATABASE {dbname}")
|
||||||
|
conn.close()
|
||||||
|
initdb.run(AlembicArgs)
|
||||||
|
|
||||||
|
|
||||||
|
def _drop_database(engine: Engine, dbname: str) -> None:
|
||||||
|
"""
|
||||||
|
Drop a test database.
|
||||||
|
|
||||||
|
:param engine: Engine returned by test_engine()
|
||||||
|
:param dbname: Database name to drop
|
||||||
|
"""
|
||||||
|
aurweb.schema.metadata.drop_all(bind=engine)
|
||||||
|
conn = engine.connect()
|
||||||
|
conn.execute(f"DROP DATABASE {dbname}")
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="module")
|
||||||
|
def setup_database(tmp_path_factory: pytest.fixture,
|
||||||
|
worker_id: pytest.fixture) -> None:
|
||||||
|
""" Create and drop a database for the suite this fixture is used in. """
|
||||||
|
engine = test_engine()
|
||||||
|
dbname = aurweb.db.name()
|
||||||
|
|
||||||
|
if worker_id == "master": # pragma: no cover
|
||||||
|
# If we're not running tests through multiproc pytest-xdist.
|
||||||
|
yield _create_database(engine, dbname)
|
||||||
|
_drop_database(engine, dbname)
|
||||||
|
return
|
||||||
|
|
||||||
|
root_tmp_dir = tmp_path_factory.getbasetemp().parent
|
||||||
|
fn = root_tmp_dir / dbname
|
||||||
|
|
||||||
|
with FileLock(str(fn) + ".lock"):
|
||||||
|
if fn.is_file():
|
||||||
|
# If the data file exists, skip database creation.
|
||||||
|
yield
|
||||||
|
else:
|
||||||
|
# Otherwise, create the data file and create the database.
|
||||||
|
fn.write_text("1")
|
||||||
|
yield _create_database(engine, dbname)
|
||||||
|
_drop_database(engine, dbname)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="module")
|
||||||
|
def db_session(setup_database: pytest.fixture) -> scoped_session:
|
||||||
|
"""
|
||||||
|
Yield a database session based on aurweb.db.name().
|
||||||
|
|
||||||
|
The returned session is popped out of persistence after the test is run.
|
||||||
|
"""
|
||||||
|
# After the test runs, aurweb.db.name() ends up returning the
|
||||||
|
# configured database, because PYTEST_CURRENT_TEST is removed.
|
||||||
|
dbname = aurweb.db.name()
|
||||||
|
session = aurweb.db.get_session()
|
||||||
|
yield session
|
||||||
|
|
||||||
|
# Close the session and pop it.
|
||||||
|
session.close()
|
||||||
|
aurweb.db.pop_session(dbname)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def db_test(db_session: scoped_session) -> None:
|
||||||
|
"""
|
||||||
|
Database test fixture.
|
||||||
|
|
||||||
|
This fixture should be included in any tests which access the
|
||||||
|
database. It ensures that a test database is created and
|
||||||
|
alembic migrated, takes care of dropping the database when
|
||||||
|
the module is complete, and runs setup_test_db() to clear out
|
||||||
|
tables for each test.
|
||||||
|
|
||||||
|
Tests using this fixture should access the database
|
||||||
|
session via aurweb.db.get_session().
|
||||||
|
"""
|
||||||
|
testing.setup_test_db()
|
|
@ -2,38 +2,33 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, query
|
from aurweb import db
|
||||||
from aurweb.models.accepted_term import AcceptedTerm
|
from aurweb.models.accepted_term import AcceptedTerm
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.term import Term
|
from aurweb.models.term import Term
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = term = accepted_term = None
|
user = term = accepted_term = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, term, accepted_term
|
global user, term
|
||||||
|
|
||||||
setup_test_db("Users", "AcceptedTerms", "Terms")
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
|
||||||
term = create(Term, Description="Test term", URL="https://test.term")
|
term = db.create(Term, Description="Test term",
|
||||||
|
URL="https://test.term")
|
||||||
|
|
||||||
yield term
|
yield term
|
||||||
|
|
||||||
# Eradicate any terms we created.
|
|
||||||
setup_test_db("AcceptedTerms", "Terms")
|
|
||||||
|
|
||||||
|
|
||||||
def test_accepted_term():
|
def test_accepted_term():
|
||||||
accepted_term = create(AcceptedTerm, User=user, Term=term)
|
with db.begin():
|
||||||
|
accepted_term = db.create(AcceptedTerm, User=user, Term=term)
|
||||||
|
|
||||||
# Make sure our AcceptedTerm relationships got initialized properly.
|
# Make sure our AcceptedTerm relationships got initialized properly.
|
||||||
assert accepted_term.User == user
|
assert accepted_term.User == user
|
||||||
|
@ -42,14 +37,10 @@ def test_accepted_term():
|
||||||
|
|
||||||
|
|
||||||
def test_accepted_term_null_user_raises_exception():
|
def test_accepted_term_null_user_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(AcceptedTerm, Term=term)
|
AcceptedTerm(Term=term)
|
||||||
session.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_accepted_term_null_term_raises_exception():
|
def test_accepted_term_null_term_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(AcceptedTerm, User=user)
|
AcceptedTerm(User=user)
|
||||||
session.rollback()
|
|
||||||
|
|
|
@ -1,31 +1,29 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from aurweb.db import begin, create, delete, query
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
account_type = None
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("Users")
|
return
|
||||||
|
|
||||||
global account_type
|
|
||||||
|
|
||||||
with begin():
|
|
||||||
account_type = create(AccountType, AccountType="TestUser")
|
|
||||||
|
|
||||||
yield account_type
|
|
||||||
|
|
||||||
with begin():
|
|
||||||
delete(account_type)
|
|
||||||
|
|
||||||
|
|
||||||
def test_account_type():
|
@pytest.fixture
|
||||||
|
def account_type() -> AccountType:
|
||||||
|
with db.begin():
|
||||||
|
account_type_ = db.create(AccountType, AccountType="TestUser")
|
||||||
|
|
||||||
|
yield account_type_
|
||||||
|
|
||||||
|
with db.begin():
|
||||||
|
db.delete(account_type_)
|
||||||
|
|
||||||
|
|
||||||
|
def test_account_type(account_type):
|
||||||
""" Test creating an AccountType, and reading its columns. """
|
""" Test creating an AccountType, and reading its columns. """
|
||||||
# Make sure it got created and was given an ID.
|
# Make sure it got db.created and was given an ID.
|
||||||
assert bool(account_type.ID)
|
assert bool(account_type.ID)
|
||||||
|
|
||||||
# Next, test our string functions.
|
# Next, test our string functions.
|
||||||
|
@ -34,20 +32,20 @@ def test_account_type():
|
||||||
"<AccountType(ID='%s', AccountType='TestUser')>" % (
|
"<AccountType(ID='%s', AccountType='TestUser')>" % (
|
||||||
account_type.ID)
|
account_type.ID)
|
||||||
|
|
||||||
record = query(AccountType,
|
record = db.query(AccountType,
|
||||||
AccountType.AccountType == "TestUser").first()
|
AccountType.AccountType == "TestUser").first()
|
||||||
assert account_type == record
|
assert account_type == record
|
||||||
|
|
||||||
|
|
||||||
def test_user_account_type_relationship():
|
def test_user_account_type_relationship(account_type):
|
||||||
with begin():
|
with db.begin():
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountType=account_type)
|
||||||
|
|
||||||
assert user.AccountType == account_type
|
assert user.AccountType == account_type
|
||||||
|
|
||||||
# This must be deleted here to avoid foreign key issues when
|
# This must be db.deleted here to avoid foreign key issues when
|
||||||
# deleting the temporary AccountType in the fixture.
|
# deleting the temporary AccountType in the fixture.
|
||||||
with begin():
|
with db.begin():
|
||||||
delete(user)
|
db.delete(user)
|
||||||
|
|
|
@ -20,7 +20,6 @@ from aurweb.models.session import Session
|
||||||
from aurweb.models.ssh_pub_key import SSHPubKey, get_fingerprint
|
from aurweb.models.ssh_pub_key import SSHPubKey, get_fingerprint
|
||||||
from aurweb.models.term import Term
|
from aurweb.models.term import Term
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.html import get_errors
|
from aurweb.testing.html import get_errors
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
|
@ -50,11 +49,9 @@ def make_ssh_pubkey():
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user
|
global user
|
||||||
|
|
||||||
setup_test_db("Users", "Sessions", "Bans", "Terms", "AcceptedTerms")
|
|
||||||
|
|
||||||
account_type = query(AccountType,
|
account_type = query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
|
|
||||||
|
@ -65,10 +62,6 @@ def setup():
|
||||||
|
|
||||||
yield user
|
yield user
|
||||||
|
|
||||||
# Remove term records so other tests don't get them
|
|
||||||
# and falsely redirect.
|
|
||||||
setup_test_db("Terms", "AcceptedTerms")
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def tu_user():
|
def tu_user():
|
||||||
|
|
|
@ -3,19 +3,18 @@ import pytest
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.db import create
|
|
||||||
from aurweb.models.api_rate_limit import ApiRateLimit
|
from aurweb.models.api_rate_limit import ApiRateLimit
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("ApiRateLimit")
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_api_rate_key_creation():
|
def test_api_rate_key_creation():
|
||||||
with db.begin():
|
with db.begin():
|
||||||
rate = create(ApiRateLimit, IP="127.0.0.1", Requests=10, WindowStart=1)
|
rate = db.create(ApiRateLimit, IP="127.0.0.1", Requests=10,
|
||||||
|
WindowStart=1)
|
||||||
assert rate.IP == "127.0.0.1"
|
assert rate.IP == "127.0.0.1"
|
||||||
assert rate.Requests == 10
|
assert rate.Requests == 10
|
||||||
assert rate.WindowStart == 1
|
assert rate.WindowStart == 1
|
||||||
|
@ -23,19 +22,15 @@ def test_api_rate_key_creation():
|
||||||
|
|
||||||
def test_api_rate_key_ip_default():
|
def test_api_rate_key_ip_default():
|
||||||
with db.begin():
|
with db.begin():
|
||||||
api_rate_limit = create(ApiRateLimit, Requests=10, WindowStart=1)
|
api_rate_limit = db.create(ApiRateLimit, Requests=10, WindowStart=1)
|
||||||
assert api_rate_limit.IP == str()
|
assert api_rate_limit.IP == str()
|
||||||
|
|
||||||
|
|
||||||
def test_api_rate_key_null_requests_raises_exception():
|
def test_api_rate_key_null_requests_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
ApiRateLimit(IP="127.0.0.1", WindowStart=1)
|
||||||
create(ApiRateLimit, IP="127.0.0.1", WindowStart=1)
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_api_rate_key_null_window_start_raises_exception():
|
def test_api_rate_key_null_window_start_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
ApiRateLimit(IP="127.0.0.1", Requests=1)
|
||||||
create(ApiRateLimit, IP="127.0.0.1", Requests=1)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -6,28 +6,22 @@ from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.auth import AnonymousUser, BasicAuthBackend, account_type_required, has_credential
|
from aurweb.auth import AnonymousUser, BasicAuthBackend, account_type_required, has_credential
|
||||||
from aurweb.db import create, query
|
from aurweb.models.account_type import USER, USER_ID
|
||||||
from aurweb.models.account_type import USER, USER_ID, AccountType
|
|
||||||
from aurweb.models.session import Session
|
from aurweb.models.session import Session
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
user = backend = request = None
|
user = backend = request = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, backend, request
|
global user, backend, request
|
||||||
|
|
||||||
setup_test_db("Users", "Sessions")
|
|
||||||
|
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = create(User, Username="test", Email="test@example.com",
|
user = db.create(User, Username="test", Email="test@example.com",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
|
||||||
backend = BasicAuthBackend()
|
backend = BasicAuthBackend()
|
||||||
request = Request()
|
request = Request()
|
||||||
|
@ -56,10 +50,8 @@ async def test_auth_backend_invalid_user_id():
|
||||||
# Create a new session with a fake user id.
|
# Create a new session with a fake user id.
|
||||||
now_ts = datetime.utcnow().timestamp()
|
now_ts = datetime.utcnow().timestamp()
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
Session(UsersID=666, SessionID="realSession",
|
||||||
create(Session, UsersID=666, SessionID="realSession",
|
|
||||||
LastUpdateTS=now_ts + 5)
|
LastUpdateTS=now_ts + 5)
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
|
@ -68,7 +60,7 @@ async def test_basic_auth_backend():
|
||||||
# equal the real_user.
|
# equal the real_user.
|
||||||
now_ts = datetime.utcnow().timestamp()
|
now_ts = datetime.utcnow().timestamp()
|
||||||
with db.begin():
|
with db.begin():
|
||||||
create(Session, UsersID=user.ID, SessionID="realSession",
|
db.create(Session, UsersID=user.ID, SessionID="realSession",
|
||||||
LastUpdateTS=now_ts + 5)
|
LastUpdateTS=now_ts + 5)
|
||||||
request.cookies["AURSID"] = "realSession"
|
request.cookies["AURSID"] = "realSession"
|
||||||
_, result = await backend.authenticate(request)
|
_, result = await backend.authenticate(request)
|
||||||
|
|
|
@ -13,7 +13,6 @@ from aurweb.db import begin, create, query
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.session import Session
|
from aurweb.models.session import Session
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
# Some test global constants.
|
# Some test global constants.
|
||||||
TEST_USERNAME = "test"
|
TEST_USERNAME = "test"
|
||||||
|
@ -27,11 +26,9 @@ user = client = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, client
|
global user, client
|
||||||
|
|
||||||
setup_test_db("Users", "Sessions", "Bans")
|
|
||||||
|
|
||||||
account_type = query(AccountType,
|
account_type = query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
|
|
||||||
|
|
|
@ -9,18 +9,15 @@ from sqlalchemy import exc as sa_exc
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.db import create
|
from aurweb.db import create
|
||||||
from aurweb.models.ban import Ban, is_banned
|
from aurweb.models.ban import Ban, is_banned
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
ban = request = None
|
ban = request = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global ban, request
|
global ban, request
|
||||||
|
|
||||||
setup_test_db("Bans")
|
|
||||||
|
|
||||||
ts = datetime.utcnow() + timedelta(seconds=30)
|
ts = datetime.utcnow() + timedelta(seconds=30)
|
||||||
with db.begin():
|
with db.begin():
|
||||||
ban = create(Ban, IPAddress="127.0.0.1", BanTS=ts)
|
ban = create(Ban, IPAddress="127.0.0.1", BanTS=ts)
|
||||||
|
@ -33,8 +30,6 @@ def test_ban():
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_ban():
|
def test_invalid_ban():
|
||||||
from aurweb.db import session
|
|
||||||
|
|
||||||
with pytest.raises(sa_exc.IntegrityError):
|
with pytest.raises(sa_exc.IntegrityError):
|
||||||
bad_ban = Ban(BanTS=datetime.utcnow())
|
bad_ban = Ban(BanTS=datetime.utcnow())
|
||||||
|
|
||||||
|
@ -44,7 +39,7 @@ def test_invalid_ban():
|
||||||
with warnings.catch_warnings():
|
with warnings.catch_warnings():
|
||||||
warnings.simplefilter("ignore", sa_exc.SAWarning)
|
warnings.simplefilter("ignore", sa_exc.SAWarning)
|
||||||
with db.begin():
|
with db.begin():
|
||||||
session.add(bad_ban)
|
db.add(bad_ban)
|
||||||
|
|
||||||
# Since we got a transaction failure, we need to rollback.
|
# Since we got a transaction failure, we need to rollback.
|
||||||
db.rollback()
|
db.rollback()
|
||||||
|
|
|
@ -3,14 +3,11 @@ import pytest
|
||||||
from aurweb import cache, db
|
from aurweb import cache, db
|
||||||
from aurweb.models.account_type import USER_ID
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(
|
return
|
||||||
User.__tablename__
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class StubRedis:
|
class StubRedis:
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from aurweb import captcha
|
from aurweb import captcha
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def setup(db_test):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_captcha_salts():
|
def test_captcha_salts():
|
||||||
""" Make sure we can get some captcha salts. """
|
""" Make sure we can get some captcha salts. """
|
||||||
salts = captcha.get_captcha_salts()
|
salts = captcha.get_captcha_salts()
|
||||||
|
|
110
test/test_db.py
110
test/test_db.py
|
@ -12,7 +12,6 @@ import aurweb.initdb
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
class Args:
|
class Args:
|
||||||
|
@ -96,16 +95,10 @@ def make_temp_mysql_config():
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup_db():
|
def setup(db_test):
|
||||||
if os.path.exists("/tmp/aurweb.sqlite3"):
|
if os.path.exists("/tmp/aurweb.sqlite3"):
|
||||||
os.remove("/tmp/aurweb.sqlite3")
|
os.remove("/tmp/aurweb.sqlite3")
|
||||||
|
|
||||||
# In various places in this test, we reinitialize the engine.
|
|
||||||
# Make sure we kill the previous engine before initializing
|
|
||||||
# it via setup_test_db().
|
|
||||||
aurweb.db.kill_engine()
|
|
||||||
setup_test_db()
|
|
||||||
|
|
||||||
|
|
||||||
def test_sqlalchemy_sqlite_url():
|
def test_sqlalchemy_sqlite_url():
|
||||||
tmpctx, tmp = make_temp_sqlite_config()
|
tmpctx, tmp = make_temp_sqlite_config()
|
||||||
|
@ -159,24 +152,6 @@ def test_sqlalchemy_unknown_backend():
|
||||||
def test_db_connects_without_fail():
|
def test_db_connects_without_fail():
|
||||||
""" This only tests the actual config supplied to pytest. """
|
""" This only tests the actual config supplied to pytest. """
|
||||||
db.connect()
|
db.connect()
|
||||||
assert db.engine is not None
|
|
||||||
|
|
||||||
|
|
||||||
def test_connection_class_sqlite_without_fail():
|
|
||||||
tmpctx, tmp = make_temp_sqlite_config()
|
|
||||||
with tmpctx:
|
|
||||||
with mock.patch.dict(os.environ, {"AUR_CONFIG": tmp}):
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
aurweb.db.kill_engine()
|
|
||||||
aurweb.initdb.run(Args())
|
|
||||||
|
|
||||||
conn = db.Connection()
|
|
||||||
cur = conn.execute(
|
|
||||||
"SELECT AccountType FROM AccountTypes WHERE ID = ?", (1,))
|
|
||||||
account_type = cur.fetchone()[0]
|
|
||||||
assert account_type == "User"
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
|
|
||||||
def test_connection_class_unsupported_backend():
|
def test_connection_class_unsupported_backend():
|
||||||
|
@ -200,83 +175,6 @@ def test_connection_mysql():
|
||||||
aurweb.config.rehash()
|
aurweb.config.rehash()
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("sqlite3.connect", mock.MagicMock(return_value=DBConnection()))
|
|
||||||
@mock.patch.object(sqlite3, "paramstyle", "qmark")
|
|
||||||
def test_connection_sqlite():
|
|
||||||
db.Connection()
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("sqlite3.connect", mock.MagicMock(return_value=DBConnection()))
|
|
||||||
@mock.patch.object(sqlite3, "paramstyle", "format")
|
|
||||||
def test_connection_execute_paramstyle_format():
|
|
||||||
tmpctx, tmp = make_temp_sqlite_config()
|
|
||||||
|
|
||||||
with tmpctx:
|
|
||||||
with mock.patch.dict(os.environ, {"AUR_CONFIG": tmp}):
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
aurweb.db.kill_engine()
|
|
||||||
aurweb.initdb.run(Args())
|
|
||||||
|
|
||||||
# Test SQLite route of clearing tables.
|
|
||||||
setup_test_db("Users", "Bans")
|
|
||||||
|
|
||||||
conn = db.Connection()
|
|
||||||
|
|
||||||
# First, test ? to %s format replacement.
|
|
||||||
account_types = conn\
|
|
||||||
.execute("SELECT * FROM AccountTypes WHERE AccountType = ?",
|
|
||||||
["User"]).fetchall()
|
|
||||||
assert account_types == \
|
|
||||||
["SELECT * FROM AccountTypes WHERE AccountType = %s", ["User"]]
|
|
||||||
|
|
||||||
# Test other format replacement.
|
|
||||||
account_types = conn\
|
|
||||||
.execute("SELECT * FROM AccountTypes WHERE AccountType = %",
|
|
||||||
["User"]).fetchall()
|
|
||||||
assert account_types == \
|
|
||||||
["SELECT * FROM AccountTypes WHERE AccountType = %%", ["User"]]
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("sqlite3.connect", mock.MagicMock(return_value=DBConnection()))
|
|
||||||
@mock.patch.object(sqlite3, "paramstyle", "qmark")
|
|
||||||
def test_connection_execute_paramstyle_qmark():
|
|
||||||
tmpctx, tmp = make_temp_sqlite_config()
|
|
||||||
|
|
||||||
with tmpctx:
|
|
||||||
with mock.patch.dict(os.environ, {"AUR_CONFIG": tmp}):
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
aurweb.db.kill_engine()
|
|
||||||
aurweb.initdb.run(Args())
|
|
||||||
|
|
||||||
conn = db.Connection()
|
|
||||||
# We don't modify anything when using qmark, so test equality.
|
|
||||||
account_types = conn\
|
|
||||||
.execute("SELECT * FROM AccountTypes WHERE AccountType = ?",
|
|
||||||
["User"]).fetchall()
|
|
||||||
assert account_types == \
|
|
||||||
["SELECT * FROM AccountTypes WHERE AccountType = ?", ["User"]]
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
|
|
||||||
@mock.patch("sqlite3.connect", mock.MagicMock(return_value=DBConnection()))
|
|
||||||
@mock.patch.object(sqlite3, "paramstyle", "unsupported")
|
|
||||||
def test_connection_execute_paramstyle_unsupported():
|
|
||||||
tmpctx, tmp = make_temp_sqlite_config()
|
|
||||||
with tmpctx:
|
|
||||||
with mock.patch.dict(os.environ, {"AUR_CONFIG": tmp}):
|
|
||||||
aurweb.config.rehash()
|
|
||||||
conn = db.Connection()
|
|
||||||
with pytest.raises(ValueError, match="unsupported paramstyle"):
|
|
||||||
conn.execute(
|
|
||||||
"SELECT * FROM AccountTypes WHERE AccountType = ?",
|
|
||||||
["User"]
|
|
||||||
).fetchall()
|
|
||||||
aurweb.config.rehash()
|
|
||||||
|
|
||||||
|
|
||||||
def test_create_delete():
|
def test_create_delete():
|
||||||
with db.begin():
|
with db.begin():
|
||||||
account_type = db.create(AccountType, AccountType="test")
|
account_type = db.create(AccountType, AccountType="test")
|
||||||
|
@ -318,3 +216,9 @@ def test_connection_executor_mysql_paramstyle():
|
||||||
def test_connection_executor_sqlite_paramstyle():
|
def test_connection_executor_sqlite_paramstyle():
|
||||||
executor = db.ConnectionExecutor(None, backend="sqlite")
|
executor = db.ConnectionExecutor(None, backend="sqlite")
|
||||||
assert executor.paramstyle() == sqlite3.paramstyle
|
assert executor.paramstyle() == sqlite3.paramstyle
|
||||||
|
|
||||||
|
|
||||||
|
def test_name_without_pytest_current_test():
|
||||||
|
with mock.patch.dict("os.environ", {}, clear=True):
|
||||||
|
dbname = aurweb.db.name()
|
||||||
|
assert dbname == aurweb.config.get("database", "name")
|
||||||
|
|
|
@ -2,12 +2,11 @@ import pytest
|
||||||
|
|
||||||
from aurweb.db import begin, create, delete, query
|
from aurweb.db import begin, create, delete, query
|
||||||
from aurweb.models.dependency_type import DependencyType
|
from aurweb.models.dependency_type import DependencyType
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db()
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_dependency_types():
|
def test_dependency_types():
|
||||||
|
|
|
@ -4,12 +4,11 @@ from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.group import Group
|
from aurweb.models.group import Group
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("Groups")
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_group_creation():
|
def test_group_creation():
|
||||||
|
@ -21,6 +20,4 @@ def test_group_creation():
|
||||||
|
|
||||||
def test_group_null_name_raises_exception():
|
def test_group_null_name_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
Group()
|
||||||
db.create(Group)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ from aurweb.models.package_request import PackageRequest
|
||||||
from aurweb.models.request_type import DELETION_ID, RequestType
|
from aurweb.models.request_type import DELETION_ID, RequestType
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.redis import redis_connection
|
from aurweb.redis import redis_connection
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.html import parse_root
|
from aurweb.testing.html import parse_root
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
|
@ -26,14 +25,8 @@ client = TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
yield setup_test_db(
|
return
|
||||||
User.__tablename__,
|
|
||||||
Package.__tablename__,
|
|
||||||
PackageBase.__tablename__,
|
|
||||||
PackageComaintainer.__tablename__,
|
|
||||||
PackageRequest.__tablename__
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
|
@ -8,14 +8,13 @@ from fastapi.testclient import TestClient
|
||||||
from aurweb import asgi, db
|
from aurweb import asgi, db
|
||||||
from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID, AccountType
|
from aurweb.models.account_type import TRUSTED_USER_ID, USER_ID, AccountType
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.html import get_errors, get_successes, parse_root
|
from aurweb.testing.html import get_errors, get_successes, parse_root
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(User.__tablename__)
|
return
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
import aurweb.config
|
import aurweb.config
|
||||||
import aurweb.db
|
import aurweb.db
|
||||||
import aurweb.initdb
|
import aurweb.initdb
|
||||||
|
@ -5,6 +7,11 @@ import aurweb.initdb
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def setup(db_test):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
class Args:
|
class Args:
|
||||||
use_alembic = True
|
use_alembic = True
|
||||||
verbose = True
|
verbose = True
|
||||||
|
@ -15,6 +22,8 @@ def test_run():
|
||||||
aurweb.db.kill_engine()
|
aurweb.db.kill_engine()
|
||||||
metadata.drop_all(aurweb.db.get_engine())
|
metadata.drop_all(aurweb.db.get_engine())
|
||||||
aurweb.initdb.run(Args())
|
aurweb.initdb.run(Args())
|
||||||
|
|
||||||
|
# Check that constant table rows got added via initdb.
|
||||||
record = aurweb.db.query(AccountType,
|
record = aurweb.db.query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
assert record is not None
|
assert record is not None
|
||||||
|
|
|
@ -4,12 +4,11 @@ from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.license import License
|
from aurweb.models.license import License
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("Licenses")
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_license_creation():
|
def test_license_creation():
|
||||||
|
@ -21,6 +20,4 @@ def test_license_creation():
|
||||||
|
|
||||||
def test_license_null_name_raises_exception():
|
def test_license_null_name_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
License()
|
||||||
db.create(License)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -4,12 +4,11 @@ from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.official_provider import OfficialProvider
|
from aurweb.models.official_provider import OfficialProvider
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("OfficialProviders")
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_official_provider_creation():
|
def test_official_provider_creation():
|
||||||
|
@ -53,26 +52,14 @@ def test_official_provider_cs():
|
||||||
|
|
||||||
def test_official_provider_null_name_raises_exception():
|
def test_official_provider_null_name_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
OfficialProvider(Repo="some-repo", Provides="some-provides")
|
||||||
db.create(OfficialProvider,
|
|
||||||
Repo="some-repo",
|
|
||||||
Provides="some-provides")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_official_provider_null_repo_raises_exception():
|
def test_official_provider_null_repo_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
OfficialProvider(Name="some-name", Provides="some-provides")
|
||||||
db.create(OfficialProvider,
|
|
||||||
Name="some-name",
|
|
||||||
Provides="some-provides")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_official_provider_null_provides_raises_exception():
|
def test_official_provider_null_provides_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
OfficialProvider(Name="some-name", Repo="some-repo")
|
||||||
db.create(OfficialProvider,
|
|
||||||
Name="some-name",
|
|
||||||
Repo="some-repo")
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -8,17 +8,14 @@ from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = package = None
|
user = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase, package
|
global user, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("Packages", "PackageBases", "Users")
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
account_type = db.query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
|
|
||||||
|
|
|
@ -8,17 +8,14 @@ from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = None
|
user = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user
|
global user
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases")
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
account_type = db.query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
with db.begin():
|
with db.begin():
|
||||||
|
|
|
@ -6,17 +6,15 @@ from aurweb import db
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_blacklist import PackageBlacklist
|
from aurweb.models.package_blacklist import PackageBlacklist
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("PackageBlacklist", "PackageBases", "Users")
|
with db.begin():
|
||||||
|
|
||||||
user = db.create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword")
|
RealName="Test User", Passwd="testPassword")
|
||||||
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
@ -31,6 +29,4 @@ def test_package_blacklist_creation():
|
||||||
|
|
||||||
def test_package_blacklist_null_name_raises_exception():
|
def test_package_blacklist_null_name_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageBlacklist()
|
||||||
db.create(PackageBlacklist)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -2,28 +2,27 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, rollback
|
from aurweb import db
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_comaintainer import PackageComaintainer
|
from aurweb.models.package_comaintainer import PackageComaintainer
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "PackageComaintainers")
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword")
|
RealName="Test User", Passwd="testPassword")
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_comaintainer_creation():
|
def test_package_comaintainer_creation():
|
||||||
package_comaintainer = create(PackageComaintainer, User=user,
|
with db.begin():
|
||||||
|
package_comaintainer = db.create(PackageComaintainer, User=user,
|
||||||
PackageBase=pkgbase, Priority=5)
|
PackageBase=pkgbase, Priority=5)
|
||||||
assert bool(package_comaintainer)
|
assert bool(package_comaintainer)
|
||||||
assert package_comaintainer.User == user
|
assert package_comaintainer.User == user
|
||||||
|
@ -33,17 +32,14 @@ def test_package_comaintainer_creation():
|
||||||
|
|
||||||
def test_package_comaintainer_null_user_raises_exception():
|
def test_package_comaintainer_null_user_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageComaintainer, PackageBase=pkgbase, Priority=1)
|
PackageComaintainer(PackageBase=pkgbase, Priority=1)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_comaintainer_null_pkgbase_raises_exception():
|
def test_package_comaintainer_null_pkgbase_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageComaintainer, User=user, Priority=1)
|
PackageComaintainer(User=user, Priority=1)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_comaintainer_null_priority_raises_exception():
|
def test_package_comaintainer_null_priority_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageComaintainer, User=user, PackageBase=pkgbase)
|
PackageComaintainer(User=user, PackageBase=pkgbase)
|
||||||
rollback()
|
|
||||||
|
|
|
@ -2,70 +2,55 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import begin, create, query, rollback
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_comment import PackageComment
|
from aurweb.models.package_comment import PackageComment
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("PackageBases", "PackageComments", "Users")
|
|
||||||
|
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
account_type = query(AccountType,
|
with db.begin():
|
||||||
AccountType.AccountType == "User").first()
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
with begin():
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_comment_creation():
|
def test_package_comment_creation():
|
||||||
with begin():
|
with db.begin():
|
||||||
package_comment = create(PackageComment,
|
package_comment = db.create(PackageComment, PackageBase=pkgbase,
|
||||||
PackageBase=pkgbase,
|
User=user, Comments="Test comment.",
|
||||||
User=user,
|
|
||||||
Comments="Test comment.",
|
|
||||||
RenderedComment="Test rendered comment.")
|
RenderedComment="Test rendered comment.")
|
||||||
assert bool(package_comment.ID)
|
assert bool(package_comment.ID)
|
||||||
|
|
||||||
|
|
||||||
def test_package_comment_null_package_base_raises_exception():
|
def test_package_comment_null_package_base_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with begin():
|
PackageComment(User=user, Comments="Test comment.",
|
||||||
create(PackageComment, User=user, Comments="Test comment.",
|
|
||||||
RenderedComment="Test rendered comment.")
|
RenderedComment="Test rendered comment.")
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_comment_null_user_raises_exception():
|
def test_package_comment_null_user_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with begin():
|
PackageComment(PackageBase=pkgbase,
|
||||||
create(PackageComment, PackageBase=pkgbase,
|
|
||||||
Comments="Test comment.",
|
Comments="Test comment.",
|
||||||
RenderedComment="Test rendered comment.")
|
RenderedComment="Test rendered comment.")
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_comment_null_comments_raises_exception():
|
def test_package_comment_null_comments_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with begin():
|
PackageComment(PackageBase=pkgbase, User=user,
|
||||||
create(PackageComment, PackageBase=pkgbase, User=user,
|
|
||||||
RenderedComment="Test rendered comment.")
|
RenderedComment="Test rendered comment.")
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_comment_null_renderedcomment_defaults():
|
def test_package_comment_null_renderedcomment_defaults():
|
||||||
with begin():
|
with db.begin():
|
||||||
record = create(PackageComment,
|
record = db.create(PackageComment, PackageBase=pkgbase,
|
||||||
PackageBase=pkgbase,
|
User=user, Comments="Test comment.")
|
||||||
User=user,
|
|
||||||
Comments="Test comment.")
|
|
||||||
assert record.RenderedComment == str()
|
assert record.RenderedComment == str()
|
||||||
|
|
|
@ -3,35 +3,28 @@ import pytest
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.db import create, query
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.dependency_type import CHECKDEPENDS_ID, DEPENDS_ID, MAKEDEPENDS_ID, OPTDEPENDS_ID
|
||||||
from aurweb.models.dependency_type import DependencyType
|
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_dependency import PackageDependency
|
from aurweb.models.package_dependency import PackageDependency
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = package = None
|
user = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase, package
|
global user, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "Packages", "PackageDepends")
|
|
||||||
|
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
pkgbase = create(PackageBase,
|
pkgbase = db.create(PackageBase,
|
||||||
Name="test-package",
|
Name="test-package",
|
||||||
Maintainer=user)
|
Maintainer=user)
|
||||||
package = create(Package,
|
package = db.create(Package,
|
||||||
PackageBase=pkgbase,
|
PackageBase=pkgbase,
|
||||||
Name=pkgbase.Name,
|
Name=pkgbase.Name,
|
||||||
Description="Test description.",
|
Description="Test description.",
|
||||||
|
@ -39,81 +32,41 @@ def setup():
|
||||||
|
|
||||||
|
|
||||||
def test_package_dependencies():
|
def test_package_dependencies():
|
||||||
depends = query(DependencyType, DependencyType.Name == "depends").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgdep = create(PackageDependency, Package=package,
|
pkgdep = db.create(PackageDependency, Package=package,
|
||||||
DependencyType=depends,
|
DepTypeID=DEPENDS_ID, DepName="test-dep")
|
||||||
DepName="test-dep")
|
|
||||||
assert pkgdep.DepName == "test-dep"
|
assert pkgdep.DepName == "test-dep"
|
||||||
assert pkgdep.Package == package
|
assert pkgdep.Package == package
|
||||||
assert pkgdep.DependencyType == depends
|
|
||||||
assert pkgdep in depends.package_dependencies
|
|
||||||
assert pkgdep in package.package_dependencies
|
assert pkgdep in package.package_dependencies
|
||||||
|
|
||||||
makedepends = query(DependencyType,
|
|
||||||
DependencyType.Name == "makedepends").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgdep.DependencyType = makedepends
|
pkgdep.DepTypeID = MAKEDEPENDS_ID
|
||||||
assert pkgdep.DepName == "test-dep"
|
|
||||||
assert pkgdep.Package == package
|
|
||||||
assert pkgdep.DependencyType == makedepends
|
|
||||||
assert pkgdep in makedepends.package_dependencies
|
|
||||||
assert pkgdep in package.package_dependencies
|
|
||||||
|
|
||||||
checkdepends = query(DependencyType,
|
|
||||||
DependencyType.Name == "checkdepends").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgdep.DependencyType = checkdepends
|
pkgdep.DepTypeID = CHECKDEPENDS_ID
|
||||||
assert pkgdep.DepName == "test-dep"
|
|
||||||
assert pkgdep.Package == package
|
|
||||||
assert pkgdep.DependencyType == checkdepends
|
|
||||||
assert pkgdep in checkdepends.package_dependencies
|
|
||||||
assert pkgdep in package.package_dependencies
|
|
||||||
|
|
||||||
optdepends = query(DependencyType,
|
|
||||||
DependencyType.Name == "optdepends").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgdep.DependencyType = optdepends
|
pkgdep.DepTypeID = OPTDEPENDS_ID
|
||||||
assert pkgdep.DepName == "test-dep"
|
|
||||||
assert pkgdep.Package == package
|
|
||||||
assert pkgdep.DependencyType == optdepends
|
|
||||||
assert pkgdep in optdepends.package_dependencies
|
|
||||||
assert pkgdep in package.package_dependencies
|
|
||||||
|
|
||||||
assert not pkgdep.is_package()
|
assert not pkgdep.is_package()
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
base = create(PackageBase, Name=pkgdep.DepName, Maintainer=user)
|
base = db.create(PackageBase, Name=pkgdep.DepName, Maintainer=user)
|
||||||
create(Package, PackageBase=base, Name=pkgdep.DepName)
|
db.create(Package, PackageBase=base, Name=pkgdep.DepName)
|
||||||
|
|
||||||
assert pkgdep.is_package()
|
assert pkgdep.is_package()
|
||||||
|
|
||||||
|
|
||||||
def test_package_dependencies_null_package_raises_exception():
|
def test_package_dependencies_null_package_raises_exception():
|
||||||
depends = query(DependencyType, DependencyType.Name == "depends").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageDependency(DepTypeID=DEPENDS_ID, DepName="test-dep")
|
||||||
create(PackageDependency,
|
|
||||||
DependencyType=depends,
|
|
||||||
DepName="test-dep")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_dependencies_null_dependency_type_raises_exception():
|
def test_package_dependencies_null_dependency_type_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageDependency(Package=package, DepName="test-dep")
|
||||||
create(PackageDependency,
|
|
||||||
Package=package,
|
|
||||||
DepName="test-dep")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_dependencies_null_depname_raises_exception():
|
def test_package_dependencies_null_depname_raises_exception():
|
||||||
depends = query(DependencyType, DependencyType.Name == "depends").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageDependency(DepTypeID=DEPENDS_ID, Package=package)
|
||||||
create(PackageDependency,
|
|
||||||
Package=package,
|
|
||||||
DependencyType=depends)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -2,51 +2,44 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, query
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.group import Group
|
from aurweb.models.group import Group
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_group import PackageGroup
|
from aurweb.models.package_group import PackageGroup
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = group = pkgbase = package = None
|
user = group = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, group, pkgbase, package
|
global user, group, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "Packages",
|
with db.begin():
|
||||||
"Groups", "PackageGroups")
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
|
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
group = db.create(Group, Name="Test Group")
|
||||||
|
|
||||||
group = create(Group, Name="Test Group")
|
with db.begin():
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
package = create(Package, PackageBase=pkgbase, Name=pkgbase.Name)
|
package = db.create(Package, PackageBase=pkgbase, Name=pkgbase.Name)
|
||||||
|
|
||||||
|
|
||||||
def test_package_group():
|
def test_package_group():
|
||||||
package_group = create(PackageGroup, Package=package, Group=group)
|
with db.begin():
|
||||||
|
package_group = db.create(PackageGroup, Package=package, Group=group)
|
||||||
assert package_group.Group == group
|
assert package_group.Group == group
|
||||||
assert package_group.Package == package
|
assert package_group.Package == package
|
||||||
|
|
||||||
|
|
||||||
def test_package_group_null_package_raises_exception():
|
def test_package_group_null_package_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageGroup, Group=group)
|
PackageGroup(Group=group)
|
||||||
session.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_group_null_group_raises_exception():
|
def test_package_group_null_group_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageGroup, Package=package)
|
PackageGroup(Package=package)
|
||||||
session.rollback()
|
|
||||||
|
|
|
@ -2,34 +2,31 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, query
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_keyword import PackageKeyword
|
from aurweb.models.package_keyword import PackageKeyword
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "PackageKeywords")
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
pkgbase = create(PackageBase,
|
pkgbase = db.create(PackageBase,
|
||||||
Name="beautiful-package",
|
Name="beautiful-package",
|
||||||
Maintainer=user)
|
Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_keyword():
|
def test_package_keyword():
|
||||||
pkg_keyword = create(PackageKeyword,
|
with db.begin():
|
||||||
|
pkg_keyword = db.create(PackageKeyword,
|
||||||
PackageBase=pkgbase,
|
PackageBase=pkgbase,
|
||||||
Keyword="test")
|
Keyword="test")
|
||||||
assert pkg_keyword in pkgbase.keywords
|
assert pkg_keyword in pkgbase.keywords
|
||||||
|
@ -37,9 +34,5 @@ def test_package_keyword():
|
||||||
|
|
||||||
|
|
||||||
def test_package_keyword_null_pkgbase_raises_exception():
|
def test_package_keyword_null_pkgbase_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageKeyword,
|
PackageKeyword(Keyword="test")
|
||||||
Keyword="test")
|
|
||||||
session.rollback()
|
|
||||||
|
|
|
@ -2,51 +2,45 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, query
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.license import License
|
from aurweb.models.license import License
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_license import PackageLicense
|
from aurweb.models.package_license import PackageLicense
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = license = pkgbase = package = None
|
user = license = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, license, pkgbase, package
|
global user, license, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "Packages",
|
with db.begin():
|
||||||
"Licenses", "PackageLicenses")
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
|
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
license = db.create(License, Name="Test License")
|
||||||
|
|
||||||
license = create(License, Name="Test License")
|
with db.begin():
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
package = create(Package, PackageBase=pkgbase, Name=pkgbase.Name)
|
package = db.create(Package, PackageBase=pkgbase, Name=pkgbase.Name)
|
||||||
|
|
||||||
|
|
||||||
def test_package_license():
|
def test_package_license():
|
||||||
package_license = create(PackageLicense, Package=package, License=license)
|
with db.begin():
|
||||||
|
package_license = db.create(PackageLicense, Package=package,
|
||||||
|
License=license)
|
||||||
assert package_license.License == license
|
assert package_license.License == license
|
||||||
assert package_license.Package == package
|
assert package_license.Package == package
|
||||||
|
|
||||||
|
|
||||||
def test_package_license_null_package_raises_exception():
|
def test_package_license_null_package_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageLicense, License=license)
|
PackageLicense(License=license)
|
||||||
session.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_license_null_license_raises_exception():
|
def test_package_license_null_license_raises_exception():
|
||||||
from aurweb.db import session
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageLicense, Package=package)
|
PackageLicense(Package=package)
|
||||||
session.rollback()
|
|
||||||
|
|
|
@ -2,29 +2,28 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, rollback
|
from aurweb import db
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_notification import PackageNotification
|
from aurweb.models.package_notification import PackageNotification
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "PackageNotifications")
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword")
|
RealName="Test User", Passwd="testPassword")
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_notification_creation():
|
def test_package_notification_creation():
|
||||||
package_notification = create(PackageNotification, User=user,
|
with db.begin():
|
||||||
PackageBase=pkgbase)
|
package_notification = db.create(
|
||||||
|
PackageNotification, User=user, PackageBase=pkgbase)
|
||||||
assert bool(package_notification)
|
assert bool(package_notification)
|
||||||
assert package_notification.User == user
|
assert package_notification.User == user
|
||||||
assert package_notification.PackageBase == pkgbase
|
assert package_notification.PackageBase == pkgbase
|
||||||
|
@ -32,11 +31,9 @@ def test_package_notification_creation():
|
||||||
|
|
||||||
def test_package_notification_null_user_raises_exception():
|
def test_package_notification_null_user_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageNotification, PackageBase=pkgbase)
|
PackageNotification(PackageBase=pkgbase)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_notification_null_pkgbase_raises_exception():
|
def test_package_notification_null_pkgbase_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageNotification, User=user)
|
PackageNotification(User=user)
|
||||||
rollback()
|
|
||||||
|
|
|
@ -1,37 +1,30 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError, OperationalError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.db import create, query
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.account_type import AccountType
|
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_relation import PackageRelation
|
from aurweb.models.package_relation import PackageRelation
|
||||||
from aurweb.models.relation_type import RelationType
|
from aurweb.models.relation_type import CONFLICTS_ID, PROVIDES_ID, REPLACES_ID
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = package = None
|
user = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase, package
|
global user, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "Packages", "PackageRelations")
|
|
||||||
|
|
||||||
account_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
pkgbase = create(PackageBase,
|
pkgbase = db.create(PackageBase,
|
||||||
Name="test-package",
|
Name="test-package",
|
||||||
Maintainer=user)
|
Maintainer=user)
|
||||||
package = create(Package,
|
package = db.create(Package,
|
||||||
PackageBase=pkgbase,
|
PackageBase=pkgbase,
|
||||||
Name=pkgbase.Name,
|
Name=pkgbase.Name,
|
||||||
Description="Test description.",
|
Description="Test description.",
|
||||||
|
@ -39,65 +32,32 @@ def setup():
|
||||||
|
|
||||||
|
|
||||||
def test_package_relation():
|
def test_package_relation():
|
||||||
conflicts = query(RelationType, RelationType.Name == "conflicts").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgrel = create(PackageRelation, Package=package,
|
pkgrel = db.create(PackageRelation, Package=package,
|
||||||
RelationType=conflicts,
|
RelTypeID=CONFLICTS_ID,
|
||||||
RelName="test-relation")
|
RelName="test-relation")
|
||||||
|
|
||||||
assert pkgrel.RelName == "test-relation"
|
assert pkgrel.RelName == "test-relation"
|
||||||
assert pkgrel.Package == package
|
assert pkgrel.Package == package
|
||||||
assert pkgrel.RelationType == conflicts
|
|
||||||
assert pkgrel in conflicts.package_relations
|
|
||||||
assert pkgrel in package.package_relations
|
assert pkgrel in package.package_relations
|
||||||
|
|
||||||
provides = query(RelationType, RelationType.Name == "provides").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgrel.RelationType = provides
|
pkgrel.RelTypeID = PROVIDES_ID
|
||||||
assert pkgrel.RelName == "test-relation"
|
|
||||||
assert pkgrel.Package == package
|
|
||||||
assert pkgrel.RelationType == provides
|
|
||||||
assert pkgrel in provides.package_relations
|
|
||||||
assert pkgrel in package.package_relations
|
|
||||||
|
|
||||||
replaces = query(RelationType, RelationType.Name == "replaces").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgrel.RelationType = replaces
|
pkgrel.RelTypeID = REPLACES_ID
|
||||||
assert pkgrel.RelName == "test-relation"
|
|
||||||
assert pkgrel.Package == package
|
|
||||||
assert pkgrel.RelationType == replaces
|
|
||||||
assert pkgrel in replaces.package_relations
|
|
||||||
assert pkgrel in package.package_relations
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_relation_null_package_raises_exception():
|
def test_package_relation_null_package_raises_exception():
|
||||||
conflicts = query(RelationType, RelationType.Name == "conflicts").first()
|
|
||||||
assert conflicts is not None
|
|
||||||
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRelation(RelTypeID=CONFLICTS_ID, RelName="test-relation")
|
||||||
create(PackageRelation,
|
|
||||||
RelationType=conflicts,
|
|
||||||
RelName="test-relation")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_relation_null_relation_type_raises_exception():
|
def test_package_relation_null_relation_type_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRelation(Package=package, RelName="test-relation")
|
||||||
create(PackageRelation,
|
|
||||||
Package=package,
|
|
||||||
RelName="test-relation")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_relation_null_relname_raises_exception():
|
def test_package_relation_null_relname_raises_exception():
|
||||||
depends = query(RelationType, RelationType.Name == "conflicts").first()
|
with pytest.raises(IntegrityError):
|
||||||
assert depends is not None
|
PackageRelation(Package=package, RelTypeID=CONFLICTS_ID)
|
||||||
|
|
||||||
with pytest.raises((OperationalError, IntegrityError)):
|
|
||||||
with db.begin():
|
|
||||||
create(PackageRelation,
|
|
||||||
Package=package,
|
|
||||||
RelationType=depends)
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -5,41 +5,35 @@ import pytest
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.db import create, query, rollback
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_request import (ACCEPTED, ACCEPTED_ID, CLOSED, CLOSED_ID, PENDING, PENDING_ID, REJECTED,
|
from aurweb.models.package_request import (ACCEPTED, ACCEPTED_ID, CLOSED, CLOSED_ID, PENDING, PENDING_ID, REJECTED,
|
||||||
REJECTED_ID, PackageRequest)
|
REJECTED_ID, PackageRequest)
|
||||||
from aurweb.models.request_type import RequestType
|
from aurweb.models.request_type import MERGE_ID
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("PackageRequests", "PackageBases", "Users")
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword")
|
RealName="Test User", Passwd="testPassword",
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
AccountTypeID=USER_ID)
|
||||||
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_creation():
|
def test_package_request_creation():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
assert request_type.Name == "merge"
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
package_request = create(PackageRequest, RequestType=request_type,
|
package_request = db.create(PackageRequest, ReqTypeID=MERGE_ID,
|
||||||
User=user, PackageBase=pkgbase,
|
User=user, PackageBase=pkgbase,
|
||||||
PackageBaseName=pkgbase.Name,
|
PackageBaseName=pkgbase.Name,
|
||||||
Comments=str(), ClosureComment=str())
|
Comments=str(), ClosureComment=str())
|
||||||
|
|
||||||
assert bool(package_request.ID)
|
assert bool(package_request.ID)
|
||||||
assert package_request.RequestType == request_type
|
|
||||||
assert package_request.User == user
|
assert package_request.User == user
|
||||||
assert package_request.PackageBase == pkgbase
|
assert package_request.PackageBase == pkgbase
|
||||||
assert package_request.PackageBaseName == pkgbase.Name
|
assert package_request.PackageBaseName == pkgbase.Name
|
||||||
|
@ -47,18 +41,14 @@ def test_package_request_creation():
|
||||||
assert package_request.ClosureComment == str()
|
assert package_request.ClosureComment == str()
|
||||||
|
|
||||||
# Make sure that everything is cross-referenced with relationships.
|
# Make sure that everything is cross-referenced with relationships.
|
||||||
assert package_request in request_type.package_requests
|
|
||||||
assert package_request in user.package_requests
|
assert package_request in user.package_requests
|
||||||
assert package_request in pkgbase.requests
|
assert package_request in pkgbase.requests
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_closed():
|
def test_package_request_closed():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
assert request_type.Name == "merge"
|
|
||||||
|
|
||||||
ts = int(datetime.utcnow().timestamp())
|
ts = int(datetime.utcnow().timestamp())
|
||||||
with db.begin():
|
with db.begin():
|
||||||
package_request = create(PackageRequest, RequestType=request_type,
|
package_request = db.create(PackageRequest, ReqTypeID=MERGE_ID,
|
||||||
User=user, PackageBase=pkgbase,
|
User=user, PackageBase=pkgbase,
|
||||||
PackageBaseName=pkgbase.Name,
|
PackageBaseName=pkgbase.Name,
|
||||||
Closer=user, ClosedTS=ts,
|
Closer=user, ClosedTS=ts,
|
||||||
|
@ -73,69 +63,50 @@ def test_package_request_closed():
|
||||||
|
|
||||||
def test_package_request_null_request_type_raises_exception():
|
def test_package_request_null_request_type_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(User=user, PackageBase=pkgbase,
|
||||||
create(PackageRequest, User=user, PackageBase=pkgbase,
|
|
||||||
PackageBaseName=pkgbase.Name,
|
PackageBaseName=pkgbase.Name,
|
||||||
Comments=str(), ClosureComment=str())
|
Comments=str(), ClosureComment=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_null_user_raises_exception():
|
def test_package_request_null_user_raises_exception():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(ReqTypeID=MERGE_ID,
|
||||||
create(PackageRequest, RequestType=request_type,
|
|
||||||
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
||||||
Comments=str(), ClosureComment=str())
|
Comments=str(), ClosureComment=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_null_package_base_raises_exception():
|
def test_package_request_null_package_base_raises_exception():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(ReqTypeID=MERGE_ID,
|
||||||
create(PackageRequest, RequestType=request_type,
|
|
||||||
User=user, PackageBaseName=pkgbase.Name,
|
User=user, PackageBaseName=pkgbase.Name,
|
||||||
Comments=str(), ClosureComment=str())
|
Comments=str(), ClosureComment=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_null_package_base_name_raises_exception():
|
def test_package_request_null_package_base_name_raises_exception():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(ReqTypeID=MERGE_ID,
|
||||||
create(PackageRequest, RequestType=request_type,
|
|
||||||
User=user, PackageBase=pkgbase,
|
User=user, PackageBase=pkgbase,
|
||||||
Comments=str(), ClosureComment=str())
|
Comments=str(), ClosureComment=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_null_comments_raises_exception():
|
def test_package_request_null_comments_raises_exception():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(ReqTypeID=MERGE_ID, User=user,
|
||||||
create(PackageRequest, RequestType=request_type, User=user,
|
|
||||||
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
||||||
ClosureComment=str())
|
ClosureComment=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_null_closure_comment_raises_exception():
|
def test_package_request_null_closure_comment_raises_exception():
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
PackageRequest(ReqTypeID=MERGE_ID, User=user,
|
||||||
create(PackageRequest, RequestType=request_type, User=user,
|
|
||||||
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
||||||
Comments=str())
|
Comments=str())
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_request_status_display():
|
def test_package_request_status_display():
|
||||||
""" Test status_display() based on the Status column value. """
|
""" Test status_display() based on the Status column value. """
|
||||||
request_type = query(RequestType, RequestType.Name == "merge").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
pkgreq = create(PackageRequest, RequestType=request_type,
|
pkgreq = db.create(PackageRequest, ReqTypeID=MERGE_ID,
|
||||||
User=user, PackageBase=pkgbase,
|
User=user, PackageBase=pkgbase,
|
||||||
PackageBaseName=pkgbase.Name,
|
PackageBaseName=pkgbase.Name,
|
||||||
Comments=str(), ClosureComment=str(),
|
Comments=str(), ClosureComment=str(),
|
||||||
|
|
|
@ -14,7 +14,7 @@ user = pkgbase = package = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase, package
|
global user, pkgbase, package
|
||||||
|
|
||||||
setup_test_db("PackageSources", "Packages", "PackageBases", "Users")
|
setup_test_db("PackageSources", "Packages", "PackageBases", "Users")
|
||||||
|
|
|
@ -4,30 +4,30 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, rollback
|
from aurweb import db
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.package_vote import PackageVote
|
from aurweb.models.package_vote import PackageVote
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = pkgbase = None
|
user = pkgbase = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, pkgbase
|
global user, pkgbase
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "PackageVotes")
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword")
|
RealName="Test User", Passwd="testPassword")
|
||||||
pkgbase = create(PackageBase, Name="test-package", Maintainer=user)
|
pkgbase = db.create(PackageBase, Name="test-package", Maintainer=user)
|
||||||
|
|
||||||
|
|
||||||
def test_package_vote_creation():
|
def test_package_vote_creation():
|
||||||
ts = int(datetime.utcnow().timestamp())
|
ts = int(datetime.utcnow().timestamp())
|
||||||
package_vote = create(PackageVote, User=user, PackageBase=pkgbase,
|
|
||||||
VoteTS=ts)
|
with db.begin():
|
||||||
|
package_vote = db.create(PackageVote, User=user,
|
||||||
|
PackageBase=pkgbase, VoteTS=ts)
|
||||||
assert bool(package_vote)
|
assert bool(package_vote)
|
||||||
assert package_vote.User == user
|
assert package_vote.User == user
|
||||||
assert package_vote.PackageBase == pkgbase
|
assert package_vote.PackageBase == pkgbase
|
||||||
|
@ -36,17 +36,14 @@ def test_package_vote_creation():
|
||||||
|
|
||||||
def test_package_vote_null_user_raises_exception():
|
def test_package_vote_null_user_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageVote, PackageBase=pkgbase, VoteTS=1)
|
PackageVote(PackageBase=pkgbase, VoteTS=1)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_vote_null_pkgbase_raises_exception():
|
def test_package_vote_null_pkgbase_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageVote, User=user, VoteTS=1)
|
PackageVote(User=user, VoteTS=1)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_package_vote_null_votets_raises_exception():
|
def test_package_vote_null_votets_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(PackageVote, User=user, PackageBase=pkgbase)
|
PackageVote(User=user, PackageBase=pkgbase)
|
||||||
rollback()
|
|
||||||
|
|
|
@ -28,7 +28,6 @@ from aurweb.models.package_vote import PackageVote
|
||||||
from aurweb.models.relation_type import CONFLICTS_ID, PROVIDES_ID, REPLACES_ID, RelationType
|
from aurweb.models.relation_type import CONFLICTS_ID, PROVIDES_ID, REPLACES_ID, RelationType
|
||||||
from aurweb.models.request_type import DELETION_ID, MERGE_ID, RequestType
|
from aurweb.models.request_type import DELETION_ID, MERGE_ID, RequestType
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.html import get_errors, get_successes, parse_root
|
from aurweb.testing.html import get_errors, get_successes, parse_root
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
|
@ -65,21 +64,8 @@ def create_package_rel(package: Package,
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(
|
return
|
||||||
User.__tablename__,
|
|
||||||
Package.__tablename__,
|
|
||||||
PackageBase.__tablename__,
|
|
||||||
PackageDependency.__tablename__,
|
|
||||||
PackageRelation.__tablename__,
|
|
||||||
PackageKeyword.__tablename__,
|
|
||||||
PackageVote.__tablename__,
|
|
||||||
PackageNotification.__tablename__,
|
|
||||||
PackageComaintainer.__tablename__,
|
|
||||||
PackageComment.__tablename__,
|
|
||||||
PackageRequest.__tablename__,
|
|
||||||
OfficialProvider.__tablename__
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -91,12 +77,11 @@ def client() -> TestClient:
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def user() -> User:
|
def user() -> User:
|
||||||
""" Yield a user. """
|
""" Yield a user. """
|
||||||
account_type = db.query(AccountType, AccountType.ID == USER_ID).first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = db.create(User, Username="test",
|
user = db.create(User, Username="test",
|
||||||
Email="test@example.org",
|
Email="test@example.org",
|
||||||
Passwd="testPassword",
|
Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
yield user
|
yield user
|
||||||
|
|
||||||
|
|
||||||
|
@ -1173,7 +1158,7 @@ def test_pkgbase_comments(client: TestClient, maintainer: User, user: User,
|
||||||
PackageNotification.UserID == maintainer.ID
|
PackageNotification.UserID == maintainer.ID
|
||||||
).first()
|
).first()
|
||||||
with db.begin():
|
with db.begin():
|
||||||
db.session.delete(db_notif)
|
db.delete(db_notif)
|
||||||
|
|
||||||
# Now, let's edit the comment we just created.
|
# Now, let's edit the comment we just created.
|
||||||
comment_id = int(headers[0].attrib["id"].split("-")[-1])
|
comment_id = int(headers[0].attrib["id"].split("-")[-1])
|
||||||
|
|
|
@ -6,7 +6,7 @@ from fastapi import HTTPException
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
|
||||||
from aurweb import asgi, db
|
from aurweb import asgi, db
|
||||||
from aurweb.models.account_type import USER_ID, AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.official_provider import OFFICIAL_BASE, OfficialProvider
|
from aurweb.models.official_provider import OFFICIAL_BASE, OfficialProvider
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
|
@ -15,29 +15,20 @@ from aurweb.models.package_vote import PackageVote
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.packages import util
|
from aurweb.packages import util
|
||||||
from aurweb.redis import kill_redis
|
from aurweb.redis import kill_redis
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(
|
return
|
||||||
User.__tablename__,
|
|
||||||
Package.__tablename__,
|
|
||||||
PackageBase.__tablename__,
|
|
||||||
PackageVote.__tablename__,
|
|
||||||
PackageNotification.__tablename__,
|
|
||||||
OfficialProvider.__tablename__
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def maintainer() -> User:
|
def maintainer() -> User:
|
||||||
account_type = db.query(AccountType, AccountType.ID == USER_ID).first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
maintainer = db.create(User, Username="test_maintainer",
|
maintainer = db.create(User, Username="test_maintainer",
|
||||||
Email="test_maintainer@examepl.org",
|
Email="test_maintainer@examepl.org",
|
||||||
Passwd="testPassword",
|
Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
yield maintainer
|
yield maintainer
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,12 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
from aurweb.scripts import popupdate
|
from aurweb.scripts import popupdate
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def setup(db_test):
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_popupdate():
|
def test_popupdate():
|
||||||
popupdate.main()
|
popupdate.main()
|
||||||
|
|
|
@ -8,15 +8,14 @@ from aurweb import config, db, logging
|
||||||
from aurweb.models import ApiRateLimit
|
from aurweb.models import ApiRateLimit
|
||||||
from aurweb.ratelimit import check_ratelimit
|
from aurweb.ratelimit import check_ratelimit
|
||||||
from aurweb.redis import redis_connection
|
from aurweb.redis import redis_connection
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
logger = logging.get_logger(__name__)
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(ApiRateLimit.__tablename__)
|
return
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
@ -31,27 +30,36 @@ def pipeline():
|
||||||
yield pipeline
|
yield pipeline
|
||||||
|
|
||||||
|
|
||||||
|
config_getint = config.getint
|
||||||
|
|
||||||
|
|
||||||
def mock_config_getint(section: str, key: str):
|
def mock_config_getint(section: str, key: str):
|
||||||
if key == "request_limit":
|
if key == "request_limit":
|
||||||
return 4
|
return 4
|
||||||
elif key == "window_length":
|
elif key == "window_length":
|
||||||
return 100
|
return 100
|
||||||
return config.getint(section, key)
|
return config_getint(section, key)
|
||||||
|
|
||||||
|
|
||||||
|
config_getboolean = config.getboolean
|
||||||
|
|
||||||
|
|
||||||
def mock_config_getboolean(return_value: int = 0):
|
def mock_config_getboolean(return_value: int = 0):
|
||||||
def fn(section: str, key: str):
|
def fn(section: str, key: str):
|
||||||
if section == "ratelimit" and key == "cache":
|
if section == "ratelimit" and key == "cache":
|
||||||
return return_value
|
return return_value
|
||||||
return config.getboolean(section, key)
|
return config_getboolean(section, key)
|
||||||
return fn
|
return fn
|
||||||
|
|
||||||
|
|
||||||
|
config_get = config.get
|
||||||
|
|
||||||
|
|
||||||
def mock_config_get(return_value: str = "none"):
|
def mock_config_get(return_value: str = "none"):
|
||||||
def fn(section: str, key: str):
|
def fn(section: str, key: str):
|
||||||
if section == "options" and key == "cache":
|
if section == "options" and key == "cache":
|
||||||
return return_value
|
return return_value
|
||||||
return config.get(section, key)
|
return config_get(section, key)
|
||||||
return fn
|
return fn
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,11 @@ import pytest
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.relation_type import RelationType
|
from aurweb.models.relation_type import RelationType
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db()
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_relation_type_creation():
|
def test_relation_type_creation():
|
||||||
|
|
|
@ -2,12 +2,11 @@ import pytest
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.request_type import DELETION_ID, MERGE_ID, ORPHAN_ID, RequestType
|
from aurweb.models.request_type import DELETION_ID, MERGE_ID, ORPHAN_ID, RequestType
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db()
|
return
|
||||||
|
|
||||||
|
|
||||||
def test_request_type_creation():
|
def test_request_type_creation():
|
||||||
|
|
|
@ -10,27 +10,21 @@ from fastapi.testclient import TestClient
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.asgi import app
|
from aurweb.asgi import app
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
user = client = None
|
user = client = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, client
|
global user, client
|
||||||
|
|
||||||
setup_test_db("Users", "Sessions")
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = db.create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
|
||||||
client = TestClient(app)
|
client = TestClient(app)
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@ from aurweb.models.package_vote import PackageVote
|
||||||
from aurweb.models.relation_type import RelationType
|
from aurweb.models.relation_type import RelationType
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.redis import redis_connection
|
from aurweb.redis import redis_connection
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
def make_request(path, headers: Dict[str, str] = {}):
|
def make_request(path, headers: Dict[str, str] = {}):
|
||||||
|
@ -35,11 +34,8 @@ def make_request(path, headers: Dict[str, str] = {}):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
# Set up tables.
|
# TODO: Rework this into organized fixtures.
|
||||||
setup_test_db("Users", "PackageBases", "Packages", "Licenses",
|
|
||||||
"PackageDepends", "PackageRelations", "PackageLicenses",
|
|
||||||
"PackageKeywords", "PackageVotes", "ApiRateLimit")
|
|
||||||
|
|
||||||
# Create test package details.
|
# Create test package details.
|
||||||
with begin():
|
with begin():
|
||||||
|
|
|
@ -12,17 +12,13 @@ from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.package import Package
|
from aurweb.models.package import Package
|
||||||
from aurweb.models.package_base import PackageBase
|
from aurweb.models.package_base import PackageBase
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
logger = logging.get_logger(__name__)
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db(
|
return
|
||||||
Package.__tablename__,
|
|
||||||
PackageBase.__tablename__,
|
|
||||||
User.__tablename__)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
|
@ -8,17 +8,14 @@ from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.session import Session, generate_unique_sid
|
from aurweb.models.session import Session, generate_unique_sid
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
account_type = user = session = None
|
account_type = user = session = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global account_type, user, session
|
global account_type, user, session
|
||||||
|
|
||||||
setup_test_db("Users", "Sessions")
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
account_type = db.query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
with db.begin():
|
with db.begin():
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import USER_ID
|
||||||
from aurweb.models.ssh_pub_key import SSHPubKey, get_fingerprint
|
from aurweb.models.ssh_pub_key import SSHPubKey, get_fingerprint
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
TEST_SSH_PUBKEY = """
|
TEST_SSH_PUBKEY = """
|
||||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCycoCi5yGCvSclH2wmNBUuwsYEzRZZBJaQquRc4ysl+Tg+/jiDkR3Zn9fIznC4KnFoyrIHzkKuePZ3bNDYwkZxkJKoWBCh4hXKDXSm87FMN0+VDC+1QxF/z0XaAGr/P6f4XukabyddypBdnHcZiplbw+YOSqcAE2TCqOlSXwNMOcF9U89UsR/Q9i9I52hlvU0q8+fZVGhou1KCowFSnHYtrr5KYJ04CXkJ13DkVf3+pjQWyrByvBcf1hGEaczlgfobrrv/y96jDhgfXucxliNKLdufDPPkii3LhhsNcDmmI1VZ3v0irKvd9WZuauqloobY84zEFcDTyjn0hxGjVeYFejm4fBnvjga0yZXORuWksdNfXWLDxFk6MDDd1jF0ExRbP+OxDuU4IVyIuDL7S3cnbf2YjGhkms/8voYT2OBE7FwNlfv98Kr0NUp51zpf55Arxn9j0Rz9xTA7FiODQgCn6iQ0SDtzUNL0IKTCw26xJY5gzMxbfpvzPQGeulx/ioM= kevr@volcano
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCycoCi5yGCvSclH2wmNBUuwsYEzRZZBJaQquRc4ysl+Tg+/jiDkR3Zn9fIznC4KnFoyrIHzkKuePZ3bNDYwkZxkJKoWBCh4hXKDXSm87FMN0+VDC+1QxF/z0XaAGr/P6f4XukabyddypBdnHcZiplbw+YOSqcAE2TCqOlSXwNMOcF9U89UsR/Q9i9I52hlvU0q8+fZVGhou1KCowFSnHYtrr5KYJ04CXkJ13DkVf3+pjQWyrByvBcf1hGEaczlgfobrrv/y96jDhgfXucxliNKLdufDPPkii3LhhsNcDmmI1VZ3v0irKvd9WZuauqloobY84zEFcDTyjn0hxGjVeYFejm4fBnvjga0yZXORuWksdNfXWLDxFk6MDDd1jF0ExRbP+OxDuU4IVyIuDL7S3cnbf2YjGhkms/8voYT2OBE7FwNlfv98Kr0NUp51zpf55Arxn9j0Rz9xTA7FiODQgCn6iQ0SDtzUNL0IKTCw26xJY5gzMxbfpvzPQGeulx/ioM= kevr@volcano
|
||||||
|
@ -14,21 +13,16 @@ user = ssh_pub_key = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, ssh_pub_key
|
global user, ssh_pub_key
|
||||||
|
|
||||||
setup_test_db("Users", "SSHPubKeys")
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
|
||||||
AccountType.AccountType == "User").first()
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
user = db.create(User, Username="test", Email="test@example.org",
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
RealName="Test User", Passwd="testPassword",
|
RealName="Test User", Passwd="testPassword",
|
||||||
AccountType=account_type)
|
AccountTypeID=USER_ID)
|
||||||
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
ssh_pub_key = db.create(SSHPubKey,
|
ssh_pub_key = db.create(SSHPubKey, UserID=user.ID,
|
||||||
UserID=user.ID,
|
|
||||||
Fingerprint="testFingerprint",
|
Fingerprint="testFingerprint",
|
||||||
PubKey="testPubKey")
|
PubKey="testPubKey")
|
||||||
|
|
||||||
|
|
|
@ -4,17 +4,11 @@ from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb import db
|
from aurweb import db
|
||||||
from aurweb.models.term import Term
|
from aurweb.models.term import Term
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("Terms")
|
return
|
||||||
|
|
||||||
yield None
|
|
||||||
|
|
||||||
# Wipe em out just in case records are leftover.
|
|
||||||
setup_test_db("Terms")
|
|
||||||
|
|
||||||
|
|
||||||
def test_term_creation():
|
def test_term_creation():
|
||||||
|
@ -29,13 +23,9 @@ def test_term_creation():
|
||||||
|
|
||||||
def test_term_null_description_raises_exception():
|
def test_term_null_description_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
Term(URL="https://fake_url.io")
|
||||||
db.create(Term, URL="https://fake_url.io")
|
|
||||||
db.rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_term_null_url_raises_exception():
|
def test_term_null_url_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
with db.begin():
|
Term(Description="Term description")
|
||||||
db.create(Term, Description="Term description")
|
|
||||||
db.rollback()
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.tu_vote import TUVote
|
from aurweb.models.tu_vote import TUVote
|
||||||
from aurweb.models.tu_voteinfo import TUVoteInfo
|
from aurweb.models.tu_voteinfo import TUVoteInfo
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
DATETIME_REGEX = r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
|
DATETIME_REGEX = r'^[0-9]{4}-[0-9]{2}-[0-9]{2}$'
|
||||||
|
@ -76,8 +75,8 @@ def assert_past_vote_html(row, expected):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
setup_test_db("TU_Votes", "TU_VoteInfo", "Users")
|
return
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
|
@ -4,30 +4,26 @@ import pytest
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
||||||
from aurweb.db import create, query, rollback
|
from aurweb import db
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import TRUSTED_USER_ID
|
||||||
from aurweb.models.tu_vote import TUVote
|
from aurweb.models.tu_vote import TUVote
|
||||||
from aurweb.models.tu_voteinfo import TUVoteInfo
|
from aurweb.models.tu_voteinfo import TUVoteInfo
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = tu_voteinfo = None
|
user = tu_voteinfo = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user, tu_voteinfo
|
global user, tu_voteinfo
|
||||||
|
|
||||||
setup_test_db("Users", "TU_VoteInfo", "TU_Votes")
|
|
||||||
|
|
||||||
tu_type = query(AccountType,
|
|
||||||
AccountType.AccountType == "Trusted User").first()
|
|
||||||
user = create(User, Username="test", Email="test@example.org",
|
|
||||||
RealName="Test User", Passwd="testPassword",
|
|
||||||
AccountType=tu_type)
|
|
||||||
|
|
||||||
ts = int(datetime.utcnow().timestamp())
|
ts = int(datetime.utcnow().timestamp())
|
||||||
tu_voteinfo = create(TUVoteInfo,
|
with db.begin():
|
||||||
|
user = db.create(User, Username="test", Email="test@example.org",
|
||||||
|
RealName="Test User", Passwd="testPassword",
|
||||||
|
AccountTypeID=TRUSTED_USER_ID)
|
||||||
|
|
||||||
|
tu_voteinfo = db.create(TUVoteInfo,
|
||||||
Agenda="Blah blah.",
|
Agenda="Blah blah.",
|
||||||
User=user.Username,
|
User=user.Username,
|
||||||
Submitted=ts, End=ts + 5,
|
Submitted=ts, End=ts + 5,
|
||||||
|
@ -36,21 +32,20 @@ def setup():
|
||||||
|
|
||||||
|
|
||||||
def test_tu_vote_creation():
|
def test_tu_vote_creation():
|
||||||
tu_vote = create(TUVote, User=user, VoteInfo=tu_voteinfo)
|
with db.begin():
|
||||||
|
tu_vote = db.create(TUVote, User=user, VoteInfo=tu_voteinfo)
|
||||||
|
|
||||||
assert tu_vote.VoteInfo == tu_voteinfo
|
assert tu_vote.VoteInfo == tu_voteinfo
|
||||||
assert tu_vote.User == user
|
assert tu_vote.User == user
|
||||||
|
|
||||||
assert tu_vote in user.tu_votes
|
assert tu_vote in user.tu_votes
|
||||||
assert tu_vote in tu_voteinfo.tu_votes
|
assert tu_vote in tu_voteinfo.tu_votes
|
||||||
|
|
||||||
|
|
||||||
def test_tu_vote_null_user_raises_exception():
|
def test_tu_vote_null_user_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(TUVote, VoteInfo=tu_voteinfo)
|
TUVote(VoteInfo=tu_voteinfo)
|
||||||
rollback()
|
|
||||||
|
|
||||||
|
|
||||||
def test_tu_vote_null_voteinfo_raises_exception():
|
def test_tu_vote_null_voteinfo_raises_exception():
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError):
|
||||||
create(TUVote, User=user)
|
TUVote(User=user)
|
||||||
rollback()
|
|
||||||
|
|
|
@ -9,17 +9,14 @@ from aurweb.db import create, query, rollback
|
||||||
from aurweb.models.account_type import AccountType
|
from aurweb.models.account_type import AccountType
|
||||||
from aurweb.models.tu_voteinfo import TUVoteInfo
|
from aurweb.models.tu_voteinfo import TUVoteInfo
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
|
|
||||||
user = None
|
user = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global user
|
global user
|
||||||
|
|
||||||
setup_test_db("Users", "PackageBases", "TU_VoteInfo")
|
|
||||||
|
|
||||||
tu_type = query(AccountType,
|
tu_type = query(AccountType,
|
||||||
AccountType.AccountType == "Trusted User").first()
|
AccountType.AccountType == "Trusted User").first()
|
||||||
with db.begin():
|
with db.begin():
|
||||||
|
|
|
@ -19,27 +19,15 @@ from aurweb.models.package_vote import PackageVote
|
||||||
from aurweb.models.session import Session
|
from aurweb.models.session import Session
|
||||||
from aurweb.models.ssh_pub_key import SSHPubKey
|
from aurweb.models.ssh_pub_key import SSHPubKey
|
||||||
from aurweb.models.user import User
|
from aurweb.models.user import User
|
||||||
from aurweb.testing import setup_test_db
|
|
||||||
from aurweb.testing.requests import Request
|
from aurweb.testing.requests import Request
|
||||||
|
|
||||||
account_type = user = None
|
account_type = user = None
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def setup():
|
def setup(db_test):
|
||||||
global account_type, user
|
global account_type, user
|
||||||
|
|
||||||
setup_test_db(
|
|
||||||
User.__tablename__,
|
|
||||||
Session.__tablename__,
|
|
||||||
Ban.__tablename__,
|
|
||||||
SSHPubKey.__tablename__,
|
|
||||||
Package.__tablename__,
|
|
||||||
PackageBase.__tablename__,
|
|
||||||
PackageVote.__tablename__,
|
|
||||||
PackageNotification.__tablename__
|
|
||||||
)
|
|
||||||
|
|
||||||
account_type = db.query(AccountType,
|
account_type = db.query(AccountType,
|
||||||
AccountType.AccountType == "User").first()
|
AccountType.AccountType == "User").first()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue