Git Product home page Git Product logo

mrocarequestlogbundle's Introduction

MrocaRequestLogBundle

An HTTP requests mock generator symfony bundle.

Build Status SensioLabsInsight

Description

This bundle allows to log HTTP requests and associated responses as json files. This generated json files can be used as API mock in order to test a front app without running the api.

How it works ?

After each request (Kernel::TERMINATE event) containing the x-generate-response-mock header, a json file is created containing the request and the response.

Examples :

GET /categories

app/log/mocks/categories/GET__.json

{
    "request": {
        "uri": "/categories",
        "method": "GET",
        "parameters": [],
        "content": ""
    },
    "response": {
        "statusCode": 200,
        "contentType": "application/json",
        "content": {
            "@context": "/contexts/Category",
            "@id": "/categories",
            "hydra:member": [
                {"name": "foo"},
                {"name": "bar"}
            ]
        }
    }
}

PUT /categories/1 {"foo": "bar"}

app/log/mocks/categories/PUT__1-a5e74.json

{
    "request": {
        "uri": "/categories/1",
        "method": "PUT",
        "parameters": [],
        "content": {
            "foo": "bar"
        }
    },
    "response": {
        "statusCode": 204,
        "contentType": "application/json",
        "content": ""
    }
}

File naming strategy

All files are created with the following convention :

uri/METHOD__segments{--sorted-query=string&others}{__<sha1_substr5(sortedJsonContent)>}{__<sha1_substr5(sortedPostParameters)>}.json

Examples :

URL Filename
GET / GET__.json
GET /categories categories/GET__.json
GET /categories/1 categories/GET__1.json
GET /categories?order[foo]=asc&order[bar]=desc categories/GET__--order[bar]=desc&order[foo]=asc.json
POST /categories PARAMS: foo1=bar1; foo2=bar2 categories/POST____3e038.json
POST /categories CONTENT: {"foo1":"bar1", "foo2":"bar2"} categories/POST____3e038.json
PUT /categories/1 CONTENT: {"foo2":"bar2", "foo1":"bar1"} categories/POST__1__3e038.json
The filenames query strings can be hashed by setting the `hash_query_params` option to `true`.
For example, `categories/GET__--order[bar]=desc&order[foo]=asc.json` will be `categories/GET__--b0324.json`

See the ResponseLoggerTest file for more examples.

Installation

You can use Composer to install the bundle to your project as a dev dependency :

composer require --dev mroca/request-log-bundle

Then, enable the bundle by updating your app/config/AppKernel.php file to enable the bundle:

<?php
// app/config/AppKernel.php

public function registerBundles()
{
    //...
    if (in_array($this->getEnvironment(), ['dev', 'test'])) {
        //...
        $bundles[] = new Mroca\RequestLogBundle\RequestLogBundle();
    }

    return $bundles;
}

If necessary, configure the bundle to your needs (example with default values):

# app/config/config_dev.yml

mroca_request_log:
    mocks_dir: %kernel.logs_dir%/mocks/
    hash_query_params: false

If your are using the NelmioCorsBundle or another CORS protection, you must add the header in the allowed ones :

nelmio_cors:
    defaults:
        allow_headers: ['x-generate-response-mock']

Usage

The request & response logger is not always activated. To log a request, add the x-generate-response-mock header into your request :

GET /categories HTTP/1.1
Host: api.my.domain
x-generate-response-mock: true

Commands

Some useful commands are available to manager your mocks :

Clear all mocks

app/console mroca:request-log:clear 

Save mocks in a target directory

app/console mroca:request-log:dump /tmp/mocksdirtarget

Dev

composer install

Php-cs-fixer

vendor/bin/php-cs-fixer fix

Testing

vendor/bin/phpunit

TODO

  • A Guzzle client using this files for functionnals tests
  • A Protractor client using this files for AngularJS e2e tests

mrocarequestlogbundle's People

Contributors

mroca avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.