Skip to content
This repository was archived by the owner on Oct 15, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[![CircleCI](https://circleci.com/gh/moip/mockkid.svg?style=shield)](https://circleci.com/gh/moip/mockkid)
[![CircleCI](https://circleci.com/gh/moip/mockkid.svg?style=shield)](https://circleci.com/gh/moip/mockkid) [![codecov](https://codecov.io/gh/moip/mockkid/branch/master/graph/badge.svg)](https://codecov.io/gh/moip/mockkid)

# Mockkid
Mockkid is a webserver for mocking http responses.
Mock Kid is a web server for mocking http responses through file-based configurations.

## Pre-requisites
- Maven
Expand All @@ -20,7 +20,7 @@ Mockkid is a webserver for mocking http responses.

Running with docker-compose will point mockkid to the configurations in the *samples* folder.

To use other configurations, edit docker-compose.yml to change the volume or change the samples folder.
To use other configurations, edit `docker-compose.yml` to change the volume or change the samples folder.

## Samples

Expand Down
12 changes: 8 additions & 4 deletions src/main/java/br/com/moip/mockkid/service/ConditionalSolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
Expand All @@ -22,10 +23,13 @@ public class ConditionalSolver {
private Conditionals conditionals;

public ResponseConfiguration solve(Configuration configuration, HttpServletRequest request) {
Map<String, String> variables = variableResolver.resolve(configuration, request);
for (ResponseConfiguration r : configuration.getResponseConfigurations()) {
if (r.getConditional() != null && solve(r.getConditional(), variables)) {
return r;
for (ResponseConfiguration rc : configuration.getResponseConfigurations()) {
Conditional conditional = rc.getConditional();
if (conditional == null) continue;

Map<String, String> variables = variableResolver.resolve(rc, conditional, request);
if (solve(rc.getConditional(), variables)) {
return rc;
}
}

Expand Down
14 changes: 3 additions & 11 deletions src/main/java/br/com/moip/mockkid/service/VariableResolver.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package br.com.moip.mockkid.service;

import br.com.moip.mockkid.model.Conditional;
import br.com.moip.mockkid.model.Configuration;
import br.com.moip.mockkid.model.ResponseConfiguration;
import br.com.moip.mockkid.model.VariableResolvers;
import org.slf4j.Logger;
Expand Down Expand Up @@ -29,17 +28,10 @@ public class VariableResolver {
@Autowired
private VariableResolvers variableResolvers;

public Map<String, String> resolve(Configuration config, HttpServletRequest request) {
public Map<String, String> resolve(ResponseConfiguration responseConfiguration, Conditional conditional, HttpServletRequest request) {
Map<String, String> resolvedVariables = new HashMap<>();

for (ResponseConfiguration responseConfiguration: config.getResponseConfigurations()) {
Conditional conditional = responseConfiguration.getConditional();

resolvedVariables.putAll(handleConditionals(request, responseConfiguration, conditional));
}

resolvedVariables.putAll(handleConditionals(request, responseConfiguration, conditional));
logger.info("Variables = " + resolvedVariables);

return resolvedVariables;
}

Expand Down Expand Up @@ -101,7 +93,7 @@ private Map<String, String> resolveVariables(Set<String> variableNames, Response

private String resolveVariable(String variableName, ResponseConfiguration responseConfiguration, HttpServletRequest request) {
for (br.com.moip.mockkid.variable.VariableResolver resolver : variableResolvers) {
if (resolver.handles(variableName)) {
if (resolver.canHandle(variableName, request)) {
String value = resolver.extract(variableName, responseConfiguration, request);
if (value != null) {
return value;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public interface VariableResolver {

boolean handles(String variable);
boolean canHandle(String variable, HttpServletRequest request);

String extract(String variable, ResponseConfiguration responseConfiguration, HttpServletRequest request);

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class HeaderVariableResolver implements VariableResolver {

@Override
public boolean handles(String variable) {
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.startsWith("headers.");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package br.com.moip.mockkid.variable.resolver.body;
package br.com.moip.mockkid.variable.resolver;

import br.com.moip.mockkid.model.MockkidRequest;
import br.com.moip.mockkid.model.ResponseConfiguration;
import br.com.moip.mockkid.variable.VariableResolver;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
Expand All @@ -11,11 +13,26 @@
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class JSONBodyVariableResolver {
public class JSONBodyVariableResolver implements VariableResolver {

private static final Logger logger = LoggerFactory.getLogger(JSONBodyVariableResolver.class);

public static String extractValueFromJson(String name, HttpServletRequest request) {
@Override
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.startsWith("body.") && isJson(request);
}

@Override
public String extract(String variable, ResponseConfiguration responseConfiguration, HttpServletRequest request) {
return extractValueFromJson(variable, request);
}

private boolean isJson(HttpServletRequest request) {
String header = request.getHeader("content-type");
return header != null && (header.contains("application/json") || header.contains("text/json"));
}

private String extractValueFromJson(String name, HttpServletRequest request) {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(((MockkidRequest) request).getSafeInputStream()));
Expand All @@ -39,6 +56,7 @@ public static String extractValueFromJson(String name, HttpServletRequest reques
} catch (Exception e) {
logger.warn("Couldn't extract variable", e);
}

return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class RawBodyVariableResolver implements VariableResolver {
private static final Logger logger = LoggerFactory.getLogger(RawBodyVariableResolver.class);

@Override
public boolean handles(String variable) {
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.equals("body");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class RegexVariableResolver implements VariableResolver {
private static final Logger logger = LoggerFactory.getLogger(RegexVariableResolver.class);

@Override
public boolean handles(String variable) {
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.startsWith("regex.");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class URLQueryParameterVariableResolver implements VariableResolver {

@Override
public boolean handles(String variable) {
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.startsWith("url.");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package br.com.moip.mockkid.variable.resolver.body;
package br.com.moip.mockkid.variable.resolver;

import br.com.moip.mockkid.model.MockkidRequest;
import br.com.moip.mockkid.model.ResponseConfiguration;
import br.com.moip.mockkid.variable.VariableResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
Expand All @@ -11,14 +13,28 @@
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;

public class XMLBodyVariableResolver {
public class XMLBodyVariableResolver implements VariableResolver {

private static final Logger logger = LoggerFactory.getLogger(XMLBodyVariableResolver.class);

public static String extractValueFromXml(String name, HttpServletRequest request) {
@Override
public boolean canHandle(String variable, HttpServletRequest request) {
return variable.startsWith("body.") && isXml(request);
}

@Override
public String extract(String variable, ResponseConfiguration responseConfiguration, HttpServletRequest request) {
return extractValueFromXml(variable, request);
}

private boolean isXml(HttpServletRequest request) {
String header = request.getHeader("content-type");
return header != null && (header.contains("application/xml") || header.contains("text/xml"));
}

private String extractValueFromXml(String name, HttpServletRequest request) {
try {
DocumentBuilderFactory builderFactory =
DocumentBuilderFactory.newInstance();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(((MockkidRequest) request).getSafeInputStream());

Expand All @@ -30,6 +46,7 @@ public static String extractValueFromXml(String name, HttpServletRequest request
} catch (Exception e) {
logger.warn("Couldn't extract variable", e);
}

return null;
}
}
Loading