test_canonical.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import unittest
  2. from sentry.utils.canonical import CanonicalKeyDict, CanonicalKeyView
  3. class CanonicalKeyViewTests(unittest.TestCase):
  4. canonical_data = {
  5. "release": "asdf",
  6. "exception": {"type": "DemoException"},
  7. "user": {"id": "DemoUser"},
  8. }
  9. legacy_data = {
  10. "release": "asdf",
  11. "sentry.interfaces.Exception": {"type": "DemoException"},
  12. "sentry.interfaces.User": {"id": "DemoUser"},
  13. }
  14. mixed_data = {
  15. "release": "asdf",
  16. "sentry.interfaces.User": {"id": "INVALID"},
  17. "exception": {"type": "DemoException"},
  18. "user": {"id": "DemoUser"},
  19. "sentry.interfaces.Exception": {"type": "INVALID"},
  20. }
  21. def test_len(self):
  22. assert len(CanonicalKeyView(self.canonical_data)) == 3
  23. assert len(CanonicalKeyView(self.legacy_data)) == 3
  24. assert len(CanonicalKeyView(self.mixed_data)) == 3
  25. def test_iter(self):
  26. assert list(CanonicalKeyView(self.canonical_data).keys()) == [
  27. "release",
  28. "exception",
  29. "user",
  30. ]
  31. assert list(CanonicalKeyView(self.legacy_data).keys()) == ["release", "exception", "user"]
  32. assert list(CanonicalKeyView(self.mixed_data).keys()) == ["release", "exception", "user"]
  33. def test_contains(self):
  34. assert "user" in CanonicalKeyView(self.canonical_data)
  35. assert "user" in CanonicalKeyView(self.legacy_data)
  36. assert "user" in CanonicalKeyView(self.mixed_data)
  37. assert "sentry.interfaces.User" in CanonicalKeyView(self.canonical_data)
  38. assert "sentry.interfaces.User" in CanonicalKeyView(self.legacy_data)
  39. assert "sentry.interfaces.User" in CanonicalKeyView(self.mixed_data)
  40. def test_getitem(self):
  41. assert CanonicalKeyView(self.canonical_data)["user"] == {"id": "DemoUser"}
  42. assert CanonicalKeyView(self.legacy_data)["user"] == {"id": "DemoUser"}
  43. assert CanonicalKeyView(self.mixed_data)["user"] == {"id": "DemoUser"}
  44. assert CanonicalKeyView(self.canonical_data)["sentry.interfaces.User"] == {"id": "DemoUser"}
  45. assert CanonicalKeyView(self.legacy_data)["sentry.interfaces.User"] == {"id": "DemoUser"}
  46. assert CanonicalKeyView(self.mixed_data)["sentry.interfaces.User"] == {"id": "DemoUser"}
  47. class CanonicalKeyDictTests(unittest.TestCase):
  48. canonical_data = {
  49. "release": "asdf",
  50. "exception": {"type": "DemoException"},
  51. "user": {"id": "DemoUser"},
  52. }
  53. def test_canonical(self):
  54. assert (
  55. CanonicalKeyDict(
  56. {
  57. "release": "asdf",
  58. "exception": {"type": "DemoException"},
  59. "user": {"id": "DemoUser"},
  60. }
  61. )
  62. == self.canonical_data
  63. )
  64. def test_legacy(self):
  65. assert (
  66. CanonicalKeyDict(
  67. {
  68. "release": "asdf",
  69. "sentry.interfaces.Exception": {"type": "DemoException"},
  70. "sentry.interfaces.User": {"id": "DemoUser"},
  71. }
  72. )
  73. == self.canonical_data
  74. )
  75. def test_mixed(self):
  76. assert (
  77. CanonicalKeyDict(
  78. {
  79. "release": "asdf",
  80. "exception": {"type": "DemoException"},
  81. "user": {"id": "DemoUser"},
  82. "sentry.interfaces.Exception": {"type": "INVALID"},
  83. "sentry.interfaces.User": {"id": "INVALID"},
  84. }
  85. )
  86. == self.canonical_data
  87. )
  88. def test_getitem_setitem(self):
  89. d = CanonicalKeyDict({"user": {"id": "DemoUser"}})
  90. d["user"] = {"id": "other"}
  91. assert d["user"] == {"id": "other"}
  92. assert d["sentry.interfaces.User"] == {"id": "other"}
  93. d = CanonicalKeyDict({"user": {"id": "DemoUser"}})
  94. d["sentry.interfaces.User"] = {"id": "other"}
  95. assert d["user"] == {"id": "other"}
  96. assert d["sentry.interfaces.User"] == {"id": "other"}
  97. def test_delitem(self):
  98. d = CanonicalKeyDict({"user": {"id": "DemoUser"}})
  99. del d["user"]
  100. assert d == {}
  101. d = CanonicalKeyDict({"user": {"id": "DemoUser"}})
  102. del d["sentry.interfaces.User"]
  103. assert d == {}
  104. def test_contains(self):
  105. d = CanonicalKeyDict({"user": {"id": "DemoUser"}})
  106. assert "user" in d
  107. assert "sentry.interfaces.User" in d
  108. def test_len(self):
  109. assert (
  110. len(
  111. CanonicalKeyDict(
  112. {
  113. "release": "asdf",
  114. "exception": {"type": "DemoException"},
  115. "user": {"id": "DemoUser"},
  116. "sentry.interfaces.Exception": {"type": "INVALID"},
  117. "sentry.interfaces.User": {"id": "INVALID"},
  118. }
  119. )
  120. )
  121. == 3
  122. )
  123. class LegacyCanonicalKeyDictTests(unittest.TestCase):
  124. canonical_data = {
  125. "release": "asdf",
  126. "sentry.interfaces.Exception": {"type": "DemoException"},
  127. "sentry.interfaces.User": {"id": "DemoUser"},
  128. }
  129. def test_canonical(self):
  130. assert (
  131. CanonicalKeyDict(
  132. {
  133. "release": "asdf",
  134. "exception": {"type": "DemoException"},
  135. "user": {"id": "DemoUser"},
  136. },
  137. legacy=True,
  138. )
  139. == self.canonical_data
  140. )
  141. def test_legacy(self):
  142. assert (
  143. CanonicalKeyDict(
  144. {
  145. "release": "asdf",
  146. "sentry.interfaces.Exception": {"type": "DemoException"},
  147. "sentry.interfaces.User": {"id": "DemoUser"},
  148. },
  149. legacy=True,
  150. )
  151. == self.canonical_data
  152. )
  153. def test_mixed(self):
  154. assert (
  155. CanonicalKeyDict(
  156. {
  157. "release": "asdf",
  158. "sentry.interfaces.Exception": {"type": "DemoException"},
  159. "sentry.interfaces.User": {"id": "DemoUser"},
  160. "exception": {"type": "INVALID"},
  161. "user": {"id": "INVALID"},
  162. },
  163. legacy=True,
  164. )
  165. == self.canonical_data
  166. )
  167. def test_getitem_setitem(self):
  168. d = CanonicalKeyDict({"user": {"id": "DemoUser"}}, legacy=True)
  169. d["user"] = {"id": "other"}
  170. assert d["user"] == {"id": "other"}
  171. assert d["sentry.interfaces.User"] == {"id": "other"}
  172. d = CanonicalKeyDict({"user": {"id": "DemoUser"}}, legacy=True)
  173. d["sentry.interfaces.User"] = {"id": "other"}
  174. assert d["user"] == {"id": "other"}
  175. assert d["sentry.interfaces.User"] == {"id": "other"}
  176. class DoubleAliasingTests(unittest.TestCase):
  177. def test_canonical(self):
  178. view = CanonicalKeyView({"logentry": "foo"})
  179. assert len(view) == 1
  180. assert list(view.keys()) == ["logentry"]
  181. assert "logentry" in view
  182. assert "sentry.interfaces.Message" in view
  183. assert "message" in view
  184. assert view["logentry"] == "foo"
  185. assert view["sentry.interfaces.Message"] == "foo"
  186. assert view["message"] == "foo"
  187. def test_legacy_first(self):
  188. view = CanonicalKeyView({"sentry.interfaces.Message": "foo"})
  189. assert len(view) == 1
  190. assert list(view.keys()) == ["logentry"]
  191. assert "logentry" in view
  192. assert "sentry.interfaces.Message" in view
  193. assert "message" in view
  194. assert view["logentry"] == "foo"
  195. assert view["sentry.interfaces.Message"] == "foo"
  196. assert view["message"] == "foo"
  197. def test_legacy_second(self):
  198. view = CanonicalKeyView({"message": "foo"})
  199. assert len(view) == 1
  200. assert list(view.keys()) == ["logentry"]
  201. assert "logentry" in view
  202. assert "sentry.interfaces.Message" in view
  203. assert "message" in view
  204. assert view["logentry"] == "foo"
  205. assert view["sentry.interfaces.Message"] == "foo"
  206. assert view["message"] == "foo"
  207. def test_override(self):
  208. view = CanonicalKeyView({"logentry": "foo", "sentry.interfaces.Message": "bar"})
  209. assert len(view) == 1
  210. assert list(view.keys()) == ["logentry"]
  211. assert "logentry" in view
  212. assert "sentry.interfaces.Message" in view
  213. assert "message" in view
  214. assert view["logentry"] == "foo"
  215. assert view["sentry.interfaces.Message"] == "foo"
  216. assert view["message"] == "foo"
  217. def test_two_legacy(self):
  218. view = CanonicalKeyView({"message": "bar", "sentry.interfaces.Message": "foo"})
  219. assert len(view) == 1
  220. assert list(view.keys()) == ["logentry"]
  221. assert "logentry" in view
  222. assert "sentry.interfaces.Message" in view
  223. assert "message" in view
  224. assert view["logentry"] == "foo"
  225. assert view["sentry.interfaces.Message"] == "foo"
  226. assert view["message"] == "foo"