test_schemas.py 9.8 KB
Newer Older
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
1
from openapi_spec_validator import openapi_v30_spec_validator
2 3 4 5 6 7 8 9 10 11 12
from openapi_spec_validator.readers import read_from_filename
from openapi_schema_validator import validate
from jsonschema import FormatChecker
from tests.fixtures.schemas import (
    acknowledgement_schema,
    message_header,
    observation_schema,
    planning_configuration_schema,
    platform_status_schema,
    mission_plan_schema,
)
13

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
14
import unittest
15
import json
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
import os
from jsonschema.validators import RefResolver
from openapi_schema_validator import validate

# class ValidateResponse:
#     def __init__(self, valid, error):
#         self.valid = valid
#         self.error = error

SCHEMA_DIR = "projects/soar/swagger.json"
MOCK_DATA_DIR = "examples/"

class SchemaError(Exception):
    """
    """
    def __init__(self, exception_type, message):
        self.type = exception_type
        self.message = message
        super().__init__(self.message)
35 36 37 38 39 40 41 42 43 44


class TestSpecs(unittest.TestCase):
    def test_swagger_specs(self):
        """
        Test specs (swagger.json generated from generate_schema_config.py)
        """
        schema, spec_url = read_from_filename("tests/fixtures/swagger.json")
        self.assertIsNone(openapi_v30_spec_validator.validate(schema))

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
class TestAllMessageExamples(unittest.TestCase):
    def test_schema_specs(self):
        """
        Test specs (swagger.json generated from generate_schema_config.py)
        """
        schema_ref = open(SCHEMA_DIR)
        schema = json.load(schema_ref)
        schema_ref.close()


        partner_dir_list = os.listdir(MOCK_DATA_DIR)
        

        for partner in partner_dir_list:
            message_list = os.listdir(os.path.join(MOCK_DATA_DIR, partner))
            for message_type in message_list:
                print("Testing message %s by %s now..." % (message_type, partner))

                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()
        
        schema_ref.close()
        
79 80 81 82 83 84 85 86 87 88 89 90

class TestSchema(unittest.TestCase):
    def test_sample_hydrosurv_messages(self):
        """
        Test schema - Hydrosurv Messages
        """
        message_types = ["acknowledgement", "mission_plan", "platform_status"]
        for item in message_types:
            f = open("examples/hydrosurv_adapter/%s.json" % item)
            mock_data = json.load(f)
            header_data = mock_data["header"]
            payload_data = mock_data["payload"]
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
91 92 93 94 95 96 97
            self.assertIsNone(
                validate(
                    header_data,
                    message_header,
                    format_checker=FormatChecker(),
                )
            )
98 99 100
            if item == "acknowledgement":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
101 102 103
                        payload_data,
                        acknowledgement_schema,
                        format_checker=FormatChecker(),
104 105 106 107
                    )
                )
            elif item == "mission_plan":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
108 109 110 111 112
                    validate(
                        payload_data,
                        mission_plan_schema,
                        format_checker=FormatChecker(),
                    )
113 114 115 116
                )
            elif item == "platform_status":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
117 118 119
                        payload_data,
                        platform_status_schema,
                        format_checker=FormatChecker(),
120 121 122
                    )
                )

123 124
            f.close()

125 126 127 128 129 130 131 132 133 134
    def test_sample_gui_messages(self):
        """
        Test schema - GUI Messages
        """
        message_types = ["planning_configuration"]
        for item in message_types:
            f = open("examples/gui_adapter/%s.json" % item)
            mock_data = json.load(f)
            header_data = mock_data["header"]
            payload_data = mock_data["payload"]
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
135 136 137 138 139 140 141
            self.assertIsNone(
                validate(
                    header_data,
                    message_header,
                    format_checker=FormatChecker(),
                )
            )
142 143 144 145 146 147 148 149 150
            if item == "planning_configuration":
                self.assertIsNone(
                    validate(
                        payload_data,
                        planning_configuration_schema,
                        format_checker=FormatChecker(),
                    )
                )

151 152
            f.close()

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
    def test_sample_ecosub_messages(self):
        """
        Test schema - Ecosub Messages
        """
        message_types = [
            "observation",
            "mission_plan",
            "platform_status",
            "platform_status-from_usbl_example",
        ]
        for item in message_types:
            f = open("examples/ecosub_adapter/%s.json" % item)
            mock_data = json.load(f)
            header_data = mock_data["header"]
            payload_data = mock_data["payload"]
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
168 169 170 171 172 173 174
            self.assertIsNone(
                validate(
                    header_data,
                    message_header,
                    format_checker=FormatChecker(),
                )
            )
175 176 177
            if item == "platform_status-from_usbl_example.json":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
178 179 180
                        payload_data,
                        platform_status_schema,
                        format_checker=FormatChecker(),
181 182 183 184
                    )
                )
            elif item == "mission_plan":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
185 186 187 188 189
                    validate(
                        payload_data,
                        mission_plan_schema,
                        format_checker=FormatChecker(),
                    )
190 191 192 193
                )
            elif item == "platform_status":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
194 195 196
                        payload_data,
                        platform_status_schema,
                        format_checker=FormatChecker(),
197 198 199 200
                    )
                )
            elif item == "observation":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
201 202 203 204 205
                    validate(
                        payload_data,
                        observation_schema,
                        format_checker=FormatChecker(),
                    )
206
                )
James Kirk's avatar
James Kirk committed
207

208
            f.close()
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227

    def test_sample_autonomy_engine_messages(self):
        """
        Test schema - Autonomy Engine Messages
        """
        message_types = [
            "planning_configuration",
            "mission_plan_AH1",
            "mission_plan_ECOSUB",
            "mission_plan_HYDROSURV",
            "platform_status",
            "platform_status-from_usbl_example",
            "acknowledgement",
        ]
        for item in message_types:
            f = open("examples/autonomy_engine_adapter/%s.json" % item)
            mock_data = json.load(f)
            header_data = mock_data["header"]
            payload_data = mock_data["payload"]
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
228 229 230 231 232 233 234
            self.assertIsNone(
                validate(
                    header_data,
                    message_header,
                    format_checker=FormatChecker(),
                )
            )
235 236 237
            if item == "platform_status-from_usbl_example.json":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
238 239 240
                        payload_data,
                        platform_status_schema,
                        format_checker=FormatChecker(),
241 242 243 244
                    )
                )
            elif item == "mission_plan_AH1":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
245 246 247 248 249
                    validate(
                        payload_data,
                        mission_plan_schema,
                        format_checker=FormatChecker(),
                    )
250 251 252
                )
            elif item == "mission_plan_ECOSUB":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
253 254 255 256 257
                    validate(
                        payload_data,
                        mission_plan_schema,
                        format_checker=FormatChecker(),
                    )
258 259 260
                )
            elif item == "mission_plan_HYDROSURV":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
261 262 263 264 265
                    validate(
                        payload_data,
                        mission_plan_schema,
                        format_checker=FormatChecker(),
                    )
266 267 268 269
                )
            elif item == "platform_status":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
270 271 272
                        payload_data,
                        platform_status_schema,
                        format_checker=FormatChecker(),
273 274 275 276
                    )
                )
            elif item == "observation":
                self.assertIsNone(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
277 278 279 280 281
                    validate(
                        payload_data,
                        observation_schema,
                        format_checker=FormatChecker(),
                    )
282 283 284 285 286 287 288 289 290 291 292 293
                )
            elif item == "planning_configuration":
                self.assertIsNone(
                    validate(
                        payload_data,
                        planning_configuration_schema,
                        format_checker=FormatChecker(),
                    )
                )
            elif item == "acknowledgement":
                self.assertIsNone(
                    validate(
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
294 295 296
                        payload_data,
                        acknowledgement_schema,
                        format_checker=FormatChecker(),
297 298 299
                    )
                )

300 301
            f.close()

Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
302 303

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