Skip to content

Instantly share code, notes, and snippets.

@ZurgInq
Last active March 14, 2018 20:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ZurgInq/2bbe3defa168fe6fd679f24562682e62 to your computer and use it in GitHub Desktop.
Save ZurgInq/2bbe3defa168fe6fd679f24562682e62 to your computer and use it in GitHub Desktop.
Golang + RSpec Tutorial
# spec/api_spec.rb
require 'spec_helper'
require 'rest-client'
require 'mockserver-client'
def create_mock_client
MockServer::MockServerClient.new(ENV.fetch("MOCK_SERVER_HOST", 'localhost'), ENV.fetch("MOCK_SERVER_PORT", 1080))
end
RSpec.describe "ApiServer" do
include MockServer
include MockServer::Model::DSL
let(:api_server_host) { "http://#{ENV.fetch("API_SERVICE_ADDR", '127.0.0.1:8000')}" }
describe "GET /ping" do
before { @response = RestClient.get "#{api_server_host}/ping" }
it do
expect(@response.code).to eql 200
expect(@response.body).to eql 'OK'
end
end
describe "GET /movies" do
let(:query_string_parameters) { [] }
let(:movies_resp_body) { '[]' }
before :each do
@movies_server = create_mock_client
@movies_server.reset
@exp = expectation do |exp|
exp.request do |request|
request.method = 'GET'
request.path = '/movies'
request.headers << header('Accept', 'application/json')
request.query_string_parameters = query_string_parameters
end
exp.response do |response|
response.status_code = 200
response.headers << header('Content-Type', 'application/json; charset=utf-8')
response.body = body(movies_resp_body)
end
end
@movies_server.register(@exp)
end
shared_examples 'response_ok' do
it do
expect(@response.code).to eql 200
expect(@response.body).to eql(resp_body)
end
end
let(:params) { {} }
before { @response = RestClient.get "#{api_server_host}/movies", {params: params} }
context '?rating=X' do
let(:params) { {rating: 90} }
let(:query_string_parameters) { [parameter('rating', '90')] }
let(:movies_resp_body) { File.read('spec/fixtures/movies_90.json') }
let(:resp_body) { movies_resp_body }
include_examples 'response_ok'
end
describe 'set default filter' do
let(:query_string_parameters) { [parameter('rating', '70')] }
let(:movies_resp_body) { File.read('spec/fixtures/movies.json') }
let(:resp_body) { movies_resp_body }
include_examples 'response_ok'
end
end
end
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rspec"
gem "rest-client"
gem "mockserver-client"
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/ping", ping)
e.GET("/movies", movies)
e.Start(":8000")
}
func ping(c echo.Context) error {
return c.String(http.StatusOK, "OK")
}
func movies(c echo.Context) error {
rating := c.QueryParam("rating")
if rating == "" {
rating = "70"
}
client := &http.Client{}
req, _ := http.NewRequest("GET", "http://localhost:1080/movies", nil)
req.Header.Add("Accept", `application/json`)
q := req.URL.Query()
q.Add("rating", rating)
req.URL.RawQuery = q.Encode()
if resp, err := client.Do(req); err != nil {
panic(err)
} else {
return c.Stream(http.StatusOK, "application/json", resp.Body)
}
}
["The Godfather", "The Shawshank Redemption", "Schindler's List", "Raging Bull", "Casablanca"]
["The Godfather", "The Shawshank Redemption"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment