Миграция с Mockoon на Mockarty
Если вы уже используете Mockoon (десктопное приложение,
mockoon-cli или контейнер) для эмуляции API, ваши environment’ы
можно перенести в Mockarty. Маршруты, response rules, шаблонные тела и
data buckets, которые они читают, переезжают как есть. Документ
описывает импорт и точно указывает, где Mockoon и Mockarty расходятся.
Кратко
- Тот же
environment.json— Mockarty принимает файл, который
сохраняет Mockoon: маршруты, папки, определения ответов и response
rules. - Те же response rules —
equals,regex,regex_i,null,
empty_array,array_includesдля body, query, header, cookie,
params, path, method иrequest_number, с той же семантикой
rulesOperator(OR/AND) иinvert. - Та же шаблонизация. Handlebars-хелперы Mockoon —
{{urlParam 'id'}},{{body 'user.name'}},{{data 'pets'}},
{{int 1 100}},{{faker 'person.firstName'}},{{#each}},
{{#switch}}— вычисляются Mockarty на каждом запросе: и в теле
ответа, и в его заголовках. Переписывать ничего не нужно. Полный
список и три хелпера, которые не переехали, — в разделе
Шаблонизация: что работает. - Те же data buckets. Бакеты, которые читают ваши шаблоны,
импортируются вместе с маршрутами, поэтому{{data 'pets'}}
возвращает ваши данные.
Перед миграцией прочитайте раздел «Что импортируется»: там перечислено,
какие части environment переносятся, а какие нет.
Два способа использовать ваш environment
Вариант 1 — Drop-in контейнер
Запустите универсальный образ mockarty/cli с --format=mockoon,
смонтировав файл environment:
docker run --rm -p 3001:8080 \
-v $(pwd)/environment.json:/data/env.json:ro \
mockarty/cli mock serve --data-dir /data --format mockoon
Контейнер отдаст каждый маршрут из environment’а, применит правила
ответов и шаблонизацию точно так же, как mockoon-cli. Без
лицензии работает ограничение в 5 стабов — установите
MOCKARTY_LICENSE_KEY или выполните mockarty-cli login чтобы
снять кап.
Вариант 2 — Импорт в ваш инстанс Mockarty
Сконвертируйте окружение в файлы моков Mockarty и импортируйте их:
mockarty-cli login --server https://mockarty.company.com --token mk_xxx
mockarty-cli mock convert --from mockoon --out ./mockarty-mocks ./mockoon-env/
mockarty-cli mock import -f ./mockarty-mocks
convert пишет по одному файлу на маршрут Mockoon и переносит правила выбора
ответа; import загружает их в namespace, под которым вы вошли (другой
задаётся флагом --namespace). Обе команды возвращают ненулевой код, если хоть
один файл не прошёл, — шаг CI может полагаться на код выхода.
mockarty-cli mock serve --format mockoon --data-dir ./mockoon-env/ — это
другое: он обслуживает окружение локально как drop-in замену (Вариант 1) и
ничего никуда не загружает.
Каждый маршрут Mockoon становится одним моком Mockarty. UUID
Mockoon сохраняется (Mockarty хранит как mn_<uuid>), так что один
и тот же экспорт можно переимпортировать без дублей.
Что попадает в импорт
| Mockoon | Mockarty |
|---|---|
routes[] |
Один мок на маршрут |
endpointPrefix |
Добавляется ко всем route path |
Path-параметры (:id) |
Тот же синтаксис |
Wildcards (*) |
Тот же синтаксис |
Регексные маршруты (\d+) |
Сохраняются как RoutePattern |
responses[] + responseMode |
Сворачиваются в chain с rule-based selection |
rules[] и rulesOperator |
Обрабатываются runtime’ом Mockarty |
Response body |
Отдаётся как написано, Handlebars-хелперы вычисляются на каждом запросе |
Response latency |
Per-response задержка |
Тело ответа с хелперами {{ }} |
Вычисляется — см. Шаблонизация: что работает |
{{status 404}} в теле |
Задаёт код ответа, как и в Mockoon |
disableTemplating у ответа |
Учитывается, если выключен у всего маршрута — скобки отдаются дословно. Если выключен только у части ответов, импорт выводит предупреждение: в Mockarty шаблонизация включается на маршрут |
filePath (файл-тело) |
С диска не отдаётся. Mockarty ищет имя в хранилище файлов-шаблонов неймспейса — загрузите файл туда либо вставьте тело инлайном |
databucketID |
Резолвится — отдаётся содержимое бакета |
| Response-заголовки | Сохраняются, шаблоны в значениях вычисляются |
| Заголовки уровня environment | Не применяются. Mockoon добавляет их ко всем ответам; задайте их на каждом ответе |
folders[] |
Создаются как Mockarty folders |
data[] (data buckets) |
Импортируются вместе с маршрутами, которые их читают, поэтому {{data 'x'}} резолвится |
callbacks |
Не импортируются |
fallbackTo404 |
Не учитывается — если ни одно правило не сработало, отдаётся ответ по умолчанию, а не 404 |
streamingMode / streamingInterval (SSE/WS) |
Не импортируются |
Метод-джокер (all) |
Сужается до GET с предупреждением при импорте — заведите по маршруту на каждый метод |
proxyMode + proxyHost |
Тэг на первом моке + warning |
cors |
Тэг; глобально включается в admin UI |
tlsOptions (PEM cert + key) |
TLS-терминация через reverse-proxy (nginx/Caddy) |
| Отключённые маршруты | Импортируются в корзину (на паузе) |
| Правило на маршруте с ОДНИМ ответом | Не применяется — выбирать не из чего, этот ответ отдаётся всегда (при импорте выводится предупреждение) |
Шаблонизация: что работает
Handlebars-хелперы Mockoon вычисляются Mockarty в момент отдачи мока,
поэтому тело вида
{
"id": "{{urlParam 'id'}}",
"name": "{{faker 'person.firstName'}}",
"pets": {{data 'pets'}}
}
возвращает реальные значения, а не текст хелпера. Шаблонизация работает
в теле ответа и в значениях response-заголовков. Переписывать
ничего не нужно.
Поддерживаемые хелперы
| Группа | Хелперы |
|---|---|
| Блоки | #if, #unless, #each (с @index, @first, @last), #with, #switch / #case / #default, repeat, lookup |
| Запрос | body, bodyRaw, queryParam, queryParamRaw, queryParams, urlParam, urlParams, cookie, header, headers, hostname, ip, method, baseUrl |
| Data buckets | data, dataRaw |
| Ответ | status |
| Массивы | array, oneOf, someOf, join, slice, len, find, filter, sort, sortBy, reverse, concat |
| Объекты | object, objectMerge, objectPath, jsonPath |
| Математика | add, subtract, multiply, divide, modulo, ceil, floor, round, toFixed, eq, gt, gte, lt, lte |
| Строки | includes, indexOf, substr, replace, replaceAll, lowercase, uppercase, split, concat, parseInt, padStart, padEnd, jsonParse, stringify |
| Даты | now, date, time, dateFormat, dateTimeShift, isValidDate |
| Кодирование и прочее | base64, base64Decode, base64url, base64urlDecode, newline, objectId |
| Переменные | setVar, getVar, setGlobalVar, getGlobalVar |
| JWT | jwtPayload, jwtHeader |
| Faker | {{faker 'namespace.method'}} и короткие алиасы: int, float, boolean, title, firstName, lastName, company, domain, tld, email, street, city, country, countryCode, zipcode, postcode, lat, long, phone, color, hexColor, uuid, guid, ipv4, ipv6, lorem |
Именованные аргументы тоже работают:
{{faker 'number.int' min=10 max=100}},
{{dateTimeShift date='2024-01-01' format='YYYY-MM-DD' days=7}},
{{object id='7' name='Ada'}}.
{{ }} и {{{ }}} ведут себя как в Mockoon: HTML не экранируется, поэтому
JSON-тело остаётся валидным JSON.
Что не поддерживается
Три хелпера не переехали. Тело с любым из них всё равно отрендерится —
пустым будет только сам этот хелпер.
| Хелпер | Почему и что делать |
|---|---|
setData |
Пишет обратно в data bucket во время запроса. В Mockarty бакеты доступны только на чтение при формировании ответа; чтобы хранить состояние между запросами, используйте chain store или скриптовый ответ. |
jmesPath |
Не реализован. Для той же выборки используйте jsonPath или objectPath. |
getEnvVar |
Отключён намеренно. Mockarty — общий сервер, и тело мока не должно читать переменные окружения хоста. Положите значение в data bucket или в глобальное хранилище. |
Где поведение близкое, но не идентичное
jsonPathвычисляет стандартный JSONPath. Селекторы и простые
фильтры работают; расширения JSONPath-Plus (^,@property,@path)
— нет.- Faker покрывает основные пространства имён (
person,internet,
location,company,commerce,finance,date,string,
number,lorem,image,phone,vehicle,music,animal,
git,database,system,color), но не каждый метод Faker.js.
Неизвестный метод отдаёт пустое значение; старые написанияname.*и
address.*резолвятся наравне сperson.*/location.*. - Токены формата даты:
YYYY,YY,MM,DD,HH,mm,ss,
SSS. Остальные символы переносятся в результат как есть. - Глобальные переменные (
setGlobalVar/getGlobalVar) живут в
пределах вашего неймспейса, поэтому две команды на одном сервере
Mockarty не видят и не перезаписывают значения друг друга. disableTemplatingв Mockoon — чекбокс у ответа, в Mockarty —
настройка маршрута. Выключите его у всех ответов маршрута — скобки
отдадутся дословно; выключите у части — импорт предупредит, такие
ответы стоит вынести в отдельный маршрут.- Тело, которое не удалось отрендерить (например, незакрытый
{{#each}}), отдаётся как написано, а причина попадает в лог сервера.
Мок продолжает отвечать и никогда не превращается в 500.
Если всё-таки нужен синтаксис Mockarty
У Mockarty есть собственный синтаксис динамических ответов — им
пользуются моки, созданные прямо в Mockarty. К импортированному телу
Mockoon он не применяется, поэтому два синтаксиса не конфликтуют.
Соответствия, если вы захотите перевести тело:
| Mockoon | Mockarty |
|---|---|
{{urlParam 'id'}} |
$.req.path.id |
{{queryParam 'page'}} |
$.req.query.page |
{{header 'X-Token'}} |
$.reqHeader.X-Token |
{{body 'user.name'}} |
$.req.body.user.name |
{{firstName}} |
$.fake.FirstName |
{{email}} |
$.fake.Email |
{{int 1 100}} |
$.fake.IntBetween(1, 100) |
Полный каталог хелперов Mockarty — в админке (Docs → Templating).
Чем Mockoon и Mockarty отличаются
Несколько фич пока остаются только в Mockoon:
- PFX TLS bundles — Mockarty читает их, но не расшифровывает;
экспортируйте сертификат в PEM (openssl pkcs12 -in cert.pfx -out cert.pem -nodes) и поставьте TLS-терминирующий reverse-proxy (nginx/Caddy) передmock serve. - CRUD-маршруты (
type: "crud") — CRUD-маршрут Mockoon
порождает девять эндпоинтов поверх data bucket. Импорт помечает
маршрут тегомtype:crud, но эти эндпоинты не создаёт —
соберите их как обычные моки. - WebSocket маршруты (
type: "ws") — импортируются только как
тег. Пересоздайте их как Socket-моки Mockarty. - Proxy mode (
proxyMode,proxyHost, правила proxy-заголовков)
— записывается тегом; проксирование настраивается на стороне Mockarty. cors— записывается тегом; включается в админке.- PFX TLS bundles — экспортируйте сертификат в PEM
(openssl pkcs12 -in cert.pfx -out cert.pem -nodes) и поставьте
TLS-терминирующий reverse-proxy (nginx/Caddy) передmock serve.
По каждому из этих пунктов импорт печатает предупреждение — как и по
каждому response rule, чей target или оператор мы не реализуем
(таргеты global_var, data_bucket, templating и оператор
valid_json_schema: такое правило никогда не срабатывает, а не
срабатывает ошибочно). Читайте предупреждения — это и есть список
того, что после импорта надо доделать руками.
Round-trip экспорт
Mockarty выгружает ваши моки в формате Mockarty (для бэкапа или
переноса между инстансами). Обратной выгрузки в формат
Mockoon-environment нет:
mockarty-cli mock export -d ./mocks/
UUID сохраняются, так что выгруженный файл можно переимпортировать
без дублей.
Траблшутинг
- «environment lastMigration=NN exceeds known max» — ваш файл
Mockoon из новой версии, незнакомой релизу Mockarty. Большинство
полей всё ещё импортируется корректно; обновите Mockarty когда
выйдет новая версия. - В теле ответа виден дословный
{{ ... }}— шаблон не удалось
разобрать, и тело отдано как написано. Причина — в логе сервера
(обычно незакрытый блок:{{#each}}без{{/each}}). Если
environment импортирован более старой версией Mockarty, выполните
импорт заново: шаблонизация включается для маршрута в момент импорта. - Один хелпер пустой, остальные работают — либо он не поддерживается
(setData,jmesPath,getEnvVar), либо это метод Faker вне
покрытых пространств имён. См. «Шаблонизация: что работает». - Response rule никогда не срабатывает — посмотрите предупреждения
импорта. Правила с таргетамиglobal_var,data_bucket,
templatingи с операторомvalid_json_schemaне реализованы и
намеренно не матчатся. - CORS preflight возвращает 404 — включите namespace-level CORS
в admin-настройках Mockarty (CORS из Mockoon-environment’а
попадает как тэг, не как глобальное правило).