Browse Source

test: Rewrite tests to not access the events table (#14374)

Events table is getting removed, update tests to get event from Snuba
instead
Lyn Nagara 5 years ago
parent
commit
6c491fa745

+ 4 - 3
tests/sentry/lang/java/test_plugin.py

@@ -8,9 +8,10 @@ from django.conf import settings
 from django.core.urlresolvers import reverse
 from django.core.files.uploadedfile import SimpleUploadedFile
 
-from sentry.models import Event
+from sentry import eventstore
 from sentry.testutils import TestCase
 
+
 PROGUARD_UUID = '6dc7fdb0-d2fb-4c8e-9d6b-bb1aa98929b1'
 PROGUARD_SOURCE = b'''\
 org.slf4j.helpers.Util$ClassContextSecurityManager -> org.a.b.g$a:
@@ -116,7 +117,7 @@ class BasicResolvingIntegrationTest(TestCase):
             resp = self._postWithHeader(event_data)
         assert resp.status_code == 200
 
-        event = Event.objects.first()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
 
         bt = event.interfaces['exception'].values[0].stacktrace
         frames = bt.frames
@@ -202,7 +203,7 @@ class BasicResolvingIntegrationTest(TestCase):
         resp = self._postWithHeader(event_data)
         assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
 
         assert len(event.data['errors']) == 1
         assert event.data['errors'][0] == {

+ 2 - 2
tests/sentry/lang/javascript/test_example.py

@@ -6,8 +6,8 @@ import os
 import json
 import responses
 
+from sentry import eventstore
 from sentry.testutils import TestCase
-from sentry.models import Event
 
 
 def get_fixture_path(name):
@@ -60,7 +60,7 @@ class ExampleTestCase(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
 
         exception = event.interfaces['exception']
         frame_list = exception.values[0].stacktrace.frames

+ 53 - 23
tests/sentry/lang/javascript/test_plugin.py

@@ -5,12 +5,15 @@ from __future__ import absolute_import
 import pytest
 import os.path
 import responses
-
 from mock import patch
+from datetime import timedelta
+
 from django.conf import settings
+from django.utils import timezone
 
-from sentry.models import Event, File, Release, ReleaseFile
-from sentry.testutils import TestCase
+from sentry import eventstore
+from sentry.models import File, Release, ReleaseFile
+from sentry.testutils import TestCase, SnubaTestCase
 
 
 BASE64_SOURCEMAP = 'data:application/json;base64,' + (
@@ -28,13 +31,21 @@ def load_fixture(name):
         return fp.read()
 
 
-class JavascriptIntegrationTest(TestCase):
+class JavascriptIntegrationTest(TestCase, SnubaTestCase):
+    def setUp(self):
+        super(JavascriptIntegrationTest, self).setUp()
+        self.min_ago = (timezone.now() - timedelta(minutes=1)).isoformat()[:19]
+
+    def get_event(self):
+        return eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
+
     @pytest.mark.skipif(
         settings.SENTRY_TAGSTORE == 'sentry.tagstore.v2.V2TagStorage',
         reason='Queries are completly different when using tagstore'
     )
     def test_adds_contexts_without_device(self):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'request': {
@@ -65,7 +76,8 @@ class JavascriptIntegrationTest(TestCase):
             resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.first()
+        event = self.get_event()
+
         contexts = event.interfaces['contexts'].to_json()
         assert contexts.get('os') == {
             'name': 'Windows 8',
@@ -80,6 +92,7 @@ class JavascriptIntegrationTest(TestCase):
 
     def test_adds_contexts_with_device(self):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'request': {
@@ -97,7 +110,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         contexts = event.interfaces['contexts'].to_json()
         assert contexts.get('os') == {
             'name': 'Android',
@@ -118,6 +131,7 @@ class JavascriptIntegrationTest(TestCase):
 
     def test_adds_contexts_with_ps4_device(self):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'request': {
@@ -135,7 +149,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         contexts = event.interfaces['contexts'].to_json()
         assert contexts.get('os') is None
         assert contexts.get('browser') is None
@@ -149,6 +163,7 @@ class JavascriptIntegrationTest(TestCase):
     @patch('sentry.lang.javascript.processor.fetch_file')
     def test_source_expansion(self, mock_fetch_file):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -190,7 +205,7 @@ class JavascriptIntegrationTest(TestCase):
             allow_scraping=True,
         )
 
-        event = Event.objects.get()
+        event = self.get_event()
         exception = event.interfaces['exception']
         frame_list = exception.values[0].stacktrace.frames
 
@@ -211,6 +226,7 @@ class JavascriptIntegrationTest(TestCase):
     @patch('sentry.lang.javascript.processor.discover_sourcemap')
     def test_inlined_sources(self, mock_discover_sourcemap, mock_fetch_file):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -249,7 +265,7 @@ class JavascriptIntegrationTest(TestCase):
             allow_scraping=True,
         )
 
-        event = Event.objects.get()
+        event = self.get_event()
         exception = event.interfaces['exception']
         frame_list = exception.values[0].stacktrace.frames
 
@@ -262,6 +278,7 @@ class JavascriptIntegrationTest(TestCase):
     @responses.activate
     def test_error_message_translations(self):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'logentry': {
@@ -284,7 +301,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
 
         message = event.interfaces['logentry']
         assert message.formatted == 'ReferenceError: Cannot define property \'foo\': object is not extensible'
@@ -322,6 +339,7 @@ class JavascriptIntegrationTest(TestCase):
         responses.add(responses.GET, 'http://example.com/index.html', body='Not Found', status=404)
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -356,7 +374,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [
             {
                 'type': 'js_no_source',
@@ -404,6 +422,7 @@ class JavascriptIntegrationTest(TestCase):
         responses.add(responses.GET, 'http://example.com/index.html', body='Not Found', status=404)
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -438,7 +457,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [
             {
                 'type': 'js_no_source',
@@ -494,6 +513,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'release': 'abc',
@@ -518,7 +538,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert 'errors' not in event.data
 
         exception = event.interfaces['exception']
@@ -567,6 +587,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -597,7 +618,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert 'errors' not in event.data
 
         exception = event.interfaces['exception']
@@ -739,6 +760,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'release': 'abc',
@@ -769,7 +791,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert 'errors' not in event.data
 
         exception = event.interfaces['exception']
@@ -896,6 +918,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'release': 'abc',
@@ -927,7 +950,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert 'errors' not in event.data
 
         exception = event.interfaces['exception']
@@ -973,6 +996,7 @@ class JavascriptIntegrationTest(TestCase):
         responses.add(responses.GET, 'http://example.com/file1.js', body='Not Found', status=404)
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -1005,7 +1029,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [
             {
                 'url': u'http://example.com/file1.js',
@@ -1049,6 +1073,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -1073,7 +1098,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [
             {
                 'url': u'http://example.com/unsupported.sourcemap.js',
@@ -1083,6 +1108,7 @@ class JavascriptIntegrationTest(TestCase):
 
     def test_failed_sourcemap_expansion_data_url(self):
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -1107,7 +1133,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [{'url': u'<data url>', 'type': 'js_no_source'}]
 
     @responses.activate
@@ -1123,6 +1149,7 @@ class JavascriptIntegrationTest(TestCase):
             body='{}'
         )
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -1151,7 +1178,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert 'errors' not in event.data
 
     @responses.activate
@@ -1175,6 +1202,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'javascript',
             'exception': {
@@ -1211,7 +1239,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         assert event.data['errors'] == [
             {
                 'url': u'http://example.com/file1.js',
@@ -1257,6 +1285,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'node',
             'release': 'nodeabc123',
@@ -1312,7 +1341,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
 
         exception = event.interfaces['exception']
         frame_list = exception.values[0].stacktrace.frames
@@ -1367,6 +1396,7 @@ class JavascriptIntegrationTest(TestCase):
         )
 
         data = {
+            'timestamp': self.min_ago,
             'message': 'hello',
             'platform': 'node',
             'exception': {
@@ -1421,7 +1451,7 @@ class JavascriptIntegrationTest(TestCase):
         resp = self._postWithHeader(data)
         assert resp.status_code, 200
 
-        event = Event.objects.get()
+        event = self.get_event()
         exception = event.interfaces['exception']
         frame_list = exception.values[0].stacktrace.frames
 

+ 4 - 47
tests/sentry/models/tests.py

@@ -7,13 +7,13 @@ import pytest
 from datetime import timedelta
 from django.core import mail
 from django.core.urlresolvers import reverse
-from django.db import connection
+# from django.db import connection
 from django.http import HttpRequest
 from django.utils import timezone
 from exam import fixture
 
 from sentry import nodestore
-from sentry.db.models.fields.node import NodeData, NodeIntegrityFailure
+from sentry.db.models.fields.node import NodeIntegrityFailure
 from sentry.models import ProjectKey, Event, LostPasswordHash
 from sentry.testutils import TestCase
 from sentry.utils.compat import pickle
@@ -90,50 +90,6 @@ class GroupIsOverResolveAgeTest(TestCase):
 
 
 class EventNodeStoreTest(TestCase):
-    def test_does_transition_data_to_node(self):
-        group = self.group
-        data = {'key': 'value'}
-
-        query_bits = [
-            "INSERT INTO sentry_message (group_id, project_id, data, message, datetime)",
-            "VALUES(%s, %s, %s, %s, %s)",
-        ]
-        params = [group.id, group.project_id, compress(pickle.dumps(data)), 'test', timezone.now()]
-
-        # This is pulled from SQLInsertCompiler
-        if connection.features.can_return_id_from_insert:
-            r_fmt, r_params = connection.ops.return_insert_id()
-            if r_fmt:
-                query_bits.append(r_fmt % Event._meta.pk.column)
-                params += r_params
-
-        cursor = connection.cursor()
-        cursor.execute(' '.join(query_bits), params)
-
-        if connection.features.can_return_id_from_insert:
-            event_id = connection.ops.fetch_returned_insert_id(cursor)
-        else:
-            event_id = connection.ops.last_insert_id(
-                cursor, Event._meta.db_table, Event._meta.pk.column
-            )
-
-        event = Event.objects.get(id=event_id)
-        assert type(event.data) == NodeData
-        assert event.data == data
-
-        event.save()
-
-        assert event.data == data
-        assert event.data.id is not None
-
-        node_id = event.data.id
-        event = Event.objects.get(id=event_id)
-
-        Event.objects.bind_nodes([event], 'data')
-
-        assert event.data == data
-        assert event.data.id == node_id
-
     def test_event_node_id(self):
         # Create an event without specifying node_id. A node_id should be generated
         e1 = Event(project_id=1, event_id='abc', data={'foo': 'bar'})
@@ -163,7 +119,8 @@ class EventNodeStoreTest(TestCase):
         # Create an event with a new event body that specifies the node_id to use.
         e3 = Event(project_id=1, event_id='ghi', data={'baz': 'quux', 'node_id': '1:ghi'})
         assert e3.data.id == '1:ghi', "Event should have the specified node_id"
-        assert e3.data.data == {'baz': 'quux'}, "Event body should be the one provided (sans node_id)"
+        assert e3.data.data == {
+            'baz': 'quux'}, "Event body should be the one provided (sans node_id)"
         e3.save()
         e3_body = nodestore.get('1:ghi')
         assert e3_body == {'baz': 'quux'}, "Event body should be saved to nodestore"

+ 11 - 28
tests/snuba/models/test_event.py

@@ -24,7 +24,7 @@ class SnubaEventTest(TestCase, SnubaTestCase):
         )
 
         # Raw event data
-        data = {
+        self.data = {
             'event_id': self.event_id,
             'primary_hash': '1' * 32,
             'project_id': self.proj1.id,
@@ -51,20 +51,20 @@ class SnubaEventTest(TestCase, SnubaTestCase):
         make_django_event = True
         if make_django_event:
             self.create_event(
-                event_id=data['event_id'],
+                event_id=self.data['event_id'],
                 datetime=self.now,
                 project=self.proj1,
                 group=self.proj1group1,
-                data=data,
+                data=self.data,
             )
             nodestore_data = nodestore.get(
                 SnubaEvent.generate_node_id(
                     self.proj1.id, self.event_id))
-            assert data['event_id'] == nodestore_data['event_id']
+            assert self.data['event_id'] == nodestore_data['event_id']
         else:
             node_id = SnubaEvent.generate_node_id(self.proj1.id, self.event_id)
-            nodestore.set(node_id, data)
-            assert nodestore.get(node_id) == data
+            nodestore.set(node_id, self.data)
+            assert nodestore.get(node_id) == self.data
 
     def test_fetch(self):
         event = SnubaEvent.get_event(self.proj1.id, self.event_id)
@@ -83,39 +83,22 @@ class SnubaEventTest(TestCase, SnubaTestCase):
         # And the full user should be in there.
         assert event.data['user']['id'] == u'user1'
 
-    def test_same(self):
-        django_event = Event.objects.get(project_id=self.proj1.id, event_id=self.event_id)
-        snuba_event = SnubaEvent.get_event(self.proj1.id, self.event_id)
-
-        assert django_event.group_id == snuba_event.group_id
-        assert django_event.interfaces == snuba_event.interfaces
-        assert django_event.datetime == snuba_event.datetime
-        assert django_event.platform == snuba_event.platform
-
-        assert django_event.as_dict() == snuba_event.as_dict()
-
-        django_serialized = serialize(django_event)
-        snuba_serialized = serialize(snuba_event)
-        del django_serialized['id']
-        del snuba_serialized['id']
-        assert django_serialized == snuba_serialized
-
     def test_minimal(self):
         """
         Test that a SnubaEvent that only loads minimal data from snuba
         can still be serialized completely by falling back to nodestore data.
         """
-        django_event = Event.objects.get(project_id=self.proj1.id, event_id=self.event_id)
         snuba_event = SnubaEvent.get_event(
             self.proj1.id,
             self.event_id,
             snuba_cols=SnubaEvent.minimal_columns)
 
-        django_serialized = serialize(django_event)
         snuba_serialized = serialize(snuba_event)
-        del django_serialized['id']
-        del snuba_serialized['id']
-        assert django_serialized == snuba_serialized
+
+        assert snuba_serialized['message'] == self.data['message']
+        assert snuba_serialized['eventID'] == self.data['event_id']
+        assert snuba_serialized['platform'] == self.data['platform']
+        assert snuba_serialized['user']['email'] == self.data['user']['email']
 
     def test_bind_nodes(self):
         """

+ 5 - 4
tests/symbolicator/test_minidump_full.py

@@ -9,8 +9,9 @@ from six import BytesIO
 from django.core.urlresolvers import reverse
 from django.core.files.uploadedfile import SimpleUploadedFile
 
+from sentry import eventstore
 from sentry.testutils import TransactionTestCase
-from sentry.models import Event, EventAttachment
+from sentry.models import EventAttachment
 
 from tests.symbolicator import get_fixture_path, insta_snapshot_stacktrace_data
 
@@ -70,7 +71,7 @@ class SymbolicatorMinidumpIntegrationTest(TransactionTestCase):
                 })
                 assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
         insta_snapshot_stacktrace_data(self, event.data)
 
         attachments = sorted(
@@ -97,7 +98,7 @@ class SymbolicatorMinidumpIntegrationTest(TransactionTestCase):
                 resp = self._postMinidumpWithHeader(f, raw=True)
                 assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
         insta_snapshot_stacktrace_data(self, event.data)
 
     def test_missing_dsym(self):
@@ -108,6 +109,6 @@ class SymbolicatorMinidumpIntegrationTest(TransactionTestCase):
                 })
                 assert resp.status_code == 200
 
-        event = Event.objects.get()
+        event = eventstore.get_events(filter_keys={'project_id': [self.project.id]})[0]
         insta_snapshot_stacktrace_data(self, event.data)
         assert not EventAttachment.objects.filter(event_id=event.event_id)