예제 #1
0
    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"
예제 #2
0
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"
예제 #3
0
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"
예제 #4
0
    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"
예제 #5
0
    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
예제 #6
0
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']}"
예제 #7
0
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']}"
예제 #8
0
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