Плагин hapi, предоставляющий макеты для API-интерфейсов restful и API на основе строки запроса.
ВНИМАНИЕ: ПОДДЕРЖКА ЭТОГО ПРОЕКТА ЗАВЕРШЕНА
Этот проект принадлежал и обслуживался Walmart. Этот проект подошел к концу, и Walmart больше не поддерживает его.
Мы больше не будем отслеживать проблемы этого проекта или проверять запросы на включение. Вы можете продолжать использовать этот проект в соответствии с условиями лицензии или его ответвлений на свой страх и риск. Этот проект больше не подлежит программе вознаграждения за обнаружение ошибок Walmart или другому мониторингу безопасности.
Мы рекомендуем вам предпринять следующие действия:
По соображениям безопасности Walmart не передает право собственности на наши основные репозитории на Github или других платформах другим лицам/организациям. Кроме того, мы не передаем право собственности на пакеты общедоступным системам управления пакетами.
Если вы хотите создать форк этого пакета и продолжить разработку, вам следует выбрать новое имя для проекта и создать свои собственные пакеты, автоматизировать сборку и т. д.
Пожалуйста, ознакомьтесь с условиями лицензирования этого проекта, которые продолжают действовать даже после вывода из эксплуатации.##curved-carousel
Простой способ создать бесконечно прокручиваемую карусель с произвольной кривизной.
Для настройки доступны следующие параметры.
apiPrefix
Строка или массив строк, представляющих основу маршрутов, которые следует имитировать.
По умолчанию /api
mocksDir
Каталог, содержащий фиктивные файлы.
По умолчанию __dirname + './mocks'
, где __dirname — это плагин.
mocksAdminPath
Относительный URL-адрес, по которому можно найти страницу администратора этого плагина.
По умолчанию /admin/mocks
mocksAdminServerLabels
Массив меток, используемых при регистрации плагина hapi.
По умолчанию ['admin']
enabled
Независимо от того, включены или нет макеты.
По умолчанию false
enableForceCookiePage
Логическое значение, указывающее, регистрировать или нет страницу установки файлов cookie. На этой странице есть простая кнопка для включения или отключения файла cookie always_ridicule
, которая позволяет клиенту согласиться на принудительные ложные ответы независимо от настроек сервера. Полезно для начинающих тестировщиков или устройств, где создание букмарклета затруднительно. По умолчанию false
forceCookiePath
Относительный URL-адрес, по которому можно найти страницу настройки файлов cookie.
По умолчанию /cookie
forceCookieValue
Строка, представляющая значение файла cookie always_ridicule
. Позволяет серверам иметь общедоступный метод имитации согласия без публичной известности конкретного необходимого файла cookie. Значение expires
составляет 30 минут с момента установки.
По умолчанию "true"
Внутри вашего mocksDir
создайте файл ridicule.js
, который предоставляет массив маршрутов Hapi в его module.exports
.
module . exports = [ {
method : 'GET' ,
path : '/hello' ,
handler : function ( request , reply ) {
reply ( 'hello world' ) ;
}
} , {
method : 'POST' ,
path : '/goodbye' ,
handler : function ( request , reply ) {
reply ( 'thanks for all the fish' ) ;
}
} ]
При запуске сервера все настроенные маршруты прописываются со случайным префиксом из 40 символов. (например, маршрут /foo
высмеивается в /(uuid)/foo
)
Когда макетный сервер включен, все входящие запросы сопоставляются с настроенным apiPrefix
. Когда совпадение найдено, запрос внутренне перенаправляется обработчику фиктивного маршрута.
У вас есть возможность спастись при имитации запроса в обработчике (полезно, когда вы имитируете только подмножество системы, основанной на строке запроса, поскольку hapi соответствует только путям). Просто require
в файле насмешку, а затем вызовите ridicule.bailout(req, res)
, где req
и res
— это объекты запроса и ответа внутри обработчика.
Самый распространенный способ имитировать запросы — это просто вернуть данные json-файла в интерфейсе reply()
вашего обработчика маршрута.
var data = require ( './mockFile.json' ) ;
var route = {
method : '*' ,
path : '/mockPath' ,
config : {
handler : function ( request , reply ) {
return reply ( data ) ;
}
}
} ;
Однако у вас есть возможность добавить к ответу дополнительные метаданные, такие как пользовательские заголовки и коды состояния HTTP. Вам просто нужно обернуть существующий файл json внутри другого объекта, установив для оригинала значение payload
и добавить поле ridiculeSettings
.
так что этот запрос
{
"foo" : " bar "
}
становится
{
"ridiculeSettings" : {
"statusCode" : 418 ,
"headers" : { "Content-Type" : " x-stream " }
}
payload: {
"foo" : " bar "
}
}
Стоит отметить, что, поскольку это добавляется в самом конце потока запросов hapi, в результате payload
должна быть встроена в макетный файл и, следовательно, ограничена поддержкой только строк и объектов JSON, а не потоков или буферов.
Есть три способа включить/отключить макеты.
Настройка конфигурации hapi
Вы можете изменить enabled
опцию в своих настройках на true
. Это включает его при запуске, но может быть изменено в будущем с помощью...
Переключение кнопки страницы администратора
Вы можете включить или отключить макеты в любое время, просмотрев путь, настроенный в разделе mocksAdminPath
. По умолчанию это /admin/mocks
. Обратите внимание, что это зарегистрировано под меткой hapi (настраивается в ваших настройках, но по умолчанию ['admin']
). Это позволяет вам отправлять насмешки на ваш производственный сайт и размещать тумблер в порту, который не является общедоступным.
Файл cookie на клиенте
Если файл cookie always_ridicule
установлен со значением из настроенного forceCookieValue
(значение по умолчанию — строка «true», например, always_ridicule="true"
) на клиенте, то настроенные макеты будут обслуживаться всегда (пока они не будут удалены, конечно). ). Кроме того, always_ridicule=false
заставит клиента никогда не подвергаться макетированию, независимо от текущих настроек сервера.
Поскольку hapi сопоставляет маршруты только по путям (а не по каким-либо параметрам строки запроса), вам необходимо иметь возможность сопоставлять более одного запроса с путем. Для этого насмешка предоставляет метод ridicule.validate
.
ridicule.validate
— это функция, которая принимает пару запроса и ответа, затем объект проверки, состоящий из объекта validator
, и функцию callback
.
Объект validator
— это простой объект, где каждый ключ представляет собой ключ строки запроса, а значение — это строка, RegExp или функция, которая соответствует значению соответствующего значения в строке запроса.
Например, следующая строка запроса
?category=Music&genre=ska&year=2012
будет соответствовать следующей проверке
...
handler : function ( request , reply ) {
ridicule . validate ( request , reply , {
validator : {
category : 'Music' ,
genre : function ( value ) {
return value === 'ska' || value === 'rocksteady'
} ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( { 'all' : 'good' } ) ;
}
} )
}
. . .
конечно, вы можете легко связать несколько проверок
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : {
foo : 'bar' ,
baz : 'biz'
} ,
callback : function ( request , reply ) {
reply ( { 'wordsAre' : 'hard' } ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
Вы можете столкнуться с проблемой, когда вам захочется имитировать подмножество ваших запросов в конечной точке, но не все из них. В этом случае насмешка предоставляет удобную вспомогательную функцию, ridicule.bailout
.
все, что вам нужно сделать, это добавить его в конец проверок вашего запроса, проходя через интерфейсы request
и reply
обработчиков.
var matched = queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
if ( ! matched ) {
ridicule . bailout ( request , reply ) ;
}
Альтернативой этому является установка объекта валидатора в вашем последнем запросе на true
. Это будет автоматически соответствовать предоставленному запросу и может выступать в качестве обобщения.
var queriesToCheck = [ {
validator : {
category : 'Music' ,
genre : 'ska' ,
year : / ^d{4}$ /
} ,
callback : function ( request , reply ) {
reply ( ) . file ( './authMock.json' ) ;
}
} , {
validator : true ,
callback : function ( request , reply ) {
reply ( ) . file ( './catchall.json' ) ;
}
} ] ;
queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;