http_stub 0.14.2 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/lib/http_stub/configurer/request/http/basic.rb +21 -0
  3. data/lib/http_stub/configurer/request/http/factory.rb +43 -0
  4. data/lib/http_stub/configurer/request/http/multipart.rb +33 -0
  5. data/lib/http_stub/configurer/request/stub.rb +24 -8
  6. data/lib/http_stub/configurer/request/stub_activator.rb +12 -8
  7. data/lib/http_stub/configurer/request/{stub_activator_payload_builder.rb → stub_activator_builder.rb} +4 -4
  8. data/lib/http_stub/configurer/request/stub_builder.rb +34 -0
  9. data/lib/http_stub/configurer/request/stub_response.rb +40 -0
  10. data/lib/http_stub/configurer/request/stub_response_file.rb +20 -0
  11. data/lib/http_stub/configurer/server/command.rb +5 -1
  12. data/lib/http_stub/configurer/server/command_processor.rb +1 -1
  13. data/lib/http_stub/configurer/server/dsl.rb +4 -4
  14. data/lib/http_stub/configurer/server/facade.rb +25 -11
  15. data/lib/http_stub/extensions/core/hash.rb +26 -0
  16. data/lib/http_stub/rake/server_daemon_tasks.rb +1 -1
  17. data/lib/http_stub/rake/server_tasks.rb +1 -1
  18. data/lib/http_stub/rake/task_generators.rb +3 -3
  19. data/lib/http_stub/server/application.rb +117 -0
  20. data/lib/http_stub/server/daemon.rb +39 -0
  21. data/lib/http_stub/{models → server}/exact_value_matcher.rb +1 -1
  22. data/lib/http_stub/{models → server}/hash_with_string_value_matchers.rb +2 -2
  23. data/lib/http_stub/{models → server}/headers.rb +1 -1
  24. data/lib/http_stub/{models → server}/omitted_value_matcher.rb +1 -1
  25. data/lib/http_stub/{models → server}/regexp_value_matcher.rb +1 -1
  26. data/lib/http_stub/{models → server}/registry.rb +10 -3
  27. data/lib/http_stub/{models → server}/request_header_parser.rb +1 -1
  28. data/lib/http_stub/server/response.rb +13 -0
  29. data/lib/http_stub/server/response_pipeline.rb +18 -0
  30. data/lib/http_stub/{models → server}/string_value_matcher.rb +4 -4
  31. data/lib/http_stub/server/stub.rb +37 -0
  32. data/lib/http_stub/{models → server}/stub_activator.rb +10 -2
  33. data/lib/http_stub/{controllers → server}/stub_activator_controller.rb +5 -5
  34. data/lib/http_stub/{controllers → server}/stub_controller.rb +4 -4
  35. data/lib/http_stub/server/stub_factory.rb +30 -0
  36. data/lib/http_stub/{models → server}/stub_headers.rb +4 -4
  37. data/lib/http_stub/{models → server}/stub_parameters.rb +2 -2
  38. data/lib/http_stub/{models → server}/stub_registry.rb +4 -4
  39. data/lib/http_stub/server/stub_response/base.rb +62 -0
  40. data/lib/http_stub/server/stub_response/file.rb +48 -0
  41. data/lib/http_stub/server/stub_response/text.rb +17 -0
  42. data/lib/http_stub/server/stub_response.rb +14 -0
  43. data/lib/http_stub/{models → server}/stub_triggers.rb +6 -2
  44. data/lib/http_stub/{models → server}/stub_uri.rb +2 -2
  45. data/lib/http_stub/{views → server/views}/_stub.haml +0 -0
  46. data/lib/http_stub/{views → server/views}/application.sass +0 -0
  47. data/lib/http_stub/{views → server/views}/layout.haml +0 -0
  48. data/lib/http_stub/{views → server/views}/stub_activators.haml +0 -0
  49. data/lib/http_stub/{views → server/views}/stubs.haml +0 -0
  50. data/lib/http_stub/version.rb +1 -1
  51. data/lib/http_stub.rb +41 -24
  52. data/spec/lib/http_stub/configurer/deprecated_dsl_spec.rb +2 -2
  53. data/spec/lib/http_stub/configurer/request/http/basic_spec.rb +15 -0
  54. data/spec/lib/http_stub/configurer/request/http/factory_spec.rb +148 -0
  55. data/spec/lib/http_stub/configurer/request/http/multipart_spec.rb +74 -0
  56. data/spec/lib/http_stub/configurer/request/stub_activator_builder_spec.rb +119 -0
  57. data/spec/lib/http_stub/configurer/request/stub_activator_spec.rb +24 -22
  58. data/spec/lib/http_stub/configurer/request/stub_builder_spec.rb +154 -0
  59. data/spec/lib/http_stub/configurer/request/stub_response_spec.rb +136 -0
  60. data/spec/lib/http_stub/configurer/request/stub_spec.rb +238 -17
  61. data/spec/lib/http_stub/configurer/server/command_processor_integration_spec.rb +7 -3
  62. data/spec/lib/http_stub/configurer/server/command_spec.rb +7 -6
  63. data/spec/lib/http_stub/configurer/server/dsl_spec.rb +58 -94
  64. data/spec/lib/http_stub/configurer/server/facade_spec.rb +56 -41
  65. data/spec/lib/http_stub/configurer_integration_spec.rb +180 -81
  66. data/spec/lib/http_stub/{hash_extensions_spec.rb → extensions/core/hash_spec.rb} +1 -1
  67. data/spec/lib/http_stub/rake/server_daemon_tasks_smoke_spec.rb +1 -1
  68. data/spec/lib/http_stub/{server_integration_spec.rb → server/application_integration_spec.rb} +1 -1
  69. data/spec/lib/http_stub/server/application_spec.rb +205 -0
  70. data/spec/lib/http_stub/server/daemon_integration_spec.rb +7 -0
  71. data/spec/lib/http_stub/{server_daemon_spec.rb → server/daemon_spec.rb} +4 -4
  72. data/spec/lib/http_stub/{models → server}/exact_value_matcher_spec.rb +2 -2
  73. data/spec/lib/http_stub/{models → server}/hash_with_string_value_matchers_spec.rb +5 -5
  74. data/spec/lib/http_stub/{models → server}/headers_spec.rb +2 -2
  75. data/spec/lib/http_stub/{models → server}/omitted_value_matcher_spec.rb +2 -2
  76. data/spec/lib/http_stub/{models → server}/regexp_value_matcher_spec.rb +2 -2
  77. data/spec/lib/http_stub/{models → server}/registry_spec.rb +52 -55
  78. data/spec/lib/http_stub/{models → server}/request_header_parser_spec.rb +4 -4
  79. data/spec/lib/http_stub/server/response_pipeline_spec.rb +29 -0
  80. data/spec/lib/http_stub/server/response_spec.rb +41 -0
  81. data/spec/lib/http_stub/{models → server}/string_value_matcher_spec.rb +11 -11
  82. data/spec/lib/http_stub/server/stub_activator_controller_spec.rb +85 -0
  83. data/spec/lib/http_stub/server/stub_activator_spec.rb +124 -0
  84. data/spec/lib/http_stub/server/stub_controller_spec.rb +74 -0
  85. data/spec/lib/http_stub/server/stub_factory_spec.rb +117 -0
  86. data/spec/lib/http_stub/{models → server}/stub_headers_spec.rb +9 -9
  87. data/spec/lib/http_stub/{models → server}/stub_parameters_spec.rb +6 -6
  88. data/spec/lib/http_stub/{models → server}/stub_registry_integration_spec.rb +3 -3
  89. data/spec/lib/http_stub/{models → server}/stub_registry_spec.rb +15 -35
  90. data/spec/lib/http_stub/server/stub_response/base_spec.rb +225 -0
  91. data/spec/lib/http_stub/server/stub_response/file_spec.rb +140 -0
  92. data/spec/lib/http_stub/server/stub_response/text_spec.rb +103 -0
  93. data/spec/lib/http_stub/server/stub_response_spec.rb +49 -0
  94. data/spec/lib/http_stub/{models → server}/stub_spec.rb +34 -18
  95. data/spec/lib/http_stub/{models → server}/stub_triggers_spec.rb +26 -16
  96. data/spec/lib/http_stub/{models → server}/stub_uri_spec.rb +5 -5
  97. data/spec/resources/sample.pdf +0 -0
  98. data/spec/resources/sample.txt +1 -0
  99. data/spec/spec_helper.rb +13 -4
  100. data/spec/support/stub_fixture.rb +106 -0
  101. metadata +148 -102
  102. data/lib/http_stub/configurer/request/stub_payload_builder.rb +0 -46
  103. data/lib/http_stub/hash_extensions.rb +0 -22
  104. data/lib/http_stub/models/request_pipeline.rb +0 -13
  105. data/lib/http_stub/models/response.rb +0 -43
  106. data/lib/http_stub/models/stub.rb +0 -35
  107. data/lib/http_stub/server.rb +0 -114
  108. data/lib/http_stub/server_daemon.rb +0 -36
  109. data/spec/lib/http_stub/configurer/request/stub_activator_payload_builder_spec.rb +0 -103
  110. data/spec/lib/http_stub/configurer/request/stub_payload_builder_spec.rb +0 -304
  111. data/spec/lib/http_stub/controllers/stub_activator_controller_spec.rb +0 -94
  112. data/spec/lib/http_stub/controllers/stub_controller_spec.rb +0 -83
  113. data/spec/lib/http_stub/models/request_pipeline_spec.rb +0 -17
  114. data/spec/lib/http_stub/models/response_spec.rb +0 -206
  115. data/spec/lib/http_stub/models/stub_activator_spec.rb +0 -76
  116. data/spec/lib/http_stub/server_daemon_integration_spec.rb +0 -7
  117. data/spec/lib/http_stub/server_spec.rb +0 -234
  118. data/spec/support/http_stub/configurer/request/stub_payload_builder_shared_context.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 462d586bf168313bf0a34ff8549b6120d336503a
4
- data.tar.gz: 1ea3c26af008e2a0fe3339c7827e170ecf252648
3
+ metadata.gz: 77eb1d522a9c4187caae1203528f66741295bffe
4
+ data.tar.gz: f089d9c6e085126c6be87386a77cc1295b142e9c
5
5
  SHA512:
6
- metadata.gz: 0c6a2fbd7db3b9e04d4b7ebdd52b7a4fe910001a1d11474962a532a61d5c1a86f7ed193891ff69aa701a724c7362ecbab5a2aed3ee84260208243547fa5a770c
7
- data.tar.gz: 0fdb121126205ad0628b2aead6012ae5c6dd7828c1d5bedcfc726739f77cbadd5f1ffeb22c98819e316316f08f0b8343033c570375ca3a3efbe091168d7cbd29
6
+ metadata.gz: 5c367ce983d21581034478d9accfcffc23d1d150fe49053fd72992fd2a7e8106eae1cb3a7d710111bf9ffad5ec073623785102efca130b0a4b64251e9d5f93f4
7
+ data.tar.gz: d3f5a65a799a7afebc73feb58f155196fce11acacb827d3706243b836abb5261f75cf04f9cb6156a6deb2462e4d23db80efd90759e638af8f673edab278c6ba2
@@ -0,0 +1,21 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+ module Http
5
+
6
+ class Basic
7
+
8
+ def initialize(http_request)
9
+ @http_request = http_request
10
+ end
11
+
12
+ def to_http_request
13
+ @http_request
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+ module Http
5
+
6
+ class Factory
7
+
8
+ class << self
9
+
10
+ def stub(model)
11
+ HttpStub::Configurer::Request::Http::Multipart.new("/stubs", model)
12
+ end
13
+
14
+ def stub_activator(model)
15
+ HttpStub::Configurer::Request::Http::Multipart.new("/stubs/activators", model)
16
+ end
17
+
18
+ def get(path)
19
+ to_basic_request(Net::HTTP::Get.new(path))
20
+ end
21
+
22
+ def post(path)
23
+ to_basic_request(Net::HTTP::Post.new(path).tap { |request| request.body = "" })
24
+ end
25
+
26
+ def delete(path)
27
+ to_basic_request(Net::HTTP::Delete.new(path))
28
+ end
29
+
30
+ private
31
+
32
+ def to_basic_request(http_request)
33
+ HttpStub::Configurer::Request::Http::Basic.new(http_request)
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,33 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+ module Http
5
+
6
+ class Multipart
7
+
8
+ def initialize(path, model)
9
+ @path = path
10
+ @model = model
11
+ end
12
+
13
+ def to_http_request
14
+ Net::HTTP::Post::Multipart.new(@path, parameters)
15
+ end
16
+
17
+ private
18
+
19
+ def parameters
20
+ { payload: @model.payload.to_json }.tap do |parameters|
21
+ @model.response_files.each do |response_file|
22
+ parameters["response_file_#{response_file.id}"] =
23
+ UploadIO.new(response_file.path, response_file.type, response_file.name)
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -2,17 +2,33 @@ module HttpStub
2
2
  module Configurer
3
3
  module Request
4
4
 
5
- class Stub < Net::HTTP::Post
5
+ class Stub
6
6
 
7
- def initialize(payload)
8
- super("/stubs")
9
- @payload = payload
10
- self.content_type = "application/json"
11
- self.body = payload.to_json
7
+ def initialize(args)
8
+ @id = SecureRandom.uuid
9
+ @request = args[:request]
10
+ @response = HttpStub::Configurer::Request::StubResponse.new(@id, args[:response])
11
+ @triggers = args[:triggers].map(&:build)
12
12
  end
13
13
 
14
- def stub_uri
15
- @payload[:uri]
14
+ def payload
15
+ {
16
+ id: @id,
17
+ uri: HttpStub::Configurer::Request::ControllableValue.format(@request[:uri]),
18
+ method: @request[:method],
19
+ headers: HttpStub::Configurer::Request::ControllableValue.format(@request[:headers] || {}),
20
+ parameters: HttpStub::Configurer::Request::ControllableValue.format(@request[:parameters] || {}),
21
+ response: @response.payload,
22
+ triggers: @triggers.map(&:payload)
23
+ }
24
+ end
25
+
26
+ def response_files
27
+ ([ @response.file ] + @triggers.map(&:response_files)).flatten.compact
28
+ end
29
+
30
+ def to_s
31
+ @request[:uri]
16
32
  end
17
33
 
18
34
  end
@@ -2,17 +2,21 @@ module HttpStub
2
2
  module Configurer
3
3
  module Request
4
4
 
5
- class StubActivator < Net::HTTP::Post
5
+ class StubActivator
6
6
 
7
- def initialize(payload)
8
- super("/stubs/activators")
9
- @payload = payload
10
- self.content_type = "application/json"
11
- self.body = payload.to_json
7
+ delegate :response_files, to: :@stub
8
+
9
+ def initialize(args)
10
+ @activation_uri = args[:activation_uri]
11
+ @stub = args[:stub]
12
+ end
13
+
14
+ def payload
15
+ { activation_uri: @activation_uri }.merge(@stub.payload)
12
16
  end
13
17
 
14
- def activation_uri
15
- @payload[:activation_uri]
18
+ def to_s
19
+ @activation_uri
16
20
  end
17
21
 
18
22
  end
@@ -2,12 +2,12 @@ module HttpStub
2
2
  module Configurer
3
3
  module Request
4
4
 
5
- class StubActivatorPayloadBuilder
5
+ class StubActivatorBuilder
6
6
 
7
- delegate :match_requests, :respond_with, :trigger, to: :@stub_payload_builder
7
+ delegate :match_requests, :respond_with, :trigger, to: :@stub_builder
8
8
 
9
9
  def initialize(response_defaults)
10
- @stub_payload_builder = HttpStub::Configurer::Request::StubPayloadBuilder.new(response_defaults)
10
+ @stub_builder = HttpStub::Configurer::Request::StubBuilder.new(response_defaults)
11
11
  end
12
12
 
13
13
  def on(uri)
@@ -15,7 +15,7 @@ module HttpStub
15
15
  end
16
16
 
17
17
  def build
18
- { activation_uri: @activation_uri }.merge(@stub_payload_builder.build)
18
+ HttpStub::Configurer::Request::StubActivator.new(activation_uri: @activation_uri, stub: @stub_builder.build)
19
19
  end
20
20
 
21
21
  end
@@ -0,0 +1,34 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+
5
+ class StubBuilder
6
+
7
+ def initialize(response_defaults)
8
+ @response = response_defaults ? response_defaults.clone : {}
9
+ @triggers = []
10
+ end
11
+
12
+ def match_requests(uri, args={})
13
+ @request = { uri: uri }.merge(args)
14
+ end
15
+
16
+ def respond_with(args)
17
+ @response.deep_merge!(args)
18
+ end
19
+
20
+ def trigger(stub_builder_or_builders)
21
+ resolved_builders =
22
+ stub_builder_or_builders.is_a?(Array) ? stub_builder_or_builders : [ stub_builder_or_builders ]
23
+ @triggers.concat(resolved_builders)
24
+ end
25
+
26
+ def build
27
+ HttpStub::Configurer::Request::Stub.new(request: @request, response: @response, triggers: @triggers)
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+
5
+ class StubResponse
6
+
7
+ def initialize(id, args)
8
+ @id = id
9
+ @args = args
10
+ end
11
+
12
+ def payload
13
+ {
14
+ status: @args[:status] || "",
15
+ headers: @args[:headers] || {},
16
+ body: @args[:body],
17
+ delay_in_seconds: @args[:delay_in_seconds] || ""
18
+ }
19
+ end
20
+
21
+ def file
22
+ if contains_file?
23
+ args = { id: @id, type: @args[:headers]["content-type"] }.merge(@args[:body][:file])
24
+ HttpStub::Configurer::Request::StubResponseFile.new(args)
25
+ else
26
+ nil
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def contains_file?
33
+ @args[:body].is_a?(Hash) && @args[:body].key?(:file)
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,20 @@
1
+ module HttpStub
2
+ module Configurer
3
+ module Request
4
+
5
+ class StubResponseFile
6
+
7
+ attr_reader :id, :path, :name, :type
8
+
9
+ def initialize(args)
10
+ @id = args[:id]
11
+ @path = args[:path]
12
+ @name = args[:name]
13
+ @type = args[:type]
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -4,13 +4,17 @@ module HttpStub
4
4
 
5
5
  class Command
6
6
 
7
- attr_reader :request, :description
7
+ attr_reader :description
8
8
 
9
9
  def initialize(args)
10
10
  @request = args[:request]
11
11
  @description = args[:description]
12
12
  end
13
13
 
14
+ def http_request
15
+ @request.to_http_request
16
+ end
17
+
14
18
  end
15
19
 
16
20
  end
@@ -10,7 +10,7 @@ module HttpStub
10
10
 
11
11
  def process(command)
12
12
  begin
13
- response = Net::HTTP.start(host, port) { |http| http.request(command.request) }
13
+ response = Net::HTTP.start(host, port) { |http| http.request(command.http_request) }
14
14
  raise "#{error_message_prefix(command)}: #{response.code} #{response.message}" unless response.code == "200"
15
15
  rescue Exception => exc
16
16
  raise "#{error_message_prefix(command)}: #{exc}"
@@ -18,14 +18,14 @@ module HttpStub
18
18
  end
19
19
 
20
20
  def build_stub(&block)
21
- builder = HttpStub::Configurer::Request::StubPayloadBuilder.new(@response_defaults)
21
+ builder = HttpStub::Configurer::Request::StubBuilder.new(@response_defaults)
22
22
  block.call(builder) if block_given?
23
23
  builder
24
24
  end
25
25
 
26
26
  def add_stub!(builder=nil, &block)
27
27
  resolved_builder = builder || self.build_stub(&block)
28
- @server_facade.stub_response(HttpStub::Configurer::Request::Stub.new(resolved_builder.build))
28
+ @server_facade.stub_response(resolved_builder.build)
29
29
  end
30
30
 
31
31
  def add_stubs!(builders)
@@ -33,9 +33,9 @@ module HttpStub
33
33
  end
34
34
 
35
35
  def add_activator!(&block)
36
- builder = HttpStub::Configurer::Request::StubActivatorPayloadBuilder.new(@response_defaults)
36
+ builder = HttpStub::Configurer::Request::StubActivatorBuilder.new(@response_defaults)
37
37
  block.call(builder)
38
- @server_facade.stub_activator(HttpStub::Configurer::Request::StubActivator.new(builder.build))
38
+ @server_facade.stub_activator(builder.build)
39
39
  end
40
40
 
41
41
  def activate!(uri)
@@ -8,37 +8,51 @@ module HttpStub
8
8
  @request_processor = HttpStub::Configurer::Server::RequestProcessor.new(configurer)
9
9
  end
10
10
 
11
- def stub_response(request)
12
- @request_processor.submit(request: request, description: "stubbing '#{request.stub_uri}'")
11
+ def stub_response(model)
12
+ @request_processor.submit(
13
+ request: HttpStub::Configurer::Request::Http::Factory.stub(model),
14
+ description: "stubbing '#{model}'"
15
+ )
13
16
  end
14
17
 
15
- def stub_activator(request)
16
- @request_processor.submit(request: request, description: "registering activator '#{request.activation_uri}'")
18
+ def stub_activator(model)
19
+ @request_processor.submit(
20
+ request: HttpStub::Configurer::Request::Http::Factory.stub_activator(model),
21
+ description: "registering activator '#{model}'"
22
+ )
17
23
  end
18
24
 
19
25
  def activate(uri)
20
- @request_processor.submit(request: Net::HTTP::Get.new(uri), description: "activating '#{uri}'")
26
+ @request_processor.submit(
27
+ request: HttpStub::Configurer::Request::Http::Factory.get(uri),
28
+ description: "activating '#{uri}'"
29
+ )
21
30
  end
22
31
 
23
32
  def remember_stubs
24
- request = Net::HTTP::Post.new("/stubs/memory")
25
- request.body = ""
26
- @request_processor.submit(request: request, description: "committing stubs to memory")
33
+ @request_processor.submit(
34
+ request: HttpStub::Configurer::Request::Http::Factory.post("/stubs/memory"),
35
+ description: "committing stubs to memory"
36
+ )
27
37
  end
28
38
 
29
39
  def recall_stubs
30
40
  @request_processor.submit(
31
- request: Net::HTTP::Get.new("/stubs/memory"), description: "recalling stubs in memory"
41
+ request: HttpStub::Configurer::Request::Http::Factory.get("/stubs/memory"),
42
+ description: "recalling stubs in memory"
32
43
  )
33
44
  end
34
45
 
35
46
  def clear_stubs
36
- @request_processor.submit(request: Net::HTTP::Delete.new("/stubs"), description: "clearing stubs")
47
+ @request_processor.submit(
48
+ request: HttpStub::Configurer::Request::Http::Factory.delete("/stubs"),
49
+ description: "clearing stubs")
37
50
  end
38
51
 
39
52
  def clear_activators
40
53
  @request_processor.submit(
41
- request: Net::HTTP::Delete.new("/stubs/activators"), description: "clearing activators"
54
+ request: HttpStub::Configurer::Request::Http::Factory.delete("/stubs/activators"),
55
+ description: "clearing activators"
42
56
  )
43
57
  end
44
58
 
@@ -0,0 +1,26 @@
1
+ module HttpStub
2
+ module Extensions
3
+ module Core
4
+
5
+ module Hash
6
+
7
+ def downcase_and_underscore_keys
8
+ self.reduce({}) do |result, element|
9
+ result[element[0].is_a?(::String) ? element[0].downcase.gsub(/-/, '_') : element[0]] = element[1]
10
+ result
11
+ end
12
+ end
13
+
14
+ def has_hash?(other_hash)
15
+ other_hash.nil? || other_hash.reduce(true) do |result, element|
16
+ result && (self[element[0]] == element[1])
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+
26
+ ::Hash.send(:include, HttpStub::Extensions::Core::Hash)
@@ -5,7 +5,7 @@ module HttpStub
5
5
 
6
6
  def initialize(args)
7
7
  HttpStub::Rake::ServerTasks.new(args)
8
- namespace(args[:name]) { HttpServerManager::Rake::ServerTasks.new(HttpStub::ServerDaemon.new(args)) }
8
+ namespace(args[:name]) { HttpServerManager::Rake::ServerTasks.new(HttpStub::Server::Daemon.new(args)) }
9
9
  end
10
10
 
11
11
  end
@@ -16,7 +16,7 @@ module HttpStub
16
16
  namespace :start do
17
17
  desc "Starts stub #{args[:name]} in the foreground"
18
18
  task(:foreground) do
19
- HttpStub::Server.instance_eval do
19
+ HttpStub::Server::Application.instance_eval do
20
20
  set :environment, :test
21
21
  set :port, args[:port]
22
22
  run!
@@ -1,7 +1,7 @@
1
- require File.expand_path('../../../http_stub', __FILE__)
1
+ require ::File.expand_path('../../../http_stub', __FILE__)
2
2
  require 'rake/tasklib' unless defined? (::Rake::TaskLib)
3
3
 
4
4
  require 'http_server_manager/rake/task_generators'
5
5
 
6
- require File.expand_path('../server_tasks', __FILE__)
7
- require File.expand_path('../server_daemon_tasks', __FILE__)
6
+ require ::File.expand_path('../server_tasks', __FILE__)
7
+ require ::File.expand_path('../server_daemon_tasks', __FILE__)
@@ -0,0 +1,117 @@
1
+ module HttpStub
2
+ module Server
3
+
4
+ class Application < Sinatra::Base
5
+
6
+ register Sinatra::Partial
7
+
8
+ enable :dump_errors, :logging, :partial_underscores
9
+
10
+ def initialize
11
+ super()
12
+ @stub_registry = HttpStub::Server::StubRegistry.new
13
+ @stub_activator_registry = HttpStub::Server::Registry.new("stub_activator")
14
+ @stub_controller = HttpStub::Server::StubController.new(@stub_registry)
15
+ @stub_activator_controller =
16
+ HttpStub::Server::StubActivatorController.new(@stub_activator_registry, @stub_registry)
17
+ end
18
+
19
+ private
20
+
21
+ SUPPORTED_REQUEST_TYPES = [ :get, :post, :put, :delete, :patch, :options ].freeze
22
+
23
+ def self.any_request_type(path, opts={}, &block)
24
+ SUPPORTED_REQUEST_TYPES.each { |type| self.send(type, path, opts, &block) }
25
+ end
26
+
27
+ before { @response_pipeline = HttpStub::Server::ResponsePipeline.new(self) }
28
+
29
+ public
30
+
31
+ # Sample request body:
32
+ # {
33
+ # "uri": "/some/path",
34
+ # "method": "get",
35
+ # "headers": {
36
+ # "key": "value",
37
+ # ...
38
+ # },
39
+ # "parameters": {
40
+ # "key": "value",
41
+ # ...
42
+ # },
43
+ # "response": {
44
+ # "status": "200",
45
+ # "body": "Hello World"
46
+ # }
47
+ # }
48
+ post "/stubs" do
49
+ response = @stub_controller.register(request)
50
+ @response_pipeline.process(response)
51
+ end
52
+
53
+ get "/stubs" do
54
+ haml :stubs, {}, stubs: @stub_registry.all
55
+ end
56
+
57
+ delete "/stubs" do
58
+ @stub_controller.clear(request)
59
+ halt 200, "OK"
60
+ end
61
+
62
+ post "/stubs/memory" do
63
+ @stub_registry.remember
64
+ halt 200, "OK"
65
+ end
66
+
67
+ get "/stubs/memory" do
68
+ @stub_registry.recall
69
+ halt 200, "OK"
70
+ end
71
+
72
+ # Sample request body:
73
+ # {
74
+ # "activation_uri": "/some/path",
75
+ # ... see /stub ...
76
+ # }
77
+ post "/stubs/activators" do
78
+ response = @stub_activator_controller.register(request)
79
+ @response_pipeline.process(response)
80
+ end
81
+
82
+ get "/stubs/activators" do
83
+ haml :stub_activators, {}, stub_activators: @stub_activator_registry.all.sort_by(&:activation_uri)
84
+ end
85
+
86
+ delete "/stubs/activators" do
87
+ @stub_activator_controller.clear(request)
88
+ halt 200, "OK"
89
+ end
90
+
91
+ get "/application.css" do
92
+ sass :application
93
+ end
94
+
95
+ any_request_type(//) { handle_request }
96
+
97
+ helpers do
98
+
99
+ def h(text)
100
+ Rack::Utils.escape_html(text)
101
+ end
102
+
103
+ end
104
+
105
+ private
106
+
107
+ def handle_request
108
+ response = @stub_controller.replay(request)
109
+ response = @stub_activator_controller.activate(request) if response.empty?
110
+ response = HttpStub::Server::Response::ERROR if response.empty?
111
+ @response_pipeline.process(response)
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,39 @@
1
+ module HttpStub
2
+ module Server
3
+
4
+ class Daemon < HttpServerManager::Server
5
+
6
+ class << self
7
+
8
+ def pid_dir=(dir)
9
+ HttpServerManager.pid_dir = dir
10
+ end
11
+
12
+ def log_dir=(dir)
13
+ HttpServerManager.log_dir = dir
14
+ end
15
+
16
+ end
17
+
18
+ def initialize(args)
19
+ super({ host: "localhost" }.merge(args))
20
+ @configurer = args[:configurer]
21
+ end
22
+
23
+ def start!
24
+ super
25
+ if @configurer
26
+ @configurer.initialize!
27
+ logger.info "#{@name} initialized"
28
+ end
29
+ end
30
+
31
+ def start_command
32
+ "rake #{@name}:start:foreground"
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -1,5 +1,5 @@
1
1
  module HttpStub
2
- module Models
2
+ module Server
3
3
 
4
4
  class ExactValueMatcher
5
5
 
@@ -1,10 +1,10 @@
1
1
  module HttpStub
2
- module Models
2
+ module Server
3
3
 
4
4
  class HashWithStringValueMatchers < Hash
5
5
 
6
6
  def initialize(stub_hash)
7
- stub_hash.each_pair { |key, value| self[key] = HttpStub::Models::StringValueMatcher.new(value) }
7
+ stub_hash.each_pair { |key, value| self[key] = HttpStub::Server::StringValueMatcher.new(value) }
8
8
  end
9
9
 
10
10
  def match?(actual_hash)
@@ -1,5 +1,5 @@
1
1
  module HttpStub
2
- module Models
2
+ module Server
3
3
 
4
4
  class Headers < Hash
5
5