FakeServer com Ruby

FakeServer com Ruby

Ultimamente tenho encontrado no meu dia a dia muitos projetos os quais é necessário fazer integrações com outros sistemas com outros protocolos, como SOAP x REST e etc. Também tenho esbarrado em dificuldades de infra, como conseguir um servidor compatível com a aplicação para podermos usar como ambiente de DEV. Essas dificuldades muitas vezes causados por políticas da empresa ou outros.

O fato é que esses dias precisei levantar um servidor-fake para que o nosso time conseguise realizar testes de desenvolvimento, inclusive porque a aplicação em questão não estava desenvolvida ainda.

A solução foi mockar os endpoint’s e a abordagem que usei foi a criação de uma aplicação rodando com ruby/sinatra para acessar os endpoint’s. Na verdade contei com a ajuda de um grande amigo meu que é um especialista ruby (Manoel), ele praticamente desenvolveu a solução e eu a adaptei para a nossas necessidades.

Instalação

Clone o projeto:

https://github.com/apedrina/fakeserver.git

Instale o ruby:

sudo apt install ruby-full

Depois instale o bundler:

sudo gem install bundler

Na raiz do projeto rode o bundler:

sudo bundle install

Executar

Para executar o server use o comando abaixo:

./start.sh

Acessando

http://localhost:4567/api/incidente/1

Criando um novo endpoint

Abra o arquivo mock_server.rb e adicione um novo método (veja os métodos já existentes para ter uma noção do que fazer) e no diretório /files crie o payload que você deseja que nosso endpoint fake retorne.

Gateway

Para não precisar alterar as configurações do nosso front criamos um Gateway para o fakeserver, abaixo calsse java que atua como um Gateway:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;

import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/incidente")
public class IncidenteController extends AbstractController {

	private static final long serialVersionUID = 1L;

	private static final String URL = "http://localhost:4567";

	private static final String incidenteEndpoint = "/api/incidente/1";

	public ResponseEntity getStatus() throws IOException, JSONException {
		JSONObject json = JsonReader.readJsonFromUrl(String.format("%s%s",URL, incidenteEndpoint));
		try {
			return ResponseEntity.ok(json.toString());
		} catch (Exception e) {
			return new ResponseEntity(HttpStatus.EXPECTATION_FAILED);
		}
	}

}

class JsonReader {

	private static String readAll(Reader rd) throws IOException {
		StringBuilder sb = new StringBuilder();
		int cp;
		while ((cp = rd.read()) != -1) {
			sb.append((char) cp);
		}
		return sb.toString();
	}

	public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
		InputStream is = new URL(url).openStream();
		try {
			BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
			String jsonText = readAll(rd);
			JSONObject json = new JSONObject(jsonText);
			return json;
		} finally {
			is.close();
		}
	}
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s