From 8a8259f85f17f5b7ffa6dc103b38ab477cb85753 Mon Sep 17 00:00:00 2001 From: Jan Willhaus Date: Sat, 18 May 2019 18:44:06 +0200 Subject: Move unittests to tests/ dir --- .coveragerc | 2 +- pytest.ini | 2 +- test/__init__.py | 0 test/schemas/country.json | 10 -- test/schemas/person.json | 10 -- test/test_core.py | 307 --------------------------------------------- tests/__init__.py | 0 tests/schemas/country.json | 10 ++ tests/schemas/person.json | 10 ++ tests/test_core.py | 307 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 329 insertions(+), 329 deletions(-) delete mode 100644 test/__init__.py delete mode 100644 test/schemas/country.json delete mode 100644 test/schemas/person.json delete mode 100644 test/test_core.py create mode 100644 tests/__init__.py create mode 100644 tests/schemas/country.json create mode 100644 tests/schemas/person.json create mode 100644 tests/test_core.py diff --git a/.coveragerc b/.coveragerc index 1b53185..0b060d5 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,7 +2,7 @@ source = warlock omit = - test/* + tests/* venv/* [report] diff --git a/pytest.ini b/pytest.ini index 1231a44..a07e947 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,5 @@ [pytest] -testpaths = test +testpaths = tests norecursedirs = .git venv __pycache__ addopts = --cov diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/test/schemas/country.json b/test/schemas/country.json deleted file mode 100644 index 730eb0d..0000000 --- a/test/schemas/country.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema", - "name": "Country", - "properties": { - "name": {"type": "string"}, - "population": {"type": "integer"}, - "overlord": { "$ref": "person.json#" } - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/test/schemas/person.json b/test/schemas/person.json deleted file mode 100644 index e517a53..0000000 --- a/test/schemas/person.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema", - "name": "Person", - "type" : "object", - "properties": { - "title": { "type": "string" }, - "firstname": { "type": "string" }, - "lastname": { "type": "string" } - } -} \ No newline at end of file diff --git a/test/test_core.py b/test/test_core.py deleted file mode 100644 index 51c0426..0000000 --- a/test/test_core.py +++ /dev/null @@ -1,307 +0,0 @@ -# Copyright 2012 Brian Waldon -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import copy -import unittest -import os - -import json - -import six - -import warlock - - -fixture = { - 'name': 'Country', - 'properties': { - 'name': {'type': 'string'}, - 'population': {'type': 'integer'}, - }, - 'additionalProperties': False, -} - - -complex_fixture = { - 'name': 'Mixmaster', - 'properties': { - 'sub': {'type': 'object', - 'properties': {'foo': {'type': 'string'}}} - }, -} - -parent_fixture = { - 'name': 'Parent', - 'properties': { - 'name': {'type': 'string'}, - 'children': {'type': 'array', 'items': [{'type': 'object'}]} - }, - 'required': ['name', 'children'] -} - -child_fixture = { - 'name': 'Child', - 'properties': { - 'age': {'type': 'integer'}, - 'mother': {'type': 'object'} - }, - 'required': ['age', 'mother'] -} - - -nameless_fixture = { - 'properties': { - 'name': {'type': 'string'}, - 'population': {'type': 'integer'}, - }, - 'additionalProperties': False, -} - - -class TestCore(unittest.TestCase): - def test_create_invalid_object(self): - Country = warlock.model_factory(fixture) - self.assertRaises(ValueError, Country, name=1) - - def test_class_name_from_unicode_schema_name(self): - fixture_copy = copy.deepcopy(fixture) - fixture_copy['name'] = six.text_type(fixture_copy['name']) - # Can't set class.__name__ to a unicode object, ensure warlock - # does some magic to make it possible - warlock.model_factory(fixture_copy) - - def test_invalid_operations(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - - # Ensure a valid object was created - self.assertEqual(sweden.name, 'Sweden') - self.assertEqual(sweden.population, 9379116) - - # Specific exceptions should be raised for invalid operations - self.assertRaises(AttributeError, getattr, sweden, 'overlord') - exc = warlock.InvalidOperation - self.assertRaises(exc, setattr, sweden, 'overlord', 'Bears') - self.assertRaises(exc, setattr, sweden, 'name', 5) - self.assertRaises(exc, setattr, sweden, 'population', 'N/A') - - def test_no_mask_arbitrary_properties(self): - fixture_copy = copy.deepcopy(fixture) - fixture_copy['additionalProperties'] = {'type': 'string'} - Country = warlock.model_factory(fixture_copy) - - # We should still depend on the schema for validation - self.assertRaises(ValueError, Country, GDP=56956) - - # But arbitrary properties should be allowed if they check out - sweden = Country(overlord='Waldon') - sweden.abbreviation = 'SE' - exc = warlock.InvalidOperation - self.assertRaises(exc, setattr, sweden, 'abbreviation', 0) - - def test_items(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - self.assertEqual(set(list(six.iteritems(sweden))), - set([('name', 'Sweden'), ('population', 9379116)])) - self.assertEqual(set(sweden.items()), - set([('name', 'Sweden'), ('population', 9379116)])) - - def test_update(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - exc = warlock.InvalidOperation - self.assertRaises(exc, sweden.update, {'population': 'N/A'}) - self.assertRaises(exc, sweden.update, {'overloard': 'Bears'}) - - def test_naming(self): - Country = warlock.model_factory(fixture) - self.assertEqual('Country', Country.__name__) - - Country2 = warlock.model_factory(fixture, name='Country2') - self.assertEqual('Country2', Country2.__name__) - - nameless = warlock.model_factory(nameless_fixture) - self.assertEqual('Model', nameless.__name__) - - nameless2 = warlock.model_factory(nameless_fixture, name='Country3') - self.assertEqual('Country3', nameless2.__name__) - - def test_deepcopy(self): - """Make sure we aren't leaking references.""" - Mixmaster = warlock.model_factory(complex_fixture) - mike = Mixmaster(sub={'foo': 'mike'}) - - self.assertEquals('mike', mike.sub['foo']) - - mike_1 = mike.copy() - mike_1['sub']['foo'] = 'james' - self.assertEquals('mike', mike.sub['foo']) - - mike_2 = dict(six.iteritems(mike)) - mike_2['sub']['foo'] = 'james' - self.assertEquals('mike', mike.sub['foo']) - - mike_2 = dict(mike.items()) - mike_2['sub']['foo'] = 'james' - self.assertEquals('mike', mike.sub['foo']) - - mike_3_sub = list(six.itervalues(mike))[0] - mike_3_sub['foo'] = 'james' - self.assertEquals('mike', mike.sub['foo']) - - mike_3_sub = list(mike.values())[0] - mike_3_sub['foo'] = 'james' - self.assertEquals('mike', mike.sub['foo']) - - def test_forbidden_methods(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - exc = warlock.InvalidOperation - self.assertRaises(exc, sweden.clear) - self.assertRaises(exc, sweden.pop, 0) - self.assertRaises(exc, sweden.popitem) - - def test_dict_syntax(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - - sweden['name'] = 'Finland' - self.assertEqual('Finland', sweden['name']) - - del sweden['name'] - self.assertRaises(AttributeError, getattr, sweden, 'name') - - def test_attr_syntax(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - - sweden.name = 'Finland' - self.assertEqual('Finland', sweden.name) - - delattr(sweden, 'name') - self.assertRaises(AttributeError, getattr, sweden, 'name') - - def test_changes(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - self.assertEqual(sweden.changes, {}) - sweden['name'] = 'Finland' - self.assertEqual(sweden.changes, {'name': 'Finland'}) - sweden['name'] = 'Norway' - self.assertEqual(sweden.changes, {'name': 'Norway'}) - - def test_patch_no_changes(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - self.assertEqual(sweden.patch, '[]') - - def test_patch_alter_value(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - sweden['name'] = 'Finland' - self.assertEqual( - json.loads(sweden.patch), - json.loads( - '[{"path": "/name", "value": "Finland", "op": "replace"}]')) - - def test_patch_drop_attribute(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - del sweden['name'] - self.assertEqual( - json.loads(sweden.patch), - json.loads('[{"path": "/name", "op": "remove"}]')) - - def test_patch_reduce_operations(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - - sweden['name'] = 'Finland' - self.assertEqual( - json.loads(sweden.patch), - json.loads( - '[{"path": "/name", "value": "Finland", "op": "replace"}]')) - - sweden['name'] = 'Norway' - self.assertEqual( - json.loads(sweden.patch), - json.loads( - '[{"path": "/name", "value": "Norway", "op": "replace"}]')) - - def test_patch_multiple_operations(self): - Country = warlock.model_factory(fixture) - sweden = Country(name='Sweden', population=9379116) - - sweden['name'] = 'Finland' - sweden['population'] = 5387000 - - self.assertEqual(len(json.loads(sweden.patch)), 2) - - patches = json.loads( - '[{"path": "/name", "value": "Finland", "op": "replace"}, ' - '{"path": "/population", "value": 5387000, "op": "replace"}]') - - for patch in json.loads(sweden.patch): - self.assertTrue(patch in patches) - - def test_resolver(self): - from jsonschema import RefResolver - dirname = os.path.dirname(__file__) - schemas_path = 'file://' + os.path.join(dirname, 'schemas/') - resolver = RefResolver(schemas_path, None) - - country_schema_file = \ - open(os.path.join(dirname, 'schemas/') + 'country.json') - person_schema_file = \ - open(os.path.join(dirname, 'schemas/') + 'person.json') - - country_schema = json.load(country_schema_file) - person_schema = json.load(person_schema_file) - Country = warlock.model_factory(country_schema, resolver) - Person = warlock.model_factory(person_schema, resolver) - - england = Country( - name="England", - population=53865800, - overlord=Person( - title="Queen", - firstname="Elizabeth", - lastname="Windsor" - ) - ) - expected = { - 'name': 'England', - 'population': 53865800, - 'overlord': { - 'title': 'Queen', - 'lastname': 'Windsor', - 'firstname': 'Elizabeth' - } - } - self.assertEqual(england, expected) - - def test_recursive_models(self): - Parent = warlock.model_factory(parent_fixture) - Child = warlock.model_factory(child_fixture) - - mom = Parent(name='Abby', children=[]) - - teenager = Child(age=15, mother=mom) - toddler = Child(age=3, mother=mom) - - mom.children = [teenager, toddler] - - self.assertEqual(mom.children[0].age, 15) - self.assertEqual(mom.children[1].age, 3) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/schemas/country.json b/tests/schemas/country.json new file mode 100644 index 0000000..730eb0d --- /dev/null +++ b/tests/schemas/country.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "name": "Country", + "properties": { + "name": {"type": "string"}, + "population": {"type": "integer"}, + "overlord": { "$ref": "person.json#" } + }, + "additionalProperties": false +} \ No newline at end of file diff --git a/tests/schemas/person.json b/tests/schemas/person.json new file mode 100644 index 0000000..e517a53 --- /dev/null +++ b/tests/schemas/person.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema", + "name": "Person", + "type" : "object", + "properties": { + "title": { "type": "string" }, + "firstname": { "type": "string" }, + "lastname": { "type": "string" } + } +} \ No newline at end of file diff --git a/tests/test_core.py b/tests/test_core.py new file mode 100644 index 0000000..51c0426 --- /dev/null +++ b/tests/test_core.py @@ -0,0 +1,307 @@ +# Copyright 2012 Brian Waldon +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import copy +import unittest +import os + +import json + +import six + +import warlock + + +fixture = { + 'name': 'Country', + 'properties': { + 'name': {'type': 'string'}, + 'population': {'type': 'integer'}, + }, + 'additionalProperties': False, +} + + +complex_fixture = { + 'name': 'Mixmaster', + 'properties': { + 'sub': {'type': 'object', + 'properties': {'foo': {'type': 'string'}}} + }, +} + +parent_fixture = { + 'name': 'Parent', + 'properties': { + 'name': {'type': 'string'}, + 'children': {'type': 'array', 'items': [{'type': 'object'}]} + }, + 'required': ['name', 'children'] +} + +child_fixture = { + 'name': 'Child', + 'properties': { + 'age': {'type': 'integer'}, + 'mother': {'type': 'object'} + }, + 'required': ['age', 'mother'] +} + + +nameless_fixture = { + 'properties': { + 'name': {'type': 'string'}, + 'population': {'type': 'integer'}, + }, + 'additionalProperties': False, +} + + +class TestCore(unittest.TestCase): + def test_create_invalid_object(self): + Country = warlock.model_factory(fixture) + self.assertRaises(ValueError, Country, name=1) + + def test_class_name_from_unicode_schema_name(self): + fixture_copy = copy.deepcopy(fixture) + fixture_copy['name'] = six.text_type(fixture_copy['name']) + # Can't set class.__name__ to a unicode object, ensure warlock + # does some magic to make it possible + warlock.model_factory(fixture_copy) + + def test_invalid_operations(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + # Ensure a valid object was created + self.assertEqual(sweden.name, 'Sweden') + self.assertEqual(sweden.population, 9379116) + + # Specific exceptions should be raised for invalid operations + self.assertRaises(AttributeError, getattr, sweden, 'overlord') + exc = warlock.InvalidOperation + self.assertRaises(exc, setattr, sweden, 'overlord', 'Bears') + self.assertRaises(exc, setattr, sweden, 'name', 5) + self.assertRaises(exc, setattr, sweden, 'population', 'N/A') + + def test_no_mask_arbitrary_properties(self): + fixture_copy = copy.deepcopy(fixture) + fixture_copy['additionalProperties'] = {'type': 'string'} + Country = warlock.model_factory(fixture_copy) + + # We should still depend on the schema for validation + self.assertRaises(ValueError, Country, GDP=56956) + + # But arbitrary properties should be allowed if they check out + sweden = Country(overlord='Waldon') + sweden.abbreviation = 'SE' + exc = warlock.InvalidOperation + self.assertRaises(exc, setattr, sweden, 'abbreviation', 0) + + def test_items(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + self.assertEqual(set(list(six.iteritems(sweden))), + set([('name', 'Sweden'), ('population', 9379116)])) + self.assertEqual(set(sweden.items()), + set([('name', 'Sweden'), ('population', 9379116)])) + + def test_update(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + exc = warlock.InvalidOperation + self.assertRaises(exc, sweden.update, {'population': 'N/A'}) + self.assertRaises(exc, sweden.update, {'overloard': 'Bears'}) + + def test_naming(self): + Country = warlock.model_factory(fixture) + self.assertEqual('Country', Country.__name__) + + Country2 = warlock.model_factory(fixture, name='Country2') + self.assertEqual('Country2', Country2.__name__) + + nameless = warlock.model_factory(nameless_fixture) + self.assertEqual('Model', nameless.__name__) + + nameless2 = warlock.model_factory(nameless_fixture, name='Country3') + self.assertEqual('Country3', nameless2.__name__) + + def test_deepcopy(self): + """Make sure we aren't leaking references.""" + Mixmaster = warlock.model_factory(complex_fixture) + mike = Mixmaster(sub={'foo': 'mike'}) + + self.assertEquals('mike', mike.sub['foo']) + + mike_1 = mike.copy() + mike_1['sub']['foo'] = 'james' + self.assertEquals('mike', mike.sub['foo']) + + mike_2 = dict(six.iteritems(mike)) + mike_2['sub']['foo'] = 'james' + self.assertEquals('mike', mike.sub['foo']) + + mike_2 = dict(mike.items()) + mike_2['sub']['foo'] = 'james' + self.assertEquals('mike', mike.sub['foo']) + + mike_3_sub = list(six.itervalues(mike))[0] + mike_3_sub['foo'] = 'james' + self.assertEquals('mike', mike.sub['foo']) + + mike_3_sub = list(mike.values())[0] + mike_3_sub['foo'] = 'james' + self.assertEquals('mike', mike.sub['foo']) + + def test_forbidden_methods(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + exc = warlock.InvalidOperation + self.assertRaises(exc, sweden.clear) + self.assertRaises(exc, sweden.pop, 0) + self.assertRaises(exc, sweden.popitem) + + def test_dict_syntax(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + sweden['name'] = 'Finland' + self.assertEqual('Finland', sweden['name']) + + del sweden['name'] + self.assertRaises(AttributeError, getattr, sweden, 'name') + + def test_attr_syntax(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + sweden.name = 'Finland' + self.assertEqual('Finland', sweden.name) + + delattr(sweden, 'name') + self.assertRaises(AttributeError, getattr, sweden, 'name') + + def test_changes(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + self.assertEqual(sweden.changes, {}) + sweden['name'] = 'Finland' + self.assertEqual(sweden.changes, {'name': 'Finland'}) + sweden['name'] = 'Norway' + self.assertEqual(sweden.changes, {'name': 'Norway'}) + + def test_patch_no_changes(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + self.assertEqual(sweden.patch, '[]') + + def test_patch_alter_value(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + sweden['name'] = 'Finland' + self.assertEqual( + json.loads(sweden.patch), + json.loads( + '[{"path": "/name", "value": "Finland", "op": "replace"}]')) + + def test_patch_drop_attribute(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + del sweden['name'] + self.assertEqual( + json.loads(sweden.patch), + json.loads('[{"path": "/name", "op": "remove"}]')) + + def test_patch_reduce_operations(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + sweden['name'] = 'Finland' + self.assertEqual( + json.loads(sweden.patch), + json.loads( + '[{"path": "/name", "value": "Finland", "op": "replace"}]')) + + sweden['name'] = 'Norway' + self.assertEqual( + json.loads(sweden.patch), + json.loads( + '[{"path": "/name", "value": "Norway", "op": "replace"}]')) + + def test_patch_multiple_operations(self): + Country = warlock.model_factory(fixture) + sweden = Country(name='Sweden', population=9379116) + + sweden['name'] = 'Finland' + sweden['population'] = 5387000 + + self.assertEqual(len(json.loads(sweden.patch)), 2) + + patches = json.loads( + '[{"path": "/name", "value": "Finland", "op": "replace"}, ' + '{"path": "/population", "value": 5387000, "op": "replace"}]') + + for patch in json.loads(sweden.patch): + self.assertTrue(patch in patches) + + def test_resolver(self): + from jsonschema import RefResolver + dirname = os.path.dirname(__file__) + schemas_path = 'file://' + os.path.join(dirname, 'schemas/') + resolver = RefResolver(schemas_path, None) + + country_schema_file = \ + open(os.path.join(dirname, 'schemas/') + 'country.json') + person_schema_file = \ + open(os.path.join(dirname, 'schemas/') + 'person.json') + + country_schema = json.load(country_schema_file) + person_schema = json.load(person_schema_file) + Country = warlock.model_factory(country_schema, resolver) + Person = warlock.model_factory(person_schema, resolver) + + england = Country( + name="England", + population=53865800, + overlord=Person( + title="Queen", + firstname="Elizabeth", + lastname="Windsor" + ) + ) + expected = { + 'name': 'England', + 'population': 53865800, + 'overlord': { + 'title': 'Queen', + 'lastname': 'Windsor', + 'firstname': 'Elizabeth' + } + } + self.assertEqual(england, expected) + + def test_recursive_models(self): + Parent = warlock.model_factory(parent_fixture) + Child = warlock.model_factory(child_fixture) + + mom = Parent(name='Abby', children=[]) + + teenager = Child(age=15, mother=mom) + toddler = Child(age=3, mother=mom) + + mom.children = [teenager, toddler] + + self.assertEqual(mom.children[0].age, 15) + self.assertEqual(mom.children[1].age, 3) -- cgit v1.2.1