Package: yamas
Yamas - Yet Another Mock API ServerThis project develops a simple mock API server for prototyping and testing client applications.Based onhttp.serverof Python3.6+, Yamas is a testing API server which can accept HTTP requests from a client and reply with pre-defined mock HTTP responses. (Note: Yamas should not be used for production.)The mock responses and the rules of selecting them are specified in a JSON file. Processing an request, Yamas locates the wanted mock response by matching the request path with a sequence of user-specified regular expressions and then looking up the response by the request method.UsageYamas has been published toPyPI. You can usepipto install Yamas:pipinstallyamasThe command-line interface of Yamas is as follows:yamas[-e|--endpointhost:port]-f|--filemock_responses_spec-eor--endpointspecifies the host address and the port number of the endpoint; if this is not specified,127.0.0.1:7000will be used.-for--filespecifies the path of the JSON file which defines the mock responses and the selection rules.For example,yamas-elocalhost:8000-fmock_responses.jsonTo run Yamas using the source code under the project root directory (e.g.,/home/yam/git/yamas):pipinstall.
yamas-elocalhost:8000-fdata/mock_responses.jsonTo run the tests:python-mpytesttests/Specification of mock responsesThe mock responses and the rules of selecting them are specified in a JSON file, which is given on the command line. A sample specification is given as follows:{"global":{"headers":{"Access-Control-Allow-Origin":"*"},"serverHeader":"YetAnotherMockAPIServer 0.0.1"},"rules":{"^/users/(\\w+)/todo/(\\d+)$":{"GET":{"status":200,"content":{"user":"$p_0","taskid":"$p_1","task":"Buy milk","pri":"low"},"contentType":"json","interpolate":true},"DELETE":{"status":410}},"^/users/\\w+/todo/?":{"GET":{"status":200,"content":["123","456","789"],"contentType":"json"},"POST":{"content":{"taskid":"123"},"contentType":"json","interpolate":false}},"^/users/(\\w+)/profile.xml$":{"GET":{"status":200,"headers":{"Content-Type":"application/xml"},"content":"<profile><user>$p_0</user><org>yam.ai</org><grade>premium</grade></profile>","contentType":"text","interpolate":true},"PUT":{"status":409,"content":"object already updated","contentType":"text"}},"^/users/(\\w+)/profile$":{"GET":{"status":200,"headers":{"Content-Type":""},"content":"Hello $p_0","contentType":"text","interpolate":true},"POST":{"status":200,"headers":{"Content-Type":""},"content":{"hello":"$p_0"},"contentType":"json","interpolate":true}}}}The root level is a JSON object. Inside the root object, there are optional objectsglobalandrules.Underglobal, there are optional objectsheadersandserverHeader. Theheadersobject specifies the default HTTP response headers to be included in the response to each request matching any of the rules specified below. TheserverHeaderfield gives a string value that customizes the default HTTP response headerServer.Therulesobject maps the pattern (Python regular expressions) of an HTTP request path (i.e., key) to an object containing the mock responses for different HTTP methods (i.e., value). The matching is done in the order of the key-value pairs specified underrules. In other words, a key is selected one at a time from the top to the bottom and its regular expression is used to match the request path.When the request path matches the pattern in a key, the associated JSON object specifying the mock responses associated with the HTTP methods will be selected. When the request path does not match the regular expression, the regular expression in the next key will be selected. If the request path matches no regular expression, a404 Not Foundresponse will be replied.When a request path matches the pattern in a key, the corresponding JSON object will be used to construct the response. Inside this JSON object, the keys areHTTP methods. The JSON object value corresponding to each HTTP method key specifies a mock response.The mock response object contains the following:statusspecifies the status code of the response. Ifstatusis not specified,200 OKwill be used.headersspecifies a JSON object containing the header names and values. If there are no user-defined headers,headerscan be omitted. If the value of a header is an empty string, the corresponding header which may be automatically added, (e.g.,Content-Typeand a globally specified header) will be removed.contentspecifies the content (or body) of the response. Its value should match itscontentType.contentTypespecifies the data type of the content. The following types can be used:text:contentmust be a string of theUTF-8text content. The headerContent-Type: text/plainwill be automatically added unless it is overriden by a user-specifiedContent-Typeheader.json:contentis treated as a JSON value. The headerContent-Type: application/jsonwill be automatically added unless it is overriden by a user-specifiedContent-Typeheader.contentTypeis omitted:contentis treated astextexcept the headerContent-Type: text/plainis not automatically added.interpolatespecifies whether the matched values of the capturing groups in the request path will replace the placeholders in the content template. It isfalseby default. Wheninterpolateistrue, every string value incontentis expected to be aPython template string. Ifcontentistext, the value is treated as a template. If thecontentisjson, every string value in the object is treated as a template. As shown in the the above example, the placeholder$p_iwill be replaced with the matched value of thei-th capturing group in the request path pattern. As in the above example,$p_0will be substituted with the matched value of the first capturing group(\w+)in the pattern path^/users/(\w+)/todo/(\d+)$,$p_1will be substituted with the value of the second matched capturing group(\d+). Note: the special character$should be escaped as$$.Professional servicesIf you need any support or consultancy services from YAM AI Machinery, please find us at:https://www.yam.aihttps://twitter.com/theYAMaihttps://www.linkedin.com/company/yamaihttps://www.facebook.com/theYAMaihttps://github.com/yam-aihttps://hub.docker.com/u/yamai