def test_list_events(self): test_cases = [ { "name":"existing event", "db": MockSchemaStorage({ ("client1","event_name"): {"type":"object","required":["color"]}, }), "client": "client1", "status_code": 200, "code": "SUCCEEDED", "contains": [["client1","event_name"],], }, ] for tc in test_cases: self.app.db = tc['db'] rv = self.client.get(f"/{tc['client']}/list_events") assert rv.status_code == tc['status_code'], f"{tc['name']}: wrong status_code" assert rv.json['code'] == tc['code'], f"{tc['name']}: wrong code" if tc['code'] != 'SUCCEEDED': continue for event in tc['contains']: assert event in rv.json['events'], f"{tc['name']}: missing event"
def test_event_processor_list_registerd_events(): test_cases = [ { "name": "base case", "storage":MockSchemaStorage({ ("a","e1"): "", ("a","e2"): "", ("b","e1"): "", }), "query_client":"a", "contains": [ ("a","e1"), ("a","e2"), ], "not contains": [ ("b","e1"), ], }, ] for tc in test_cases: ep = EventProcessor(MockEventStream(), tc["storage"]) registered_events = ep.list_registered_events(tc["query_client"]) for event in tc["contains"]: assert event in registered_events, f"{tc['name']}: '{event}' not found" for event in tc["not contains"]: assert event not in registered_events, f"{tc['name']}: '{event}' should not be present"
def test_event_processor_recieve_event(): test_cases = [ { "name": "valid event", "data": {"color":"blue"}, "client": 'client1', "event": "event_name", "storage": MockSchemaStorage({ ("client1","event_name"): {"type":"object","required":["color"]}, }), "success": True, }, { "name": "invalid event", "data": {"name":"walter"}, "client": 'client1', "event": "event_name", "storage": MockSchemaStorage({ ("client1","event_name"): {"type":"object","required":["color"]}, }), "success": False, }, { "name": "unregistered event", "data": {"name":"walter"}, "client": 'client1', "event": "new_event", "storage": MockSchemaStorage(), "success": False, }, ] for tc in test_cases: es = MockEventStream() ep = EventProcessor(es, tc["storage"]) success = ep.receive_event(tc['client'], tc['event'], tc['data']) assert success == tc["success"], f"{tc['name']}: success did not match" if not tc["success"]: continue events = es.list_events(tc['client'], tc['event']) assert tc['data'] in events, "{tc['name']}: event not stored in stream"
def test_send_event(self): test_cases = [ { "name":"existing event", "db": MockSchemaStorage({ ("client1","event_name"): {"type":"object","required":["color"]}, }), "client": "client1", "event_name": "event_name", "data": {"color":"blue"}, "status_code": 200, "code": "SUCCEEDED", }, { "name":"new event", "db": MockSchemaStorage(), "client": "client1", "event_name": "event_name", "data": {"color":"blue"}, "status_code": 400, "code": "FAILED", }, { "name":"invalid schema", "db": MockSchemaStorage({ ("client1","event_name"): {"type":"object","required":["color"]}, }), "client": "client1", "event_name": "event_name", "data": {"name":"Jonas"}, "status_code": 400, "code": "FAILED", }, ] for tc in test_cases: self.app.db = tc['db'] rv = self.client.post( f"/{tc['client']}/{tc['event_name']}/send_event", data={"event": json.dumps(tc['data'])}, ) assert rv.status_code == tc['status_code'], f"{tc['name']}: wrong status_code" assert rv.json['code'] == tc['code'], f"{tc['name']}: wrong code"
def setUp(self): # This import is out of the top level so that we can # set the TEST_ENV variable from web.endpoints import app app.testing = True app.db = MockSchemaStorage() app.es = MockEventStream() self.client = app.test_client() self.app = app
def test_event_processor_register_event(): test_cases = [ { "name": "succesfully register", "client": "client1", "event_name": "new_event", "schema": {"type":"object","required":["color"]}, "storage": MockSchemaStorage(), "success":True, }, { "name": "already registered", "client": "client1", "event_name": "old_event", "schema": {"type":"object","required":["color"]}, "storage": MockSchemaStorage({("client1","old_event"): {}}), "success":False, }, { "name": "invalid schema", "client": "client1", "event_name": "new_event", "schema": {"type":"random_type"}, "storage": MockSchemaStorage(), "success":False, }, ] for tc in test_cases: ep = EventProcessor(MockEventStream(), tc["storage"]) got = ep.register_event(tc["client"], tc["event_name"], tc["schema"]) assert got == tc["success"], f"Error on test_case: {tc['name']}" if not tc["success"]: continue got = ep.get_event(tc["client"], tc["event_name"]) assert got == tc["schema"], f"Error, stored schema does not match registerd: {tc['name']}"
def test_event_processor_valid_event(): test_cases = [ { "name": "valid event", "data": {"fruit":"apple","color":"blue"}, "schema": { "type":"object", "required": ["color", "fruit"], "properties": { "fruit":{"type":"string", "description":"name of fruit"}, "color":{"type":"string", "description":"name of color"}, }, "additionalProperties": False, }, "out": True }, { "name": "invalid event", "data": {"fruit":"apple"}, "schema": { "type":"object", "required": ["color", "fruit"], "properties": { "fruit":{"type":"string", "description":"name of fruit"}, "color":{"type":"string", "description":"name of color"}, }, "additionalProperties": False, }, "out": False }, ] for tc in test_cases: ep = EventProcessor(MockEventStream(), MockSchemaStorage()) got = ep._valid_event(tc["data"], tc["schema"]) assert got == tc["out"], f"Error on test_case: {tc['name']}"
import os import json from flask import Flask from flask import request from flask import current_app from core.event_processor import EventProcessor from schema_storages.mock import MockSchemaStorage from schema_storages.postgres import PostgresSchemaStorage from event_streams.mock import MockEventStream from event_streams.kafka_stream import KafkaEventStream app = Flask(__name__) app.db = MockSchemaStorage() app.es = MockEventStream() @app.route("/<client>/<event_name>/send_event", methods=["POST"]) def send_event(client, event_name): ep = EventProcessor(current_app.es, current_app.db) data = request.form.get("event") if not data: return {"code":"FAILED", "msg": "'event' key not in data"}, 400 data = try_json_decode(data) if not data: return {"code":"FAILED", "msg": "'event' is not a valid json"}, 400 succ = ep.receive_event(client, event_name, data) if not succ: return {"code":"FAILED", "msg": "failed to send event"}, 400