/capstone/capdb/tests/test_postgres.py

https://github.com/harvard-lil/capstone
Python | 116 lines | 69 code | 23 blank | 24 comment | 4 complexity | 67ab4281131f480432cbf2df46ca8a77 MD5 | raw file
  1. from copy import deepcopy
  2. import pytest
  3. from django.db import transaction
  4. from capdb.models import CaseMetadata, CaseDeleted, CaseLastUpdate
  5. from scripts.helpers import parse_xml, serialize_xml
  6. from test_data.test_fixtures.helpers import get_timestamp, check_timestamps_changed, check_timestamps_unchanged
  7. @pytest.mark.parametrize('versioned_fixture_name', [
  8. 'volume_xml',
  9. 'case_xml',
  10. 'page_xml'
  11. ])
  12. def test_versioning(transactional_db, versioned_fixture_name, request):
  13. # load initial volume_xml/case_xml/page_xml
  14. versioned_instance = request.getfixturevalue(versioned_fixture_name)
  15. original_instance = deepcopy(versioned_instance)
  16. # starts with no history
  17. assert versioned_instance.history.count() == 0
  18. # versions are only created once per transaction.
  19. # since tests run in transactions, run an initial sub-transaction to
  20. # make sure our next save causes a new version to be created.
  21. # note that this is not sufficient when using the temporal_tables
  22. # extension, which additionally requires (transaction=True) as an
  23. # argument to the pytest.mark.django_db decorator
  24. with transaction.atomic(using='capdb'):
  25. versioned_instance.save()
  26. # make some modifications:
  27. versioned_instance.s3_key = 'changed'
  28. parsed = parse_xml(versioned_instance.orig_xml)
  29. parsed('mets').append("<new_element/>")
  30. versioned_instance.orig_xml = serialize_xml(parsed)
  31. # save modified version:
  32. with transaction.atomic(using='capdb'):
  33. versioned_instance.save()
  34. # historical version should now exist:
  35. previous_version = versioned_instance.history.first()
  36. assert previous_version
  37. # current version's sys_period should start where historical version's sys_period ends:
  38. versioned_instance.refresh_from_db() # load current sys_period
  39. assert versioned_instance.sys_period.lower == previous_version.sys_period.upper
  40. # historical version should have values from before latest save:
  41. assert previous_version.s3_key == original_instance.s3_key
  42. assert previous_version.orig_xml == original_instance.orig_xml
  43. @pytest.mark.django_db(databases=['capdb'], transaction=True)
  44. def test_last_updated(case, extracted_citation_factory, elasticsearch):
  45. # creating case creates a timestamp
  46. timestamp = get_timestamp(case)
  47. # updating case field in set_up_postgres updates timestamp
  48. CaseMetadata.objects.filter(pk=case.id).update(frontend_url='foo')
  49. timestamp = check_timestamps_changed(case, timestamp)
  50. # updating case field not in set_up_postgres doesn't update timestamp
  51. CaseMetadata.objects.filter(pk=case.id).update(no_index_notes='foo')
  52. check_timestamps_unchanged(case, timestamp)
  53. # adding inbound references
  54. extracted_cite = extracted_citation_factory(cited_by=case)
  55. timestamp = check_timestamps_changed(case, timestamp)
  56. # updating inbound references
  57. for obj, change_field, no_change_field in (
  58. (case.citations.first(), 'cite', 'normalized_cite'),
  59. (case.body_cache, 'html', 'text'),
  60. (extracted_cite, 'cite', 'rdb_cite'),
  61. ):
  62. # updating tracked field
  63. setattr(obj, change_field, 'foo')
  64. obj.save()
  65. timestamp = check_timestamps_changed(case, timestamp)
  66. # updated untracked field
  67. setattr(obj, no_change_field, 'foo')
  68. obj.save()
  69. check_timestamps_unchanged(case, timestamp)
  70. # deleting
  71. obj.delete()
  72. timestamp = check_timestamps_changed(case, timestamp)
  73. # updating outbound references
  74. for obj, change_field, no_change_field in (
  75. (case.reporter, 'full_name', 'notes'),
  76. (case.court, 'name', 'none'),
  77. (case.volume, 'volume_number', 'publisher'),
  78. (case.jurisdiction, 'name', 'none'),
  79. ):
  80. # updating tracked field
  81. setattr(obj, change_field, 'foo')
  82. obj.save()
  83. timestamp = check_timestamps_changed(case, timestamp)
  84. # updated untracked field
  85. setattr(obj, no_change_field, 'foo')
  86. obj.save()
  87. check_timestamps_unchanged(case, timestamp)
  88. @pytest.mark.django_db(databases=['capdb'])
  89. def test_case_deleted(volume_metadata):
  90. case = CaseMetadata.objects.create(volume=volume_metadata, reporter=volume_metadata.reporter)
  91. CaseLastUpdate.objects.filter(case=case).delete()
  92. CaseMetadata.objects.filter(id=case.id).delete()
  93. assert CaseDeleted.objects.filter(case_id=case.id, indexed=False).exists()