@@ -543,12 +543,46 @@ def fsqlalite_datastore(app, tmpdir, realdburl):
543543 td ()
544544
545545
546- def fsqlalite_setup (app , tmpdir , realdburl ):
546+ @pytest .fixture ()
547+ def fsqlalite_min_datastore (app , tmpdir , realdburl ):
548+ pytest .importorskip ("flask_sqlalchemy_lite" )
549+ from sqlalchemy .orm import declared_attr , mapped_column , relationship
550+ from sqlalchemy import String
551+
552+ class FsMinUserMixin (UserMixin ):
553+ # flask_security basic fields
554+ id : Mapped [int ] = mapped_column (primary_key = True ) # type: ignore
555+ email : Mapped [str ] = mapped_column (String (255 ), unique = True ) # type: ignore
556+ password : Mapped [str | None ] = mapped_column (String (255 )) # type: ignore
557+ active : Mapped [bool ] = mapped_column () # type: ignore
558+ fs_uniquifier : Mapped [str ] = mapped_column ( # type: ignore
559+ String (64 ), unique = True
560+ )
561+
562+ @declared_attr
563+ def roles (cls ):
564+ # The first arg is a class name, the backref is a column name
565+ return relationship (
566+ "Role" ,
567+ secondary = "roles_users" ,
568+ back_populates = "users" ,
569+ )
570+
571+ ds , td = fsqlalite_setup (
572+ app , tmpdir , realdburl , usermixin = FsMinUserMixin , use_webauthn = False
573+ )
574+ yield ds
575+ td ()
576+
577+
578+ def fsqlalite_setup (app , tmpdir , realdburl , usermixin = None , use_webauthn = True ):
547579 pytest .importorskip ("flask_sqlalchemy_lite" )
548580 from flask_sqlalchemy_lite import SQLAlchemy
549581 from sqlalchemy .orm import DeclarativeBase , mapped_column
550582 from flask_security .models import sqla as sqla
551583
584+ if not usermixin :
585+ usermixin = sqla .FsUserMixin
552586 if realdburl :
553587 db_url , db_info = _setup_realdb (realdburl )
554588 else :
@@ -568,10 +602,12 @@ class Model(DeclarativeBase):
568602 class Role (Model , sqla .FsRoleMixin ):
569603 __tablename__ = "role"
570604
571- class WebAuthn (Model , sqla .FsWebAuthnMixin ):
572- __tablename__ = "webauthn"
605+ if use_webauthn :
573606
574- class User (Model , sqla .FsUserMixin ):
607+ class WebAuthn (Model , sqla .FsWebAuthnMixin ):
608+ __tablename__ = "webauthn"
609+
610+ class User (Model , usermixin ):
575611 __tablename__ = "user"
576612 security_number : Mapped [t .Optional [int ]] = mapped_column ( # type: ignore
577613 unique = True
@@ -593,7 +629,10 @@ def tear_down():
593629 if realdburl :
594630 _teardown_realdb (db_info )
595631
596- return FSQLALiteUserDatastore (db , User , Role , WebAuthn ), tear_down
632+ return (
633+ FSQLALiteUserDatastore (db , User , Role , WebAuthn if use_webauthn else None ),
634+ tear_down ,
635+ )
597636
598637
599638@pytest .fixture ()
@@ -1022,6 +1061,17 @@ def create_app():
10221061 return ScriptInfo (create_app = create_app )
10231062
10241063
1064+ @pytest .fixture ()
1065+ def script_info_min (app , fsqlalite_min_datastore ):
1066+ from flask .cli import ScriptInfo
1067+
1068+ def create_app ():
1069+ app .security = Security (app , datastore = fsqlalite_min_datastore )
1070+ return app
1071+
1072+ return ScriptInfo (create_app = create_app )
1073+
1074+
10251075def pytest_addoption (parser ):
10261076 parser .addoption (
10271077 "--realdburl" ,
0 commit comments