Skip to content

Commit da5408d

Browse files
committed
Implemented tests for updated game server info worker
1 parent 5adda02 commit da5408d

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
import pytest
2+
from sage_utils.amqp.clients import RpcAmqpClient
3+
from sage_utils.constants import VALIDATION_ERROR, NOT_FOUND_ERROR
4+
from sage_utils.wrappers import Response
5+
6+
from app.game_servers.documents import GameServer
7+
from app.workers.update_server import UpdateServerWorker
8+
9+
10+
REQUEST_QUEUE = UpdateServerWorker.QUEUE_NAME
11+
REQUEST_EXCHANGE = UpdateServerWorker.REQUEST_EXCHANGE_NAME
12+
RESPONSE_EXCHANGE = UpdateServerWorker.RESPONSE_EXCHANGE_NAME
13+
14+
15+
@pytest.mark.asyncio
16+
async def test_worker_returns_an_updated_information_about_slots(sanic_server):
17+
await GameServer.collection.delete_many({})
18+
19+
game_server = GameServer(**{
20+
'host': '127.0.0.1',
21+
'port': 9000,
22+
'available_slots': 100,
23+
'credentials': {
24+
'token': 'super_secret_token'
25+
},
26+
'game_mode': '1v1'
27+
})
28+
await game_server.commit()
29+
30+
client = RpcAmqpClient(
31+
sanic_server.app,
32+
routing_key=REQUEST_QUEUE,
33+
request_exchange=REQUEST_EXCHANGE,
34+
response_queue='',
35+
response_exchange=RESPONSE_EXCHANGE
36+
)
37+
data = {
38+
'id': str(game_server.id),
39+
'freed-slots': 10
40+
}
41+
response = await client.send(payload=data)
42+
43+
assert Response.EVENT_FIELD_NAME in response.keys()
44+
assert Response.CONTENT_FIELD_NAME in response.keys()
45+
content = response[Response.CONTENT_FIELD_NAME]
46+
47+
assert set(content.keys()) == {'id', 'available-slots'}
48+
assert content['id'] == str(game_server.id)
49+
assert content['available-slots'] == game_server.available_slots + data['freed-slots']
50+
51+
servers_count = await GameServer.collection.count_documents({})
52+
assert servers_count == 1
53+
54+
await GameServer.collection.delete_many({})
55+
56+
57+
@pytest.mark.asyncio
58+
async def test_worker_returns_not_found_error_for_non_existing_game_server(sanic_server):
59+
await GameServer.collection.delete_many({})
60+
61+
client = RpcAmqpClient(
62+
sanic_server.app,
63+
routing_key=REQUEST_QUEUE,
64+
request_exchange=REQUEST_EXCHANGE,
65+
response_queue='',
66+
response_exchange=RESPONSE_EXCHANGE
67+
)
68+
data = {
69+
'id': '5b6a085123cf24aef53b4c78',
70+
'freed-slots': 10
71+
}
72+
response = await client.send(payload=data)
73+
74+
assert Response.ERROR_FIELD_NAME in response.keys()
75+
error = response[Response.ERROR_FIELD_NAME]
76+
77+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
78+
assert error[Response.ERROR_TYPE_FIELD_NAME] == NOT_FOUND_ERROR
79+
80+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
81+
assert error[Response.ERROR_DETAILS_FIELD_NAME] == 'The requested game server ' \
82+
'was not found.'
83+
84+
servers_count = await GameServer.collection.count_documents({})
85+
assert servers_count == 0
86+
87+
await GameServer.collection.delete_many({})
88+
89+
90+
@pytest.mark.asyncio
91+
async def test_worker_returns_a_validation_error_for_missing_fields(sanic_server):
92+
await GameServer.collection.delete_many({})
93+
94+
client = RpcAmqpClient(
95+
sanic_server.app,
96+
routing_key=REQUEST_QUEUE,
97+
request_exchange=REQUEST_EXCHANGE,
98+
response_queue='',
99+
response_exchange=RESPONSE_EXCHANGE
100+
)
101+
response = await client.send(payload={})
102+
103+
assert Response.ERROR_FIELD_NAME in response.keys()
104+
error = response[Response.ERROR_FIELD_NAME]
105+
106+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
107+
assert error[Response.ERROR_TYPE_FIELD_NAME] == VALIDATION_ERROR
108+
109+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
110+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]) == 2
111+
112+
for field in ['id', 'freed-slots']:
113+
assert field in error[Response.ERROR_DETAILS_FIELD_NAME]
114+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME][field]) == 1
115+
assert error[Response.ERROR_DETAILS_FIELD_NAME][field][0] == 'Missing data for ' \
116+
'required field.'
117+
118+
servers_count = await GameServer.collection.count_documents({})
119+
assert servers_count == 0
120+
121+
await GameServer.collection.delete_many({})
122+
123+
124+
@pytest.mark.asyncio
125+
async def test_worker_returns_a_validation_error_for_invalid_id_and_slots_type(sanic_server):
126+
await GameServer.collection.delete_many({})
127+
128+
client = RpcAmqpClient(
129+
sanic_server.app,
130+
routing_key=REQUEST_QUEUE,
131+
request_exchange=REQUEST_EXCHANGE,
132+
response_queue='',
133+
response_exchange=RESPONSE_EXCHANGE
134+
)
135+
data = {
136+
'id': 'INVALID_OBJECT_ID',
137+
'freed-slots': 'INVALID_VALUE'
138+
}
139+
response = await client.send(payload=data)
140+
141+
assert Response.ERROR_FIELD_NAME in response.keys()
142+
error = response[Response.ERROR_FIELD_NAME]
143+
144+
assert Response.ERROR_TYPE_FIELD_NAME in error.keys()
145+
assert error[Response.ERROR_TYPE_FIELD_NAME] == VALIDATION_ERROR
146+
147+
assert Response.ERROR_DETAILS_FIELD_NAME in error.keys()
148+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]) == 2
149+
150+
assert 'id' in error[Response.ERROR_DETAILS_FIELD_NAME]
151+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]['id']) == 1
152+
assert error[Response.ERROR_DETAILS_FIELD_NAME]['id'][0] == "'INVALID_OBJECT_ID' is not a " \
153+
"valid ObjectId, it must be a " \
154+
"12-byte input or a " \
155+
"24-character hex string."
156+
157+
assert 'freed-slots' in error[Response.ERROR_DETAILS_FIELD_NAME]
158+
assert len(error[Response.ERROR_DETAILS_FIELD_NAME]['freed-slots']) == 1
159+
assert error[Response.ERROR_DETAILS_FIELD_NAME]['freed-slots'][0] == 'Not a valid integer.'
160+
161+
servers_count = await GameServer.collection.count_documents({})
162+
assert servers_count == 0
163+
164+
await GameServer.collection.delete_many({})

0 commit comments

Comments
 (0)