mirror of
https://github.com/zulip/zulip.git
synced 2025-11-08 07:52:19 +00:00
This is preparatory work towards adding a Topic model. We plan to use the local variable name as 'topic' for the Topic model objects. Currently, we use *topic as the local variable name for topic names. We rename local variables of the form *topic to *topic_name so that we don't need to think about type collisions in individual code paths where we might want to talk about both Topic objects and strings for the topic name.
288 lines
11 KiB
Python
288 lines
11 KiB
Python
from zerver.lib.test_classes import WebhookTestCase
|
|
|
|
|
|
class SentryHookTests(WebhookTestCase):
|
|
STREAM_NAME = "sentry"
|
|
URL_TEMPLATE = "/api/v1/external/sentry?&api_key={api_key}&stream={stream}"
|
|
WEBHOOK_DIR_NAME = "sentry"
|
|
|
|
def test_event_for_exception_golang(self) -> None:
|
|
expected_topic_name = '*url.Error: Get "bad_url": unsupported protocol scheme ""'
|
|
expected_message = """\
|
|
**New exception:** [*url.Error: Get "bad_url": unsupported protocol scheme ""](https://sentry.io/organizations/hypro999-personal-organization/issues/1637164584/events/80777a9cc30e4d0eb8904333d5c298b0/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-04-29 11:23:45
|
|
**filename:** trigger-exception.go
|
|
```
|
|
|
|
Traceback:
|
|
```go
|
|
// Set the timeout to the maximum duration the program can afford to wait.
|
|
defer sentry.Flush(2 * time.Second)
|
|
|
|
resp, err := http.Get(os.Args[1])
|
|
if err != nil {
|
|
---> sentry.CaptureException(err)
|
|
log.Printf("reported to Sentry: %s", err)
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
```"""
|
|
self.check_webhook("event_for_exception_golang", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_exception_node(self) -> None:
|
|
expected_topic_name = "Error: Sample error from node."
|
|
expected_message = """\
|
|
**New exception:** [Error: Sample error from node.](https://sentry.io/organizations/hypro999-personal-organization/issues/1638852747/events/f9cb0f2afff74a5aa92e766fb7ac3fe3/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-04-30 06:19:33
|
|
**filename:** /home/hemanth/Desktop/sentry/trigger-exception.js
|
|
```
|
|
|
|
Traceback:
|
|
```javascript
|
|
dsn: 'https://redacted.ingest.sentry.io/5216640',
|
|
});
|
|
|
|
Sentry.withScope(function(scope) {
|
|
scope.addEventProcessor(function(event, hint) {
|
|
return event;
|
|
});
|
|
---> Sentry.captureException(new Error('Sample error from node.'));
|
|
});
|
|
|
|
|
|
```"""
|
|
self.check_webhook("event_for_exception_node", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_exception_python(self) -> None:
|
|
expected_topic_name = "Exception: Custom exception!"
|
|
expected_message = """\
|
|
**New exception:** [Exception: Custom exception!](https://sentry.io/organizations/hypro999-personal-organization/issues/1635244907/events/599349254a1447a99774b5310711c1a8/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-04-28 13:56:05
|
|
**filename:** trigger-exception.py
|
|
```
|
|
|
|
Traceback:
|
|
```python3
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sentry_sdk.init(dsn=SECRET_DSN)
|
|
try:
|
|
---> raise Exception("Custom exception!")
|
|
except Exception as e:
|
|
sentry_sdk.capture_exception(e)
|
|
|
|
```"""
|
|
self.check_webhook("event_for_exception_python", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_exception_rails(self) -> None:
|
|
expected_topic_name = "ZeroDivisionError: divided by 0"
|
|
expected_message = """\
|
|
**New exception:** [ZeroDivisionError: divided by 0](https://sentry.io/organizations/nitk-46/issues/4213933362/events/49b528e13e45497ab9adc3173fd2ed34/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2023-05-29 10:12:33
|
|
**filename:** app/controllers/articles_controller.rb
|
|
```
|
|
|
|
Traceback:
|
|
```ruby
|
|
class ArticlesController < ApplicationController
|
|
|
|
def index
|
|
|
|
begin
|
|
|
|
---> 132312 / 0
|
|
|
|
rescue ZeroDivisionError => exception
|
|
|
|
Sentry.capture_exception(exception)
|
|
|
|
end
|
|
|
|
```"""
|
|
self.check_webhook("event_for_exception_rails", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_exception_vue(self) -> None:
|
|
expected_topic_name = "TypeError: Cannot read properties of null (reading 'inser..."
|
|
expected_message = """\
|
|
**New exception:** [TypeError: Cannot read properties of null (reading 'insertBefore')](https://sentry.io/organizations/nitk-46/issues/4214010673/events/292f78454e774e62999506f759ad791d/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2023-05-29 11:08:30
|
|
**filename:** /node_modules/.vite/deps/chunk-G4DFXOZZ.js
|
|
```"""
|
|
self.check_webhook("event_for_exception_vue", expected_topic_name, expected_message)
|
|
|
|
def test_webhook_event_for_exception_python(self) -> None:
|
|
expected_topic_name = "ValueError: new sentry error."
|
|
expected_message = """\
|
|
**New exception:** [ValueError: new sentry error.](https://sentry.io/organizations/bar-foundation/issues/1972208801/events/c916dccfd58e41dcabaebef0091f0736/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-10-21 23:25:11
|
|
**filename:** trigger-exception.py
|
|
```
|
|
|
|
Traceback:
|
|
```python3
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sentry_sdk.init(dsn=DSN_SECRET)
|
|
try:
|
|
---> raise ValueError("new sentry error.")
|
|
except Exception as e:
|
|
sentry_sdk.capture_exception(e)
|
|
```"""
|
|
self.check_webhook(
|
|
"webhook_event_for_exception_python", expected_topic_name, expected_message
|
|
)
|
|
|
|
def test_webhook_event_for_exception_javascript(self) -> None:
|
|
expected_topic_name = 'TypeError: can\'t access property "bar", x.foo is undefined'
|
|
expected_message = """\
|
|
**New exception:** [TypeError: can't access property "bar", x.foo is undefined](https://sentry.io/organizations/foo-bar-org/issues/1982047746/events/f3bf5fc4e354451db9e885a69b2a2b51/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-10-26 16:39:54
|
|
**filename:** None
|
|
```"""
|
|
self.check_webhook(
|
|
"webhook_event_for_exception_javascript", expected_topic_name, expected_message
|
|
)
|
|
|
|
def test_event_for_exception_js(self) -> None:
|
|
expected_topic_name = "Error: Something external broke."
|
|
expected_message = """\
|
|
**New exception:** [Error: Something external broke.](https://sentry.io/organizations/hypro999-personal-organization/issues/1731239773/events/355c3b2a142046629dd410db2fdda003/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-06-17 14:42:54
|
|
**filename:** /mnt/data/Documents/Stuff%20for%20Zulip/Repos/sentry/js/external.js
|
|
```"""
|
|
self.check_webhook("event_for_exception_js", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_message_golang(self) -> None:
|
|
expected_topic_name = "A test message event from golang."
|
|
expected_message = """\
|
|
**New message event:** [A test message event from golang.](https://sentry.io/organizations/hypro999-personal-organization/issues/1638844654/events/01ecb45633bc4f5ca940ada671124c8f/)
|
|
```quote
|
|
**level:** info
|
|
**timestamp:** 2020-04-30 06:14:13
|
|
```"""
|
|
self.check_webhook("event_for_message_golang", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_message_node(self) -> None:
|
|
expected_topic_name = "Test event from node."
|
|
expected_message = """\
|
|
**New message event:** [Test event from node.](https://sentry.io/organizations/hypro999-personal-organization/issues/1638840427/events/6886bb1fe7ce4497b7836f6083d5fd34/)
|
|
```quote
|
|
**level:** info
|
|
**timestamp:** 2020-04-30 06:09:56
|
|
```"""
|
|
self.check_webhook("event_for_message_node", expected_topic_name, expected_message)
|
|
|
|
def test_event_for_message_python(self) -> None:
|
|
expected_topic_name = "A simple message-based issue."
|
|
expected_message = """\
|
|
**New message event:** [A simple message-based issue.](https://sentry.io/organizations/hypro999-personal-organization/issues/1635261062/events/8da63b42375e4d3b803c377fefb062f8/)
|
|
```quote
|
|
**level:** info
|
|
**timestamp:** 2020-04-28 14:05:04
|
|
```"""
|
|
self.check_webhook("event_for_message_python", expected_topic_name, expected_message)
|
|
|
|
def test_issue_assigned_to_individual(self) -> None:
|
|
expected_topic_name = "A test message event from golang."
|
|
expected_message = """Issue **A test message event from golang.** has now been assigned to **Hemanth V. Alluri** by **Hemanth V. Alluri**."""
|
|
self.check_webhook("issue_assigned_to_individual", expected_topic_name, expected_message)
|
|
|
|
def test_issue_assigned_to_team(self) -> None:
|
|
expected_topic_name = "Exception: program has entered an invalid state."
|
|
expected_message = """Issue **Exception: program has entered an invalid state.** has now been assigned to **team lone-wolf** by **Hemanth V. Alluri**."""
|
|
self.check_webhook("issue_assigned_to_team", expected_topic_name, expected_message)
|
|
|
|
def test_issue_created_for_exception(self) -> None:
|
|
expected_topic_name = "Exception: Custom exception!"
|
|
expected_message = """\
|
|
**New issue created:** Exception: Custom exception!
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2020-04-28 13:56:05
|
|
**assignee:** No one
|
|
```"""
|
|
self.check_webhook("issue_created_for_exception", expected_topic_name, expected_message)
|
|
|
|
def test_issue_created_for_message(self) -> None:
|
|
expected_topic_name = "A simple message-based issue."
|
|
expected_message = """\
|
|
**New issue created:** A simple message-based issue.
|
|
```quote
|
|
**level:** info
|
|
**timestamp:** 2020-04-28 14:05:04
|
|
**assignee:** No one
|
|
```"""
|
|
self.check_webhook("issue_created_for_message", expected_topic_name, expected_message)
|
|
|
|
def test_issue_ignored(self) -> None:
|
|
expected_topic_name = "Exception: program has entered an invalid state."
|
|
expected_message = """Issue **Exception: program has entered an invalid state.** was ignored by **Hemanth V. Alluri**."""
|
|
self.check_webhook("issue_ignored", expected_topic_name, expected_message)
|
|
|
|
def test_issue_resolved(self) -> None:
|
|
expected_topic_name = "Exception: program has entered an invalid state."
|
|
expected_message = """Issue **Exception: program has entered an invalid state.** was marked as resolved by **Hemanth V. Alluri**."""
|
|
self.check_webhook("issue_resolved", expected_topic_name, expected_message)
|
|
|
|
def test_deprecated_exception_message(self) -> None:
|
|
expected_topic_name = "zulip"
|
|
expected_message = """\
|
|
New [issue](https://sentry.io/zulip/zulip/issues/156699934/) (level: ERROR):
|
|
|
|
``` quote
|
|
This is an example python exception
|
|
```"""
|
|
self.check_webhook("deprecated_exception_message", expected_topic_name, expected_message)
|
|
|
|
def test_sample_event_through_alert(self) -> None:
|
|
expected_topic_name = "This is an example Python exception"
|
|
expected_message = """\
|
|
**New message event:** [This is an example Python exception](https://sentry.io/organizations/nitk-46/issues/4218258981/events/b6eff1a49b1f4132850b1238d968da70/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2023-05-31 11:06:16
|
|
```"""
|
|
self.check_webhook("sample_event_through_alert", expected_topic_name, expected_message)
|
|
|
|
def test_sample_event_through_plugin(self) -> None:
|
|
expected_topic_name = "This is an example Python exception"
|
|
expected_message = """\
|
|
**New message event:** [This is an example Python exception](https://nitk-46.sentry.io/issues/4218258981/events/4dc4fc2858aa450eb658be9e5b8ad149/)
|
|
```quote
|
|
**level:** error
|
|
**timestamp:** 2023-07-09 20:41:24
|
|
```"""
|
|
self.check_webhook("sample_event_through_plugin", expected_topic_name, expected_message)
|
|
|
|
def test_raven_sdk_python_event(self) -> None:
|
|
payload = self.get_body("raven_sdk_python_event")
|
|
result = self.client_post(
|
|
self.url,
|
|
payload,
|
|
content_type="application/json",
|
|
)
|
|
self.assert_json_success(result)
|
|
self.assert_in_response(
|
|
"The 'Raven SDK' event isn't currently supported by the Sentry webhook; ignoring",
|
|
result,
|
|
)
|