Manual rollback of committed data in tests #130
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
The current
dbfixture in pytest-invenio uses nested transactions (session.begin_nested()) to isolate test data. However, this approach fails when tests or invenio code explicitly calldb.session.commit(), as this causes the data to be committed into the outermost transaction and not the nested one (change from sqlalchemy 1.x where the same operation committed the nested transaction). This causes:This PR introduces a manual database cleanup mechanism that:
store_database_values()(this preserves module- scoped db rows from cleanup)purge_database_values()InconsistentDatabaseErrorif tests remove rows from module-level fixtures, making explicit what would otherwise be silent test pollutionThe package was tested with all invenio packages . All tests were successful with the exception of:
With those patches, all tests pass.
Alternative approaches tested and rejected
An alternative approach would be to override
commitandrollbackso that they commit/rollback the nested transaction instead of the outer one and start a new nested transaction automatically. This approach seems not to be working:Checklist
Ticks in all boxes and 🟢 on all GitHub actions status checks are required to merge:
Frontend
Reminder
By using GitHub, you have already agreed to the GitHub’s Terms of Service including that: