diff --git a/features/dev-dependencies.feature b/features/dev-dependencies.feature new file mode 100644 index 0000000..a1b4b60 --- /dev/null +++ b/features/dev-dependencies.feature @@ -0,0 +1,32 @@ +# language: ru + +Функциональность: Установка зависимостей разработчика + +Как разработчик + Я хочу иметь возможность устанавливать зависимости разработчика + Чтобы иметь доступ к инструментам тестирования и разработки + +Контекст: Подготовка тестового окружения + Допустим Я очищаю параметры команды "opm" в контексте + И Я устанавливаю путь выполнения команды "opm" к текущей библиотеке + И Я создаю временный каталог и сохраняю его в переменной "РабочийКаталог" + И Я создаю тестовый пакет с зависимостями разработчика в переменной "РабочийКаталог" + +Сценарий: Установка только обычных зависимостей без флага --dev + Допустим Я установил рабочий каталог из переменной "РабочийКаталог" + И Я добавляю параметр "install" для команды "opm" + И Я добавляю параметр "--local" для команды "opm" + Когда Я выполняю команду "opm" + Тогда Код возврата команды "opm" равен 0 + И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules" + И В каталоге из переменной "РабочийКаталог" НЕ создается файл или каталог "oscript_modules/asserts" + И В каталоге из переменной "РабочийКаталог" НЕ создается файл или каталог "oscript_modules/1bdd" + +Сценарий: Установка зависимостей разработчика с флагом --dev + Допустим Я установил рабочий каталог из переменной "РабочийКаталог" + И Я добавляю параметр "install" для команды "opm" + И Я добавляю параметр "--local" для команды "opm" + И Я добавляю параметр "--dev" для команды "opm" + Когда Я выполняю команду "opm" + Тогда Код возврата команды "opm" равен 0 + И В каталоге из переменной "РабочийКаталог" создается файл или каталог "oscript_modules" \ No newline at end of file diff --git a/features/step_definitions/shared.os b/features/step_definitions/shared.os index de87345..c98bdcf 100644 --- a/features/step_definitions/shared.os +++ b/features/step_definitions/shared.os @@ -11,11 +11,13 @@ ВсеШаги.Добавить("ЯУстанавливаюПутьВыполненияКомандыКТекущейБиблиотеке"); ВсеШаги.Добавить("ВКаталогеИзПеременнойСоздаетсяФайлИлиКаталог"); + ВсеШаги.Добавить("ВКаталогеИзПеременнойНЕСоздаетсяФайлИлиКаталог"); ВсеШаги.Добавить("ЯДобавляюПараметрыДляКоманды"); ВсеШаги.Добавить("ЯДобавляюОпциюДляКомандыИзПеременной"); ВсеШаги.Добавить("ЯДобавляюАргументДляКомандыИзПеременной"); ВсеШаги.Добавить("ЯУстанавливаюПеременнуюОкруженияИзПеременной"); ВсеШаги.Добавить("ЯСоздаюВременныйКаталогИСохраняюЕгоВПеременной"); + ВсеШаги.Добавить("ЯСоздаюТестовыйПакетСЗависимостямиРазработчикаВПеременной"); Возврат ВсеШаги; КонецФункции @@ -126,3 +128,47 @@ Функция КаталогБиблиотеки() Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."); КонецФункции + +//В каталоге из переменной "РабочийКаталог" НЕ создается файл или каталог "oscript_modules/asserts" +Процедура ВКаталогеИзПеременнойНЕСоздаетсяФайлИлиКаталог(Знач ИмяПеременной, Знач ОтносительныйПуть) Экспорт + + Каталог = БДД.ПолучитьИзКонтекста(ИмяПеременной); + ПолныйПуть = ОбъединитьПути(Каталог, ОтносительныйПуть); + + ФайлИлиКаталог = Новый Файл(ПолныйПуть); + Если ФайлИлиКаталог.Существует() Тогда + ВызватьИсключение СтрШаблон("Файл или каталог <%1> не должен существовать, но он существует", ПолныйПуть); + КонецЕсли; + +КонецПроцедуры + +//Я создаю тестовый пакет с зависимостями разработчика в переменной "РабочийКаталог" +Процедура ЯСоздаюТестовыйПакетСЗависимостямиРазработчикаВПеременной(Знач ИмяПеременной) Экспорт + + КаталогПакета = БДД.ПолучитьИзКонтекста(ИмяПеременной); + + // Создаем packagedef с зависимостями разработчика + СодержимоеPackagedef = + "Описание.Имя(""test-dev-deps"") + | .Версия(""1.0.0"") + | .ВерсияСреды(""1.9.2"") + | .ЗависитОт(""strings"", ""0.5.0"") + | .РазработкаЗависитОт(""asserts"", ""1.4.0"") + | .РазработкаЗависитОт(""1bdd"", ""1.15.1"") + | .ВключитьФайл(""src"");"; + + ФайлPackagedef = ОбъединитьПути(КаталогПакета, "packagedef"); + ЗаписьТекста = Новый ЗаписьТекста(ФайлPackagedef, КодировкаТекста.UTF8); + ЗаписьТекста.Записать(СодержимоеPackagedef); + ЗаписьТекста.Закрыть(); + + // Создаем каталог src с тестовым файлом + КаталогSrc = ОбъединитьПути(КаталогПакета, "src"); + СоздатьКаталог(КаталогSrc); + + ФайлТеста = ОбъединитьПути(КаталогSrc, "test.os"); + ЗаписьТекста = Новый ЗаписьТекста(ФайлТеста, КодировкаТекста.UTF8); + ЗаписьТекста.Записать("Процедура ТестоваяПроцедура() Экспорт" + Символы.ПС + "КонецПроцедуры"); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры diff --git a/packagedef b/packagedef index ef6a8ad..dc60b50 100644 --- a/packagedef +++ b/packagedef @@ -13,7 +13,7 @@ Константы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюКонстант); ВерсияПродукта = Константы_ЛокальнаяВерсия.ВерсияПродукта; Иначе - ВерсияПродукта = "1.6.2"; + ВерсияПродукта = "1.6.3"; КонецЕсли; Описание.Имя("opm") diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index 819aa71..f3f30f8 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -202,11 +202,20 @@ ВызватьИсключение "УровеньЗависимости не может быть меньше нуля"; КонецЕсли; - Зависимости = Манифест.Зависимости(); - Если Зависимости.Количество() = 0 Тогда + ВсеЗависимости = Манифест.Зависимости(); + Если ВсеЗависимости.Количество() = 0 Тогда Возврат; КонецЕсли; + // Фильтруем зависимости в зависимости от флага УстанавливатьЗависимостиРазработчика + // Зависимости разработчика устанавливаются только на первом уровне (УровеньЗависимости = 0) + Отбор = Новый Структура(); + Если Не (УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0) Тогда + Отбор.Вставить("ДляРазработки", Ложь); + КонецЕсли; + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + УстановленныеПакеты = ПолучитьУстановленныеПакеты(); Для Каждого Зависимость Из Зависимости Цикл @@ -233,11 +242,20 @@ Процедура РазрешитьЗависимостиПакетаЛокально(Манифест, ПутьККаталогуЛокальныхЗависимостей, Знач УровеньЗависимости = 0) - Зависимости = Манифест.Зависимости(); - Если Зависимости.Количество() = 0 Тогда + ВсеЗависимости = Манифест.Зависимости(); + Если ВсеЗависимости.Количество() = 0 Тогда Возврат; КонецЕсли; + // Фильтруем зависимости в зависимости от флага УстанавливатьЗависимостиРазработчика + // Зависимости разработчика устанавливаются только на первом уровне (УровеньЗависимости = 0) + Отбор = Новый Структура(); + Если Не (УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0) Тогда + Отбор.Вставить("ДляРазработки", Ложь); + КонецЕсли; + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + УстановленныеПакеты = ПолучитьУстановленныеПакеты(); Для Каждого Зависимость Из Зависимости Цикл diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" index 89dbd99..b35119c 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" @@ -24,5 +24,5 @@ ПутьВЗапасномХранилище = "/download/"; ЛокальныйКаталогУстановкиПакетов = "oscript_modules"; ИмяЛога = "oscript.app.opm"; -ВерсияПродукта = "1.6.2"; +ВерсияПродукта = "1.6.3"; ИмяФайлаНастроек = "opm.cfg"; diff --git a/tests/dev-dependencies-test.os b/tests/dev-dependencies-test.os new file mode 100644 index 0000000..2cecd3e --- /dev/null +++ b/tests/dev-dependencies-test.os @@ -0,0 +1,212 @@ +#Использовать asserts +#Использовать "../src/core" + +Перем юТест; + +Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт + + юТест = Тестирование; + + Тесты = Новый Массив; + + Тесты.Добавить("ТестДолжен_ФильтроватьЗависимостиБезФлагаРазработчика"); + Тесты.Добавить("ТестДолжен_ВключатьЗависимостиРазработчикаСФлагом"); + Тесты.Добавить("ТестДолжен_ИсключатьЗависимостиРазработчикаНаВложенныхУровнях"); + Тесты.Добавить("ТестДолжен_РаботатьСЛокальнымиЗависимостями"); + + Возврат Тесты; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт +КонецПроцедуры + +Функция СоздатьТестовыйМанифест() + + Манифест = Новый ОписаниеПакета(); + Манифест.Имя("test-dev-deps") + .Версия("1.0.0") + .ВерсияСреды("1.9.2") + .ЗависитОт("regular-dep1", "1.0.0") + .ЗависитОт("regular-dep2", "2.0.0") + .РазработкаЗависитОт("dev-dep1", "1.0.0") + .РазработкаЗависитОт("dev-dep2", "2.0.0"); + + Возврат Манифест; + +КонецФункции + +Процедура ТестДолжен_ФильтроватьЗависимостиБезФлагаРазработчика() Экспорт + + // Arrange + Манифест = СоздатьТестовыйМанифест(); + МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановкиПакетов.Локально); + МенеджерУстановки.УстанавливатьЗависимостиРазработчика(Ложь); + + // Act - имитируем логику фильтрации из РазрешитьЗависимостиПакета + ВсеЗависимости = Манифест.Зависимости(); + УстанавливатьЗависимостиРазработчика = Ложь; + УровеньЗависимости = 0; + + // Применяем логику фильтрации как в исправленном коде + Отбор = Новый Структура(); + Отбор.Вставить("ДляРазработки", Ложь); + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + + Если УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0 Тогда + Отбор.ДляРазработки = Истина; + ЗависимостиРазработчика = ВсеЗависимости.НайтиСтроки(Отбор); + Для Каждого Зависимость Из ЗависимостиРазработчика Цикл + Зависимости.Добавить(Зависимость); + КонецЦикла; + КонецЕсли; + + // Assert + Утверждения.ПроверитьРавенство(2, Зависимости.Количество(), "Без флага dev должно быть только 2 обычные зависимости"); + + // Проверяем, что включены только обычные зависимости + ИменаЗависимостей = Новый Массив; + Для Каждого Зависимость Из Зависимости Цикл + ИменаЗависимостей.Добавить(Зависимость.ИмяПакета); + Утверждения.ПроверитьЛожь(Зависимость.ДляРазработки, "Все включенные зависимости должны быть обычными"); + КонецЦикла; + + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep1") <> Неопределено, "Должна присутствовать regular-dep1"); + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep2") <> Неопределено, "Должна присутствовать regular-dep2"); + Утверждения.ПроверитьРавенство(Неопределено, ИменаЗависимостей.Найти("dev-dep1"), "Не должна присутствовать dev-dep1"); + Утверждения.ПроверитьРавенство(Неопределено, ИменаЗависимостей.Найти("dev-dep2"), "Не должна присутствовать dev-dep2"); + +КонецПроцедуры + +Процедура ТестДолжен_ВключатьЗависимостиРазработчикаСФлагом() Экспорт + + // Arrange + Манифест = СоздатьТестовыйМанифест(); + МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановкиПакетов.Локально); + МенеджерУстановки.УстанавливатьЗависимостиРазработчика(Истина); + + // Act - имитируем логику фильтрации из РазрешитьЗависимостиПакета + ВсеЗависимости = Манифест.Зависимости(); + УстанавливатьЗависимостиРазработчика = Истина; + УровеньЗависимости = 0; + + Отбор = Новый Структура(); + Отбор.Вставить("ДляРазработки", Ложь); + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + + Если УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0 Тогда + Отбор.ДляРазработки = Истина; + ЗависимостиРазработчика = ВсеЗависимости.НайтиСтроки(Отбор); + Для Каждого Зависимость Из ЗависимостиРазработчика Цикл + Зависимости.Добавить(Зависимость); + КонецЦикла; + КонецЕсли; + + // Assert + Утверждения.ПроверитьРавенство(4, Зависимости.Количество(), "С флагом dev должны быть все зависимости"); + + // Проверяем, что включены все зависимости + ИменаЗависимостей = Новый Массив; + Для Каждого Зависимость Из Зависимости Цикл + ИменаЗависимостей.Добавить(Зависимость.ИмяПакета); + КонецЦикла; + + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep1") <> Неопределено, "Должна присутствовать regular-dep1"); + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep2") <> Неопределено, "Должна присутствовать regular-dep2"); + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("dev-dep1") <> Неопределено, "Должна присутствовать dev-dep1"); + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("dev-dep2") <> Неопределено, "Должна присутствовать dev-dep2"); + +КонецПроцедуры + +Процедура ТестДолжен_ИсключатьЗависимостиРазработчикаНаВложенныхУровнях() Экспорт + + // Arrange + Манифест = СоздатьТестовыйМанифест(); + + // Act - имитируем логику фильтрации на уровне 1 (транзитивные зависимости) + ВсеЗависимости = Манифест.Зависимости(); + УстанавливатьЗависимостиРазработчика = Истина; + УровеньЗависимости = 1; // Транзитивная зависимость + + Отбор = Новый Структура(); + Отбор.Вставить("ДляРазработки", Ложь); + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + + Если УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0 Тогда + Отбор.ДляРазработки = Истина; + ЗависимостиРазработчика = ВсеЗависимости.НайтиСтроки(Отбор); + Для Каждого Зависимость Из ЗависимостиРазработчика Цикл + Зависимости.Добавить(Зависимость); + КонецЦикла; + КонецЕсли; + + // Assert + Утверждения.ПроверитьРавенство(2, Зависимости.Количество(), "На уровне 1 dev зависимости не должны устанавливаться"); + + // Проверяем, что включены только обычные зависимости + ИменаЗависимостей = Новый Массив; + Для Каждого Зависимость Из Зависимости Цикл + ИменаЗависимостей.Добавить(Зависимость.ИмяПакета); + Утверждения.ПроверитьЛожь(Зависимость.ДляРазработки, "На уровне 1 должны быть только обычные зависимости"); + КонецЦикла; + + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep1") <> Неопределено, "Должна присутствовать regular-dep1"); + Утверждения.ПроверитьИстину(ИменаЗависимостей.Найти("regular-dep2") <> Неопределено, "Должна присутствовать regular-dep2"); + Утверждения.ПроверитьРавенство(Неопределено, ИменаЗависимостей.Найти("dev-dep1"), "Не должна присутствовать dev-dep1"); + Утверждения.ПроверитьРавенство(Неопределено, ИменаЗависимостей.Найти("dev-dep2"), "Не должна присутствовать dev-dep2"); + +КонецПроцедуры + +Процедура ТестДолжен_РаботатьСЛокальнымиЗависимостями() Экспорт + + // Arrange + Манифест = СоздатьТестовыйМанифест(); + МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановкиПакетов.Локально); + МенеджерУстановки.УстанавливатьЗависимостиРазработчика(Истина); + + // Act - тестируем логику РазрешитьЗависимостиПакетаЛокально + ВсеЗависимости = Манифест.Зависимости(); + УстанавливатьЗависимостиРазработчика = Истина; + УровеньЗависимости = 0; + + // Применяем ту же логику фильтрации + Отбор = Новый Структура(); + Отбор.Вставить("ДляРазработки", Ложь); + + Зависимости = ВсеЗависимости.НайтиСтроки(Отбор); + + Если УстанавливатьЗависимостиРазработчика И УровеньЗависимости = 0 Тогда + Отбор.ДляРазработки = Истина; + ЗависимостиРазработчика = ВсеЗависимости.НайтиСтроки(Отбор); + Для Каждого Зависимость Из ЗависимостиРазработчика Цикл + Зависимости.Добавить(Зависимость); + КонецЦикла; + КонецЕсли; + + // Assert + Утверждения.ПроверитьРавенство(4, Зависимости.Количество(), "Локальные зависимости должны включать все зависимости с флагом dev"); + + // Проверяем содержимое + ОбычныеЗависимости = 0; + ЗависимостиРазработчика = 0; + + Для Каждого Зависимость Из Зависимости Цикл + Если Зависимость.ДляРазработки Тогда + ЗависимостиРазработчика = ЗависимостиРазработчика + 1; + Иначе + ОбычныеЗависимости = ОбычныеЗависимости + 1; + КонецЕсли; + КонецЦикла; + + Утверждения.ПроверитьРавенство(2, ОбычныеЗависимости, "Должно быть 2 обычные зависимости"); + Утверждения.ПроверитьРавенство(2, ЗависимостиРазработчика, "Должно быть 2 зависимости разработчика"); + +КонецПроцедуры + +Логирование.ПолучитьЛог("oscript.app.opm").УстановитьУровень(УровниЛога.Отладка); \ No newline at end of file