Skip to content

Commit

Permalink
Реализация логики проверки additionalProperties (#3)
Browse files Browse the repository at this point in the history
* Реализация логики проверки additionalProperties

* Бамп версии
  • Loading branch information
Segate-ekb authored Nov 26, 2024
1 parent 4828121 commit 77f874d
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 13 deletions.
2 changes: 1 addition & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


Описание.Имя("1c_openApi_validation")
.Версия("0.0.1")
.Версия("0.0.0.3")
.Автор("Иванов Егор")
.АдресАвтора("https://github.com/Segate-ekb")
.Описание("Валидатор OpenApi")
Expand Down
2 changes: 1 addition & 1 deletion src/cf/Configuration.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<ScriptVariant>Russian</ScriptVariant>
<DefaultRoles/>
<Vendor/>
<Version>0.0.0.2</Version>
<Version>0.0.0.3</Version>
<UpdateCatalogAddress/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>false</UseManagedFormInOrdinaryApplication>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,24 @@
#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьСвойствоПоСхеме(Данные, ТекущийКонтекст, РазрешеныДопСвойства = Истина)
Процедура ПроверитьСвойствоПоСхеме(Данные,
ТекущийКонтекст,
РазрешеныДопСвойства = Истина,
СхемаДопСвойств = Неопределено)

ПроверяемаяСхема = ПолучитьПроверяемуюСхему(Данные.Ключ, ТекущийКонтекст);
Если ПроверяемаяСхема = Неопределено Тогда
// Это доп.свойство
Если Не РазрешеныДопСвойства Тогда
// Доп.свойства нельзя, но схему не нашли. Зафиксируем ошибку.
ТекстОшибки = СтрШаблон("Не удалось найти свойство <%1> в схеме данных.", Данные.Ключ);
Ошибки.Добавить(ТекстОшибки);
Возврат;
КонецЕсли;
Возврат;
Если Не ЗначениеЗаполнено(СхемаДопСвойств) Тогда
Возврат;
КонецЕсли;
ПроверяемаяСхема = СхемаДопСвойств;
КонецЕсли;

Если ЭтоСложнаяСхема(ПроверяемаяСхема) Тогда
Expand All @@ -65,7 +73,7 @@
Возврат ПроверяемаяСхема;
КонецЕсли;

ПроверяемаяСхема = РазыменоватьСхему(ПроверяемаяСхема, Спецификация);
ПроверяемаяСхема = РазыменоватьСхему(ПроверяемаяСхема);

Возврат ПроверяемаяСхема;
КонецФункции
Expand All @@ -75,12 +83,11 @@
// Получает необходимую схему по ссылке, если это требуется.
// Параметры:
// ПроверяемаяСхема - Соответствие - Схема которую требуется разыменовать
// Спецификация - Строка - Спецификация openApi котора будет использоваться для разыменования
//
// Возвращаемое значение:
// Соответствие - Разыменованое соответствие
//
Функция РазыменоватьСхему(ПроверяемаяСхема, Спецификация) Экспорт
Функция РазыменоватьСхему(ПроверяемаяСхема)
РазыменованнаяСхема = ПроверяемаяСхема;
Если РазыменованнаяСхема = Неопределено Тогда
// Если у нас на вход неопределено, значит такая схема не найдена.
Expand All @@ -105,7 +112,7 @@
// Возвращаемое значение:
// Булево - Истина, если схема использует сложные конструкции
//
Функция ЭтоСложнаяСхема(ПроверяемаяСхема) Экспорт
Функция ЭтоСложнаяСхема(ПроверяемаяСхема)
ЭтоOneOf = Не ПроверяемаяСхема.Получить("oneOf") = Неопределено;
ЭтоAllOf = Не ПроверяемаяСхема.Получить("allOf") = Неопределено;
ЭтоAnyOf = Не ПроверяемаяСхема.Получить("anyOf") = Неопределено;
Expand Down Expand Up @@ -446,16 +453,21 @@
ПроверитьНаличиеОбязательныхСвойств(ЗначениеСвойства, ПроверяемаяСхема);

ПроверитьКоличествоСвойств(ЗначениеСвойства, ПроверяемаяСхема);

ДополнительныеСвойства = ПроверяемаяСхема.Получить("additionalProperties");
РазрешеныДополнительныеСвойства = Не ДополнительныеСвойства = Ложь;
Если ТипЗнч(ДополнительныеСвойства) = Тип("Соответствие") Тогда
СхемаДопСвойств = РазыменоватьСхему(ДополнительныеСвойства);
КонецЕсли;

РазрешеныДополнительныеСвойства = Не ПроверяемаяСхема.Получить("additionalProperties") = Ложь;
СписокСвойств = ПроверяемаяСхема.Получить("properties");
Если СписокСвойств = Неопределено Тогда
// Если свойства не определены - значит все свойства что есть, дополнительные.
// Передадим пустое соответсвие в качестве контекста
СписокСвойств = Новый Соответствие;
КонецЕсли;
Для Каждого Свойство Из ЗначениеСвойства Цикл
ПроверитьСвойствоПоСхеме(Свойство, СписокСвойств, РазрешеныДополнительныеСвойства);
ПроверитьСвойствоПоСхеме(Свойство, СписокСвойств, РазрешеныДополнительныеСвойства, СхемаДопСвойств);
КонецЦикла;
КонецПроцедуры

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@
.ДобавитьТест("Ошибка_ЧислоСвойствБольшеМаксимума")
.ДобавитьТест("Ошибка_НетОбязательногоСвойства")
.ДобавитьТест("Ошибка_ПроверкаРаботыЗапретаДопСвойств")
.ДобавитьТест("ВалидацияДопСвойств")
.СПараметрами("additional_true")
.СПараметрами("additional_empty")
.СПараметрами("additional_object", Истина)
.СПараметрами("additional_ref", Истина)
.ДобавитьТестовыйНабор("ПозитивныеТесты")
.ДобавитьТест("РазрешениеСсылочногоТипа")
.ДобавитьТест("УспешнаяВалидацияОбъекта")
Expand Down Expand Up @@ -412,7 +417,7 @@

Процедура Ошибка_ПроверкаРаботыЗапретаДопСвойств() Экспорт
ОбъектПроверки = Новый Соответствие;
ОбъектПроверки.Вставить("additional", Новый Структура("normal, additional", "Тут все ок", "Тут Ошибочка"));
ОбъектПроверки.Вставить("additional_false", Новый Структура("normal, additional", "Тут все ок", "Тут Ошибочка"));

ИмяСхемы = "objects";
МассивОшибок = Валидировать(ОбъектПроверки, ИмяСхемы);
Expand All @@ -424,6 +429,24 @@

КонецПроцедуры

Процедура ВалидацияДопСвойств(ИмяПроверяемойСхемы, ЖдемОшибку = Ложь) Экспорт
ОбъектПроверки = Новый Соответствие;
ОбъектПроверки.Вставить(ИмяПроверяемойСхемы, Новый Структура("normal, additional", "Тут все ок", 42));

ИмяСхемы = "objects";
МассивОшибок = Валидировать(ОбъектПроверки, ИмяСхемы);

Если ЖдемОшибку Тогда
ЮТест.ОжидаетЧто(МассивОшибок)
.ИмеетДлинуБольше(0)
.Содержит(ЮТест.Предикат() // Значение по условиям
.СодержитСтрокуПоШаблону("Передан тип <Число>. Список допустимых типов: <Строка>"));
Иначе
ЮТест.ОжидаетЧто(МассивОшибок)
.ИмеетДлину(0)
КонецЕсли;
КонецПроцедуры

Процедура РазрешениеСсылочногоТипа() Экспорт
ОбъектПроверки = Новый Структура("ref", 123);
ИмяСхемы = "object";
Expand Down
42 changes: 41 additions & 1 deletion tests/fixtures/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,54 @@
"minProperties": 2,
"maxProperties": 3
},
"additional":{
"additional_false":{
"type": "object",
"properties": {
"normal": {
"type": "string"
}
},
"additionalProperties": false
},
"additional_true":{
"type": "object",
"properties": {
"normal": {
"type": "string"
}
},
"additionalProperties": true
},
"additional_empty":{
"type": "object",
"properties": {
"normal": {
"type": "string"
}
},
"additionalProperties": {}
},
"additional_object":{
"type": "object",
"properties": {
"normal": {
"type": "string"
}
},
"additionalProperties": {
"type": "string"
}
},
"additional_ref":{
"type": "object",
"properties": {
"normal": {
"type": "string"
}
},
"additionalProperties": {
"$ref": "#/components/schemas/simple_string"
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion tools/yaxunit-jenkins-lib.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@
"level": "debug"
},
"exitCode": "./build/out/yaxunit/result.txt",
"projectPath": "."
"projectPath": "./"
}

0 comments on commit 77f874d

Please sign in to comment.