test_schemas.py 3.34 KB
Newer Older
1
from openapi_spec_validator import OpenAPIV30SpecValidator
2 3
from openapi_spec_validator.readers import read_from_filename
from openapi_schema_validator import validate
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
4
from jsonschema.validators import RefResolver
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
5
import unittest
6
import json
7
import os
8
from generate_schema_config import write_schema, get_swagger_config
9 10 11 12


MOCK_DATA_DIR = "examples/"

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
13

14 15 16 17 18 19 20 21 22 23 24 25 26
class SchemaTestCase(unittest.TestCase):
    def load_schema(self, file_path=None):
        if file_path:
            schema_path = file_path
        else:
            schema_path = os.getenv("SCHEMA_PATH")
        schema, _ = read_from_filename(schema_path)
        return schema

    @classmethod
    def setUpClass(cls):
        test_schema_path = "tests/test_swagger.json"
        os.environ["SCHEMA_PATH"] = test_schema_path
27
        swagger_config = get_swagger_config()
28 29 30
        write_schema(swagger_config, test_schema_path)


31 32
class SchemaError(Exception):
    """
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
33
    Test config specs of swagger.json for projects
34
    """
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
35

36 37 38
    def __init__(self, exception_type, message):
        self.type = exception_type
        self.message = message
39
        super().__init__(message)
40 41


42 43 44 45 46 47 48 49 50 51 52 53 54
class TestCompiledSoarSpec(SchemaTestCase):
    """
    Test the saved version of the compiled schema has been updated
    """

    def test_compiled_spec_matches_definitions(self):
        print("TEST: definitions match project/soar/swagger.json")
        derived_schema = self.load_schema()
        saved_schema = self.load_schema("project/soar/swagger.json")
        self.assertEqual(saved_schema, derived_schema)


class TestSpecs(SchemaTestCase):
55 56 57 58
    def test_swagger_specs(self):
        """
        Test specs (swagger.json generated from generate_schema_config.py)
        """
59 60
        print("TEST: compiled schema matches openapi v3 spec")
        schema = self.load_schema()
61 62
        errors = list(OpenAPIV30SpecValidator(schema).iter_errors())
        self.assertEqual(len(errors), 0)
63

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
64

65
class TestAllMessageExamples(SchemaTestCase):
66 67 68 69
    def test_schema_specs(self):
        """
        Test specs (swagger.json generated from generate_schema_config.py)
        """
70
        schema = self.load_schema()
71 72 73 74

        partner_dir_list = os.listdir(MOCK_DATA_DIR)

        for partner in partner_dir_list:
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
            if not partner.endswith(".py"):
                print("TEST: Partner is %s" % partner.upper())
                message_list = os.listdir(os.path.join(MOCK_DATA_DIR, partner))
                for message_type in message_list:
                    if message_type.endswith(".json"):
                        print("Testing %s now..." % message_type)

                        f = open(
                            os.path.join(
                                MOCK_DATA_DIR,
                                partner,
                                message_type,
                            )
                        )
                        mock_message = json.load(f)
                        ref_resolver = RefResolver.from_schema(schema)

                        self.assertIsNone(
                            validate(
                                mock_message,
                                schema["components"]["schemas"]["MESSAGE"],
                                resolver=ref_resolver,
                            )
                        )
                        f.close()
                        print("Done.")
101

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
102 103

if __name__ == "__main__":
104
    unittest.main()