1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-11-25 22:12:29 +02:00
Files
OpenIntegrations/XML/CommonModules/OPI_ReportPortal/Ext/Module.bsl
Vitaly the Alpaca (bot) cdef2d02ab Main build (Jenkins)
2025-10-21 21:43:05 +03:00

481 lines
30 KiB
Plaintext

// OneScript: ./OInt/core/Modules/OPI_ReportPortal.os
// Lib: ReportPortal
// CLI: rportal
// Keywords: reportportal
// MIT License
// Copyright (c) 2023-2025 Anton Tsitavets
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// https://github.com/Bayselonarrend/OpenIntegrations
// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off
// BSLLS:UnreachableCode-off
// BSLLS:CommentedCode-off
// BSLLS:UsingServiceTag-off
// BSLLS:NumberOfParams-off
// BSLLS:LineLength-off
// BSLLS:UsingSynchronousCalls-off
// BSLLS:MagicNumber-off
//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
#Область ПрограммныйИнтерфейс
#Область Авторизация
// Получить временный токен
// Получает временный токен на основе логина и пароля
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Логин - Строка - Логин пользователя - login
// Пароль - Строка - Пароль пользователя - pass
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция ПолучитьВременныйТокен(Знач URL, Знач Логин, Знач Пароль) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(Логин);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль);
ДополнитьURL(URL, "uat/sso/oauth/token");
Результат = OPI_ЗапросыHTTP.НовыйЗапрос()
.Инициализировать()
.УстановитьURL(URL)
.ДобавитьBasicАвторизацию("ui", "uiman")
.УстановитьFormТело(Новый Структура("grant_type,username,password", "password", Логин, Пароль))
.ОбработатьЗапрос("POST")
.ВернутьОтветКакJSONКоллекцию();
Возврат Результат;
КонецФункции
// Получить постоянный токен
// Создает постоянный токен пользователя ReportPortal
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// IDПользователя - Строка - ID пользователя - user
// ИмяКлюча - Строка - Имя токена - name
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция ПолучитьПостоянныйТокен(Знач URL, Знач Токен, Знач IDПользователя, Знач ИмяКлюча) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
ДополнитьURL(URL, СтрШаблон("api/users/%1/api-keys", IDПользователя));
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("name", ИмяКлюча, "Строка", Параметры);
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PostСТелом(URL, Параметры, Заголовки);
Возврат Результат;
КонецФункции
// Удалить постоянный токен
// Удаляет ранее созданный токен пользователя
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// IDПользователя - Строка - ID пользователя - user
// IDКлюча - Строка - ID токена - id
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция УдалитьПостоянныйТокен(Знач URL, Знач Токен, Знач IDПользователя, Знач IDКлюча) Экспорт
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКлюча);
ДополнитьURL(URL, СтрШаблон("api/users/%1/api-keys/%2", IDПользователя, IDКлюча));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.Delete(URL, , Заголовки);
Возврат Результат;
КонецФункции
#КонецОбласти
#Область УправлениеРезультатами
// Создать запуск
// Запускает новый сеанс выполнения тестов
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// Проект - Строка - ID проекта - proj
// СтруктураЗапуска - Структура Из КлючИЗначение - Параметры запуска. См. ПолучитьСтруктуруЗапуска - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция СоздатьЗапуск(Знач URL, Знач Токен, Знач Проект, Знач СтруктураЗапуска) Экспорт
ТекстОшибки = "Структура запуска не является корректной коллекцией КлючИЗначение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураЗапуска, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
ДополнитьURL(URL, СтрШаблон("api/v1/%1/launch", Проект));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PostСТелом(URL, СтруктураЗапуска, Заголовки);
Возврат Результат;
КонецФункции
// Создать элемент
// Создает новый тестовый элемент
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// Проект - Строка - ID проекта - proj
// СтруктураЭлемента - Структура Из КлючИЗначение - Параметры элемента. См. ПолучитьСтруктуруЭлемента - params
// Родитель - Строка - ID родительского элемента, если необходимо - parent
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция СоздатьЭлемент(Знач URL, Знач Токен, Знач Проект, Знач СтруктураЭлемента, Знач Родитель = "") Экспорт
ТекстОшибки = "Структура элемента не является корректной коллекцией КлючИЗначение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураЭлемента, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
Родитель = ?(ЗначениеЗаполнено(Родитель), "/" + Родитель, "");
ДополнитьURL(URL, СтрШаблон("api/v1/%1/item%2", Проект, Родитель));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PostСТелом(URL, СтруктураЭлемента, Заголовки);
Возврат Результат;
КонецФункции
// Завершить запуск
// Завершает запущенный ранее сеанс выполнения тестов
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// Проект - Строка - ID проекта - proj
// IDЗапуска - Строка - ID запуска - id
// СтруктураЗавершения - Структура Из КлючИЗначение - Параметры завершения. См. ПолучитьСтруктуруЗавершенияЗапуска - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция ЗавершитьЗапуск(Знач URL, Знач Токен, Знач Проект, Знач IDЗапуска, Знач СтруктураЗавершения) Экспорт
ТекстОшибки = "Структура завершения не является корректной коллекцией КлючИЗначение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураЗавершения, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЗапуска);
ДополнитьURL(URL, СтрШаблон("api/v1/%1/launch/%2/finish", Проект, IDЗапуска));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PutСТелом(URL, СтруктураЗавершения, Заголовки);
Возврат Результат;
КонецФункции
// Завершить элемент
// Завершает работу созданного ранее тестового элемента
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// Проект - Строка - ID проекта - proj
// IDЭлемента - Строка - ID элемента - id
// СтруктураЗавершения - Структура Из КлючИЗначение - Параметры завершения. См. ПолучитьСтруктуруЗавершенияЭлемента - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция ЗавершитьЭлемент(Знач URL, Знач Токен, Знач Проект, Знач IDЭлемента, Знач СтруктураЗавершения) Экспорт
ТекстОшибки = "Структура завершения не является корректной коллекцией КлючИЗначение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураЗавершения, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЭлемента);
ДополнитьURL(URL, СтрШаблон("api/v1/%1/item/%2", Проект, IDЭлемента));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PutСТелом(URL, СтруктураЗавершения, Заголовки);
Возврат Результат;
КонецФункции
// Получить структуру запуска
// Получает структуру параметров запуска
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
// КакСоответствие - Булево - Истина > возвращает поля фильтра как соответствие - map
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруЗапуска(Знач Пустая = Ложь, Знач КакСоответствие = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
OPI_ПреобразованиеТипов.ПолучитьБулево(КакСоответствие);
Если КакСоответствие Тогда
СтруктураЗапуска = Новый Соответствие;
Иначе
СтруктураЗапуска = Новый Структура;
КонецЕсли;
СтруктураЗапуска.Вставить("name" , "<название запуска>");
СтруктураЗапуска.Вставить("startTime" , "<время начала запуска>");
СтруктураЗапуска.Вставить("description", "<описание запуска>");
СтруктураЗапуска.Вставить("uuid" , "<UUID запуска. Будет сгенерирован автоматически, если не заполнено>");
СтруктураЗапуска.Вставить("attributes" , "<атрибуты запуска в виде ключ1:значение1, ключ2:значение2>");
СтруктураЗапуска.Вставить("mode" , "<режим: default или debug>");
СтруктураЗапуска.Вставить("rerun" , "<признак перезапуска>");
СтруктураЗапуска.Вставить("rerunOf" , "<UUID уже существующего запуска, если rerun = Истина>");
Если Пустая Тогда
СтруктураЗапуска = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураЗапуска);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураЗапуска;
КонецФункции
// Получить структуру элемента
// Получает структуру параметров тестового элемента
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
// КакСоответствие - Булево - Истина > возвращает поля фильтра как соответствие - map
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруЭлемента(Знач Пустая = Ложь, Знач КакСоответствие = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
OPI_ПреобразованиеТипов.ПолучитьБулево(КакСоответствие);
Если КакСоответствие Тогда
СтруктураЭлемента = Новый Соответствие;
Иначе
СтруктураЭлемента = Новый Структура;
КонецЕсли;
СтруктураЭлемента.Вставить("name" , "<название элемента>");
СтруктураЭлемента.Вставить("startTime" , "<время начала>");
СтруктураЭлемента.Вставить("type" , "<тип элемента: suite, story, test, scenario, step, before_class, before_groups, before_method, before_suite, before_test, after_class, after_groups, after_method, after_suite, after_test>");
СтруктураЭлемента.Вставить("launchUuid" , "<UUID запуска>");
СтруктураЭлемента.Вставить("description", "<описание элемента>");
СтруктураЭлемента.Вставить("attributes" , "<атрибуты элемента в виде ключ1:значение1, ключ2:значение2>");
СтруктураЭлемента.Вставить("uuid" , "<UUID элемента. Будет сгенерирован автоматически, если не заполнено>");
СтруктураЭлемента.Вставить("codeRef" , "<физическое расположение тестов>");
СтруктураЭлемента.Вставить("parameters" , "<параметры для параметризированных тестов>");
СтруктураЭлемента.Вставить("retry" , "<является перезапуском>");
Если Пустая Тогда
СтруктураЭлемента = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураЭлемента);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураЭлемента;
КонецФункции
// Получить структуру завершения элемента
// Получает структуру параметров завершения выполнения тестового элемента
//
// Параметры:
// Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
// КакСоответствие - Булево - Истина > возвращает поля фильтра как соответствие - map
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруЗавершенияЭлемента(Знач Пустая = Ложь, Знач КакСоответствие = Ложь) Экспорт
OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
OPI_ПреобразованиеТипов.ПолучитьБулево(КакСоответствие);
Если КакСоответствие Тогда
СтруктураЭлемента = Новый Соответствие;
Иначе
СтруктураЭлемента = Новый Структура;
КонецЕсли;
СтруктураЭлемента.Вставить("endTime" , "<время окончания>");
СтруктураЭлемента.Вставить("launchUuid" , "<UUID запуска>");
СтруктураЭлемента.Вставить("status" , "<статус завершения: passed, failed, stopped, skipped, interrupted, cancelled>");
СтруктураЭлемента.Вставить("description", "<описание элемента. Перезаписывает указанное при создании>");
СтруктураЭлемента.Вставить("attributes" , "<атрибуты элемента. Перезаписывает указанное при создании>");
СтруктураЭлемента.Вставить("retry" , "<флаг завершения повторной попытки>");
СтруктураЭлемента.Вставить("issue" , "<информация о проблеме>");
Если Пустая Тогда
СтруктураЭлемента = OPI_Инструменты.ОчиститьКоллекциюРекурсивно(СтруктураЭлемента);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат СтруктураЭлемента;
КонецФункции
// Получить структуру завершения запуска
// Получает структуру параметров завершения тестового сеанса
//
// Параметры:
// Время - Дата - Дата и время завершения запуска - end
// Статус - Строка - Статус заверщения: passed, failed, stopped, skipped, interrupted, cancelled - status
// Описание - Строка - Описание запуска. Перезаписывает указанное при создании - descr
// Артибуты - Строка - Атрибуты запуска. Перезаписывает указанное при создании - attr
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруЗавершенияЗапуска(Знач Время, Знач Статус = "", Знач Описание = "", Знач Артибуты = "") Экспорт
Строка_ = "Строка";
СтруктураЗавершения = Новый Структура;
OPI_Инструменты.ДобавитьПоле("endTime" , Время , "ДатаISO", СтруктураЗавершения);
OPI_Инструменты.ДобавитьПоле("status" , Статус , Строка_ , СтруктураЗавершения);
OPI_Инструменты.ДобавитьПоле("description", Описание, Строка_ , СтруктураЗавершения);
OPI_Инструменты.ДобавитьПоле("attributes" , Артибуты, Строка_ , СтруктураЗавершения);
Возврат СтруктураЗавершения;
КонецФункции
#КонецОбласти
#Область ЗаписьЛогов
// Записать лог
// Добавляет информацию о выполнении для тестового элемента
//
// Параметры:
// URL - Строка - URL сервера ReportPortal - url
// Токен - Строка - Токен доступа - token
// Проект - Строка - ID проекта - proj
// СтруктураЛога - Структура Из КлючИЗначение - Информация о выполнении. См. ПолучитьСтруктуруЛога - params
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от ReportPortal
Функция ЗаписатьЛог(Знач URL, Знач Токен, Знач Проект, Знач СтруктураЛога) Экспорт
ТекстОшибки = "Структура лога не является корректной коллекцией КлючИЗначение";
OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(СтруктураЛога, ТекстОшибки);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Проект);
ДополнитьURL(URL, СтрШаблон("api/v1/%1/log", Проект));
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
Результат = OPI_ЗапросыHTTP.PostСТелом(URL, СтруктураЛога, Заголовки);
Возврат Результат;
КонецФункции
// Получить структуру лога
// Получает структуру параметров для записи лога
//
// Параметры:
// IDЗапуска - Строка - ID запуска, к которому принадлежит тестовый элемент - launch
// IDЭлемента - Строка - ID тестового элемента - id
// Время - Дата - Дата и время записи лога - time
// Текст - Строка - Текстовая информация лога - text
// Уровень - Строка - Уровень информации: error, warn, info, debug, trace, fatal, unknown - level
//
// Возвращаемое значение:
// Структура Из КлючИЗначение - Структура полей
Функция ПолучитьСтруктуруЛога(Знач IDЗапуска, Знач IDЭлемента, Знач Время, Знач Текст = "", Знач Уровень = "info") Экспорт
Строка_ = "Строка";
СтруктураЛога = Новый Структура;
OPI_Инструменты.ДобавитьПоле("launchUuid", IDЗапуска , Строка_ , СтруктураЛога);
OPI_Инструменты.ДобавитьПоле("itemUuid" , IDЭлемента, Строка_ , СтруктураЛога);
OPI_Инструменты.ДобавитьПоле("time" , Время , "Дата" , СтруктураЛога);
OPI_Инструменты.ДобавитьПоле("message" , Текст , Строка_ , СтруктураЛога);
OPI_Инструменты.ДобавитьПоле("level" , Уровень , Строка_ , СтруктураЛога);
Возврат СтруктураЛога;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДополнитьURL(URL, Знач Путь)
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
URL = ?(СтрЗаканчиваетсяНа(URL, "/"), URL, URL + "/");
URL = URL + Путь;
КонецПроцедуры
Функция ПолучитьЗаголовокАвторизации(Знач Токен)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
Заголовки = Новый Соответствие;
OPI_Инструменты.ДобавитьПоле("Authorization", СтрШаблон("Bearer %1", Токен), "Строка", Заголовки);
Возврат Заголовки;
КонецФункции
#КонецОбласти