import gzip import unittest from flask import Flask, request from app.routes.sync_request_parser import ( parse_confirm_payload, parse_json_request, parse_pull_payload, parse_push_payload, ) class SyncRequestParserTests(unittest.TestCase): def setUp(self) -> None: self.app = Flask(__name__) def test_parse_json_request_with_gzip(self) -> None: payload = gzip.compress(b'{"client_id":"c1","changes":[]}') with self.app.test_request_context( "/api/sync/push", method="POST", data=payload, headers={"Content-Encoding": "gzip"}, ): data, error = parse_json_request(request, allow_gzip=True) self.assertIsNone(error) self.assertEqual(data, {"client_id": "c1", "changes": []}) def test_parse_json_request_invalid_content_type(self) -> None: with self.app.test_request_context("/api/sync/pull", method="POST", data="not-json"): data, error = parse_json_request(request) self.assertIsNone(data) self.assertEqual(error, "Content-Type должен быть application/json") def test_parse_pull_payload_limit_validation(self) -> None: client_id, limit, cname, error = parse_pull_payload({"client_id": "node-1", "limit": "25"}) self.assertIsNone(error) self.assertEqual(client_id, "node-1") self.assertEqual(limit, 25) self.assertIsNone(cname) client_id, limit, cname, error = parse_pull_payload( {"client_id": "node-1", "limit": "25", "client_name": " Field-1 "} ) self.assertIsNone(error) self.assertEqual(cname, "Field-1") client_id, limit, cname, error = parse_pull_payload({"client_id": "node-1", "limit": "bad"}) self.assertIsNone(client_id) self.assertIsNone(limit) self.assertIsNone(cname) self.assertEqual(error, "limit должен быть числом") def test_parse_confirm_and_push_payloads(self) -> None: client_id, task_ids, error = parse_confirm_payload( {"client_id": "node-1", "task_ids": ["t1", "t2"]} ) self.assertIsNone(error) self.assertEqual(client_id, "node-1") self.assertEqual(task_ids, ["t1", "t2"]) client_id, changes, error = parse_push_payload({"client_id": "node-1", "changes": []}) self.assertIsNone(error) self.assertEqual(client_id, "node-1") self.assertEqual(changes, []) if __name__ == "__main__": unittest.main()