Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## Prepare environment
```
docker-compose -f base.yml up -d
```

## Run integration tests
```
docker-compose -f base.yml -f collector.yml run --rm integration-test
```

## Clear after run
```
docker-compose -f collector.yml down
```
15 changes: 15 additions & 0 deletions tests/base.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: "3.2"
services:

rabbitmq:
image: rabbitmq:3-management
ports:
- 15672:15672
- 5672:5672
volumes:
- ../registry/config/rabbit.definitions.json:/tmp/rabbit.definitions.json:ro
environment:
- RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=-rabbitmq_management load_definitions "/tmp/rabbit.definitions.json"

volumes:
mongodata:
19 changes: 19 additions & 0 deletions tests/collector.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: "3.2"
services:

collector:
build: ../collector
volumes:
- ./collector/.env:/app/.env
depends_on:
- rabbitmq

integration-test:
build: ./collector
volumes:
- ./collector/test.py:/usr/src/app/test.py
depends_on:
- collector

volumes:
mongodata:
10 changes: 10 additions & 0 deletions tests/collector/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
BROKER_URL=amqp://guest:guest@rabbitmq:5672/
EXCHANGE=errors
RETRY_NUMBER=10
RETRY_INTERVAL=4
JWT_SECRET=qwerty
MAX_HTTP_BODY_SIZE=2000000
MAX_ERROR_CATCHER_MESSAGE_SIZE=250
MAX_SOURCEMAP_CATCHER_MESSAGE_SIZE=250
LISTEN=0.0.0.0:3000
SOURCEMAP_EXCHANGE=release/javascript
12 changes: 12 additions & 0 deletions tests/collector/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM python:3.7.4

RUN apt-get update
RUN apt-get install -y python3-setuptools

COPY requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt

WORKDIR /usr/src/app

COPY test.py test.py
CMD [ "python", "test.py" ]
Empty file added tests/collector/README.md
Empty file.
1 change: 1 addition & 0 deletions tests/collector/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
requests
102 changes: 102 additions & 0 deletions tests/collector/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import requests
import unittest
import json


class TestErrorsRequestStructure(unittest.TestCase):

def test_http_empty_access(self):
response = json.loads(requests.get("http://collector:3000/").text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Invalid JSON format")

def test_http_random_data(self):
response = json.loads(requests.post("http://collector:3000/", data="1234567890").text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Invalid JSON format")

def test_http_empty_payload(self):
response = json.loads(requests.post("http://collector:3000/", data="{}").text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Payload is empty")

def test_http_empty_token(self):
response = json.loads(requests.post("http://collector:3000/", data=json.dumps({"payload": ""})).text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Token is empty")

def test_http_empty_cather_type(self):
response = json.loads(requests.post("http://collector:3000/", data=json.dumps({"payload": "", "token": "abcdef"})).text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "CatcherType is empty")

def test_http_invalid_jwt(self):
response = json.loads(requests.post("http://collector:3000/", data=json.dumps({"payload": "", "token": "abcdef", "CatcherType": "python"})).text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "invalid JWT signature")

def test_http_empty_valid(self):
response = json.loads(requests.post("http://collector:3000/", data=json.dumps({"payload": "", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9qZWN0SWQiOiJwcm9qSUQiLCJpYXQiOjE1NjcxMDQ4NDF9.nJveSAXwd38yCSG2PjOjBbQRmWtBtM6x7JWjshwl-sY", "CatcherType": "errors/python"})).text)
self.assertEqual(response['error'], False)


class TestErrorsRequestLimits(unittest.TestCase):

def setUp(self) -> None:
self.valid_payload = {
"payload": "",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9qZWN0SWQiOiJwcm9qSUQiLCJpYXQiOjE1NjcxMDQ4NDF9.nJveSAXwd38yCSG2PjOjBbQRmWtBtM6x7JWjshwl-sY",
"CatcherType": "errors/python"
}

def test_error_small_payload(self):
response = json.loads(requests.post("http://collector:3000/", data=json.dumps(self.valid_payload)).text)
self.assertEqual(response['error'], False)

def test_error_equal_to_limit_payload(self):
message = {**self.valid_payload, "payload": "a" * 57} # enlarge payload to 250 bytes
self.assertEqual(len(json.dumps(message)), 250)
response = json.loads(requests.post("http://collector:3000/", data=json.dumps(message)).text)
self.assertEqual(response['error'], False)

def test_error_large_payload(self):
message = {**self.valid_payload, "payload": "a" * 58} # enlarge payload to 251 bytes
self.assertEqual(len(json.dumps(message)), 251)
response = json.loads(requests.post("http://collector:3000/", data=json.dumps(message)).text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Request is too large")


class TestSourcemapsRequestLimits(unittest.TestCase):

def setUp(self) -> None:
self.headers = {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9qZWN0SWQiOiJwcm9qSUQiLCJpYXQiOjE1NjcxMDQ4NDF9.nJveSAXwd38yCSG2PjOjBbQRmWtBtM6x7JWjshwl-sY"}

def test_sourcemap_small_payload(self):
response = json.loads(requests.post(
"http://collector:3000/sourcemap",
headers=self.headers,
files={"release": (None, "1.0.1"), "sourcemap1": "mini"}
).text)
self.assertEqual(response['error'], False)

def test_sourcemap_equal_to_limit_payload(self):
response = json.loads(requests.post(
"http://collector:3000/sourcemap",
headers=self.headers,
files={"release": (None, "1.0.1"), "sourcemap1": "equal"}
).text)
self.assertEqual(response['error'], False)

def test_sourcemap_large_payload(self):
response = json.loads(requests.post(
"http://collector:3000/sourcemap",
headers=self.headers,
files={"release": (None, "1.0.1"), "sourcemap1": "muuuch"}
).text)
self.assertEqual(response['error'], True)
self.assertEqual(response['message'], "Request is too large")


if __name__ == '__main__':
unittest.main()
5 changes: 5 additions & 0 deletions tests/test-collector.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
docker-compose -f base.yml up -d
sleep 10
docker-compose -f base.yml -f collector.yml build
docker-compose -f base.yml -f collector.yml run --rm integration-test
docker-compose -f base.yml -f collector.yml down