12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501 |
- # -*- coding: utf-8 -*-
- # pylint: disable=function-redefined,missing-docstring
- # TODO: Remove the following PyLint disable as soon as we support YAML and RST rendering
- # pylint: disable=abstract-method
- # Import python libs
- from __future__ import absolute_import, print_function, unicode_literals
- import copy
- # Import Salt Libs
- import salt.utils.json
- import salt.utils.schema as schema
- import salt.utils.stringutils
- import salt.utils.yaml
- from salt.ext import six
- from salt.utils.versions import LooseVersion as _LooseVersion
- # Import Salt Testing Libs
- from tests.support.unit import TestCase, skipIf
- # Import 3rd-party libs
- try:
- import jsonschema
- import jsonschema.exceptions
- HAS_JSONSCHEMA = True
- JSONSCHEMA_VERSION = _LooseVersion(jsonschema.__version__)
- except ImportError:
- HAS_JSONSCHEMA = False
- JSONSCHEMA_VERSION = _LooseVersion("0")
- # pylint: disable=unused-import
- try:
- import rfc3987
- HAS_RFC3987 = True
- except ImportError:
- HAS_RFC3987 = False
- try:
- import strict_rfc3339
- HAS_STRICT_RFC3339 = True
- except ImportError:
- HAS_STRICT_RFC3339 = False
- # pylint: enable=unused-import
- class ConfigTestCase(TestCase):
- """
- TestCase for salt.utils.config module
- """
- def test_configuration_subclass_inherits_items(self):
- class BaseConfig(schema.Schema):
- base = schema.BooleanItem(default=True, required=True)
- class SubClassedConfig(BaseConfig):
- hungry = schema.BooleanItem(
- title="Hungry", description="Are you hungry?", required=True
- )
- self.assertDictEqual(
- SubClassedConfig.serialize(),
- {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "properties": {
- "base": {"default": True, "type": "boolean", "title": "base"},
- "hungry": {
- "type": "boolean",
- "description": "Are you hungry?",
- "title": "Hungry",
- },
- },
- "required": ["base", "hungry"],
- "x-ordering": ["base", "hungry"],
- "additionalProperties": False,
- },
- )
- class MergedConfigClass(schema.Schema):
- thirsty = schema.BooleanItem(
- title="Thirsty", description="Are you thirsty?", required=True
- )
- merge_subclassed = SubClassedConfig(flatten=True)
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "description": "Are you thirsty?",
- "title": "Thirsty",
- },
- "base": {"default": True, "type": "boolean", "title": "base"},
- "hungry": {
- "type": "boolean",
- "description": "Are you hungry?",
- "title": "Hungry",
- },
- },
- "required": ["thirsty", "base", "hungry"],
- "x-ordering": ["thirsty", "base", "hungry"],
- "additionalProperties": False,
- }
- self.assertDictContainsSubset(
- MergedConfigClass.serialize()["properties"], expected["properties"]
- )
- self.assertDictContainsSubset(expected, MergedConfigClass.serialize())
- def test_configuration_items_order(self):
- class One(schema.Schema):
- one = schema.BooleanItem()
- class Three(schema.Schema):
- three = schema.BooleanItem()
- class Final(One):
- two = schema.BooleanItem()
- three = Three(flatten=True)
- self.assertEqual(Final.serialize()["x-ordering"], ["one", "two", "three"])
- def test_optional_requirements_config(self):
- class BaseRequirements(schema.Schema):
- driver = schema.StringItem(default="digitalocean", format="hidden")
- class SSHKeyFileSchema(schema.Schema):
- ssh_key_file = schema.StringItem(
- title="SSH Private Key",
- description="The path to an SSH private key which will be used "
- "to authenticate on the deployed VMs",
- )
- class SSHKeyNamesSchema(schema.Schema):
- ssh_key_names = schema.StringItem(
- title="SSH Key Names",
- description="The names of an SSH key being managed on "
- "DigitalOcean account which will be used to "
- "authenticate on the deployed VMs",
- )
- class Requirements(BaseRequirements):
- title = "DigitalOcean"
- description = "DigitalOcean Cloud VM configuration requirements."
- personal_access_token = schema.StringItem(
- title="Personal Access Token",
- description="This is the API access token which can be generated "
- "under the API/Application on your account",
- required=True,
- )
- requirements_definition = schema.AnyOfItem(
- items=(
- SSHKeyFileSchema.as_requirements_item(),
- SSHKeyNamesSchema.as_requirements_item(),
- ),
- )(flatten=True)
- ssh_key_file = SSHKeyFileSchema(flatten=True)
- ssh_key_names = SSHKeyNamesSchema(flatten=True)
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "DigitalOcean",
- "description": "DigitalOcean Cloud VM configuration requirements.",
- "type": "object",
- "properties": {
- "driver": {
- "default": "digitalocean",
- "format": "hidden",
- "type": "string",
- "title": "driver",
- },
- "personal_access_token": {
- "type": "string",
- "description": "This is the API access token which can be "
- "generated under the API/Application on your account",
- "title": "Personal Access Token",
- },
- "ssh_key_file": {
- "type": "string",
- "description": "The path to an SSH private key which will "
- "be used to authenticate on the deployed VMs",
- "title": "SSH Private Key",
- },
- "ssh_key_names": {
- "type": "string",
- "description": "The names of an SSH key being managed on DigitalOcean "
- "account which will be used to authenticate on the deployed VMs",
- "title": "SSH Key Names",
- },
- },
- "anyOf": [{"required": ["ssh_key_file"]}, {"required": ["ssh_key_names"]}],
- "required": ["personal_access_token"],
- "x-ordering": [
- "driver",
- "personal_access_token",
- "ssh_key_file",
- "ssh_key_names",
- ],
- "additionalProperties": False,
- }
- self.assertDictEqual(expected, Requirements.serialize())
- class Requirements2(BaseRequirements):
- title = "DigitalOcean"
- description = "DigitalOcean Cloud VM configuration requirements."
- personal_access_token = schema.StringItem(
- title="Personal Access Token",
- description="This is the API access token which can be generated "
- "under the API/Application on your account",
- required=True,
- )
- ssh_key_file = schema.StringItem(
- title="SSH Private Key",
- description="The path to an SSH private key which will be used "
- "to authenticate on the deployed VMs",
- )
- ssh_key_names = schema.StringItem(
- title="SSH Key Names",
- description="The names of an SSH key being managed on "
- "DigitalOcean account which will be used to "
- "authenticate on the deployed VMs",
- )
- requirements_definition = schema.AnyOfItem(
- items=(
- schema.RequirementsItem(requirements=["ssh_key_file"]),
- schema.RequirementsItem(requirements=["ssh_key_names"]),
- ),
- )(flatten=True)
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "DigitalOcean",
- "description": "DigitalOcean Cloud VM configuration requirements.",
- "type": "object",
- "properties": {
- "driver": {
- "default": "digitalocean",
- "format": "hidden",
- "type": "string",
- "title": "driver",
- },
- "personal_access_token": {
- "type": "string",
- "description": "This is the API access token which can be "
- "generated under the API/Application on your account",
- "title": "Personal Access Token",
- },
- "ssh_key_file": {
- "type": "string",
- "description": "The path to an SSH private key which will "
- "be used to authenticate on the deployed VMs",
- "title": "SSH Private Key",
- },
- "ssh_key_names": {
- "type": "string",
- "description": "The names of an SSH key being managed on DigitalOcean "
- "account which will be used to authenticate on the deployed VMs",
- "title": "SSH Key Names",
- },
- },
- "anyOf": [{"required": ["ssh_key_file"]}, {"required": ["ssh_key_names"]}],
- "required": ["personal_access_token"],
- "x-ordering": [
- "driver",
- "personal_access_token",
- "ssh_key_file",
- "ssh_key_names",
- ],
- "additionalProperties": False,
- }
- self.assertDictContainsSubset(expected, Requirements2.serialize())
- class Requirements3(schema.Schema):
- title = "DigitalOcean"
- description = "DigitalOcean Cloud VM configuration requirements."
- merge_reqs = Requirements(flatten=True)
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "DigitalOcean",
- "description": "DigitalOcean Cloud VM configuration requirements.",
- "type": "object",
- "properties": {
- "driver": {
- "default": "digitalocean",
- "format": "hidden",
- "type": "string",
- "title": "driver",
- },
- "personal_access_token": {
- "type": "string",
- "description": "This is the API access token which can be "
- "generated under the API/Application on your account",
- "title": "Personal Access Token",
- },
- "ssh_key_file": {
- "type": "string",
- "description": "The path to an SSH private key which will "
- "be used to authenticate on the deployed VMs",
- "title": "SSH Private Key",
- },
- "ssh_key_names": {
- "type": "string",
- "description": "The names of an SSH key being managed on DigitalOcean "
- "account which will be used to authenticate on the deployed VMs",
- "title": "SSH Key Names",
- },
- },
- "anyOf": [{"required": ["ssh_key_file"]}, {"required": ["ssh_key_names"]}],
- "required": ["personal_access_token"],
- "x-ordering": [
- "driver",
- "personal_access_token",
- "ssh_key_file",
- "ssh_key_names",
- ],
- "additionalProperties": False,
- }
- self.assertDictContainsSubset(expected, Requirements3.serialize())
- class Requirements4(schema.Schema):
- title = "DigitalOcean"
- description = "DigitalOcean Cloud VM configuration requirements."
- merge_reqs = Requirements(flatten=True)
- ssh_key_file_2 = schema.StringItem(
- title="SSH Private Key",
- description="The path to an SSH private key which will be used "
- "to authenticate on the deployed VMs",
- )
- ssh_key_names_2 = schema.StringItem(
- title="SSH Key Names",
- description="The names of an SSH key being managed on "
- "DigitalOcean account which will be used to "
- "authenticate on the deployed VMs",
- )
- requirements_definition_2 = schema.AnyOfItem(
- items=(
- schema.RequirementsItem(requirements=["ssh_key_file_2"]),
- schema.RequirementsItem(requirements=["ssh_key_names_2"]),
- ),
- )(flatten=True)
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "DigitalOcean",
- "description": "DigitalOcean Cloud VM configuration requirements.",
- "type": "object",
- "properties": {
- "driver": {
- "default": "digitalocean",
- "format": "hidden",
- "type": "string",
- "title": "driver",
- },
- "personal_access_token": {
- "type": "string",
- "description": "This is the API access token which can be "
- "generated under the API/Application on your account",
- "title": "Personal Access Token",
- },
- "ssh_key_file": {
- "type": "string",
- "description": "The path to an SSH private key which will "
- "be used to authenticate on the deployed VMs",
- "title": "SSH Private Key",
- },
- "ssh_key_names": {
- "type": "string",
- "description": "The names of an SSH key being managed on DigitalOcean "
- "account which will be used to authenticate on the deployed VMs",
- "title": "SSH Key Names",
- },
- "ssh_key_file_2": {
- "type": "string",
- "description": "The path to an SSH private key which will "
- "be used to authenticate on the deployed VMs",
- "title": "SSH Private Key",
- },
- "ssh_key_names_2": {
- "type": "string",
- "description": "The names of an SSH key being managed on DigitalOcean "
- "account which will be used to authenticate on the deployed VMs",
- "title": "SSH Key Names",
- },
- },
- "anyOf": [
- {"required": ["ssh_key_file"]},
- {"required": ["ssh_key_names"]},
- {"required": ["ssh_key_file_2"]},
- {"required": ["ssh_key_names_2"]},
- ],
- "required": ["personal_access_token"],
- "x-ordering": [
- "driver",
- "personal_access_token",
- "ssh_key_file",
- "ssh_key_names",
- "ssh_key_file_2",
- "ssh_key_names_2",
- ],
- "additionalProperties": False,
- }
- self.assertDictContainsSubset(expected, Requirements4.serialize())
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_optional_requirements_config_validation(self):
- class BaseRequirements(schema.Schema):
- driver = schema.StringItem(default="digitalocean", format="hidden")
- class SSHKeyFileSchema(schema.Schema):
- ssh_key_file = schema.StringItem(
- title="SSH Private Key",
- description="The path to an SSH private key which will be used "
- "to authenticate on the deployed VMs",
- )
- class SSHKeyNamesSchema(schema.Schema):
- ssh_key_names = schema.StringItem(
- title="SSH Key Names",
- description="The names of an SSH key being managed on "
- "Digial Ocean account which will be used to "
- "authenticate on the deployed VMs",
- )
- class Requirements(BaseRequirements):
- title = "DigitalOcean"
- description = "DigitalOcean Cloud VM configuration requirements."
- personal_access_token = schema.StringItem(
- title="Personal Access Token",
- description="This is the API access token which can be generated "
- "under the API/Application on your account",
- required=True,
- )
- requirements_definition = schema.AnyOfItem(
- items=(
- SSHKeyFileSchema.as_requirements_item(),
- SSHKeyNamesSchema.as_requirements_item(),
- ),
- )(flatten=True)
- ssh_key_file = SSHKeyFileSchema(flatten=True)
- ssh_key_names = SSHKeyNamesSchema(flatten=True)
- try:
- jsonschema.validate(
- {
- "personal_access_token": "foo",
- "ssh_key_names": "bar",
- "ssh_key_file": "test",
- },
- Requirements.serialize(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate(
- {"personal_access_token": "foo", "ssh_key_names": "bar"},
- Requirements.serialize(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate(
- {"personal_access_token": "foo", "ssh_key_file": "test"},
- Requirements.serialize(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"personal_access_token": "foo"}, Requirements.serialize()
- )
- if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"):
- self.assertIn(
- "'ssh_key_file' is a required property", excinfo.exception.message
- )
- else:
- self.assertIn(
- "is not valid under any of the given schemas", excinfo.exception.message
- )
- def test_boolean_config(self):
- item = schema.BooleanItem(title="Hungry", description="Are you hungry?")
- self.assertDictEqual(
- item.serialize(),
- {"type": "boolean", "title": item.title, "description": item.description},
- )
- item = schema.BooleanItem(
- title="Hungry", description="Are you hungry?", default=False
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "boolean",
- "title": item.title,
- "description": item.description,
- "default": item.default,
- },
- )
- item = schema.BooleanItem(
- title="Hungry", description="Are you hungry?", default=schema.Null
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "boolean",
- "title": item.title,
- "description": item.description,
- "default": None,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_boolean_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.BooleanItem(title="Hungry", description="Are you hungry?")
- try:
- jsonschema.validate({"item": False}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 1}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- def test_string_config(self):
- item = schema.StringItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {"type": "string", "title": item.title, "description": item.description},
- )
- item = schema.StringItem(
- title="Foo", description="Foo Item", min_length=1, max_length=3
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "minLength": item.min_length,
- "maxLength": item.max_length,
- },
- )
- item = schema.StringItem(
- title="Foo",
- description="Foo Item",
- min_length=1,
- max_length=3,
- default="foo",
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "minLength": item.min_length,
- "maxLength": item.max_length,
- "default": "foo",
- },
- )
- item = schema.StringItem(
- title="Foo",
- description="Foo Item",
- min_length=1,
- max_length=3,
- enum=("foo", "bar"),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "minLength": item.min_length,
- "maxLength": item.max_length,
- "enum": ["foo", "bar"],
- },
- )
- item = schema.StringItem(
- title="Foo",
- description="Foo Item",
- min_length=1,
- max_length=3,
- enum=("foo", "bar"),
- enumNames=("Foo", "Bar"),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "minLength": item.min_length,
- "maxLength": item.max_length,
- "enum": ["foo", "bar"],
- "enumNames": ["Foo", "Bar"],
- },
- )
- item = schema.StringItem(
- title="Foo", description="Foo Item", pattern=r"^([\w_-]+)$"
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "pattern": item.pattern,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_string_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.StringItem(title="Foo", description="Foo Item")
- try:
- jsonschema.validate({"item": "the item"}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- class TestConf(schema.Schema):
- item = schema.StringItem(
- title="Foo", description="Foo Item", min_length=1, max_length=10
- )
- try:
- jsonschema.validate({"item": "the item"}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": "the item the item"}, TestConf.serialize())
- self.assertIn("is too long", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.StringItem(
- title="Foo", description="Foo Item", min_length=10, max_length=100
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": "the item"}, TestConf.serialize())
- self.assertIn("is too short", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.StringItem(
- title="Foo", description="Foo Item", enum=("foo", "bar")
- )
- try:
- jsonschema.validate({"item": "foo"}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- class TestConf(schema.Schema):
- item = schema.StringItem(
- title="Foo", description="Foo Item", enum=("foo", "bar")
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": "bin"}, TestConf.serialize())
- self.assertIn("is not one of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.StringItem(
- title="Foo", description="Foo Item", pattern=r"^([\w_-]+)$"
- )
- try:
- jsonschema.validate(
- {"item": "the-item"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "the item"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("does not match", excinfo.exception.message)
- def test_email_config(self):
- item = schema.EMailItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_email_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.EMailItem(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": "nobody@nowhere.com"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_ipv4_config(self):
- item = schema.IPv4Item(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(
- JSONSCHEMA_VERSION <= _LooseVersion("2.5.0"),
- "Requires jsonschema 2.5.0 or greater",
- )
- def test_ipv4_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.IPv4Item(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": "127.0.0.1"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_ipv6_config(self):
- item = schema.IPv6Item(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_ipv6_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.IPv6Item(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": salt.utils.stringutils.to_str("::1")},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_hostname_config(self):
- item = schema.HostnameItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_hostname_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.HostnameItem(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": "localhost"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_datetime_config(self):
- item = schema.DateTimeItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- @skipIf(not HAS_STRICT_RFC3339, "The 'strict_rfc3339' library is missing")
- def test_datetime_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.DateTimeItem(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": "2015-07-01T18:05:27+01:00"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_secret_config(self):
- item = schema.SecretItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- def test_uri_config(self):
- item = schema.UriItem(title="Foo", description="Foo Item")
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "string",
- "title": item.title,
- "description": item.description,
- "format": item.format,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- @skipIf(HAS_RFC3987 is False, "The 'rfc3987' library is missing")
- def test_uri_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.UriItem(title="Item", description="Item description")
- try:
- jsonschema.validate(
- {"item": "ssh://localhost"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": "3"},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not a", excinfo.exception.message)
- def test_number_config(self):
- item = schema.NumberItem(title="How many dogs", description="Question")
- self.assertDictEqual(
- item.serialize(),
- {"type": "number", "title": item.title, "description": item.description},
- )
- item = schema.NumberItem(
- title="How many dogs", description="Question", minimum=0, maximum=10
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "number",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- },
- )
- item = schema.NumberItem(
- title="How many dogs", description="Question", multiple_of=2
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "number",
- "title": item.title,
- "description": item.description,
- "multipleOf": item.multiple_of,
- },
- )
- item = schema.NumberItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- exclusive_minimum=True,
- maximum=10,
- exclusive_maximum=True,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "number",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "exclusiveMinimum": True,
- "exclusiveMaximum": True,
- },
- )
- item = schema.NumberItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- maximum=10,
- default=0,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "number",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "default": 0,
- },
- )
- item = schema.NumberItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- maximum=10,
- default=0,
- enum=(0, 2, 4, 6),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "number",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "default": 0,
- "enum": [0, 2, 4, 6],
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_number_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.NumberItem(title="How many dogs", description="Question")
- try:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": "3"}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="How many dogs", description="Question", multiple_of=2.2
- )
- try:
- jsonschema.validate({"item": 4.4}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 4}, TestConf.serialize())
- self.assertIn("is not a multiple of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="Foo", description="Foo Item", minimum=1, maximum=10
- )
- try:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 11}, TestConf.serialize())
- self.assertIn("is greater than the maximum of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="Foo", description="Foo Item", minimum=10, maximum=100
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is less than the minimum of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- exclusive_minimum=True,
- maximum=10,
- exclusive_maximum=True,
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 0}, TestConf.serialize())
- self.assertIn(
- "is less than or equal to the minimum of", excinfo.exception.message
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 10}, TestConf.serialize())
- self.assertIn(
- "is greater than or equal to the maximum of", excinfo.exception.message
- )
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="Foo", description="Foo Item", enum=(0, 2, 4, 6)
- )
- try:
- jsonschema.validate({"item": 4}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- class TestConf(schema.Schema):
- item = schema.NumberItem(
- title="Foo", description="Foo Item", enum=(0, 2, 4, 6)
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is not one of", excinfo.exception.message)
- def test_integer_config(self):
- item = schema.IntegerItem(title="How many dogs", description="Question")
- self.assertDictEqual(
- item.serialize(),
- {"type": "integer", "title": item.title, "description": item.description},
- )
- item = schema.IntegerItem(
- title="How many dogs", description="Question", minimum=0, maximum=10
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "integer",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- },
- )
- item = schema.IntegerItem(
- title="How many dogs", description="Question", multiple_of=2
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "integer",
- "title": item.title,
- "description": item.description,
- "multipleOf": item.multiple_of,
- },
- )
- item = schema.IntegerItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- exclusive_minimum=True,
- maximum=10,
- exclusive_maximum=True,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "integer",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "exclusiveMinimum": True,
- "exclusiveMaximum": True,
- },
- )
- item = schema.IntegerItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- maximum=10,
- default=0,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "integer",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "default": 0,
- },
- )
- item = schema.IntegerItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- maximum=10,
- default=0,
- enum=(0, 2, 4, 6),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "integer",
- "title": item.title,
- "description": item.description,
- "minimum": item.minimum,
- "maximum": item.maximum,
- "default": 0,
- "enum": [0, 2, 4, 6],
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_integer_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.IntegerItem(title="How many dogs", description="Question")
- try:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3.1}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="How many dogs", description="Question", multiple_of=2
- )
- try:
- jsonschema.validate({"item": 4}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is not a multiple of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="Foo", description="Foo Item", minimum=1, maximum=10
- )
- try:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 11}, TestConf.serialize())
- self.assertIn("is greater than the maximum of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="Foo", description="Foo Item", minimum=10, maximum=100
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is less than the minimum of", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="How many dogs",
- description="Question",
- minimum=0,
- exclusive_minimum=True,
- maximum=10,
- exclusive_maximum=True,
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 0}, TestConf.serialize())
- self.assertIn(
- "is less than or equal to the minimum of", excinfo.exception.message
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 10}, TestConf.serialize())
- self.assertIn(
- "is greater than or equal to the maximum of", excinfo.exception.message
- )
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="Foo", description="Foo Item", enum=(0, 2, 4, 6)
- )
- try:
- jsonschema.validate({"item": 4}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- class TestConf(schema.Schema):
- item = schema.IntegerItem(
- title="Foo", description="Foo Item", enum=(0, 2, 4, 6)
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 3}, TestConf.serialize())
- self.assertIn("is not one of", excinfo.exception.message)
- def test_array_config(self):
- string_item = schema.StringItem(title="Dog Name", description="The dog name")
- item = schema.ArrayItem(
- title="Dog Names", description="Name your dogs", items=string_item
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "array",
- "title": item.title,
- "description": item.description,
- "items": {
- "type": "string",
- "title": string_item.title,
- "description": string_item.description,
- },
- },
- )
- integer_item = schema.IntegerItem(title="Dog Age", description="The dog age")
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=(string_item, integer_item),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "array",
- "title": item.title,
- "description": item.description,
- "items": [
- {
- "type": "string",
- "title": string_item.title,
- "description": string_item.description,
- },
- {
- "type": "integer",
- "title": integer_item.title,
- "description": integer_item.description,
- },
- ],
- },
- )
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=(schema.StringItem(), schema.IntegerItem()),
- min_items=1,
- max_items=3,
- additional_items=False,
- unique_items=True,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "array",
- "title": item.title,
- "description": item.description,
- "minItems": item.min_items,
- "maxItems": item.max_items,
- "uniqueItems": item.unique_items,
- "additionalItems": item.additional_items,
- "items": [{"type": "string"}, {"type": "integer"}],
- },
- )
- class HowManyConfig(schema.Schema):
- item = schema.IntegerItem(title="How many dogs", description="Question")
- item = schema.ArrayItem(
- title="Dog Names", description="Name your dogs", items=HowManyConfig()
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "array",
- "title": item.title,
- "description": item.description,
- "items": HowManyConfig.serialize(),
- },
- )
- class AgesConfig(schema.Schema):
- item = schema.IntegerItem()
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=(HowManyConfig(), AgesConfig()),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "array",
- "title": item.title,
- "description": item.description,
- "items": [HowManyConfig.serialize(), AgesConfig.serialize()],
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_array_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=schema.StringItem(),
- )
- try:
- jsonschema.validate(
- {"item": ["Tobias", "Óscar"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": ["Tobias", "Óscar", 3]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=schema.StringItem(),
- min_items=1,
- max_items=2,
- )
- try:
- jsonschema.validate(
- {"item": ["Tobias", "Óscar"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": ["Tobias", "Óscar", "Pepe"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is too long", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": []},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is too short", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Dog Names",
- description="Name your dogs",
- items=schema.StringItem(),
- uniqueItems=True,
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": ["Tobias", "Tobias"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("has non-unique elements", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.ArrayItem(items=(schema.StringItem(), schema.IntegerItem()))
- try:
- jsonschema.validate(
- {"item": ["Óscar", 4]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": ["Tobias", "Óscar"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- items=schema.ArrayItem(
- items=(schema.StringItem(), schema.IntegerItem())
- )
- )
- try:
- jsonschema.validate(
- {"item": [["Tobias", 8], ["Óscar", 4]]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": [["Tobias", 8], ["Óscar", "4"]]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.ArrayItem(items=schema.StringItem(enum=["Tobias", "Óscar"]))
- try:
- jsonschema.validate(
- {"item": ["Óscar"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate(
- {"item": ["Tobias"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": ["Pepe"]},
- TestConf.serialize(),
- format_checker=jsonschema.FormatChecker(),
- )
- self.assertIn("is not one of", excinfo.exception.message)
- def test_dict_config(self):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem()},
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "properties": {"sides": {"type": "integer"}},
- },
- )
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem()},
- min_properties=1,
- max_properties=2,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "properties": {"sides": {"type": "integer"}},
- "minProperties": 1,
- "maxProperties": 2,
- },
- )
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- pattern_properties={"s.*": schema.IntegerItem()},
- min_properties=1,
- max_properties=2,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "patternProperties": {"s.*": {"type": "integer"}},
- "minProperties": 1,
- "maxProperties": 2,
- },
- )
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- pattern_properties={"s*": schema.IntegerItem()},
- min_properties=1,
- max_properties=2,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "properties": {
- "color": {"type": "string", "enum": ["red", "green", "blue"]}
- },
- "patternProperties": {"s*": {"type": "integer"}},
- "minProperties": 1,
- "maxProperties": 2,
- },
- )
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- pattern_properties={"s*": schema.IntegerItem()},
- additional_properties=True,
- min_properties=1,
- max_properties=2,
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "properties": {
- "color": {"type": "string", "enum": ["red", "green", "blue"]}
- },
- "patternProperties": {"s*": {"type": "integer"}},
- "minProperties": 1,
- "maxProperties": 2,
- "additionalProperties": True,
- },
- )
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem()},
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.StringItem()]
- ),
- )
- self.assertDictEqual(
- item.serialize(),
- {
- "type": "object",
- "title": item.title,
- "description": item.description,
- "properties": {"sides": {"type": "integer"}},
- "additionalProperties": {
- "oneOf": [{"type": "boolean"}, {"type": "string"}]
- },
- },
- )
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem(required=True)},
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.StringItem()]
- ),
- )
- self.assertDictContainsSubset(
- TestConf.serialize(),
- {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "properties": {
- "item": {
- "title": "Poligon",
- "description": "Describe the Poligon",
- "type": "object",
- "properties": {"sides": {"type": "integer"}},
- "additionalProperties": {
- "oneOf": [{"type": "boolean"}, {"type": "string"}]
- },
- "required": ["sides"],
- }
- },
- "x-ordering": ["item"],
- "additionalProperties": False,
- },
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_dict_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem()},
- )
- try:
- jsonschema.validate({"item": {"sides": 1}}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": {"sides": "1"}}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- pattern_properties={"si.*": schema.IntegerItem()},
- )
- try:
- jsonschema.validate(
- {"item": {"sides": 1, "color": "red"}}, TestConf.serialize()
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": {"sides": "4", "color": "blue"}}, TestConf.serialize()
- )
- self.assertIn("is not of type", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- pattern_properties={"si.*": schema.IntegerItem()},
- additional_properties=False,
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": {"color": "green", "sides": 4, "surfaces": 4}},
- TestConf.serialize(),
- )
- if JSONSCHEMA_VERSION < _LooseVersion("2.6.0"):
- self.assertIn(
- "Additional properties are not allowed", excinfo.exception.message
- )
- else:
- self.assertIn(
- "'surfaces' does not match any of the regexes",
- excinfo.exception.message,
- )
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.IntegerItem()]
- ),
- )
- try:
- jsonschema.validate(
- {"item": {"sides": 1, "color": "red", "rugged_surface": False}},
- TestConf.serialize(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": {"sides": "4", "color": "blue"}}, TestConf.serialize()
- )
- if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"):
- self.assertIn("'4'", excinfo.exception.message)
- self.assertIn("is not of type", excinfo.exception.message)
- self.assertIn("'boolean'", excinfo.exception.message)
- else:
- self.assertIn(
- "is not valid under any of the given schemas", excinfo.exception.message
- )
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"color": schema.StringItem(enum=["red", "green", "blue"])},
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.IntegerItem()]
- ),
- min_properties=2,
- max_properties=3,
- )
- try:
- jsonschema.validate(
- {"item": {"color": "red", "sides": 1}}, TestConf.serialize()
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate(
- {"item": {"sides": 1, "color": "red", "rugged_surface": False}},
- TestConf.serialize(),
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": {"color": "blue"}}, TestConf.serialize())
- self.assertIn("does not have enough properties", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {
- "item": {
- "sides": 4,
- "color": "blue",
- "rugged_surface": False,
- "opaque": True,
- }
- },
- TestConf.serialize(),
- )
- self.assertIn("has too many properties", excinfo.exception.message)
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties={"sides": schema.IntegerItem(required=True)},
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.StringItem()]
- ),
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": {"color": "blue", "rugged_surface": False, "opaque": True}},
- TestConf.serialize(),
- )
- self.assertIn("'sides' is a required property", excinfo.exception.message)
- class Props(schema.Schema):
- sides = schema.IntegerItem(required=True)
- class TestConf(schema.Schema):
- item = schema.DictItem(
- title="Poligon",
- description="Describe the Poligon",
- properties=Props(),
- additional_properties=schema.OneOfItem(
- items=[schema.BooleanItem(), schema.StringItem()]
- ),
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"item": {"color": "blue", "rugged_surface": False, "opaque": True}},
- TestConf.serialize(),
- )
- self.assertIn("'sides' is a required property", excinfo.exception.message)
- def test_oneof_config(self):
- item = schema.OneOfItem(
- items=(
- schema.StringItem(title="Yes", enum=["yes"]),
- schema.StringItem(title="No", enum=["no"]),
- )
- )
- self.assertEqual(
- item.serialize(), {"oneOf": [i.serialize() for i in item.items]}
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_oneof_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Hungry",
- description="Are you hungry?",
- items=schema.OneOfItem(
- items=(
- schema.StringItem(title="Yes", enum=["yes"]),
- schema.StringItem(title="No", enum=["no"]),
- )
- ),
- )
- try:
- jsonschema.validate({"item": ["no"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": ["maybe"]}, TestConf.serialize())
- if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"):
- self.assertIn("'maybe'", excinfo.exception.message)
- self.assertIn("is not one of", excinfo.exception.message)
- self.assertIn("'yes'", excinfo.exception.message)
- else:
- self.assertIn(
- "is not valid under any of the given schemas", excinfo.exception.message
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- def test_anyof_config(self):
- item = schema.AnyOfItem(
- items=(
- schema.StringItem(title="Yes", enum=["yes"]),
- schema.StringItem(title="No", enum=["no"]),
- )
- )
- self.assertEqual(
- item.serialize(),
- {"anyOf": [i.serialize() for i in item.items]}, # pylint: disable=E1133
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_anyof_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Hungry",
- description="Are you hungry?",
- items=schema.AnyOfItem(
- items=(
- schema.StringItem(title="Yes", enum=["yes"]),
- schema.StringItem(title="No", enum=["no"]),
- schema.BooleanItem(),
- )
- ),
- )
- try:
- jsonschema.validate({"item": ["no"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate({"item": ["yes"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate({"item": [True]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate({"item": [False]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": ["maybe"]}, TestConf.serialize())
- if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"):
- self.assertIn("'maybe'", excinfo.exception.message)
- self.assertIn("is not one of", excinfo.exception.message)
- self.assertIn("'yes'", excinfo.exception.message)
- else:
- self.assertIn(
- "is not valid under any of the given schemas", excinfo.exception.message
- )
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- def test_allof_config(self):
- item = schema.AllOfItem(
- items=(schema.StringItem(min_length=2), schema.StringItem(max_length=3))
- )
- self.assertEqual(
- item.serialize(),
- {"allOf": [i.serialize() for i in item.items]}, # pylint: disable=E1133
- )
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_allof_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Hungry",
- description="Are you hungry?",
- items=schema.AllOfItem(
- items=(
- schema.StringItem(min_length=2),
- schema.StringItem(max_length=3),
- )
- ),
- )
- try:
- jsonschema.validate({"item": ["no"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate({"item": ["yes"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": ["maybe"]}, TestConf.serialize())
- self.assertIn("is too long", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": ["hmmmm"]}, TestConf.serialize())
- self.assertIn("is too long", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": 2}, TestConf.serialize())
- self.assertIn("is not of type", excinfo.exception.message)
- def test_not_config(self):
- item = schema.NotItem(item=schema.BooleanItem())
- self.assertEqual(item.serialize(), {"not": item.item.serialize()})
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_not_config_validation(self):
- class TestConf(schema.Schema):
- item = schema.ArrayItem(
- title="Hungry",
- description="Are you hungry?",
- items=schema.NotItem(item=schema.BooleanItem()),
- )
- try:
- jsonschema.validate({"item": ["no"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- try:
- jsonschema.validate({"item": ["yes"]}, TestConf.serialize())
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": [True]}, TestConf.serialize())
- self.assertIn("is not allowed for", excinfo.exception.message)
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"item": [False]}, TestConf.serialize())
- self.assertIn("is not allowed for", excinfo.exception.message)
- def test_item_name_override_class_attrname(self):
- class TestConf(schema.Schema):
- item = schema.BooleanItem(
- name="hungry", title="Hungry", description="Are you hungry?"
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "properties": {
- "hungry": {
- "type": "boolean",
- "description": "Are you hungry?",
- "title": "Hungry",
- }
- },
- "x-ordering": ["hungry"],
- "additionalProperties": False,
- }
- self.assertDictEqual(TestConf.serialize(), expected)
- def test_config_name_override_class_attrname(self):
- class TestConf(schema.Schema):
- item = schema.BooleanItem(title="Hungry", description="Are you hungry?")
- class TestConf2(schema.Schema):
- a_name = TestConf(name="another_name")
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "type": "object",
- "properties": {
- "another_name": {
- "id": "https://non-existing.saltstack.com/schemas/another_name.json#",
- "type": "object",
- "properties": {
- "item": {
- "type": "boolean",
- "description": "Are you hungry?",
- "title": "Hungry",
- }
- },
- "x-ordering": ["item"],
- "additionalProperties": False,
- }
- },
- "x-ordering": ["another_name"],
- "additionalProperties": False,
- }
- self.assertDictEqual(TestConf2.serialize(), expected)
- class ComplexSchemaItem(schema.ComplexSchemaItem):
- _complex_attributes = ["thirsty"]
- thirsty = schema.BooleanItem(title="Thirsty", description="Are you thirsty?")
- class ComplexComplexSchemaItem(schema.ComplexSchemaItem):
- _complex_attributes = ["hungry", "complex_item"]
- hungry = schema.BooleanItem(
- title="Hungry", description="Are you hungry?", required=True
- )
- complex_item = ComplexSchemaItem(definition_name="test_definition")
- class TestComplexDefinitionsSchema(schema.DefinitionsSchema):
- title = "Test Complex Definition Schema"
- complex_item = ComplexSchemaItem()
- class TestOneOfComplexDefinitionsSchema(schema.DefinitionsSchema):
- title = "Test OneOf Complex Definitions Schema"
- one_of_item = schema.OneOfItem(items=[ComplexSchemaItem(), schema.StringItem()])
- class TestArrayComplexDefinitionsSchema(schema.DefinitionsSchema):
- title = "Test Array Complex Definitions Schema"
- array_item = schema.ArrayItem(items=ComplexSchemaItem())
- class TestDictComplexDefinitionsSchema(schema.DefinitionsSchema):
- title = "Test Dict Complex Definitions Schema"
- dict_item = schema.DictItem(
- properties={"complex_obj": ComplexSchemaItem(required=True)},
- additional_properties=ComplexSchemaItem(),
- )
- class TestComplexComplexDefinitionsSchema(schema.DefinitionsSchema):
- title = "Test Complex Complex Definition Schema"
- complex_complex_item = ComplexComplexSchemaItem()
- class ComplexSchemaTestCase(TestCase):
- """ Test cases with definition schemas containing complex items"""
- obj = ComplexSchemaItem()
- complex_obj = ComplexComplexSchemaItem()
- schema = TestComplexDefinitionsSchema()
- one_of_schema = TestOneOfComplexDefinitionsSchema()
- array_schema = TestArrayComplexDefinitionsSchema()
- dict_schema = TestDictComplexDefinitionsSchema()
- complex_schema = TestComplexComplexDefinitionsSchema()
- def test_complex_schema_item_serialize(self):
- obj = copy.deepcopy(self.obj)
- expected_serialized = {"$ref": "#/definitions/ComplexSchemaItem"}
- self.assertDictEqual(obj.serialize(), expected_serialized)
- def test_complex_schema_item_definition(self):
- obj = copy.deepcopy(self.obj)
- expected_def = {
- "type": "object",
- "title": "ComplexSchemaItem",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- }
- self.assertDictEqual(obj.get_definition(), expected_def)
- def test_complex_complex_schema_item_definition(self):
- complex_obj = copy.deepcopy(self.complex_obj)
- expected_def = {
- "type": "object",
- "title": "ComplexComplexSchemaItem",
- "properties": {
- "hungry": {
- "type": "boolean",
- "title": "Hungry",
- "description": "Are you hungry?",
- },
- "complex_item": {
- "type": "object",
- "$ref": "#/definitions/test_definition",
- },
- },
- "required": ["hungry"],
- }
- self.assertDictEqual(complex_obj.get_definition(), expected_def)
- def test_complex_definition_schema(self):
- serialized = salt.utils.yaml.safe_load(
- salt.utils.json.dumps(self.schema.serialize())
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Test Complex Definition Schema",
- "type": "object",
- "properties": {"complex_item": {"$ref": "#/definitions/ComplexSchemaItem"}},
- "x-ordering": ["complex_item"],
- "additionalProperties": False,
- "definitions": {
- "ComplexSchemaItem": {
- "type": "object",
- "title": "ComplexSchemaItem",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- }
- },
- }
- self.assertDictEqual(serialized, expected)
- def test_one_of_complex_definition_schema(self):
- serialized = salt.utils.yaml.safe_load(
- salt.utils.json.dumps(self.one_of_schema.serialize())
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Test OneOf Complex Definitions Schema",
- "type": "object",
- "properties": {
- "one_of_item": {
- "oneOf": [
- {"$ref": "#/definitions/ComplexSchemaItem"},
- {"type": "string"},
- ]
- }
- },
- "x-ordering": ["one_of_item"],
- "additionalProperties": False,
- "definitions": {
- "ComplexSchemaItem": {
- "type": "object",
- "title": "ComplexSchemaItem",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- }
- },
- }
- self.assertDictEqual(serialized, expected)
- def test_array_complex_definition_schema(self):
- serialized = salt.utils.yaml.safe_load(
- salt.utils.json.dumps(self.array_schema.serialize())
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Test Array Complex Definitions Schema",
- "type": "object",
- "properties": {
- "array_item": {
- "type": "array",
- "title": "array_item",
- "items": {"$ref": "#/definitions/ComplexSchemaItem"},
- }
- },
- "x-ordering": ["array_item"],
- "additionalProperties": False,
- "definitions": {
- "ComplexSchemaItem": {
- "type": "object",
- "title": "ComplexSchemaItem",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- }
- },
- }
- self.assertDictEqual(serialized, expected)
- def test_dict_complex_definition_schema(self):
- serialized = salt.utils.yaml.safe_load(
- salt.utils.json.dumps(self.dict_schema.serialize())
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Test Dict Complex Definitions Schema",
- "type": "object",
- "properties": {
- "dict_item": {
- "type": "object",
- "title": "dict_item",
- "required": ["complex_obj"],
- "properties": {
- "complex_obj": {"$ref": "#/definitions/ComplexSchemaItem"}
- },
- "additionalProperties": {"$ref": "#/definitions/ComplexSchemaItem"},
- }
- },
- "x-ordering": ["dict_item"],
- "additionalProperties": False,
- "definitions": {
- "ComplexSchemaItem": {
- "type": "object",
- "title": "ComplexSchemaItem",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- }
- },
- }
- self.assertDictEqual(serialized, expected)
- def test_complex_complex_definition_schema(self):
- serialized = salt.utils.yaml.safe_load(
- salt.utils.json.dumps(self.complex_schema.serialize())
- )
- expected = {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Test Complex Complex Definition Schema",
- "type": "object",
- "properties": {
- "complex_complex_item": {
- "$ref": "#/definitions/ComplexComplexSchemaItem"
- }
- },
- "x-ordering": ["complex_complex_item"],
- "additionalProperties": False,
- "definitions": {
- "ComplexComplexSchemaItem": {
- "type": "object",
- "title": "ComplexComplexSchemaItem",
- "properties": {
- "hungry": {
- "type": "boolean",
- "title": "Hungry",
- "description": "Are you hungry?",
- },
- "complex_item": {
- "type": "object",
- "$ref": "#/definitions/test_definition",
- },
- },
- "required": ["hungry"],
- },
- "test_definition": {
- "type": "object",
- "title": "test_definition",
- "properties": {
- "thirsty": {
- "type": "boolean",
- "title": "Thirsty",
- "description": "Are you thirsty?",
- }
- },
- },
- },
- }
- self.assertDictEqual(serialized, expected)
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_schema_item_thirsty_valid(self):
- serialized = self.schema.serialize()
- try:
- jsonschema.validate({"complex_item": {"thirsty": True}}, serialized)
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_schema_item_thirsty_invalid(self):
- serialized = self.schema.serialize()
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"complex_item": {"thirsty": "Foo"}}, serialized)
- expected = (
- "u'Foo' is not of type u'boolean'"
- if six.PY2
- else "'Foo' is not of type 'boolean'"
- )
- self.assertIn(expected, excinfo.exception.message)
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_complex_schema_item_hungry_valid(self):
- serialized = self.complex_schema.serialize()
- try:
- jsonschema.validate({"complex_complex_item": {"hungry": True}}, serialized)
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_both_complex_complex_schema_all_items_valid(self):
- serialized = self.complex_schema.serialize()
- try:
- jsonschema.validate(
- {
- "complex_complex_item": {
- "hungry": True,
- "complex_item": {"thirsty": True},
- }
- },
- serialized,
- )
- except jsonschema.exceptions.ValidationError as exc:
- self.fail("ValidationError raised: {0}".format(exc))
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_complex_schema_item_hungry_invalid(self):
- serialized = self.complex_schema.serialize()
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate({"complex_complex_item": {"hungry": "Foo"}}, serialized)
- expected = (
- "u'Foo' is not of type u'boolean'"
- if six.PY2
- else "'Foo' is not of type 'boolean'"
- )
- self.assertIn(expected, excinfo.exception.message)
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_complex_schema_item_inner_thirsty_invalid(self):
- serialized = self.complex_schema.serialize()
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {
- "complex_complex_item": {
- "hungry": True,
- "complex_item": {"thirsty": "Bar"},
- }
- },
- serialized,
- )
- expected = (
- "u'Bar' is not of type u'boolean'"
- if six.PY2
- else "'Bar' is not of type 'boolean'"
- )
- self.assertIn(expected, excinfo.exception.message)
- @skipIf(HAS_JSONSCHEMA is False, "The 'jsonschema' library is missing")
- def test_complex_complex_schema_item_missing_required_hungry(self):
- serialized = self.complex_schema.serialize()
- with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo:
- jsonschema.validate(
- {"complex_complex_item": {"complex_item": {"thirsty": True}}},
- serialized,
- )
- self.assertIn("'hungry' is a required property", excinfo.exception.message)
|