1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-20 18:48:36 +02:00

Merge pull request #226 from bia-technologies/feature/187

187 / Доработаны утверждения ИБ для проверки строк неограниченной длины
This commit is contained in:
Koryakin Aleksey 2023-12-09 03:21:04 +03:00 committed by GitHub
commit 0360905e59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 160 additions and 71 deletions

View File

@ -60,7 +60,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Структура, Неопределено - Содержит все данные записи, включая табличный части
Функция Запись(ИмяТаблицы, Предикат) Экспорт
@ -78,7 +78,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Массив из Структура - Найденные записи, включая табличный части
Функция Записи(ИмяТаблицы, Предикат) Экспорт
@ -134,7 +134,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Булево - Таблица содержит записи
Функция ТаблицаСодержитЗаписи(ИмяТаблицы, Предикат = Неопределено) Экспорт

View File

@ -18,7 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция РезультатЗапроса(ОписаниеЗапроса, ДляКлиента) Экспорт
Функция РезультатЗапроса(Знач ОписаниеЗапроса, Знач ДляКлиента) Экспорт
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
@ -53,7 +53,7 @@
// Возвращаемое значение:
// - Структура Из Произвольный - Значения реквизитов ссылки при получении значений множества реквизитов
// - Произвольный - Значение реквизита ссылки при получении значения одного реквизита
Функция ЗначенияРеквизитов(Ссылка, ИменаРеквизитов, ОдинРеквизит) Экспорт
Функция ЗначенияРеквизитов(Знач Ссылка, Знач ИменаРеквизитов, Знач ОдинРеквизит) Экспорт
ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
@ -77,7 +77,7 @@
//
// Возвращаемое значение:
// Массив из Структура, Структура, Неопределено - Записи
Функция Записи(ОписаниеЗапроса, ОднаЗапись) Экспорт
Функция Записи(Знач ОписаниеЗапроса, Знач ОднаЗапись) Экспорт
Если ОднаЗапись Тогда
ОписаниеЗапроса.КоличествоЗаписей = 1;
@ -108,7 +108,7 @@
// - Структура Из Произвольный - Значения множества реквизитов записи
// - Произвольный - Значение одного реквизита записи
//
Функция ЗначенияРеквизитовЗаписи(ОписаниеЗапроса, ОдинРеквизит) Экспорт
Функция ЗначенияРеквизитовЗаписи(Знач ОписаниеЗапроса, Знач ОдинРеквизит) Экспорт
Запись = Записи(ОписаниеЗапроса, Истина);
@ -144,6 +144,8 @@
// Запрос
Функция Запрос(ОписаниеЗапроса)
Запрос = Новый Запрос;
Строки = Новый Массив();
Строки.Добавить("ВЫБРАТЬ ");
@ -159,10 +161,12 @@
Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС));
Строки.Добавить("ИЗ " + ОписаниеЗапроса.ИмяТаблицы);
Условия = СформироватьУсловия(ОписаниеЗапроса.Условия, ОписаниеЗапроса.ИмяТаблицы, Запрос);
Если ОписаниеЗапроса.Условия.Количество() Тогда
Если Условия.Количество() Тогда
Строки.Добавить("ГДЕ (");
Строки.Добавить(СтрСоединить(ОписаниеЗапроса.Условия, ") И (" + Символы.ПС));
Строки.Добавить(СтрСоединить(Условия, ") И (" + Символы.ПС));
Строки.Добавить(")");
КонецЕсли;
@ -171,7 +175,7 @@
Строки.Добавить(СтрСоединить(ОписаниеЗапроса.Порядок, ","));
КонецЕсли;
Запрос = Новый Запрос(СтрСоединить(Строки, Символы.ПС));
Запрос.Текст = СтрСоединить(Строки, Символы.ПС);
ЮТОбщий.ОбъединитьВСтруктуру(Запрос.Параметры, ОписаниеЗапроса.ЗначенияПараметров);
Возврат Запрос;
@ -269,4 +273,123 @@
КонецФункции
Функция ШаблонУсловия(ВыражениеПредиката, ВыраженияПредикатов, ТипРеквизита)
Выражение = ВыражениеПредиката.ВидСравнения;
Отрицание = ЮТПредикатыКлиентСервер.ЭтоВыраженияОтрицания(Выражение);
Если Отрицание Тогда
Выражение = ЮТПредикатыКлиентСервер.ВыраженияБезОтрицания(Выражение);
КонецЕсли;
Если Выражение = ВыраженияПредикатов.Равно Тогда
Если ЭтоСтрокаНеограниченнойДлинны(ТипРеквизита) Тогда
Шаблон = СтрШаблон("ВЫРАЗИТЬ(%%1 КАК Строка(%1)) = &%%2", XMLСтрока(СтрДлина(ВыражениеПредиката.Значение) + 1));
Иначе
Шаблон = "%1 = &%2";
КонецЕсли;
ИначеЕсли Выражение = ВыраженияПредикатов.Больше Тогда
Шаблон = "%1 > &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.БольшеРавно Тогда
Шаблон = "%1 >= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Меньше Тогда
Шаблон = "%1 < &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.МеньшеРавно Тогда
Шаблон = "%1 <= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.ИмеетТип Тогда
Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Иначе
ВызватьИсключение "Неподдерживаемое выражения предикатов " + Выражение;
КонецЕсли;
Если Отрицание Тогда
Шаблон = СтрШаблон("НЕ (%1)", Шаблон);
КонецЕсли;
Возврат Шаблон;
КонецФункции
Функция ТипыРеквизитов(ИмяТаблицы, Предикаты)
Результат = Новый Соответствие();
Реквизиты = Новый Массив();
ПсевдонимТаблицы = ЮТТестовыеДанные.СлучайныйИдентификатор() + СтрЗаменить(ИмяТаблицы, ".", "");
ДлинаПсевдонима = СтрДлина(ПсевдонимТаблицы);
Для Каждого ВыражениеПредиката Из Предикаты Цикл
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ВыражениеПредиката) И ЗначениеЗаполнено(ВыражениеПредиката.ИмяРеквизита) Тогда
Реквизиты.Добавить(СтрШаблон("%1.%2 КАК _%3", ПсевдонимТаблицы, ВыражениеПредиката.ИмяРеквизита, Реквизиты.Количество()));
КонецЕсли;
КонецЦикла;
Если НЕ ЗначениеЗаполнено(Реквизиты) Тогда
Возврат Результат;
КонецЕсли;
Схема = Новый СхемаЗапроса();
Попытка
Схема.УстановитьТекстЗапроса(СтрШаблон("ВЫБРАТЬ %1 ИЗ %2 КАК %3", СтрСоединить(Реквизиты, ","), ИмяТаблицы, ПсевдонимТаблицы));
Исключение
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки("Не удалось получить типы реквизитов отбора.
|Возможно имена реквизитов заданы неверно");
ВызватьИсключение
КонецПопытки;
Для Каждого Колонка Из Схема.ПакетЗапросов[0].Колонки Цикл
Выражение = Строка(Колонка.Поля[0]);
Результат.Вставить(Сред(Выражение, ДлинаПсевдонима + 2), Новый ОписаниеТипов(Колонка.ТипЗначения, , "Null"));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоСтрокаНеограниченнойДлинны(ТипРеквизита)
Возврат ТипРеквизита <> Неопределено
И ТипРеквизита.СодержитТип(Тип("Строка"))
И ТипРеквизита.КвалификаторыСтроки.Длина = 0;
КонецФункции
Функция СформироватьУсловия(Условия, ИмяТаблицы, Запрос) Экспорт
Результат = Новый Массив();
Если НЕ ЗначениеЗаполнено(Условия) Тогда
Возврат Результат;
КонецЕсли;
ТипыРеквизитов = ТипыРеквизитов(ИмяТаблицы, Условия);
ВидыСравнения = ЮТПредикаты.Выражения();
Для Каждого Условие Из Условия Цикл
Если НЕ ЮТПредикатыКлиентСервер.ЭтоПредикат(Условие) Тогда
Результат.Добавить(Условие);
Продолжить;
КонецЕсли;
ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(Запрос.Параметры.Количество() + 1);
ТипРеквизита = ТипыРеквизитов[Условие.ИмяРеквизита];
Шаблон = ШаблонУсловия(Условие, ВидыСравнения, ТипРеквизита);
ТекстУсловия = СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра);
Результат.Добавить(ТекстУсловия);
Запрос.Параметры.Вставить(ИмяПараметра, Условие.Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -28,75 +28,18 @@
ЗаполнитьВыбираемыеПоля(Описание, ВыбираемыеПоля);
КонецЕсли;
СформироватьУсловия(ПредикатыУсловия, Описание.Условия, Описание.ЗначенияПараметров);
Если ПредикатыУсловия <> Неопределено Тогда
Описание.Условия = ЮТПредикатыКлиентСервер.НаборПредикатов(ПредикатыУсловия);
КонецЕсли;
Возврат Описание;
КонецФункции
Процедура СформироватьУсловия(Предикат, КоллекцияУсловий, ЗначенияПараметров) Экспорт
Если Предикат = Неопределено Тогда
Возврат;
КонецЕсли;
Предикаты = ЮТПредикатыКлиентСервер.НаборПредикатов(Предикат);
ВидыСравнения = ЮТПредикаты.Выражения();
Для Каждого ВыражениеПредиката Из Предикаты Цикл
ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(ЗначенияПараметров.Количество() + 1);
Шаблон = ШаблонУсловия(ВыражениеПредиката.ВидСравнения, ВидыСравнения);
Условие = СтрШаблон(Шаблон, ВыражениеПредиката.ИмяРеквизита, ИмяПараметра);
КоллекцияУсловий.Добавить(Условие);
ЗначенияПараметров.Вставить(ИмяПараметра, ВыражениеПредиката.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ШаблонУсловия(Знач Выражение, ВыраженияПредикатов)
Отрицание = ЮТПредикатыКлиентСервер.ЭтоВыраженияОтрицания(Выражение);
Если Отрицание Тогда
Выражение = ЮТПредикатыКлиентСервер.ВыраженияБезОтрицания(Выражение);
КонецЕсли;
Если Выражение = ВыраженияПредикатов.Равно Тогда
Шаблон = "%1 = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Больше Тогда
Шаблон = "%1 > &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.БольшеРавно Тогда
Шаблон = "%1 >= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Меньше Тогда
Шаблон = "%1 < &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.МеньшеРавно Тогда
Шаблон = "%1 <= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.ИмеетТип Тогда
Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Иначе
ВызватьИсключение "Неподдерживаемое выражения предикатов " + Выражение;
КонецЕсли;
Если Отрицание Тогда
Шаблон = СтрШаблон("НЕ (%1)", Шаблон);
КонецЕсли;
Возврат Шаблон;
КонецФункции
Процедура ЗаполнитьВыбираемыеПоля(ОписаниеЗапроса, Знач ВыбираемыеПоля)
ТипПараметра = ТипЗнч(ВыбираемыеПоля);

View File

@ -144,7 +144,7 @@
.Фикция("Наименование")
.Фикция("Поставщик");
Ссылка = Конструктор.Записать();
ДанныеСправочника = Конструктор.ДанныеОбъекта();
Конструктор.ДанныеОбъекта();
ОписаниеЗапроса = ЮТЗапросы.ОписаниеЗапроса();
ОписаниеЗапроса.ИмяТаблицы = "Справочник.Товары";
@ -187,6 +187,29 @@
ЮТест.ОжидаетЧто(ДанныеЗаписи)
.Свойство("Ссылка").Равно(Ссылка);
// Поиск по неограниченной строке
ИмяФайла = ЮТест.Данные().СлучайнаяСтрока();
Ссылка = ЮТест.Данные().КонструкторОбъекта("Справочники.ХранимыеФайлы")
.ФикцияОбязательныхПолей()
.Установить("ИмяФайла", ИмяФайла)
.Записать();
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.ХранимыеФайлы", ЮТест.Предикат()
.Реквизит("ИмяФайла").Равно(ИмяФайла));
ЮТест.ОжидаетЧто(ДанныеЗаписи, "Поиск по неограниченной строке")
.Свойство("Ссылка").Равно(Ссылка);
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.ХранимыеФайлы", ЮТест.Предикат()
.Реквизит("ИмяФайла").Равно(5));
ЮТест.ОжидаетЧто(ДанныеЗаписи, "Поиск по неограниченной строке, число")
.НеЗаполнено();
ДанныеЗаписи = ЮТЗапросы.Запись("Справочник.ХранимыеФайлы", ЮТест.Предикат()
.Реквизит("ИмяФайла").Равно(Неопределено));
ЮТест.ОжидаетЧто(ДанныеЗаписи, "Поиск по неограниченной строке, Неопределено")
.НеЗаполнено();
// Документ, тест на табличную часть
Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
.Фикция("Склад")