From 41d93c743a4794acec8fb4ec653cf31eafcf5f4e Mon Sep 17 00:00:00 2001 From: Vitaly the Alpaca Date: Wed, 8 May 2024 10:48:24 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20OPI=20->=20OInt=20?= =?UTF-8?q?(workflow)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/oint_test.yml | 44 ++- OInt/core/Modules/OPI_Airtable.os | 334 ++++++++++++++++++ OInt/core/Modules/OPI_Slack.os | 18 +- OInt/core/Modules/OPI_Telegram.os | 4 +- OInt/tests/Modules/internal/OPI_Тесты.os | 111 +++++- .../Modules/OPI_ПолучениеДанныхТестов.os | 13 +- OInt/tools/Modules/OPI_ПреобразованиеТипов.os | 7 + 7 files changed, 517 insertions(+), 14 deletions(-) create mode 100644 OInt/core/Modules/OPI_Airtable.os diff --git a/.github/workflows/oint_test.yml b/.github/workflows/oint_test.yml index 4bffb4db0f..c8525f1764 100644 --- a/.github/workflows/oint_test.yml +++ b/.github/workflows/oint_test.yml @@ -812,6 +812,48 @@ jobs: if: ${{ cancelled() }} == false run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "Слак_ЗагрузитьУдалитьВФ" + + Testing-Airtable: + runs-on: ubuntu-latest + needs: [Decode, Build] + steps: + + - uses: actions/checkout@v2 + - uses: otymko/setup-onescript@v1.4 + with: + version: 1.9.0 + + - name: Получить тестовые данные из кэша + uses: actions/cache/restore@v3 + with: + key: test-data + path: ./data.json + + - name: Установить asserts и 1testrunner + run: | + opm install asserts + opm install 1testrunner + + - name: Установить OInt + run: | + cd ./OInt + opm build + opm install *.ospx + + + + - name: Создать/Изменить базу + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьБазу" + + - name: Создать/Изменить таблицу + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьТаблицу" + + - name: Создать/Изменить поле + if: ${{ cancelled() }} == false + run: oscript /home/runner/.local/share/ovm/current/lib/1testrunner/src/main.os -run ./OInt/tests/Modules/internal/OPI_Тесты.os "АТ_СоздатьПоле" + Encode: runs-on: ubuntu-latest needs: Testing-Twitter @@ -853,7 +895,7 @@ jobs: Clear-Cache: runs-on: ubuntu-latest - needs: [Testing-Telegram, Testing-VK, Testing-Viber, Testing-Twitter, Testing-YandexDisk, Testing-GoogleWorkspace, Testing-GoogleCalendar, Testing-GoogleDrive, Testing-GoogleSheets, Testing-Notion, Testing-Slack, Encode] + needs: [Testing-Telegram, Testing-VK, Testing-Viber, Testing-Twitter, Testing-YandexDisk, Testing-GoogleWorkspace, Testing-GoogleCalendar, Testing-GoogleDrive, Testing-GoogleSheets, Testing-Notion, Testing-Slack, Testing-Airtable, Encode] if: ${{ always() }} steps: - name: Очистка основного кэша diff --git a/OInt/core/Modules/OPI_Airtable.os b/OInt/core/Modules/OPI_Airtable.os new file mode 100644 index 0000000000..c6dd3f4999 --- /dev/null +++ b/OInt/core/Modules/OPI_Airtable.os @@ -0,0 +1,334 @@ +// Библиотека: Airtable +// Команда CLI: Airtable + +// MIT License + +// Copyright (c) 2023 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:IncorrectLineBreak-off + +// Раскомментировать, если выполняется OneScript +#Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область РаботаСБазами + +// Получить список баз +// Получает список доступных баз +// +// Параметры: +// Токен - Строка - Токен - token +// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offser +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ); + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры); + + Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить таблицы базы +// Получает схему таблиц базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Get(URL, , Заголовки); + + Возврат Ответ; + +КонецФункции + +// Создать базу +// Создает новую базу данных +// +// Параметры: +// Токен - Строка - Токен - token +// РабочееПространство - Строка - Идентификатор рабочего пространства - ws +// Наименование - Строка - Наименование новой базы - title +// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц); + + Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура") + И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных коллекции таблиц"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + МассивТаблиц = Новый Массив; + + Для Каждого Таблица Из КоллекцияТаблиц Цикл + + Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение); + МассивТаблиц.Добавить(Описание); + + КонецЦикла; + + Параметры = Новый Структура; + OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры); + OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСТаблицами + +// Создать таблицу +// Создает новую таблицу в базе +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Наименование - Строка - Наименование новой таблицы - title +// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata +// Описание - Строка - Описание таблицы - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); + + Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить таблицу +// Изменяет наименование и|или описание базы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + Параметры = Новый Структура; + + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +#КонецОбласти + +#Область РаботаСПолями + +// Создать поле +// Создет новое поле в таблице +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы - base +// Таблица - Строка - Идентификатор таблицы - table +// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля); + + Если Не ТипЗнч(СтруктураПоля) = Тип("Структура") + И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда + + ВызватьИсключение "Ошибка в данных описания поля"; + + КонецЕсли; + + URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields"; + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Изменить поле +// Изменяет имя и|или описание существующего поля таблицы +// +// Параметры: +// Токен - Строка - Токен - token +// База - Строка - Идентификатор базы База - base +// Таблица - Строка - Идентификатор таблицы - table +// Поле - Строка - Идентификатор поля - field +// Наименование - Строка - Новое наименование - title +// Описание - Строка - Новое описание - description +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable +Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(База); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле); + + URL = "https://api.airtable.com/v0/meta/bases/" + + База + + "/tables/" + + Таблица + + "/fields/" + + Поле; + + Заголовки = ПолучитьЗаголовокАвторизации(Токен); + + Параметры = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры); + + Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки); + + Возврат Ответ; + +КонецФункции + +// Получить поле (строковое) +// Получает описание поля строкового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт + Возврат ОписаниеПримитивногоПоля(Наименование, "richText"); +КонецФункции + +// Получить поле (числовое) +// Получает описание поля числового типа +// +// Параметры: +// Наименование - Строка - Наименование нового поля - title +// Точность - Число,Строка - Число знаков после запятой - precision +// +// Возвращаемое значение: +// Структура - Описание поля +Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность); + + СтруктураОпций = Новый Структура("precision", Точность); + Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Authorization", "Bearer " + Токен); + + Возврат Заголовки; + +КонецФункции + +Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "") + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); + OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей); + + ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей); + + OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы); + + Возврат ОписаниеТаблицы; + +КонецФункции + +Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "") + + СтруктураПоля = Новый Структура(); + OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля); + OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля); + + Возврат СтруктураПоля; + +КонецФункции + +#КонецОбласти diff --git a/OInt/core/Modules/OPI_Slack.os b/OInt/core/Modules/OPI_Slack.os index 9bd993627a..94b4584377 100644 --- a/OInt/core/Modules/OPI_Slack.os +++ b/OInt/core/Modules/OPI_Slack.os @@ -25,8 +25,8 @@ // https://github.com/Bayselonarrend/OpenIntegrations -// BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:IncorrectLineBreak-off +// BSLLS:Typo-off // Раскомментировать, если выполняется OneScript #Использовать "../../tools" @@ -717,6 +717,7 @@ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла); OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок); + Строка_ = "Строка"; Upload_url = "upload_url"; File_id = "file_id"; URL = "https://slack.com/api/files.getUploadURLExternal"; @@ -724,8 +725,8 @@ Размер = Файл.Размер(); Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("length" , Размер , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); URL = Ответ[Upload_url]; @@ -743,8 +744,8 @@ ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок); Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("channel_id", Канал , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры); OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры); Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); @@ -884,14 +885,15 @@ // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт + Строка_ = "Строка"; URL = "https://slack.com/api/files.remote.add"; Заголовки = ПолучитьЗаголовокАвторизации(Токен); UID = Строка(Новый УникальныйИдентификатор()); Параметры = Новый Структура; - OPI_Инструменты.ДобавитьПоле("external_url", URL , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("external_id" , UID , "Строка", Параметры); - OPI_Инструменты.ДобавитьПоле("title" , Заголовок , "Строка", Параметры); + OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры); + OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры); Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки); diff --git a/OInt/core/Modules/OPI_Telegram.os b/OInt/core/Modules/OPI_Telegram.os index be867f0794..5334ad0fd9 100644 --- a/OInt/core/Modules/OPI_Telegram.os +++ b/OInt/core/Modules/OPI_Telegram.os @@ -971,6 +971,8 @@ // Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт + Result = "result"; + OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла); @@ -979,7 +981,7 @@ URL = "api.telegram.org/bot" + Токен + "/getFile"; Ответ = OPI_Инструменты.Get(URL, Параметры); - Путь = Ответ["result"]["file_path"]; + Путь = Ответ[Result]["file_path"]; Если Не ЗначениеЗаполнено(Путь) Тогда Возврат Ответ; diff --git a/OInt/tests/Modules/internal/OPI_Тесты.os b/OInt/tests/Modules/internal/OPI_Тесты.os index 35771af430..19fcddf53d 100644 --- a/OInt/tests/Modules/internal/OPI_Тесты.os +++ b/OInt/tests/Modules/internal/OPI_Тесты.os @@ -32,6 +32,7 @@ // BSLLS:DuplicateStringLiteral-off // @skip-check undefined-variable +// @skip-check wrong-string-literal-content // Раскомментировать, если выполняется OneScript #Использовать oint @@ -3377,7 +3378,7 @@ Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл"); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)"); ЗагруженныйФайл = Результат["files"][0]; МассивФайлов.Добавить(ЗагруженныйФайл["id"]); @@ -3424,6 +3425,7 @@ Проверка_СлакОк(Результат); OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив"); + КонецПроцедуры Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт @@ -3467,6 +3469,113 @@ #КонецОбласти +#Область Airtable + +Процедура АТ_СоздатьБазу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace"); + Наименование = "Тестовая база"; + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + + ИмяТаблицы = "Тестовая таблица"; + + СоответствиеТаблиц = Новый Соответствие; + СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей); + + Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы); + + База = Результат["id"]; + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База); + + Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив"); + + Результат = OPI_Airtable.ПолучитьСписокБаз(Токен); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено(); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив"); + +КонецПроцедуры + +Процедура АТ_СоздатьТаблицу() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + + МассивПолей = Новый Массив; + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер")); + МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое")); + + ИмяТаблицы = "Тестовая таблица 2"; + Описание = "Новая таблица"; + + Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + + Таблица = Результат["id"]; + ИмяТаблицы = "Тестовая таблица 2 (изм.)"; + Описание = "Новая таблица (изм.)"; + + OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица); + + Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +Процедура АТ_СоздатьПоле() Экспорт + + Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token"); + База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base"); + Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table"); + Имя = Строка(Новый УникальныйИдентификатор); + + Поле = OPI_Airtable.ПолучитьПолеНомера(Имя); + + Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + + Поле = Результат["id"]; + Имя = Имя + "(изм.)"; + Описание = "Новое описание"; + + Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле"); + + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя); + OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #КонецОбласти diff --git a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os index 48f5351b82..4b924b50fd 100644 --- a/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os +++ b/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os @@ -29,6 +29,7 @@ // BSLLS:DeprecatedMessage-off // BSLLS:UsingServiceTag-off // BSLLS:ExecuteExternalCodeInCommonModule-off +// BSLLS:DuplicateStringLiteral-off //@skip-check use-non-recommended-method @@ -52,9 +53,10 @@ Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости); Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл); Разделы.Вставить("GoogleDrive" , ЗависимостиГугл); - Разделы.Вставить("GoogleSheets" , ЗависимостиГугл); + Разделы.Вставить("GoogleSheets" , ЗависимостиГугл); Разделы.Вставить("Notion" , СтандартныеЗависимости); Разделы.Вставить("Slack" , СтандартныеЗависимости); + Разделы.Вставить("Airtable" , СтандартныеЗависимости); Возврат Разделы; @@ -73,6 +75,7 @@ Ноушн = "Notion"; Слак = "Slack"; Таблицы = "GoogleSheets"; + АирТ = "Airtable"; ТаблицаТестов = Новый ТаблицаЗначений; ТаблицаТестов.Колонки.Добавить("Метод"); @@ -193,10 +196,14 @@ НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак); НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак); НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак); + + НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ); + НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ); Возврат ТаблицаТестов; - -КонецФункции + +КонецФункции Функция ОжидаетЧто(Значение) Экспорт diff --git a/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/OInt/tools/Modules/OPI_ПреобразованиеТипов.os index af83e30615..cd119e2b58 100644 --- a/OInt/tools/Modules/OPI_ПреобразованиеТипов.os +++ b/OInt/tools/Modules/OPI_ПреобразованиеТипов.os @@ -272,6 +272,13 @@ КонецПроцедуры +Процедура ПолучитьЧисло(Значение) Экспорт + + ОписаниеТипа = Новый ОписаниеТипов("Число"); + Значение = ОписаниеТипа.ПривестиЗначение(Значение); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции