packages feed

slackblocks-3.1.0: generator/test_generate.py

"""Fail closed when shared metadata outgrows the native generator."""
import copy
import json
import unittest
import generate


class GeneratorContracts(unittest.TestCase):
    def setUp(self):
        self.model = json.loads((generate.ROOT / "spec/model.json").read_text(encoding="utf-8"))

    def test_every_native_model_resolves(self):
        roles = generate.resolve(self.model)
        self.assertEqual(set(roles), {r['name'] for r in self.model['interfaces']})

    def test_unknown_field_kind(self):
        self.model['types'][0]['fields'][0]['kind'] = 'future-unimplemented-kind'
        with self.assertRaisesRegex(ValueError, 'Unknown field kind'):
            generate.resolve(self.model)

    def test_unknown_referenced_type(self):
        field = next(f for t in self.model['types'] for f in t['fields'] if 'type' in f)
        field['type'] = 'FutureModel'
        with self.assertRaisesRegex(ValueError, 'Unknown field type'):
            generate.resolve(self.model)

    def test_native_type_collision(self):
        self.model['types'].append(copy.deepcopy(self.model['types'][0]))
        with self.assertRaisesRegex(ValueError, 'Type name collision'):
            generate.resolve(self.model)

    def test_native_field_collision(self):
        self.model['types'][0]['fields'].append(copy.deepcopy(self.model['types'][0]['fields'][0]))
        with self.assertRaisesRegex(ValueError, 'Field name collision'):
            generate.resolve(self.model)

    def test_role_discriminator_collision(self):
        blocks = [t for t in self.model['types'] if t['package'] == 'block']
        blocks[1]['wireType'] = blocks[0]['wireType']
        with self.assertRaisesRegex(ValueError, 'Ambiguous role'):
            generate.resolve(self.model)

    def test_enum_constructor_collision(self):
        self.model['enums'][0]['constants'].append(copy.deepcopy(self.model['enums'][0]['constants'][0]))
        with self.assertRaisesRegex(ValueError, 'Enum constructor collision'):
            generate.resolve(self.model)

    def test_new_constraint_cannot_be_silently_ignored(self):
        limits = json.loads((generate.ROOT / 'spec/limits.json').read_text(encoding="utf-8"))
        vocabulary = json.loads((generate.ROOT / 'spec/vocabulary.json').read_text(encoding="utf-8"))
        limits['text']['future_rule'] = 1
        with self.assertRaisesRegex(ValueError, 'Invalid bound'):
            generate.schema(self.model, limits, vocabulary)


if __name__ == '__main__':
    unittest.main()