require 'soaspec' require 'sinatra' require 'sinatra/basic_auth' require 'docdsl' require 'nokogiri' require 'erb' require 'json' require 'faker' module Soaspec # Used to run virtual web service on localhost. This makes tests more reliable and faster # First argument overrides the default port class VirtualServer < Sinatra::Application set :bind, '0.0.0.0' set :port, (ENV['port'] || 4999).to_i register Sinatra::DocDsl page do title 'Soaspec Virtual Services' header 'Perform efficient API testing with Ruby' introduction 'This has some simple virtual services aimed at helping you with testing your Ruby API code.' end documentation 'Nothing under /. Go look at /docs' do response 'redirects to the documentation page' status 303 end get '/' do redirect '/docs' end doc_endpoint '/docs' documentation 'Used to test attributes' do response 'A simple Note XML with a date attribute' end get '/test_attribute' do Soaspec::TestServer::TestAttribute.note end documentation 'Used to test namespaces' do response 'XML with 2 namespaces and same elements inside it' end get '/namespace' do Soaspec::TestServer::TestNamespace.food end documentation 'Used for showing a simple difference in value depending on the id used' do param :num, 'Number of tester' param :id, 'Test parameter' response 'JSON with success or true or false and the id sent Idea is for tester to find the id that causes a failure (the fake "defect") ' end get '/packages/:num/:id' do |num, id| JSON.generate(success: Soaspec::TestServer::IdManager.result_for(num, id), id: id) end post '/packages/developed' do Soaspec::TestServer::IdManager.developed = request.body.include?('true') Soaspec::TestServer::IdManager.developed.to_s end # Used for simple testing of posing documentation 'Simply sends the response body back' post '/echoer' do request.body end documentation "Simulate retrieving an ouath token Passed to '/invoices'" post '/as/token.oauth2' do Soaspec::TestServer::Invoices.user_used = request.env['rack.request.form_hash']['username'] [200, Soaspec::TestServer::Invoices.oauth_headers, JSON.generate(Soaspec::TestServer::Invoices.oauth_body)] end documentation 'Replies with HTTP authorization and user set in /as/token.oauth2' get '/invoice/:id' do |id| JSON.generate(customer_id: id, oauth: request.env['HTTP_AUTHORIZATION'], user: Soaspec::TestServer::Invoices.user_used) end documentation 'This is returned when a query for the WSDL is made' do response 'WSDL containing SCHEMA information' end get '/BLZService' do [200, { 'Content-Type' => 'text/xml' }, Soaspec::TestServer::GetBank.test_wsdl] end authorize do |username, password| username == 'admin' && password == 'secret' end protect do documentation "Get path used to test basic auth. User is 'admin' & password is 'secret'" do response 'Secret text' end get '/basic_secrets' do 'Secret data' end documentation 'This is the basic service being hit by SOAP actions' post '/BLZService' do Soaspec::TestServer::GetBank.response_for request end end documentation 'Used for testing storage of data' do payload 'Puppy JSON', Name: 'Test', Failure_Type__c: 'Fail' end post '/test/puppy' do request_hash = JSON.parse(request.body.string) id = Soaspec::TestServer::PuppyService.new_id Soaspec::TestServer::PuppyService.data[id][:Name] = request_hash['Name'] Soaspec::TestServer::PuppyService.data[id][:Failure_Type__c] = request_hash['Failure_Type__c'] if request_hash['Failure_Type__c'] response_hash = { result: { Status: 'success', Data: Soaspec::TestServer::PuppyService.data[id] } } JSON.generate response_hash end documentation 'Used for testing retrieving storage of data' get '/test/puppy/:id' do |id| result = Soaspec::TestServer::PuppyService.data[id.to_i] JSON.generate result end documentation 'Used for testing updating data' patch '/test/puppy/:id' do |id| request_hash = JSON.parse(request.body.string) Soaspec::TestServer::PuppyService.data[id.to_i][:Name] = request_hash['Name'] response_hash = { result: { Status: 'updated', With: request_hash['Name'] } } JSON.generate response_hash end documentation 'Used for testing the handling of JSON path' do response 'JSON with multiple elements of the same name at different nested levels' end get '/test/multiple_json' do <<-BOOKS {"store": {"bicycle": {"price":19.95, "color":"red"}, "book":[ {"price":8.95, "category":"reference", "title":"Sayings of the Century", "author":"Nigel Rees"}, {"price":12.99, "category":"fiction", "title":"Sword of Honour", "author":"Evelyn Waugh"}, {"price":8.99, "category":"fiction", "isbn":"0-553-21311-3", "title":"Moby Dick", "author":"Herman Melville","color":"blue"}, {"price":22.99, "category":"fiction", "isbn":"0-395-19395-8", "title":"The Lord of the Rings", "author":"Tolkien"} ] } } BOOKS end end end