mocking-server 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c9aef0d56c7fba6c2ed66e05acff6f5a6716a491
4
+ data.tar.gz: 301532b3ae35c6612493ca2d3b6fcace6e19f8ce
5
+ SHA512:
6
+ metadata.gz: 1e1a2a93363d10ce1ac039cd5948a11836ddb4654ef9de4b934f1ef9139066786a9ebdef35830231eb1be1538e46245977250881c1b5940e4cdca531584e5f20
7
+ data.tar.gz: f6a5aa78f6038f343b0df6cf76f99923c3b7f68b4ce70825f892d9f1fbfb48195287b09133060d45788af89a97b6578609a1b6201480c6b1df35ec3a7de3b7bc
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Nicholas Ren
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,77 @@
1
+ # Mockery #
2
+ A quick way of mocking an external web service you want to consume.
3
+ Inspired by [moco](https://github.com/dreamhead/moco), [mock-server](https://github.com/djanowski/mock-server) and [sinatra](http://www.sinatrarb.com/).
4
+
5
+ # Why #
6
+ Integration, especially based on HTTP, e.g. web service, REST etc, is widlly used in most web development.
7
+ When you write a feature that need to connect to an external web service
8
+ You wonder how to test that. One option is to stub methods in Net::HTTP and equivalents, but by doing that you
9
+ are tying yourself to an implementation detail. The ideal thing is to have a server running locally, Then serve different request for different response.
10
+
11
+ One thing I want to highlight is, rather than set up a global server which respond to all coming request, With `mockery`, you can set up different server for different `testcase`, `spec` or `scenario`.
12
+
13
+ ## Feature ##
14
+ + Standalone server, test the real interaction.
15
+ + Setup your mock server with sinatra's elegant DSL.
16
+
17
+ ## Get it ##
18
+ (haven't published to rubygems)
19
+ `gem install mockery` or add `gem 'mockery'` in your `Gemfile`
20
+
21
+ ## With rspec ##
22
+
23
+ ```
24
+ # in rspec helper
25
+ require 'mockery'
26
+ RSpec.configure do |config|
27
+ config.include Mockery::Methods
28
+ end
29
+
30
+ # in spec
31
+ describe ApiCilent do
32
+ subject { ApiCilent.new }
33
+
34
+ it "should return hello" do
35
+ server = mock_server do
36
+ get '/greeting' do
37
+ status 200
38
+ body 'hello'
39
+ end
40
+ end
41
+
42
+ server.run do
43
+ expect(subject.greeting).to eq('hello')
44
+ end
45
+ end
46
+ end
47
+ ```
48
+
49
+ ### With cucumber ##
50
+
51
+ ```
52
+ #in env.rb
53
+ require 'mockery'
54
+ World(Mockery::Methods)
55
+
56
+
57
+ # in steps
58
+ server = mock_server do
59
+ get '/greeting' do
60
+ status 200
61
+ body 'hello'
62
+ end
63
+ end
64
+
65
+ server.run do
66
+ # steps that send request to the local mock sever
67
+ end
68
+ ```
69
+
70
+ ## License ##
71
+
72
+ MIT.
73
+
74
+ ## Contributor
75
+
76
+ + Niu Yameng
77
+ + Nicholas Ren
@@ -0,0 +1,75 @@
1
+ require "sinatra/base"
2
+ require "logger"
3
+
4
+ class MockingServer
5
+ class App < Sinatra::Base
6
+ use Rack::ShowExceptions
7
+ end
8
+
9
+ def run
10
+ start
11
+ yield if block_given?
12
+ ensure
13
+ shutdown
14
+ end
15
+
16
+ module Methods
17
+ def mock_server(*args, &block)
18
+ app = Class.new(Sinatra::Base)
19
+ app.class_eval(&block)
20
+ MockingServer.new(app, *args, &block)
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def listening?(host, port)
27
+ begin
28
+ socket = TCPSocket.new(host, port)
29
+ socket.close unless socket.nil?
30
+ true
31
+ rescue Errno::ECONNREFUSED,
32
+ Errno::EBADF, # Windows
33
+ Errno::EADDRNOTAVAIL # Windows
34
+ false
35
+ end
36
+ end
37
+
38
+ def wait_for_service(host, port, timeout = 5)
39
+ start_time = Time.now
40
+
41
+ until listening?(host, port)
42
+ if timeout && (Time.now > (start_time + timeout))
43
+ raise SocketError.new("Socket did not open within #{timeout} seconds")
44
+ end
45
+ end
46
+ true
47
+ end
48
+
49
+ def initialize(app, port = 4000, &block)
50
+ @app = app
51
+ @port = port
52
+ end
53
+
54
+ def start
55
+ @pid_server = fork do
56
+
57
+ server_options = {
58
+ :app => @app,
59
+ :server => 'webrick',
60
+ :environment => :none,
61
+ :daemonize => false,
62
+ :Port => @port
63
+ }
64
+
65
+ Rack::Server.start(server_options)
66
+ end
67
+ wait_for_service("0.0.0.0", @port)
68
+ self
69
+ end
70
+
71
+ def shutdown
72
+ Process.kill(:INT, @pid_server)
73
+ Process.waitpid(@pid_server)
74
+ end
75
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ require 'net/http'
3
+
4
+
5
+ describe 'mock server' do
6
+ let( :http ) { Net::HTTP.new('127.0.0.1', 3000) }
7
+ let( :http2 ) { Net::HTTP.new('127.0.0.1', 4000) }
8
+
9
+ it "should work" do
10
+ server = mock_server(3000) do
11
+ get '/user' do
12
+ 'hello'
13
+ end
14
+ end
15
+
16
+ server.run do
17
+ http.request_get('/user').body.should eq("hello")
18
+ end
19
+ end
20
+
21
+ it "should work as well" do
22
+ server = mock_server(3000) do
23
+ get '/category' do
24
+ 'hello'
25
+ end
26
+ end
27
+
28
+ server.run do
29
+ http.request_get('/category').body.should eq("hello")
30
+ end
31
+ end
32
+
33
+ it "should work as well 2" do
34
+ server = mock_server(4000) do
35
+ get '/category' do
36
+ 'hello'
37
+ end
38
+ end
39
+
40
+ server.run do
41
+ http2.request_get('/category').body.should eq("hello")
42
+ end
43
+ end
44
+ end
45
+
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mocking-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nicholas Ren
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: ''
28
+ email:
29
+ - nicholas85211@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/mocking_server.rb
35
+ - README.md
36
+ - LICENSE
37
+ - spec/mocking_server_spec.rb
38
+ homepage: http://github.com/nicholasren/mocking-server
39
+ licenses: []
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 2.0.5
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: A quick way of mocking an external web service you want to consume.
61
+ test_files: []