From df1507c86ebac2aa4868a18aa1ce94c1ba273a79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cyrill=20K=C3=BCttel?= Date: Wed, 3 Jul 2024 00:33:51 +0200 Subject: [PATCH] tests: migrate away from SQlite In-Memory db. --- i18n.sh | 27 ++++ .../locale/de/LC_MESSAGES/privatim.mo | Bin 8979 -> 9125 bytes .../locale/de/LC_MESSAGES/privatim.po | 6 +- .../locale/fr/LC_MESSAGES/privatim.mo | Bin 9271 -> 9425 bytes .../locale/fr/LC_MESSAGES/privatim.po | 14 ++- src/privatim/locale/privatim.pot | 6 +- src/privatim/models/searchable.py | 2 - .../views/templates/search_results.pt | 7 ++ tests/cli/test_upgrade.py | 16 +-- tests/conftest.py | 119 +++++------------- tests/forms/test_forms_meeting.py | 2 +- tests/i18n/test_core.py | 18 +-- tests/models/test_searchable_mixin.py | 2 + tests/models/test_user.py | 24 ++-- tests/reporting/test_report.py | 2 +- tests/views/client/test_logout.py | 2 +- tests/views/client/test_views_homepage.py | 2 +- .../views/without_client/test_meeting_view.py | 4 +- .../without_client/test_password_change.py | 10 +- .../without_client/test_password_retrieval.py | 4 +- 20 files changed, 131 insertions(+), 136 deletions(-) diff --git a/i18n.sh b/i18n.sh index 6432bd2..99ebf22 100755 --- a/i18n.sh +++ b/i18n.sh @@ -34,6 +34,21 @@ if [ ! -f "$LOCALES_PATH"/$DOMAIN.pot ]; then touch "$LOCALES_PATH"/$DOMAIN.pot fi +# Function to insert a space before "msgid" +insert_space_before_msgid() { + local input="$1" + echo "$input" | sed 's/msgid/ msgid/' +} + +# Function to remove the fourth space in a string +remove_fourth_space() { + local input="$1" + local part1=$(echo "$input" | cut -d' ' -f1-4) + local part2=$(echo "$input" | cut -d' ' -f5-) + echo "$part1$part2" +} + + # no arguments, extract and update if [ $# -eq 0 ]; then echo "Extract messages" @@ -47,6 +62,18 @@ if [ $# -eq 0 ]; then echo "Compile message catalogs" for po in "$LOCALES_PATH"/*/LC_MESSAGES/*.po; do msgfmt --statistics -o "${po%.*}.mo" "$po" + + untranslated_messages=$(msggrep -v -T -e "." "$po" | grep -n "msgid" | grep -v '""') + if [ -n "$untranslated_messages" ]; then + echo -n "${po}:" + while IFS= read -r line; do + formatted_line=$(insert_space_before_msgid "$line") + formatted_line=$(remove_fourth_space "$formatted_line") + echo "$formatted_line" + done <<< "$untranslated_messages" + echo # Add a newline after all untranslated messages + fi + echo # Add a newline after all untranslated messages done # first argument represents language identifier, create catalog diff --git a/src/privatim/locale/de/LC_MESSAGES/privatim.mo b/src/privatim/locale/de/LC_MESSAGES/privatim.mo index f8ea01e7f0dd61f0eefff1325dd6b3d359f44562..e3c3e83d1c32825e9d35104efacbecb652831f58 100644 GIT binary patch delta 2987 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 diff --git a/src/privatim/locale/de/LC_MESSAGES/privatim.po b/src/privatim/locale/de/LC_MESSAGES/privatim.po index f7dd1a5..9f8228b 100644 --- a/src/privatim/locale/de/LC_MESSAGES/privatim.po +++ b/src/privatim/locale/de/LC_MESSAGES/privatim.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2024-07-02 14:17+0200\n" +"POT-Creation-Date: 2024-07-02 23:44+0200\n" "PO-Revision-Date: 2024-05-21 21:20+0200\n" "Last-Translator: cyrill \n" "Language-Team: German \n" @@ -338,6 +338,10 @@ msgstr "Ihr Kommentar" msgid "Search Results" msgstr "Suchergebnisse" +#: src/privatim/views/templates/search_results.pt +msgid "No results containing all your search terms were found." +msgstr "Es wurden keine Ergebnisse gefunden, die alle Ihre Suchbegriffe enthalten." + #: src/privatim/views/templates/search_results.pt #: src/privatim/views/templates/activities.pt msgid "Show Details" diff --git a/src/privatim/locale/fr/LC_MESSAGES/privatim.mo b/src/privatim/locale/fr/LC_MESSAGES/privatim.mo index 229aadaa51ba602d9e2f5d9c12d6e3a59b4a81d3..542a64e3dfab0f40914499912944eba195c8c27b 100644 GIT binary patch delta 2995 zcmXxk4NO&K9LMnoL6Lj0xEIM6Brm=oh&gpiuC2^>NI_9cO%bkeRP=hy%S92fYrba6 zX5O`$j-{nbO6M4s<}5SUi_4kiDzh!ysFc!}PUmK&eSh~pot^*rJkL4jd4JA1R`^X( zZk z4frrNqUvkHG-D#B+1@yT9v*yd^Oum*{L1AZ-b6L9yIZ^?`!Iw2aZJJUsD>^f6`M9x zL${GJ8S_xQd}mxnHWia;-_(&%&(@$zCsFA#5pC7^Q2#0ak@di1Xa;IREH{26)Z=MtN}Gsji~qEL@yq) z`BSI?oWmaYEf(M(sHMrK5_N2_=3j~7B-EqPSb-C4{s3y~T5SFUREIvb`E#i9myo*6 z6;#JNtanijKCt<&^jgo;Q1$loF#lS!EN*Bdxu^z4S;wHJtO!-n0#w1psP_Y?k*`78 zFgvgjn@}Cg=b_4vKs7uW)zN9F&0g+h{x!7?_Q7^k#d}Z<9kltws0vS@-an1%=mq=y zvh^yeq1*QPKd1qANspKJU@rNdsIO;ighU>R`8WW#;9z{u`n|oMz%X*SpMyiN81-H~ zX5#@Ih+m-Uxq-##$qMtmH#c|Jl;bA}7EX?{di^e1Y! zC-O5$L=UQb2C7^i)boC*nHpvtgPPeARJnObxriwzkW8XeC~A!hPz}#PHSE~uH8#H%)!}WZrHdllz%*MwM)sq*h_M;Qh!VF*sN(ym3fz1f z8c_!J#{tNsm_k&Ae)Qogn|~d(2M(bcZbc@^oJ9?&4K)i+m z^`wh0ULX@=Yme&KP-LH&0@N-qMK!z-Rjv-zu}0MUyHO*23)O+c_yitBPSe3lXei`Zqv&Y{51oeJ9F2wZy@flc!Op4iQ^G8ri za~9RHi%7>K<}wL=E>}@Mnj5GQKfrwKO=}wQBuvEls0u1D2^XVA9zgAZuyq}(zAc!9 zZ=lLG;Sk)93FdKQo*}b{U{l7XWE0LMa)=5dOz7A_tRj4b6TQ=QQ1N_H+AW2Ij`gvt zF(dIg;xS?@(MaeR9mn|bMMA^YHr7!etxm}tzATN~se5ptv&s3zIEz{bX6^6Pd&Ze&74(N= o_XB=k$l)P1I;~&!ZA$cv51ncDhn?DxuR2({A{eZVR`tL5AKcb7r2qf` delta 2844 zcmYk;e@vBC9LMnk7XmJl+>2zQ7|QQ1F40ELMhhiHk@%q%X$V;U2qA?0nZy+gLs&Vx z%Z)~C;c8^|!(A$swnmn&CH-LC)ri@gI{wI#{DaazsP~6^+Iq(Kd7bk-&pGFN&U2nS zepvNsf%lR->~+J@LChg)!;JYHKa1qVaXQ)<{>&Lpci~q!3r8^lColtD(~P+Tm!g{H zVFa#5Czj!KtU#KWI*c{OYxda-9q8i5FoXHQ0fg$sT*(i!-PnMkUyT^kv>d zJ$J@lA4IkP7Wp#)PHJ}*mDnwu#`q?jb8Xcjy$M@7Na`IMa^stYNaYr&)1_H zn{53EY69Ij6MHcS&!S$bMd$P_3;upgL?uCD>-KAF+0$26)%r zKZTmv0IJ=2%)lX>`dToPx+~6@6nxN2;a&<=)=qol6HMd!FPMd)Oh?b%hx2efreYJS zqh2h+3#fM<&!=%WEiqTV_R+ANL8YMH&L1|6tf-HQ(V2-UD3_56Un zKZsh&@2rGjLAm!oY%B5nld|T?LrOw7N+Be_WDn#cm1oa zkE53QZ`5-RrmG()4{GMiII(zU1G4I-9(BJJm2ek+qwl|ug5K>;e%2DP+1ibo$yroF z7f=lYsITQJY9+=|6PUn*IBD;<^1{i@yoyTn9n?ykLT&2P7_IMrkb*iGLcQAnYT&<6 z1BcBH-gl$w38;iKkX1E{kk@VstQDvkH=+`4vmQnD`zEUW3Dl37>8Fs4=a9uPW2g@G ztt3G_s-A{KnFp$Xlt1!w14SWUX z;y7xC)2ZCRR8*qz_XKC0jB1yQ`u)hqG+c*T(f!sAR3crd=RZIt@-b>+gI)^S)nB6q z96>c0MglLgl7~vH5S4ft>g%XP_OaQF9z1}W=t*?w z`~QN18lFdOiXqg}45Qxpi1iBU2kJWNxk*$z2U%yK6GLzn@eIKpn_7t$EGM)Yl|&<< z<1n#PBPCII+Ls!YUbKOdw#Q21|Hu7Q9wQbIc|-@HV@VKGg-wL!t8J@eudgd=cJ{Nu zidkXRlIwVc;3Jzl$~bFI*Nmst@yGp+nJu(OliBlT8-K^ z2Wj)iRTF&PZ2K= zMTEX%9a{P=Qzc^>a3Qgq&@O*~c#d!oI=sY_zS8KK-ZhliNM;|APiRME5;cT&OC7O} z&<1PPbB_~iiEYFlLPuMWsdEbFT4EPbK`bK*h#3A+8H>Ia=KneNw-EoZ a`(~(rB>w#fzc2B4sJ}F++u{2sdH7${*$N~8 diff --git a/src/privatim/locale/fr/LC_MESSAGES/privatim.po b/src/privatim/locale/fr/LC_MESSAGES/privatim.po index 7a1aaf7..eaec1a2 100644 --- a/src/privatim/locale/fr/LC_MESSAGES/privatim.po +++ b/src/privatim/locale/fr/LC_MESSAGES/privatim.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2024-07-02 14:17+0200\n" +"POT-Creation-Date: 2024-07-02 23:44+0200\n" "PO-Revision-Date: 2024-04-11 15:53+0200\n" "Last-Translator: cyrill \n" "Language-Team: French \n" @@ -335,7 +335,11 @@ msgstr "Votre commentaire" #: src/privatim/views/templates/search_results.pt msgid "Search Results" -msgstr "" +msgstr "Résultats de la recherche" + +#: src/privatim/views/templates/search_results.pt +msgid "No results containing all your search terms were found.." +msgstr "Aucun résultat ne contient tous les termes de votre recherche." #: src/privatim/views/templates/search_results.pt #: src/privatim/views/templates/activities.pt @@ -348,11 +352,11 @@ msgstr "Changer le mot de passe" #: src/privatim/views/templates/activities.pt msgid "Unbekannter Ersteller" -msgstr "" +msgstr "Créateur inconnu" #: src/privatim/views/templates/activities.pt msgid "Kein Leiter" -msgstr "" +msgstr "Pas de chef" #: src/privatim/views/templates/activities.pt msgid "Show Meeting" @@ -607,7 +611,7 @@ msgstr "Membres" #: src/privatim/forms/search_form.py msgid "Search" -msgstr "" +msgstr "Suchen" #: src/privatim/forms/widgets/widgets.py msgid "Uploaded file" diff --git a/src/privatim/locale/privatim.pot b/src/privatim/locale/privatim.pot index a7acb9c..9b1d167 100644 --- a/src/privatim/locale/privatim.pot +++ b/src/privatim/locale/privatim.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE 1.0\n" -"POT-Creation-Date: 2024-07-02 14:17+0200\n" +"POT-Creation-Date: 2024-07-02 23:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -328,6 +328,10 @@ msgstr "" msgid "Search Results" msgstr "" +#: ./src/privatim/views/templates/search_results.pt +msgid "No results containing all your search terms were found.." +msgstr "" + #: ./src/privatim/views/templates/search_results.pt #: ./src/privatim/views/templates/activities.pt msgid "Show Details" diff --git a/src/privatim/models/searchable.py b/src/privatim/models/searchable.py index 7ca485b..8612126 100644 --- a/src/privatim/models/searchable.py +++ b/src/privatim/models/searchable.py @@ -56,8 +56,6 @@ def reindex_full_text_search(session: 'Session') -> None: """ models = searchable_models() - # todo: remove later - assert len(models) != 0, "No models with searchable fields found" for model in models: for locale, language in locales.items(): assert language == 'german' # todo: remove later diff --git a/src/privatim/views/templates/search_results.pt b/src/privatim/views/templates/search_results.pt index 95f0a96..12f5b8d 100644 --- a/src/privatim/views/templates/search_results.pt +++ b/src/privatim/views/templates/search_results.pt @@ -14,6 +14,13 @@
+ +
+ +
diff --git a/tests/cli/test_upgrade.py b/tests/cli/test_upgrade.py index e16c571..86a4d6d 100644 --- a/tests/cli/test_upgrade.py +++ b/tests/cli/test_upgrade.py @@ -1,21 +1,21 @@ from privatim.cli.upgrade import UpgradeContext -def test_has_table(config): - upgrade = UpgradeContext(config.dbsession) +def test_has_table(pg_config): + upgrade = UpgradeContext(pg_config.dbsession) assert upgrade.has_table('consultations') assert not upgrade.has_table('bogus') -def test_drop_table(config): - upgrade = UpgradeContext(config.dbsession) - assert upgrade.has_table('meetings') - assert upgrade.drop_table('meetings') +def test_drop_table(pg_config): + upgrade = UpgradeContext(pg_config.dbsession) + assert upgrade.has_table('agenda_items') + assert upgrade.drop_table('agenda_items') assert not upgrade.has_table('meetings') assert not upgrade.drop_table('bogus') -def test_has_column(config): - upgrade = UpgradeContext(config.dbsession) +def test_has_column(pg_config): + upgrade = UpgradeContext(pg_config.dbsession) assert upgrade.has_column('meetings', 'id') assert not upgrade.has_column('meetings', 'bogus') diff --git a/tests/conftest.py b/tests/conftest.py index a37b22a..28b4b81 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,6 @@ import warnings import pytest import transaction -from libcloud.storage.drivers.local import LocalStorageDriver from pyramid import testing from sqlalchemy import engine_from_config from privatim import main @@ -10,30 +9,19 @@ from privatim.models.consultation import Status, Consultation from privatim.orm import Base, get_engine, get_session_factory, get_tm_session from privatim.testing import DummyRequest, DummyMailer, MockRequests -from sqlalchemy_file.storage import StorageManager - from tests.shared.client import Client -from typing import TYPE_CHECKING -if TYPE_CHECKING: - from pyramid.config import Configurator - - -@pytest.fixture -def base_config(_postgresql): +@pytest.fixture(scope='function') +def base_config(postgresql): msg = '.*SQLAlchemy must convert from floating point.*' warnings.filterwarnings('ignore', message=msg) - # config = testing.setUp(settings={ - # 'sqlalchemy.url': 'sqlite:///:memory:', - # }) - config = testing.setUp(settings={ 'sqlalchemy.url': ( - f'postgresql+psycopg://{_postgresql.info.user}:@' - f'{_postgresql.info.host}:{_postgresql.info.port}' - f'/{_postgresql.info.dbname}' + f'postgresql+psycopg://{postgresql.info.user}:@' + f'{postgresql.info.host}:{postgresql.info.port}' + f'/{postgresql.info.dbname}' ), }) yield config @@ -41,59 +29,25 @@ def base_config(_postgresql): transaction.abort() -@pytest.fixture -def config(base_config, monkeypatch, tmpdir) -> 'Configurator': - """ Returns the config used in tests. Note that this has side effects - on `DummyRequest` in that the session becomes available. """ - - base_config.include('privatim.models') - base_config.include('pyramid_chameleon') - base_config.include('pyramid_layout') - settings = base_config.get_settings() - - engine = get_engine(settings) - - # enable foreign key constraints in sqlite, so we can rely on them - # working during testing. - # sqlalchemy.event.listen( - # engine, - # 'connect', - # lambda c, r: c.execute('pragma foreign_keys=ON') - # ) - - Base.metadata.create_all(engine) - session_factory = get_session_factory(engine) - - dbsession = get_tm_session(session_factory, transaction.manager) - base_config.dbsession = dbsession - - orig_init = DummyRequest.__init__ - - def init_with_dbsession(self, *args, dbsession=dbsession, **kwargs): - orig_init(self, *args, dbsession=dbsession, **kwargs) - - monkeypatch.setattr(DummyRequest, '__init__', init_with_dbsession) - - # Store static files in a temporary directory - if not StorageManager._storages: - # NOTE: StorageManager does not expose any method to check if some - # storage has already been added. However, if you attempt to add a - # storage that already exists, StorageManager raises a RuntimeError. - tmpdir.mkdir('assets') - container = LocalStorageDriver(tmpdir).get_container('assets') - StorageManager.add_storage("default", container) +@pytest.fixture(scope='function', autouse=True) +def run_around_tests(engine): + # todo: check if this is actually needed? - return base_config + # This fixture will run before and after each test + # Thanks to the autouse=True parameter + yield + # After the test, we ensure all tables are dropped + Base.metadata.drop_all(bind=engine) # requires pytest-postgresql: -@pytest.fixture(scope='session') -def pg_config(_postgresql, monkeypatch): +@pytest.fixture(scope='function') +def pg_config(postgresql, monkeypatch): config = testing.setUp(settings={ 'sqlalchemy.url': ( - f'postgresql+psycopg://{_postgresql.info.user}:@' - f'{_postgresql.info.host}:{_postgresql.info.port}' - f'/{_postgresql.info.dbname}' + f'postgresql+psycopg://{postgresql.info.user}:@' + f'{postgresql.info.host}:{postgresql.info.port}' + f'/{postgresql.info.dbname}' ), }) config.include('privatim.models') @@ -125,13 +79,13 @@ def init_with_dbsession(self, *args, dbsession=dbsession, **kwargs): transaction.abort() -@pytest.fixture -def session(config): +@pytest.fixture(scope='function') +def session(pg_config): # convenience fixture - return config.dbsession + return pg_config.dbsession -@pytest.fixture +@pytest.fixture(scope='function') def user(session): user = User( email='admin@example.org', @@ -169,13 +123,13 @@ def user_with_working_group(session): @pytest.fixture -def mailer(config): +def mailer(pg_config): mailer = DummyMailer() - config.registry.registerUtility(mailer) + pg_config.registry.registerUtility(mailer) return mailer -@pytest.fixture(scope='session') +@pytest.fixture(scope='function') def engine(app_settings): engine = engine_from_config(app_settings) Base.metadata.create_all(engine) @@ -186,40 +140,35 @@ def engine(app_settings): return engine -@pytest.fixture(scope='session') +@pytest.fixture(scope='function') def connection(engine): connection = engine.connect() yield connection connection.close() -@pytest.fixture(scope='session') -def _postgresql(postgresql): - return postgresql - - -@pytest.fixture(scope='session') -def app_settings(_postgresql): +@pytest.fixture(scope='function') +def app_settings(postgresql): yield {'sqlalchemy.url': ( - f'postgresql+psycopg://{_postgresql.info.user}:@' - f'{_postgresql.info.host}:{_postgresql.info.port}' - f'/{_postgresql.info.dbname}' + f'postgresql+psycopg://{postgresql.info.user}:@' + f'{postgresql.info.host}:{postgresql.info.port}' + f'/{postgresql.info.dbname}' )} -@pytest.fixture(scope="session") +@pytest.fixture(scope='function') def app_inner(app_settings): app = main({}, **app_settings) yield app -@pytest.fixture(scope='session') +@pytest.fixture(scope='function') def app(app_inner, connection): app_inner.app.app.registry["dbsession_factory"].kw["bind"] = connection yield app_inner -@pytest.fixture(scope='session') +@pytest.fixture(scope='function') def client(app, engine): client = Client(app) diff --git a/tests/forms/test_forms_meeting.py b/tests/forms/test_forms_meeting.py index 8863e09..9dfe90d 100644 --- a/tests/forms/test_forms_meeting.py +++ b/tests/forms/test_forms_meeting.py @@ -17,7 +17,7 @@ def getlist(self, key): @pytest.mark.skip() -def test_meeting_form_time_not_optional(config): +def test_meeting_form_time_not_optional(pg_config): meeting = create_meeting() session = config.dbsession session.add(meeting) diff --git a/tests/i18n/test_core.py b/tests/i18n/test_core.py index 25c0b98..cc03be2 100644 --- a/tests/i18n/test_core.py +++ b/tests/i18n/test_core.py @@ -40,28 +40,28 @@ def test_translate_markup(): assert result == Markup('bold') -def test_translate_translation_dirs(config): - config.add_translation_dirs('privatim:locale/') +def test_translate_translation_dirs(pg_config): + pg_config.add_translation_dirs('privatim:locale/') # Testing localizer doesn't seem to work. - config.registry.localizer_de = None + pg_config.registry.localizer_de = None msg = _('Just a test') assert translate(msg, 'en') == 'Just a test' assert translate(msg, 'de') == 'Nur ein Test' -def test_translate_translation_dirs_markup(config): - config.add_translation_dirs('privatim:locale/') +def test_translate_translation_dirs_markup(pg_config): + pg_config.add_translation_dirs('privatim:locale/') # Testing localizer doesn't seem to work. - config.registry.localizer_de = None + pg_config.registry.localizer_de = None msg = _('bold', markup=True) assert escape(translate(msg, 'en')) == Markup('bold') assert escape(translate(msg, 'de')) == Markup('fett') -def test_translate_translation_dirs_markup_omitted(config): - config.add_translation_dirs('privatim:locale/') +def test_translate_translation_dirs_markup_omitted(pg_config): + pg_config.add_translation_dirs('privatim:locale/') # Testing localizer doesn't seem to work. - config.registry.localizer_de = None + pg_config.registry.localizer_de = None msg = _('bold') assert escape(translate(msg, 'en')) == Markup('<b>bold</b>') assert escape(translate(msg, 'de')) == Markup('<b>fett</b>') diff --git a/tests/models/test_searchable_mixin.py b/tests/models/test_searchable_mixin.py index 24ef113..dbe16be 100644 --- a/tests/models/test_searchable_mixin.py +++ b/tests/models/test_searchable_mixin.py @@ -1,9 +1,11 @@ +import pytest from sqlalchemy import select from sqlalchemy.orm import undefer from privatim.models import Consultation from privatim.models.searchable import reindex_full_text_search +@pytest.mark.skip('fulltext indexing is disabled for now') def test_fulltext_indexing_on_searchable_fields(pg_config): session = pg_config.dbsession consultation = Consultation( diff --git a/tests/models/test_user.py b/tests/models/test_user.py index a46ae35..c6d3366 100644 --- a/tests/models/test_user.py +++ b/tests/models/test_user.py @@ -2,8 +2,8 @@ from sqlalchemy import select -def test_set_password(config): - session = config.dbsession +def test_set_password(pg_config): + session = pg_config.dbsession user = User(email='admin@example.org') session.add(user) @@ -13,8 +13,8 @@ def test_set_password(config): assert user.check_password('Test123!') is True -def test_user_password_failure(config): - session = config.dbsession +def test_user_password_failure(pg_config): + session = pg_config.dbsession user = User(email='admin@example.org') session.add(user) session.flush() @@ -24,16 +24,16 @@ def test_user_password_failure(config): assert user.check_password('Test123!') is True -def test_user_groups_empty(config): - session = config.dbsession +def test_user_groups_empty(pg_config): + session = pg_config.dbsession user = User(email='admin@example.org') session.add(user) session.flush() assert user.groups == [] # No groups associated initially -def test_user_groups_association(config): - session = config.dbsession +def test_user_groups_association(pg_config): + session = pg_config.dbsession user = User(email='admin@example.org') group = Group(name='Test Group') @@ -45,8 +45,8 @@ def test_user_groups_association(config): assert user.groups == [group] -def test_user_leading_group_relationship(config): - session = config.dbsession +def test_user_leading_group_relationship(pg_config): + session = pg_config.dbsession user = User(email='admin@example.org') group = WorkingGroup(name='Leadership Group') @@ -62,8 +62,8 @@ def test_user_leading_group_relationship(config): assert group.leader.email == 'admin@example.org' -def test_group_type_polymorphism(config): - session = config.dbsession +def test_group_type_polymorphism(pg_config): + session = pg_config.dbsession group = Group(name='General Group') working_group = WorkingGroup(name='Specific Working Group') session.add(group) diff --git a/tests/reporting/test_report.py b/tests/reporting/test_report.py index 287d372..96f1990 100644 --- a/tests/reporting/test_report.py +++ b/tests/reporting/test_report.py @@ -5,7 +5,7 @@ from tests.shared.utils import create_meeting, CustomDummyRequest -def test_generate_meeting_report(config): +def test_generate_meeting_report(pg_config): meeting = create_meeting() renderer = HTMLReportRenderer() diff --git a/tests/views/client/test_logout.py b/tests/views/client/test_logout.py index eced534..8ffe9e8 100644 --- a/tests/views/client/test_logout.py +++ b/tests/views/client/test_logout.py @@ -2,7 +2,7 @@ from privatim.views import logout_view -def test_logout_view(config): +def test_logout_view(pg_config): config.add_route('login', '/login') request = DummyRequest() diff --git a/tests/views/client/test_views_homepage.py b/tests/views/client/test_views_homepage.py index ce24b68..c1cf2d7 100644 --- a/tests/views/client/test_views_homepage.py +++ b/tests/views/client/test_views_homepage.py @@ -10,5 +10,5 @@ def test_view_activities(client): form = page.forms[0] print(form.fields) - form['search'] = 'My search' + form['term'] = 'My search' page = form.submit() diff --git a/tests/views/without_client/test_meeting_view.py b/tests/views/without_client/test_meeting_view.py index b3954f6..211e920 100644 --- a/tests/views/without_client/test_meeting_view.py +++ b/tests/views/without_client/test_meeting_view.py @@ -8,7 +8,7 @@ create_meeting_with_agenda_items -def test_export_meeting_without_agenda_items(config): +def test_export_meeting_without_agenda_items(pg_config): config.add_route('export_meeting_as_pdf_view', '/meetings/{id}/export') @@ -30,7 +30,7 @@ def test_export_meeting_without_agenda_items(config): assert 'Logo' in all_text -def test_sortable_agenda_items_view(config): +def test_sortable_agenda_items_view(pg_config): # Add route config.add_route( diff --git a/tests/views/without_client/test_password_change.py b/tests/views/without_client/test_password_change.py index c2c679a..43a4e54 100644 --- a/tests/views/without_client/test_password_change.py +++ b/tests/views/without_client/test_password_change.py @@ -7,7 +7,7 @@ from privatim.views.password_change import password_change_view -def test_password_change_view(config): +def test_password_change_view(pg_config): request = DummyRequest() result = password_change_view(request) assert 'form' in result @@ -35,7 +35,7 @@ def test_password_change_view_password_strength(config, user): assert 'Password must have minimal length' in messages[0]['message'] -def test_password_change_view_invalid(config): +def test_password_change_view_invalid(pg_config): request = DummyRequest() request.params['token'] = '1234567' request.POST['email'] = 'username' @@ -48,7 +48,7 @@ def test_password_change_view_invalid(config): assert 'There was a problem with your submission.' in message['message'] -def test_password_change_view_invalid_confirmation(config): +def test_password_change_view_invalid_confirmation(pg_config): request = DummyRequest() request.params['token'] = '1234567' request.POST['email'] = 'username' @@ -61,7 +61,7 @@ def test_password_change_view_invalid_confirmation(config): assert 'There was a problem with your submission.' in message['message'] -def test_password_change_view_invalid_min_length(config): +def test_password_change_view_invalid_min_length(pg_config): request = DummyRequest() request.params['token'] = '1234567' request.POST['email'] = 'username' @@ -96,7 +96,7 @@ def test_password_change_view_invalid_username(config, user): assert 'form' in result -def test_password_change_view_invalid_token(config): +def test_password_change_view_invalid_token(pg_config): request = DummyRequest() request.params['token'] = '123456' request.POST['email'] = 'username' diff --git a/tests/views/without_client/test_password_retrieval.py b/tests/views/without_client/test_password_retrieval.py index 07c822c..a386062 100644 --- a/tests/views/without_client/test_password_retrieval.py +++ b/tests/views/without_client/test_password_retrieval.py @@ -4,7 +4,7 @@ from privatim.views.password_retrieval import password_retrieval_view -def test_view(config): +def test_view(pg_config): request = DummyRequest() result = password_retrieval_view(request) assert 'form' in result.keys() @@ -64,7 +64,7 @@ def test_view_submit_username(config, user, mailer): assert message['receivers'].addr_spec == 'gregory@house.com' -def test_view_submit_invalid(config): +def test_view_submit_invalid(pg_config): request = DummyRequest() request.POST['email'] = '' # Empty username request.POST['submit'] = '1'