def test_calling_a_schema_raises_invalid_group_when_data_is_invalid(self): invalid = Invalid("abc") mocked = Mock(side_effect=invalid) with patch.object(Schema, "_validate", mocked): with self.assertRaises(InvalidGroup) as cm: instance = Schema({"a": int}) instance({"a": 1}) self.assertEqual(map(str, cm.exception.errors), ["abc"]) invalid = InvalidGroup("", [Invalid("def"), Invalid("ghi")]) mocked = Mock(side_effect=invalid) with patch.object(Schema, "_validate", mocked): with self.assertRaises(InvalidGroup) as cm: instance = Schema({"a": int}) instance({"a": 1}) self.assertEqual(map(str, cm.exception.errors), ["def", "ghi"])
def test_basic_integration_test(self): s = Schema({ "abc": All(coerce_to(str), when_empty(Invalid)), "def": All(int, when_empty(Invalid)) }) with self.assertRaises(InvalidGroup) as cm: s({}) self.assertEqual( map(str, cm.exception.errors), [ "A value is required @ data[abc]", "A value is required @ data[def]" ], ) a = s({"abc": 1, "def": 2}) self.assertEqual(a, {"abc": "1", "def": 2}) s = Schema(All({"abc": coerce_to(str), "def": int})) with self.assertRaises(InvalidGroup) as cm: s({"abc": 1, "def": "abc"}) self.assertEqual(map(str, cm.exception.errors), ["Expected int @ data[def]"]) s = Schema( All({ "abc": All(coerce_to(str), when_empty(Invalid)), "def": All(int, when_empty(Invalid)) })) with self.assertRaises(InvalidGroup) as cm: s({}) self.assertEqual( map(str, cm.exception.errors), [ "A value is required @ data[abc]", "A value is required @ data[def]" ], )
def test_more_advanced_integration_test(self): def percents_add_to_100(data): total = 0 for project in data: total += project["percentage"] if total != 100: raise Invalid("the percentages must add up to 100") return data def check_required_by(data): return "required_by_type" in data and data[ "required_by_type"] == "later" s = Schema( Chain( { "description": All(str, when_empty(Invalid)), "justification": All(str, when_empty(Invalid)), "is_tech_purchase": All(bool, when_empty(False)), "projects": All([{ "id": All(int, when_empty(Undefined)), "project_id": All(int, when_empty(Invalid)), "percentage": All(int, in_range(1, 100), when_empty(Invalid)) }], percents_add_to_100), "vendor": All(str, when_empty(Invalid)), "vendor_id": All(int, when_empty(Invalid)), "required_by_type": All(str, in_list(["now", "later"])), "date_required_by": All(int, when_empty(Invalid)) }, require_one("vendor_id", "vendor"), require_if("date_required_by", check_required_by))) data = { "description": "abc", "justification": "def", "projects": [{ "project_id": 4, "percentage": 10 }, { "id": 2, "project_id": 5, "percentage": 90 }], "vendor": "ABC co.", "required_by_type": "later", "date_required_by": 1234 } val = s(data) self.assertEqual( val, { "description": "abc", "justification": "def", "is_tech_purchase": False, "projects": [{ "project_id": 4, "percentage": 10 }, { "id": 2, "project_id": 5, "percentage": 90 }], "vendor": "ABC co.", "required_by_type": "later", "date_required_by": 1234 })
def test_calling_a_schema_returns_data_when_data_is_valid(self): mocked = Mock(return_value=1) with patch.object(Schema, "_validate", mocked): instance = Schema({"a": int}) retval = instance({"a": 1}) self.assertEqual(retval, 1)
def test_creating_a_schema_saves_the_passed_in_schema(self): schema = {"a": "b", "k": "l", "y": 3} instance = Schema(schema) self.assertEqual(instance.schema, {"a": "b", "k": "l", "y": 3})
def test_validate_raises_schema_error_when_a_bad_schema_is_passed(self): with self.assertRaises(SchemaError) as cm: instance = Schema("a") instance("b") self.assertEqual(str(cm.exception), "Unsupported schema data type: a")