"screenshots/example_bdy_coords.png" did not exist on "b5b10a4d4074bbcd46bae2ef32563be24cded4f9"
test_schemas.py 3.26 KB
Newer Older
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
1
from openapi_spec_validator import openapi_v30_spec_validator
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, 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 27 28 29
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
        write_schema(swagger_config, test_schema_path)


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

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


41 42 43 44 45 46 47 48 49 50 51 52 53
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):
54 55 56 57
    def test_swagger_specs(self):
        """
        Test specs (swagger.json generated from generate_schema_config.py)
        """
58 59
        print("TEST: compiled schema matches openapi v3 spec")
        schema = self.load_schema()
60 61
        self.assertIsNone(openapi_v30_spec_validator.validate(schema))

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
62

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

        partner_dir_list = os.listdir(MOCK_DATA_DIR)

        for partner in partner_dir_list:
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
            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.")
99

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
100 101

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