test_strings.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from django.test import override_settings
  2. from sentry.sentry_metrics.indexer.mock import MockIndexer
  3. from sentry.sentry_metrics.indexer.strings import SHARED_STRINGS, StaticStringIndexer
  4. from sentry.sentry_metrics.use_case_id_registry import UseCaseID
  5. use_case_id = UseCaseID.SESSIONS
  6. def test_static_strings_only() -> None:
  7. indexer = StaticStringIndexer(MockIndexer())
  8. org_strings = {2: {"release"}, 3: {"production", "environment", "release"}}
  9. results = indexer.bulk_record({use_case_id: org_strings})
  10. assert results[use_case_id][2]["release"] == SHARED_STRINGS["release"]
  11. assert results[use_case_id][3]["production"] == SHARED_STRINGS["production"]
  12. assert results[use_case_id][3]["environment"] == SHARED_STRINGS["environment"]
  13. assert results[use_case_id][3]["release"] == SHARED_STRINGS["release"]
  14. def test_resolve_shared_org_existing_entry() -> None:
  15. """
  16. Tests it is able to resolve shared strings
  17. """
  18. indexer = StaticStringIndexer(MockIndexer())
  19. actual = indexer.resolve_shared_org("release")
  20. expected = SHARED_STRINGS["release"]
  21. assert actual == expected
  22. def test_reverse_resolve_shared_org_existing_entry() -> None:
  23. """
  24. Tests it is able to return correct strings for known
  25. shared string ids
  26. """
  27. indexer = StaticStringIndexer(MockIndexer())
  28. release_idx = indexer.resolve_shared_org("release")
  29. assert release_idx is not None
  30. actual = indexer.reverse_shared_org_resolve(release_idx)
  31. assert actual == "release"
  32. def test_resolve_shared_org_no_entry() -> None:
  33. """
  34. Tests that it returns None for unknown strings
  35. """
  36. indexer = StaticStringIndexer(MockIndexer())
  37. actual = indexer.resolve_shared_org("SOME_MADE_UP_STRING")
  38. assert actual is None
  39. def test_reverse_resolve_shared_org_no_entry() -> None:
  40. indexer = StaticStringIndexer(MockIndexer())
  41. # shared string start quite high 2^63 so anything smaller should return None
  42. actual = indexer.reverse_shared_org_resolve(5)
  43. assert actual is None
  44. REINDEXED_INTS = {12345678: "release"}
  45. @override_settings(SENTRY_METRICS_INDEXER_REINDEXED_INTS=REINDEXED_INTS)
  46. def test_reverse_resolve_reindexed():
  47. """
  48. If we have deleted a record accidentally and whose id still lives in
  49. ClickHouse, then we need to account for the re-indexed id. Since the
  50. indexer table has a unique contraint on the org and string, we have a
  51. hardcoded setting that let's us patch reverse_resolve so that we don't
  52. get MetricIndexNotFound and return a 500.
  53. """
  54. indexer = StaticStringIndexer(MockIndexer())
  55. id = indexer.record(use_case_id, 2, "release")
  56. # for mypy
  57. assert id
  58. assert indexer.reverse_resolve(UseCaseID.SESSIONS, 1, id) == "release"
  59. assert indexer.reverse_resolve(UseCaseID.SESSIONS, 1, 12345678) == "release"