flipp-mockserver-client 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +7 -0
  4. data/Gemfile +4 -0
  5. data/README.md +182 -0
  6. data/Rakefile +10 -0
  7. data/bin/mockserver +9 -0
  8. data/lib/cli.rb +146 -0
  9. data/lib/mockserver-client.rb +17 -0
  10. data/lib/mockserver/abstract_client.rb +111 -0
  11. data/lib/mockserver/mock_server_client.rb +59 -0
  12. data/lib/mockserver/model/array_of.rb +85 -0
  13. data/lib/mockserver/model/body.rb +56 -0
  14. data/lib/mockserver/model/cookie.rb +36 -0
  15. data/lib/mockserver/model/delay.rb +34 -0
  16. data/lib/mockserver/model/enum.rb +47 -0
  17. data/lib/mockserver/model/expectation.rb +158 -0
  18. data/lib/mockserver/model/forward.rb +41 -0
  19. data/lib/mockserver/model/header.rb +43 -0
  20. data/lib/mockserver/model/parameter.rb +43 -0
  21. data/lib/mockserver/model/request.rb +77 -0
  22. data/lib/mockserver/model/response.rb +45 -0
  23. data/lib/mockserver/model/times.rb +61 -0
  24. data/lib/mockserver/proxy_client.rb +9 -0
  25. data/lib/mockserver/utility_methods.rb +59 -0
  26. data/lib/mockserver/version.rb +5 -0
  27. data/mockserver-client.gemspec +36 -0
  28. data/pom.xml +116 -0
  29. data/spec/fixtures/forward_mockserver.json +7 -0
  30. data/spec/fixtures/incorrect_login_response.json +20 -0
  31. data/spec/fixtures/post_login_request.json +22 -0
  32. data/spec/fixtures/register_expectation.json +50 -0
  33. data/spec/fixtures/retrieved_request.json +22 -0
  34. data/spec/fixtures/search_request.json +6 -0
  35. data/spec/fixtures/times_once.json +6 -0
  36. data/spec/integration/mock_client_integration_spec.rb +82 -0
  37. data/spec/mockserver/builder_spec.rb +136 -0
  38. data/spec/mockserver/mock_client_spec.rb +80 -0
  39. data/spec/mockserver/proxy_client_spec.rb +38 -0
  40. data/spec/spec_helper.rb +61 -0
  41. metadata +293 -0
@@ -0,0 +1,41 @@
1
+ # encoding: UTF-8
2
+ require 'hashie'
3
+ require_relative './enum'
4
+
5
+ #
6
+ # A class to model a forwarding on a request.
7
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
8
+ #
9
+ module MockServer::Model
10
+ # Enum for a scheme used in a forward request
11
+ class Scheme < SymbolizedEnum
12
+ def allowed_values
13
+ [:HTTP, :HTTPS]
14
+ end
15
+ end
16
+
17
+ # Model for forwarding
18
+ class Forward < Hashie::Dash
19
+ include Hashie::Extensions::MethodAccess
20
+ include Hashie::Extensions::IgnoreUndeclared
21
+ include Hashie::Extensions::Coercion
22
+
23
+ property :host, default: 'localhost'
24
+ property :port, default: 80
25
+ property :scheme, default: 'HTTP'
26
+
27
+ coerce_key :host, String
28
+ coerce_key :scheme, Scheme
29
+ end
30
+
31
+ # DSL methods for forward
32
+ module DSL
33
+ def forward(&_)
34
+ obj = Forward.new
35
+ yield obj if block_given?
36
+ obj
37
+ end
38
+
39
+ alias_method :http_forward, :forward
40
+ end
41
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ require 'hashie'
3
+ require_relative './array_of'
4
+
5
+ #
6
+ # A class to model headers in payloads.
7
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
8
+ #
9
+ module MockServer::Model
10
+ # A class that only stores strings
11
+ class Strings < ArrayOf
12
+ def child_class
13
+ String
14
+ end
15
+ end
16
+
17
+ # Model for header
18
+ class Header < Hashie::Dash
19
+ include Hashie::Extensions::MethodAccess
20
+ include Hashie::Extensions::IgnoreUndeclared
21
+ include Hashie::Extensions::Coercion
22
+
23
+ property :name, required: true
24
+ property :values, default: Strings.new([])
25
+
26
+ coerce_key :name, String
27
+ coerce_key :values, Strings
28
+ end
29
+
30
+ # A collection that only stores headers
31
+ class Headers < ArrayOf
32
+ def child_class
33
+ Header
34
+ end
35
+ end
36
+
37
+ # DSL methods for header
38
+ module DSL
39
+ def header(key, *value)
40
+ Header.new(name: key, values: value)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ require 'hashie'
3
+ require_relative './array_of'
4
+
5
+ #
6
+ # A class to model parameters in payloads.
7
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
8
+ #
9
+ module MockServer::Model
10
+ # A class that only stores strings
11
+ class Strings < ArrayOf
12
+ def child_class
13
+ String
14
+ end
15
+ end
16
+
17
+ # Model for parameter
18
+ class Parameter < Hashie::Dash
19
+ include Hashie::Extensions::MethodAccess
20
+ include Hashie::Extensions::IgnoreUndeclared
21
+ include Hashie::Extensions::Coercion
22
+
23
+ property :name, required: true
24
+ property :values, default: Strings.new([])
25
+
26
+ coerce_key :name, String
27
+ coerce_key :values, Strings
28
+ end
29
+
30
+ # A collection that only stores parameters
31
+ class Parameters < ArrayOf
32
+ def child_class
33
+ Parameter
34
+ end
35
+ end
36
+
37
+ # DSL methods for parameter
38
+ module DSL
39
+ def parameter(key, *value)
40
+ Parameter.new(name: key, values: value)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: UTF-8
2
+ require 'hashie'
3
+ require_relative './parameter'
4
+ require_relative './header'
5
+ require_relative './cookie'
6
+ require_relative './body'
7
+ require_relative './enum'
8
+ require 'base64'
9
+ #
10
+ # A class to model a request in an expectation.
11
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
12
+ #
13
+ module MockServer::Model
14
+ # Enum for HTTP methods
15
+ class HTTPMethod < SymbolizedEnum
16
+ def allowed_values
17
+ [:GET, :POST, :PUT, :DELETE, :PATCH]
18
+ end
19
+ end
20
+
21
+ # Request model
22
+ class Request < Hashie::Trash
23
+ include Hashie::Extensions::MethodAccess
24
+ include Hashie::Extensions::IgnoreUndeclared
25
+ include Hashie::Extensions::Coercion
26
+
27
+ ALLOWED_METHODS = [:GET, :POST, :PUT, :DELETE, :PATCH]
28
+
29
+ property :method, required: true, default: :GET
30
+ property :path, required: true, default: ''
31
+ property :query_string_parameters, default: Parameters.new([])
32
+ property :cookies, default: Cookies.new([])
33
+ property :headers, default: Headers.new([])
34
+ property :body
35
+
36
+ coerce_key :method, HTTPMethod
37
+ coerce_key :path, String
38
+ coerce_key :query_string_parameters, Parameters
39
+ coerce_key :cookies, Cookies
40
+ coerce_key :headers, Headers
41
+ coerce_key :body, String
42
+
43
+ # Creates a request from a hash
44
+ # @param payload [Hash] a hash representation of the request
45
+ def populate_from_payload(payload)
46
+ @request = payload[MockServer::HTTP_REQUEST]
47
+ @request = Request.new(symbolize_keys(@request)) if @request
48
+ end
49
+ end
50
+
51
+ # Class to store a list of mocks - useful for modeling retrieve endpoint result
52
+ class Requests < ArrayOf
53
+ # Code is used to store HTTP status code returned from retrieve endpoint
54
+ attr_accessor :code
55
+
56
+ def child_class
57
+ Request
58
+ end
59
+ end
60
+
61
+ # DSL methods related to requests
62
+ module DSL
63
+ def request(method, path, &_)
64
+ obj = Request.new(method: method, path: path)
65
+ yield obj if block_given?
66
+ obj
67
+ end
68
+
69
+ def request_from_json(payload)
70
+ request = Request.new(symbolize_keys(payload))
71
+ yield request if block_given?
72
+ request
73
+ end
74
+
75
+ alias_method :http_request, :request
76
+ end
77
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: UTF-8
2
+ require_relative './body'
3
+ require_relative './delay'
4
+ require_relative './header'
5
+ require_relative './cookie'
6
+ require 'base64'
7
+
8
+ #
9
+ # A class to model a response in an expectation.
10
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
11
+ #
12
+ module MockServer::Model
13
+ # Model for a mock response
14
+ class Response < Hashie::Dash
15
+ include Hashie::Extensions::MethodAccess
16
+ include Hashie::Extensions::IgnoreUndeclared
17
+ include Hashie::Extensions::Coercion
18
+
19
+ property :status_code, default: 200
20
+ property :cookies, default: Cookies.new([])
21
+ property :headers, default: Headers.new([])
22
+ property :delay
23
+ property :body
24
+
25
+ coerce_key :cookies, Cookies
26
+ coerce_key :headers, Headers
27
+ coerce_key :delay, Delay
28
+ coerce_key :body, String
29
+ end
30
+
31
+ # DSL Methods for a response
32
+ module DSL
33
+ def response(&_)
34
+ obj = Response.new
35
+ yield obj if block_given?
36
+ obj
37
+ end
38
+
39
+ def decode(string)
40
+ Base64.decode64(string)
41
+ end
42
+
43
+ alias_method :http_response, :response
44
+ end
45
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+ require 'hashie'
3
+ require_relative './enum'
4
+
5
+ #
6
+ # A class to model the number of times an expectation should be respected.
7
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
8
+ #
9
+ module MockServer::Model
10
+ # Enum for boolean values since Ruby does not have this by default
11
+ class Boolean < Enum
12
+ def allowed_values
13
+ [true, false]
14
+ end
15
+
16
+ def !
17
+ !@value
18
+ end
19
+
20
+ def initialize(supplied_value)
21
+ @value = pre_process_value(supplied_value)
22
+ end
23
+ end
24
+
25
+ # Model for times class
26
+ class Times < Hashie::Dash
27
+ include Hashie::Extensions::MethodAccess
28
+ include Hashie::Extensions::IgnoreUndeclared
29
+ include Hashie::Extensions::Coercion
30
+
31
+ property :remaining_times, default: 0
32
+ property :unlimited, default: false
33
+
34
+ coerce_key :unlimited, Boolean
35
+ end
36
+
37
+ # DSL methods related to times
38
+ module DSL
39
+ def unlimited
40
+ Times.new(unlimited: true)
41
+ end
42
+
43
+ def once
44
+ Times.new(remaining_times: 1)
45
+ end
46
+
47
+ def exactly(num)
48
+ Times.new(remaining_times: num)
49
+ end
50
+
51
+ def at_least(num)
52
+ Times.new(remaining_times: num, unlimited: true)
53
+ end
54
+
55
+ def times(&_)
56
+ obj = once
57
+ yield obj if block_given?
58
+ obj
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: UTF-8
2
+ require_relative './abstract_client'
3
+
4
+ #
5
+ # The client used to interact with the proxy server.
6
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
7
+ #
8
+ class MockServer::ProxyClient < MockServer::AbstractClient
9
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+ require 'active_support/inflector'
3
+ require 'json'
4
+
5
+ #
6
+ # A module that has common utility methods used by this project
7
+ # @author:: Nayyara Samuel (mailto: nayyara.samuel@opower.com)
8
+ #
9
+ module MockServer::UtilityMethods
10
+ # Does the following filter/transform operations on a hash
11
+ # - exclude null or empty valued keys from the hash
12
+ # - camelize the keys of the hash
13
+ # @param obj [Object] an object which will be used to create the hash. Must support :to_hash method
14
+ # @return [Hash] the transformed hash
15
+ # rubocop:disable Style/MethodLength
16
+ # rubocop:disable Style/CyclomaticComplexity
17
+ def camelized_hash(obj)
18
+ obj = obj && obj.respond_to?(:to_hash) ? obj.to_hash : obj
19
+
20
+ if obj.is_a?(Hash)
21
+ obj.each_with_object({}) do |(k, v), acc|
22
+ is_empty = v.nil? || (v.respond_to?(:empty?) ? v.empty? : false)
23
+ acc[camelize(k)] = camelized_hash(v) unless is_empty
24
+ end
25
+ elsif obj.respond_to?(:map)
26
+ obj.map { |element| camelized_hash(element) }
27
+ else
28
+ obj
29
+ end
30
+ end
31
+
32
+ # Converts keys to symbols
33
+ # @param hash [Hash] a hash
34
+ # @return [Hash] a copy of the hash where keys are symbols
35
+ def symbolize_keys(hash)
36
+ if hash.is_a?(Hash)
37
+ Hash[hash.map { |k, v| [k.to_s.underscore.to_sym, symbolize_keys(v)] }]
38
+ elsif hash.respond_to?(:map)
39
+ hash.map { |obj| symbolize_keys(obj) }
40
+ else
41
+ hash
42
+ end
43
+ end
44
+
45
+ # @param str [Object] an object to camelize the string representation of
46
+ # @return [String] the string converted to camelcase with first letter in lower case
47
+ def camelize(str)
48
+ str.to_s.camelize(:lower)
49
+ end
50
+
51
+ # Parse string response into JSON
52
+ # @param response [Response] from RestClient response
53
+ # @return [Hash] the parsed response or the object unmodified if parsing is not possible
54
+ def parse_string_to_json(response)
55
+ JSON.parse(response)
56
+ rescue JSON::ParserError
57
+ response
58
+ end
59
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+ # Version for this gem
3
+ module MockServer
4
+ VERSION = '1.0.8.pre'
5
+ end
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mockserver/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'flipp-mockserver-client'
8
+ spec.version = '0.1.0'
9
+ spec.authors = ['original - Nayyara Samuel, James D Bloom', 'modified - Dennis Marcu']
10
+ spec.summary = 'mockserver-client gem modified for Flipp'
11
+ spec.description = 'A Ruby Client for MockServer that enables easy mocking of any system you integrate with via HTTP or HTTPS (i.e. services, web sites, etc) modified to work with multiple Fipp requests'
12
+
13
+ spec.required_ruby_version = '>= 1.9'
14
+ spec.required_rubygems_version = '~> 2.0'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1'
22
+ spec.add_development_dependency 'rake', '~> 10.3'
23
+ spec.add_development_dependency 'rspec', '~> 3.0'
24
+ spec.add_development_dependency 'simplecov', '~> 0.8'
25
+ spec.add_development_dependency 'webmock', '~> 1.18'
26
+ spec.add_development_dependency 'rubocop', '~> 0.23'
27
+
28
+ spec.add_dependency 'hashie', '~> 3.0'
29
+ spec.add_dependency 'json', '~> 1.8'
30
+ spec.add_dependency 'json_pure', '~> 1.8'
31
+ spec.add_dependency 'activesupport', '~> 4.1'
32
+ spec.add_dependency 'rest-client', '~> 1.7'
33
+ spec.add_dependency 'logging_factory', '~> 0.0.2'
34
+ spec.add_dependency 'thor', '~> 0.19'
35
+ spec.add_dependency 'colorize', '~> 0.7'
36
+ end
data/pom.xml ADDED
@@ -0,0 +1,116 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
+ <parent>
4
+ <groupId>org.mock-server</groupId>
5
+ <artifactId>mockserver</artifactId>
6
+ <version>3.10.5-SNAPSHOT</version>
7
+ </parent>
8
+ <modelVersion>4.0.0</modelVersion>
9
+
10
+ <artifactId>mockserver-client-ruby</artifactId>
11
+ <name>MockServer Ruby Client</name>
12
+ <description>A ruby client for the MockServer</description>
13
+ <url>http://www.mock-server.com</url>
14
+
15
+ <properties>
16
+ <skipRubyRelease>true</skipRubyRelease>
17
+ </properties>
18
+
19
+ <build>
20
+ <plugins>
21
+ <!-- run mock server for ruby client tests -->
22
+ <plugin>
23
+ <groupId>${project.groupId}</groupId>
24
+ <artifactId>mockserver-maven-plugin</artifactId>
25
+ <version>${project.version}</version>
26
+ <configuration>
27
+ <logLevel>WARN</logLevel>
28
+ <serverPort>8098</serverPort>
29
+ <proxyPort>9102</proxyPort>
30
+ </configuration>
31
+ <executions>
32
+ <execution>
33
+ <id>pre-test</id>
34
+ <phase>generate-test-sources</phase>
35
+ <goals>
36
+ <goal>start</goal>
37
+ </goals>
38
+ </execution>
39
+ <execution>
40
+ <id>post-test</id>
41
+ <phase>verify</phase>
42
+ <goals>
43
+ <goal>stop</goal>
44
+ </goals>
45
+ </execution>
46
+ </executions>
47
+ </plugin>
48
+ <!-- run ruby bundle build and install -->
49
+ <plugin>
50
+ <groupId>org.codehaus.mojo</groupId>
51
+ <artifactId>exec-maven-plugin</artifactId>
52
+ <version>1.4.0</version>
53
+ <executions>
54
+ <execution>
55
+ <id>bundle_install</id>
56
+ <phase>prepare-package</phase>
57
+ <goals>
58
+ <goal>exec</goal>
59
+ </goals>
60
+ <configuration>
61
+ <executable>bundle</executable>
62
+ <arguments>
63
+ <argument>install</argument>
64
+ <argument>--path</argument>
65
+ <argument>vendor/bundle</argument>
66
+ </arguments>
67
+ <environmentVariables>
68
+ <BUNDLE_GEMFILE>${basedir}/Gemfile</BUNDLE_GEMFILE>
69
+ </environmentVariables>
70
+ </configuration>
71
+ </execution>
72
+ <execution>
73
+ <id>ruby_make</id>
74
+ <phase>prepare-package</phase>
75
+ <goals>
76
+ <goal>exec</goal>
77
+ </goals>
78
+ <configuration>
79
+ <skip>${skipTests}</skip>
80
+ <executable>bundle</executable>
81
+ <arguments>
82
+ <argument>exec</argument>
83
+ <argument>rake</argument>
84
+ <argument>build</argument>
85
+ <argument>spec</argument>
86
+ </arguments>
87
+ <environmentVariables>
88
+ <BUNDLE_GEMFILE>${basedir}/Gemfile</BUNDLE_GEMFILE>
89
+ </environmentVariables>
90
+ </configuration>
91
+ </execution>
92
+ <execution>
93
+ <id>ruby_release</id>
94
+ <phase>deploy</phase>
95
+ <goals>
96
+ <goal>exec</goal>
97
+ </goals>
98
+ <configuration>
99
+ <skip>${skipRubyRelease}</skip>
100
+ <executable>bundle</executable>
101
+ <arguments>
102
+ <argument>exec</argument>
103
+ <argument>rake</argument>
104
+ <argument>release</argument>
105
+ </arguments>
106
+ <environmentVariables>
107
+ <BUNDLE_GEMFILE>${basedir}/Gemfile</BUNDLE_GEMFILE>
108
+ </environmentVariables>
109
+ </configuration>
110
+ </execution>
111
+ </executions>
112
+ </plugin>
113
+ </plugins>
114
+ </build>
115
+
116
+ </project>