test_snapshots.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from pathlib import Path
  2. from tempfile import TemporaryDirectory
  3. import pytest
  4. from sentry.backup.comparators import get_default_comparators
  5. from sentry.backup.findings import ComparatorFindingKind, InstanceID
  6. from sentry.backup.imports import import_in_global_scope
  7. from sentry.backup.scopes import ExportScope
  8. from sentry.backup.validate import validate
  9. from sentry.testutils.factories import get_fixture_path
  10. from sentry.testutils.helpers.backups import (
  11. NOOP_PRINTER,
  12. BackupTestCase,
  13. ValidationError,
  14. clear_database,
  15. export_to_file,
  16. )
  17. from sentry.testutils.silo import region_silo_test
  18. from sentry.utils import json
  19. @region_silo_test
  20. class SnapshotTests(BackupTestCase):
  21. """
  22. Tests against specific JSON snapshots.
  23. """
  24. def setUp(self):
  25. super().setUp()
  26. clear_database(reset_pks=True)
  27. def import_export_fixture_then_validate(
  28. self, *, tmp_out_path: Path, fixture_file_name: str
  29. ) -> json.JSONData:
  30. """
  31. Test helper that validates that data imported from a fixture `.json` file correctly matches
  32. the actual outputted export data.
  33. """
  34. fixture_file_path = get_fixture_path("backup", fixture_file_name)
  35. with open(fixture_file_path) as backup_file:
  36. expect = json.load(backup_file)
  37. with open(fixture_file_path, "rb") as fixture_file:
  38. import_in_global_scope(fixture_file, printer=NOOP_PRINTER)
  39. actual = export_to_file(tmp_out_path, ExportScope.Global)
  40. res = validate(expect, actual, get_default_comparators())
  41. if res.findings:
  42. raise ValidationError(res)
  43. return actual
  44. def test_date_with_and_without_zeroed_millis(self):
  45. with TemporaryDirectory() as tmp_dir, pytest.raises(ValidationError) as execinfo:
  46. tmp_out_path = Path(tmp_dir).joinpath(f"{self._testMethodName}.json")
  47. self.import_export_fixture_then_validate(
  48. tmp_out_path=tmp_out_path, fixture_file_name="datetime-millis.json"
  49. )
  50. findings = execinfo.value.info.findings
  51. assert len(findings) == 1
  52. assert findings[0].kind == ComparatorFindingKind.UnequalJSON
  53. assert findings[0].on == InstanceID("sentry.option", 2)
  54. assert findings[0].left_pk == 2
  55. assert findings[0].right_pk == 2
  56. assert """- "last_updated": "2023-06-22T00:00:00Z",""" in findings[0].reason
  57. assert """+ "last_updated": "2023-06-22T00:00:00.000Z",""" in findings[0].reason
  58. def test_app_user_with_empty_email(self):
  59. with TemporaryDirectory() as tmp_dir:
  60. tmp_out_path = Path(tmp_dir).joinpath(f"{self._testMethodName}.json")
  61. self.import_export_fixture_then_validate(
  62. tmp_out_path=tmp_out_path, fixture_file_name="app-user-with-empty-email.json"
  63. )