Hapi-Plugin, das Mocks für Restful- und Querystring-basierte APIs bereitstellt
HINWEIS: DIE UNTERSTÜTZUNG FÜR DIESES PROJEKT IST BEENDET
Dieses Projekt war Eigentum von Walmart und wurde von Walmart verwaltet. Dieses Projekt hat sein Lebensende erreicht und Walmart unterstützt dieses Projekt nicht mehr.
Wir werden die Probleme für dieses Projekt nicht mehr überwachen oder Pull-Anfragen prüfen. Es steht Ihnen frei, dieses Projekt unter den Lizenzbedingungen oder Zweigen dieses Projekts auf eigenes Risiko weiter zu nutzen. Dieses Projekt unterliegt nicht mehr dem Bug-Bounty-Programm von Walmart oder anderen Sicherheitsüberwachungen.
Wir empfehlen Ihnen, die folgenden Maßnahmen zu ergreifen:
Aus Sicherheitsgründen überträgt Walmart das Eigentum an unseren primären Repos auf Github oder anderen Plattformen nicht an andere Personen/Organisationen. Darüber hinaus übertragen wir das Eigentum an Paketen nicht an öffentliche Paketverwaltungssysteme.
Wenn Sie dieses Paket forken und die Entwicklung fortsetzen möchten, sollten Sie einen neuen Namen für das Projekt wählen und Ihre eigenen Pakete erstellen, Automatisierung erstellen usw.
Bitte lesen Sie die Lizenzbedingungen dieses Projekts, die auch nach der Stilllegung weiterhin in Kraft bleiben.##curved-carousel
Eine einfache Möglichkeit, ein unendlich scrollbares Karussell mit optionaler Krümmung zu erstellen.
Für die Konfiguration stehen folgende Optionen zur Verfügung.
apiPrefix
Eine Zeichenfolge oder ein Array von Zeichenfolgen, die die Basis der Routen darstellen, die verspottet werden sollen
Der Standardwert ist /api
mocksDir
Verzeichnis, das die Scheindateien enthält.
Standardmäßig ist __dirname + './mocks'
, wobei __dirname dieses Plugin ist
mocksAdminPath
Eine relative URL, über die die Admin-Seite für dieses Plugin gefunden werden kann.
Standardmäßig ist /admin/mocks
mocksAdminServerLabels
Eine Reihe von Labels, die bei der Plugin-Registrierung von Hapi verwendet werden
Standardmäßig ist ['admin']
enabled
Unabhängig davon, ob die Mocks aktiviert sind oder nicht.
Der Standardwert ist false
enableForceCookiePage
Ein boolescher Wert, der angibt, ob die Cookie-Setter-Seite registriert werden soll oder nicht. Diese Seite bietet eine einfache Schaltfläche zum Aktivieren oder Deaktivieren des always_ridicule
-Cookies, das es einem Client ermöglicht, sich dafür zu entscheiden, Scheinantworten zu erzwingen, unabhängig von den Servereinstellungen. Nützlich für unerfahrene Tester oder Geräte, bei denen das Erstellen von Bookmarklets umständlich ist. Der Standardwert ist false
forceCookiePath
Eine relative URL, unter der die Cookie-Setter-Seite zu finden ist.
Der Standardwert ist /cookie
forceCookieValue
Eine Zeichenfolge, die den Wert des always_ridicule
-Cookies darstellt. Ermöglicht Servern eine öffentlich verfügbare Opt-in-Mocking-Methode, ohne dass das konkret erforderliche Cookie öffentlich bekannt ist. expires
beträgt 30 Minuten ab dem festgelegten Zeitpunkt.
Standardmäßig ist "true"
Erstellen Sie in Ihrem mocksDir
eine Datei ridicule.js
, die in ihrer module.exports
ein Array von Hapi-Routen verfügbar macht.
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' ) ;
}
} ]
Beim Start des Servers werden alle konfigurierten Routen mit einem zufälligen 40-stelligen Präfix registriert. (z. B. wird die Route /foo
unter /(uuid)/foo
verspottet)
Wenn der Mock-Server aktiviert ist, werden alle eingehenden Anfragen mit dem konfigurierten apiPrefix
abgeglichen. Wenn eine Übereinstimmung gefunden wird, wird die Anfrage intern an den Mock-Route-Handler weitergeleitet.
Sie haben die Möglichkeit, die Anforderung in einem Handler zu verspotten (nützlich, wenn Sie nur eine Teilmenge eines auf Abfragezeichenfolgen basierenden Systems verspotten, da Hapi nur auf Pfaden übereinstimmt). require
einfach „rididcule“ in der Datei an und rufen Sie dann ridicule.bailout(req, res)
auf, wobei req
und „ res
die Anforderungs- und Antwortobjekte innerhalb des Handlers sind.
Die gebräuchlichste Methode zum Verspotten von Anforderungen besteht darin, einfach die Daten einer JSON-Datei innerhalb der reply()
-Schnittstelle Ihres Routenhandlers zurückzugeben.
var data = require ( './mockFile.json' ) ;
var route = {
method : '*' ,
path : '/mockPath' ,
config : {
handler : function ( request , reply ) {
return reply ( data ) ;
}
}
} ;
Sie haben jedoch die Möglichkeit, der Antwort zusätzliche Metadaten hinzuzufügen, z. B. benutzerdefinierte Header und HTTP-Statuscodes. Sie müssen lediglich Ihre vorhandene JSON-Datei in ein anderes Objekt einbinden, das Original auf payload
setzen und ein ridiculeSettings
-Feld hinzufügen.
also diese Anfrage
{
"foo" : " bar "
}
wird
{
"ridiculeSettings" : {
"statusCode" : 418 ,
"headers" : { "Content-Type" : " x-stream " }
}
payload: {
"foo" : " bar "
}
}
Erwähnenswert ist, dass dies ganz am Ende des Hapi-Anforderungsflusses hinzugefügt wird. Dies führt dazu, dass payload
in die Mock-Datei eingefügt werden muss und daher nur String- und JSON-Objekte und keine Streams oder Puffer unterstützen kann.
Es gibt drei Möglichkeiten, Mocks zu aktivieren/deaktivieren.
Die Hapi-Konfigurationseinstellung
Sie können die enabled
Option in Ihrem Setup auf true
ändern. Dies aktiviert es beim Start, kann aber in Zukunft geändert werden durch.
Umschalten der Schaltfläche „Administratorseite“.
Sie können Mocks jederzeit aktivieren oder deaktivieren, indem Sie den unter mocksAdminPath
konfigurierten Pfad aufrufen. Standardmäßig ist dies /admin/mocks
. Beachten Sie, dass dies hinter einem Hapi-Label registriert ist (konfigurierbar in Ihrem Setup, aber standardmäßig ['admin']
). Auf diese Weise können Sie Spots an Ihrem Produktionsstandort versenden und den Kippschalter an einem Port installieren, der nicht öffentlich zugänglich ist.
Ein Cookie auf dem Client
Wenn das Cookie always_ridicule
mit dem Wert aus dem konfigurierten forceCookieValue
(Standardwert ist die Zeichenfolge „true“, z. B. always_ridicule="true"
) auf dem Client gesetzt ist, werden die konfigurierten Mocks immer bereitgestellt (natürlich bis sie gelöscht werden). ). Darüber hinaus erzwingt always_ridicule=false
dass der Client niemals verspottet wird, unabhängig von den aktuellen Einstellungen des Servers.
Da Hapi Routen nur auf Pfaden (und nicht auf Abfragezeichenfolgenparametern) abgleicht, müssen Sie in der Lage sein, mehr als eine Abfrage mit einem Pfad abzugleichen. Dafür stellt Ridicule die Methode ridicule.validate
bereit.
ridicule.validate
ist eine Funktion, die ein Anfrage- und Antwortpaar, dann ein Validierungsobjekt, bestehend aus einem validator
, und eine callback
akzeptiert.
Das validator
ist ein einfaches Objekt, bei dem jeder Schlüssel den Schlüssel der Abfragezeichenfolge darstellt und der Wert entweder eine Zeichenfolge, RegExp oder eine Funktion ist, die mit dem Wert des entsprechenden Werts in der Abfragezeichenfolge übereinstimmt.
Zum Beispiel die folgende Abfragezeichenfolge
?category=Music&genre=ska&year=2012
würde mit der folgenden Validierung übereinstimmen
...
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' } ) ;
}
} )
}
. . .
Natürlich können Sie mehrere Prüfungen problemlos verketten
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 ) ;
} ) ;
Möglicherweise stoßen Sie auf ein Problem, bei dem Sie eine Teilmenge Ihrer Anfragen an einem Endpunkt verspotten möchten, aber nicht alle. In diesem Fall bietet Ridicule eine praktische Hilfsfunktion, ridicule.bailout
.
Sie müssen es lediglich am Ende Ihrer Abfrageprüfungen hinzufügen und dabei die request
und reply
des Handlers durchlaufen.
var matched = queriesToCheck . some ( function ( route ) {
return ridicule . validate ( request , reply , route ) ;
} ) ;
if ( ! matched ) {
ridicule . bailout ( request , reply ) ;
}
Eine Alternative dazu besteht darin, das Validatorobjekt in Ihrer letzten Abfrage auf true
zu setzen. Dies stimmt automatisch mit der bereitgestellten Abfrage überein und kann als Sammelbegriff dienen
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 ) ;
} ) ;