Skip to content

Commit 1dd6684

Browse files
committed
Implemented tests for RegisterServerWorker
1 parent 4ffcd58 commit 1dd6684

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
from copy import deepcopy
2+
3+
import pytest
4+
from sage_utils.amqp.clients import RpcAmqpClient
5+
from sage_utils.constants import VALIDATION_ERROR
6+
from sage_utils.wrappers import Response
7+
8+
from app.game_servers.documents import GameServer
9+
from app.workers.register_server import RegisterServerWorker
10+
11+
12+
REQUEST_QUEUE = RegisterServerWorker.QUEUE_NAME
13+
REQUEST_EXCHANGE = RegisterServerWorker.REQUEST_EXCHANGE_NAME
14+
RESPONSE_EXCHANGE = RegisterServerWorker.RESPONSE_EXCHANGE_NAME
15+
16+
17+
@pytest.mark.asyncio
18+
async def test_worker_returns_a_validation_error_for_missing_fields(sanic_server):
19+
await GameServer.collection.delete_many({})
20+
21+
client = RpcAmqpClient(
22+
sanic_server.app,
23+
routing_key=REQUEST_QUEUE,
24+
request_exchange=REQUEST_EXCHANGE,
25+
response_queue='',
26+
response_exchange=RESPONSE_EXCHANGE
27+
)
28+
response = await client.send(payload={})
29+
30+
assert Response.ERROR_FIELD_NAME in response.keys()
31+
error = response[Response.ERROR_FIELD_NAME]
32+
33+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
34+
assert error[Response.ERROR_TYPE_FIELD_NAME] == VALIDATION_ERROR
35+
36+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
37+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]) == 4
38+
39+
for field in ['host', 'port', 'available_slots', 'game_mode']:
40+
assert field in error[Response.ERROR_DETAILS_FIELD_NAME]
41+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME][field]) == 1
42+
assert error[Response.ERROR_DETAILS_FIELD_NAME][field][0] == 'Missing data for ' \
43+
'required field.'
44+
45+
servers_count = await GameServer.collection.find().count()
46+
assert servers_count == 0
47+
48+
await GameServer.collection.delete_many({})
49+
50+
51+
@pytest.mark.asyncio
52+
async def test_worker_registers_a_new_server_successfully(sanic_server):
53+
await GameServer.collection.delete_many({})
54+
55+
client = RpcAmqpClient(
56+
sanic_server.app,
57+
routing_key=REQUEST_QUEUE,
58+
request_exchange=REQUEST_EXCHANGE,
59+
response_queue='',
60+
response_exchange=RESPONSE_EXCHANGE
61+
)
62+
response = await client.send(payload={
63+
'host': '127.0.0.1',
64+
'port': 9000,
65+
'available_slots': 100,
66+
'credentials': {
67+
'token': 'super_secret_token'
68+
},
69+
'game_mode': '1v1'
70+
})
71+
72+
assert Response.EVENT_FIELD_NAME in response.keys()
73+
assert Response.CONTENT_FIELD_NAME in response.keys()
74+
content = response[Response.CONTENT_FIELD_NAME]
75+
76+
assert len(content.keys()) == 1
77+
assert 'id' in content.keys()
78+
79+
servers_count = await GameServer.collection.find().count()
80+
assert servers_count == 1
81+
82+
await GameServer.collection.delete_many({})
83+
84+
85+
@pytest.mark.asyncio
86+
async def test_worker_updates_a_new_server_successfully(sanic_server):
87+
await GameServer.collection.delete_many({})
88+
89+
create_data = {
90+
'host': '127.0.0.1',
91+
'port': 9000,
92+
'available_slots': 100,
93+
'credentials': {
94+
'token': 'super_secret_token'
95+
},
96+
'game_mode': '1v1'
97+
}
98+
99+
game_server = GameServer(**create_data)
100+
await game_server.commit()
101+
102+
update_data = deepcopy(create_data)
103+
update_data.update({
104+
'id': str(game_server.id),
105+
'available_slots': 80
106+
})
107+
108+
client = RpcAmqpClient(
109+
sanic_server.app,
110+
routing_key=REQUEST_QUEUE,
111+
request_exchange=REQUEST_EXCHANGE,
112+
response_queue='',
113+
response_exchange=RESPONSE_EXCHANGE
114+
)
115+
response = await client.send(payload=update_data)
116+
117+
assert Response.EVENT_FIELD_NAME in response.keys()
118+
assert Response.CONTENT_FIELD_NAME in response.keys()
119+
content = response[Response.CONTENT_FIELD_NAME]
120+
121+
assert len(content.keys()) == 1
122+
assert 'id' in content.keys()
123+
124+
servers_count = await GameServer.collection.find().count()
125+
assert servers_count == 1
126+
127+
await GameServer.collection.delete_many({})
128+
129+
130+
@pytest.mark.asyncio
131+
async def test_worker_returns_a_validation_error_for_invalid_data(sanic_server):
132+
await GameServer.collection.delete_many({})
133+
134+
client = RpcAmqpClient(
135+
sanic_server.app,
136+
routing_key=REQUEST_QUEUE,
137+
request_exchange=REQUEST_EXCHANGE,
138+
response_queue='',
139+
response_exchange=RESPONSE_EXCHANGE
140+
)
141+
response = await client.send(payload="/", raw_data=True)
142+
143+
assert Response.ERROR_FIELD_NAME in response.keys()
144+
error = response[Response.ERROR_FIELD_NAME]
145+
146+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
147+
assert error[Response.ERROR_TYPE_FIELD_NAME] == VALIDATION_ERROR
148+
149+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
150+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]) == 4
151+
152+
for field in ['host', 'port', 'available_slots', 'game_mode']:
153+
assert field in error[Response.ERROR_DETAILS_FIELD_NAME]
154+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME][field]) == 1
155+
assert error[Response.ERROR_DETAILS_FIELD_NAME][field][0] == 'Missing data for ' \
156+
'required field.'
157+
158+
servers_count = await GameServer.collection.find().count()
159+
assert servers_count == 0
160+
161+
await GameServer.collection.delete_many({})
162+
163+
164+
@pytest.mark.asyncio
165+
async def test_worker_returns_a_validation_error_for_invalid_id(sanic_server):
166+
await GameServer.collection.delete_many({})
167+
168+
create_data = {
169+
'id': "INVALID_ID",
170+
'host': '127.0.0.1',
171+
'port': 9000,
172+
'available_slots': 100,
173+
'credentials': {
174+
'token': 'super_secret_token'
175+
},
176+
'game_mode': '1v1'
177+
}
178+
179+
client = RpcAmqpClient(
180+
sanic_server.app,
181+
routing_key=REQUEST_QUEUE,
182+
request_exchange=REQUEST_EXCHANGE,
183+
response_queue='',
184+
response_exchange=RESPONSE_EXCHANGE
185+
)
186+
response = await client.send(payload=create_data)
187+
188+
assert Response.ERROR_FIELD_NAME in response.keys()
189+
error = response[Response.ERROR_FIELD_NAME]
190+
191+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
192+
assert error[Response.ERROR_TYPE_FIELD_NAME] == VALIDATION_ERROR
193+
194+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
195+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]) == 1
196+
197+
assert 'id' in error[Response.ERROR_DETAILS_FIELD_NAME]
198+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]['id']) == 1
199+
assert error[Response.ERROR_DETAILS_FIELD_NAME]['id'][0] == "'INVALID_ID' is not a valid " \
200+
"ObjectId, it must be a 12-byte " \
201+
"input or a 24-character hex " \
202+
"string."
203+
204+
servers_count = await GameServer.collection.find().count()
205+
assert servers_count == 0
206+
207+
await GameServer.collection.delete_many({})

0 commit comments

Comments
 (0)