discountnetwork 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.hound.yml +3 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +629 -0
  6. data/.sample.pryrc +4 -0
  7. data/.travis.yml +5 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +405 -0
  11. data/Rakefile +6 -0
  12. data/bin/console +7 -0
  13. data/bin/rake +17 -0
  14. data/bin/rspec +17 -0
  15. data/bin/setup +6 -0
  16. data/discountnetwork.gemspec +28 -0
  17. data/lib/discountnetwork/account.rb +28 -0
  18. data/lib/discountnetwork/activation.rb +15 -0
  19. data/lib/discountnetwork/base.rb +20 -0
  20. data/lib/discountnetwork/booking.rb +23 -0
  21. data/lib/discountnetwork/client.rb +54 -0
  22. data/lib/discountnetwork/configuration.rb +17 -0
  23. data/lib/discountnetwork/destination.rb +9 -0
  24. data/lib/discountnetwork/password.rb +21 -0
  25. data/lib/discountnetwork/provider.rb +15 -0
  26. data/lib/discountnetwork/response.rb +19 -0
  27. data/lib/discountnetwork/result.rb +15 -0
  28. data/lib/discountnetwork/rspec.rb +5 -0
  29. data/lib/discountnetwork/search.rb +15 -0
  30. data/lib/discountnetwork/session.rb +9 -0
  31. data/lib/discountnetwork/supplementary.rb +15 -0
  32. data/lib/discountnetwork/testing/discountnetwork_api.rb +240 -0
  33. data/lib/discountnetwork/version.rb +3 -0
  34. data/lib/discountnetwork.rb +16 -0
  35. data/spec/discountnetwork/account_spec.rb +36 -0
  36. data/spec/discountnetwork/activation_spec.rb +46 -0
  37. data/spec/discountnetwork/booking_spec.rb +70 -0
  38. data/spec/discountnetwork/client_spec.rb +40 -0
  39. data/spec/discountnetwork/configuration_spec.rb +30 -0
  40. data/spec/discountnetwork/destination_spec.rb +16 -0
  41. data/spec/discountnetwork/password_spec.rb +41 -0
  42. data/spec/discountnetwork/provider_spec.rb +26 -0
  43. data/spec/discountnetwork/response_spec.rb +16 -0
  44. data/spec/discountnetwork/result_spec.rb +30 -0
  45. data/spec/discountnetwork/search_spec.rb +37 -0
  46. data/spec/discountnetwork/session_spec.rb +18 -0
  47. data/spec/discountnetwork/supplementary_spec.rb +40 -0
  48. data/spec/fixtures/booking.json +86 -0
  49. data/spec/fixtures/destinations.json +22 -0
  50. data/spec/fixtures/empty.json +0 -0
  51. data/spec/fixtures/ping.json +3 -0
  52. data/spec/fixtures/provider.json +16 -0
  53. data/spec/fixtures/providers.json +32 -0
  54. data/spec/fixtures/result.json +89 -0
  55. data/spec/fixtures/results.json +121 -0
  56. data/spec/fixtures/search.json +19 -0
  57. data/spec/fixtures/search_created.json +19 -0
  58. data/spec/fixtures/session_created.json +31 -0
  59. data/spec/fixtures/supplementaries.json +33 -0
  60. data/spec/fixtures/supplementary.json +21 -0
  61. data/spec/fixtures/user.json +31 -0
  62. data/spec/spec_helper.rb +12 -0
  63. metadata +189 -0
@@ -0,0 +1,19 @@
1
+ require "json"
2
+
3
+ module DiscountNetwork
4
+ class Response
5
+ attr_reader :response
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ end
10
+
11
+ def parse
12
+ JSON.parse(response, object_class: ResponseObject)
13
+ rescue JSON::ParserError => error
14
+ ResponseObject.new(error: error, content: "")
15
+ end
16
+ end
17
+
18
+ class ResponseObject < OpenStruct; end
19
+ end
@@ -0,0 +1,15 @@
1
+ module DiscountNetwork
2
+ class Result
3
+ def self.where(search_id:, **attributes)
4
+ DiscountNetwork.get_resource(
5
+ ["searches", search_id, "results"].join("/"), attributes
6
+ ).result
7
+ end
8
+
9
+ def self.find_by(search_id:, hotel_id:, **attributes)
10
+ DiscountNetwork.get_resource(
11
+ ["searches", search_id, "results", hotel_id].join("/"), attributes
12
+ ).result
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ require "discountnetwork/testing/discountnetwork_api.rb"
2
+
3
+ RSpec.configure do |config|
4
+ config.include DiscountNetworkApi
5
+ end
@@ -0,0 +1,15 @@
1
+ module DiscountNetwork
2
+ class Search
3
+ def self.create(search_params)
4
+ DiscountNetwork.post_resource(
5
+ "searches", search: search_params
6
+ )
7
+ end
8
+
9
+ def self.find(search_id)
10
+ DiscountNetwork.get_resource(
11
+ ["searches", search_id].join("/")
12
+ ).search
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module DiscountNetwork
2
+ module Session
3
+ def self.create(name:, password:)
4
+ DiscountNetwork.post_resource(
5
+ "sessions", login: { name: name, password: password }
6
+ )
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module DiscountNetwork
2
+ class Supplementary < Base
3
+ def list
4
+ DiscountNetwork.get_resource(
5
+ "supplementaries",
6
+ ).supplementaries
7
+ end
8
+
9
+ def create(attributes)
10
+ DiscountNetwork.post_resource(
11
+ "supplementaries", subscriber: attributes
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,240 @@
1
+ module DiscountNetworkApi
2
+ def stub_api_response(method, end_point, filename:, status: 200, data: nil)
3
+ stub_request(method, api_end_point(end_point)).
4
+ with(api_request_headers(data: data)).
5
+ to_return(response_with(filename: filename, status: status))
6
+ end
7
+
8
+ def stub_session_create_api(login_params)
9
+ stub_api_response(
10
+ :post,
11
+ "sessions",
12
+ data: { login: login_params },
13
+ filename: "session_created",
14
+ status: 200
15
+ )
16
+ end
17
+
18
+ def stub_search_create_api(search_params)
19
+ stub_api_response(
20
+ :post,
21
+ "searches",
22
+ data: { search: search_params},
23
+ filename: "search_created",
24
+ status: 200
25
+ )
26
+ end
27
+
28
+ def stub_destination_list_api(term:)
29
+ stub_api_response(
30
+ :get,
31
+ "destinations",
32
+ data: { term: term },
33
+ filename: "destinations",
34
+ status: 200
35
+ )
36
+ end
37
+
38
+ def stub_search_find_api(search_id)
39
+ stub_api_response(
40
+ :get,
41
+ ["searches", search_id].join("/"),
42
+ filename: "search",
43
+ status: 200
44
+ )
45
+ end
46
+
47
+ def stub_search_results_api(search_id:)
48
+ stub_api_response(
49
+ :get,
50
+ ["searches", search_id, "results"].join("/"),
51
+ filename: "results",
52
+ status: 200
53
+ )
54
+ end
55
+
56
+ def stub_search_result_api(search_id:, hotel_id:)
57
+ stub_api_response(
58
+ :get,
59
+ ["searches", search_id, "results", hotel_id].join("/"),
60
+ filename: "result",
61
+ status: 200
62
+ )
63
+ end
64
+
65
+ def stub_search_booking_create_api(booking_params)
66
+ stub_api_response(
67
+ :post,
68
+ "bookings",
69
+ data: { booking: build_booking_data(booking_params) },
70
+ filename: "booking",
71
+ status: 200
72
+ )
73
+ end
74
+
75
+ def stub_booking_find_api(booking_id)
76
+ stub_api_response(
77
+ :get,
78
+ ["bookings", booking_id].join("/"),
79
+ filename: "booking",
80
+ status: 200
81
+ )
82
+ end
83
+
84
+ def stub_account_find_api(auth_token)
85
+ DiscountNetwork.configuration.auth_token = auth_token
86
+ stub_api_response(
87
+ :get,
88
+ "account",
89
+ filename: "user",
90
+ status: 200,
91
+ )
92
+ end
93
+
94
+ def stub_account_update_api(auth_token, attributes)
95
+ DiscountNetwork.configuration.auth_token = auth_token
96
+ stub_api_response(
97
+ :put,
98
+ "account",
99
+ data: { subscriber: attributes },
100
+ filename: "empty",
101
+ status: 204,
102
+ )
103
+ end
104
+
105
+ def stub_activation_find_api(token)
106
+ stub_api_response(
107
+ :get,
108
+ ["account", "activation", token].join("/"),
109
+ filename: "user",
110
+ status: 200,
111
+ )
112
+ end
113
+
114
+ def stub_activation_activate_api(token, attributes)
115
+ update_nested_account_resource(
116
+ "activation", token, "user", user: attributes
117
+ )
118
+ end
119
+
120
+ def stub_password_forgot_api(email)
121
+ stub_api_response(
122
+ :post,
123
+ "account/resets",
124
+ data: { account: { email: email } },
125
+ filename: "empty",
126
+ status: 204,
127
+ )
128
+ end
129
+
130
+ def stub_password_create_api(token, attributes)
131
+ update_nested_account_resource(
132
+ "passwords", token, "empty", account: attributes
133
+ )
134
+ end
135
+
136
+ def stub_password_validate_api(token)
137
+ stub_api_response(
138
+ :get,
139
+ ["account", "resets", token].join("/"),
140
+ filename: "empty",
141
+ status: 204,
142
+ )
143
+ end
144
+
145
+ def stub_supplementary_list_api
146
+ stub_api_response(
147
+ :get,
148
+ "supplementaries",
149
+ filename: "supplementaries",
150
+ status: 200,
151
+ )
152
+ end
153
+
154
+ def stub_supplementary_create_api(attributes)
155
+ stub_api_response(
156
+ :post,
157
+ "supplementaries",
158
+ data: { subscriber: attributes },
159
+ filename: "supplementary",
160
+ status: 200,
161
+ )
162
+ end
163
+
164
+ def stub_provider_listing_api(provider_type)
165
+ stub_api_response(
166
+ :get,
167
+ "providers",
168
+ data: { type: provider_type },
169
+ filename: "providers",
170
+ status: 200,
171
+ )
172
+ end
173
+
174
+ def stub_provider_find_by_slug_api(slug)
175
+ stub_api_response(
176
+ :get,
177
+ ["providers", slug].join("/"),
178
+ filename: "provider",
179
+ status: 200,
180
+ )
181
+ end
182
+
183
+ def stub_unauthorized_dn_api_reqeust(end_point)
184
+ stub_request(:any, api_end_point(end_point)).
185
+ to_return(status: 401, body: "")
186
+ end
187
+
188
+ def stub_unprocessable_dn_api_request(end_point)
189
+ stub_request(:any, api_end_point(end_point)).
190
+ to_return(status: 422, body: "")
191
+ end
192
+
193
+ private
194
+
195
+ def build_booking_data(search_id:, hotel_id:, travellers:, properties:, **opt)
196
+ opt.merge(
197
+ search_id: search_id.to_s,
198
+ travellers_attributes: [travellers],
199
+ properties_attributes: [
200
+ properties.merge(property_id: hotel_id.to_s)
201
+ ]
202
+ )
203
+ end
204
+
205
+ def update_nested_account_resource(resource, token, filename, data_hash)
206
+ stub_api_response(
207
+ :put,
208
+ ["account", resource, token].join("/"),
209
+ data: data_hash,
210
+ filename: filename,
211
+ status: 200,
212
+ )
213
+ end
214
+
215
+ def api_end_point(end_point)
216
+ [DiscountNetwork.configuration.api_host, end_point].join("/")
217
+ end
218
+
219
+ def response_with(filename:, status:)
220
+ { body: fixture_file(filename), status: status }
221
+ end
222
+
223
+ def fixture_file(filename)
224
+ file_name = [filename, "json"].join(".")
225
+ file_path = ["../../../../", "spec", "fixtures", file_name].join("/")
226
+
227
+ File.read(File.expand_path(file_path, __FILE__))
228
+ end
229
+
230
+ def api_request_headers(data:)
231
+ Hash.new.tap do |request_headers|
232
+ request_headers[:body] = data
233
+ request_headers[:headers] = api_authorization_headers
234
+ end
235
+ end
236
+
237
+ def api_authorization_headers
238
+ { "DN-API-KEY" => DiscountNetwork.configuration.api_key }
239
+ end
240
+ end
@@ -0,0 +1,3 @@
1
+ module Discountnetwork
2
+ VERSION = "0.1.0".freeze
3
+ end
@@ -0,0 +1,16 @@
1
+ require "discountnetwork/version"
2
+ require "discountnetwork/client"
3
+ require "discountnetwork/base"
4
+ require "discountnetwork/session"
5
+ require "discountnetwork/account"
6
+ require "discountnetwork/search"
7
+ require "discountnetwork/result"
8
+ require "discountnetwork/booking"
9
+ require "discountnetwork/provider"
10
+ require "discountnetwork/password"
11
+ require "discountnetwork/activation"
12
+ require "discountnetwork/destination"
13
+ require "discountnetwork/supplementary"
14
+
15
+ module DiscountNetwork
16
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Account do
4
+ describe ".find" do
5
+ it "returns the subscriber's profile" do
6
+ auth_token = "ABCD_123"
7
+ stub_account_find_api(auth_token)
8
+ set_account_auth_token(auth_token)
9
+
10
+ account = DiscountNetwork::Account.find(auth_token)
11
+ set_account_auth_token(nil)
12
+
13
+ expect(account.name).not_to be_nil
14
+ expect(account.status).to eq("Active")
15
+ expect(account.token).to eq(auth_token)
16
+ end
17
+ end
18
+
19
+ describe ".update" do
20
+ it "updates the subscriber account" do
21
+ auth_token = "ABCD_123"
22
+ set_account_auth_token(auth_token)
23
+ new_attributes = { first_name: "John", last_name: "Doe" }
24
+
25
+ stub_account_update_api(auth_token, new_attributes)
26
+ account = DiscountNetwork::Account.update(new_attributes)
27
+
28
+ expect(account).not_to be_nil
29
+ expect(account.class).to eq(DiscountNetwork::ResponseObject)
30
+ end
31
+ end
32
+
33
+ def set_account_auth_token(token)
34
+ DiscountNetwork.configuration.auth_token = token
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Activation do
4
+ describe ".find" do
5
+ it "retruns the subscriber account" do
6
+ token = "ABCD_123"
7
+ stub_activation_find_api(token)
8
+ account = DiscountNetwork::Activation.find(token)
9
+
10
+ expect(account.name).not_to be_nil
11
+ expect(account.token).to eq(token)
12
+ end
13
+ end
14
+
15
+ describe ".activate" do
16
+ it "activates the subscriber account" do
17
+ token = "ABCD_123"
18
+ stub_activation_activate_api(token, subscriber_attributes)
19
+ account = DiscountNetwork::Activation.activate(
20
+ token, subscriber_attributes
21
+ )
22
+
23
+ expect(account.name).not_to be_nil
24
+ expect(account.status).to eq("Active")
25
+ end
26
+ end
27
+
28
+ def subscriber_attributes
29
+ @subscriber_attributes ||= {
30
+ first_name: "John",
31
+ last_name: "Doe",
32
+ sex: "Male",
33
+ address: "123 Main Street",
34
+ city: "New York",
35
+ zip: "NY123",
36
+ state: "New York",
37
+ phone: "+1 123 456 789 0123",
38
+ mobile: "+1 012 345 678 9012",
39
+ username: "john.doe",
40
+ email: "john.doe@example.com",
41
+ country: "US",
42
+ password: "secret_password",
43
+ password_confirmation: "secret_password",
44
+ }
45
+ end
46
+ end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Booking do
4
+ describe ".create" do
5
+ it "creates a new booking request" do
6
+ search_id = 123_456_789
7
+ hotel_id = 456_789_012
8
+ booking_params = build_booking_attributes(search_id, hotel_id)
9
+ stub_search_booking_create_api(booking_params)
10
+
11
+ booking = DiscountNetwork::Booking.create(booking_params)
12
+ traveller = booking.travellers.first
13
+ property = booking.properties.first
14
+
15
+ expect(booking.code).not_to be_nil
16
+ expect(booking.travel_criteria.id).to eq(search_id)
17
+ expect(property.name).to eq(property_attributes[:name])
18
+ expect(traveller.email).to eq(traveller_attributes[:email])
19
+ end
20
+ end
21
+
22
+ describe ".find" do
23
+ it "finds the booking details" do
24
+ booking_id = 123_456_789
25
+ stub_booking_find_api(booking_id)
26
+ booking = DiscountNetwork::Booking.find(booking_id)
27
+
28
+ expect(booking.id).to eq(booking_id)
29
+ expect(booking.travel_criteria).not_to be_nil
30
+ expect(booking.travellers.first).not_to be_nil
31
+ expect(booking.properties.first).not_to be_nil
32
+ end
33
+ end
34
+
35
+ def build_booking_attributes(search_id, hotel_id)
36
+ {
37
+ search_id: search_id,
38
+ hotel_id: hotel_id,
39
+ travellers: traveller_attributes,
40
+ properties: property_attributes,
41
+ note: "This is a special requets"
42
+ }
43
+ end
44
+
45
+ def traveller_attributes
46
+ {
47
+ first_name: "John",
48
+ last_name: "Doe",
49
+ phone: "012 345 6789",
50
+ email: "john.doe@example.com",
51
+ address: "123 Main Street",
52
+ city: "Huai Khwang",
53
+ state: "Bangkok",
54
+ zip: "BK10310"
55
+ }
56
+ end
57
+
58
+ def property_attributes
59
+ {
60
+ property_id: "property_101",
61
+ provider_name: "Booking.com",
62
+ name: "Nasa Vagas, Thailand",
63
+ price: "100.99",
64
+ description: "Description",
65
+ review_score: "90",
66
+ total_reviews: "10000",
67
+ currency_code: "USD"
68
+ }
69
+ end
70
+ end
@@ -0,0 +1,40 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Client do
4
+ describe ".post_resource" do
5
+ it "requests the resource via :post" do
6
+ stub_discountnetwork_ping_request(:post, request_data)
7
+ response = DiscountNetwork.post_resource("ping", request_data)
8
+
9
+ expect(response.data).to eq("Pong!")
10
+ end
11
+ end
12
+
13
+ describe ".get_resource" do
14
+ it "requests the resource via :get" do
15
+ stub_discountnetwork_ping_request(:get, request_data)
16
+ response = DiscountNetwork.get_resource("ping", request_data)
17
+
18
+ expect(response.data).to eq("Pong!")
19
+ end
20
+ end
21
+
22
+ describe ".put_resource" do
23
+ it "requests the resource via :put" do
24
+ stub_discountnetwork_ping_request(:put, request_data)
25
+ response = DiscountNetwork.put_resource("ping", request_data)
26
+
27
+ expect(response.data).to eq("Pong!")
28
+ end
29
+ end
30
+
31
+ def request_data
32
+ { content: "Ping Request" }
33
+ end
34
+
35
+ def stub_discountnetwork_ping_request(method, data, end_point = "ping")
36
+ stub_api_response(
37
+ method, end_point, data: data, filename: "ping", status: 200
38
+ )
39
+ end
40
+ end
@@ -0,0 +1,30 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Configuration do
4
+ describe ".configuration" do
5
+ it "returns the client configuraiton object" do
6
+ api_host = "https://api.discountnetwork.io/api/v1"
7
+ configuration = DiscountNetwork.configuration
8
+
9
+ expect(configuration.api_host).to eq(api_host)
10
+ end
11
+ end
12
+
13
+ describe "#api_key" do
14
+ it "returns the customer specified api_key" do
15
+ api_key = "secrect_discountnetwork_api_key"
16
+ DiscountNetwork.configure { |config| config.api_key = api_key }
17
+
18
+ expect(DiscountNetwork.configuration.api_key).to eq(api_key)
19
+ end
20
+ end
21
+
22
+ describe "#auth_token" do
23
+ it "returns the user authentication token" do
24
+ auth_token = "user_secret_authentication_token"
25
+ DiscountNetwork.configure { |config| config.auth_token = auth_token }
26
+
27
+ expect(DiscountNetwork.configuration.auth_token).to eq(auth_token)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Destination do
4
+ describe ".list" do
5
+ it "returns the similar destinations" do
6
+ search_term = "bang"
7
+ stub_destination_list_api(term: search_term)
8
+
9
+ destinations = DiscountNetwork::Destination.list(term: search_term)
10
+ destination = destinations.first
11
+
12
+ expect(destination.value).to eq(835)
13
+ expect(destination.label).to eq("Bangkok, Thailand")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Password do
4
+ describe ".forgot" do
5
+ it "submits a password resets request" do
6
+ email = "john.doe@example.com"
7
+ stub_password_forgot_api(email)
8
+ password = DiscountNetwork::Password.forgot(email)
9
+
10
+ expect(password).not_to be_nil
11
+ expect(password.class).to eq(DiscountNetwork::ResponseObject)
12
+ end
13
+ end
14
+
15
+ describe ".create" do
16
+ it "creates a new password" do
17
+ token = "ABCD_123"
18
+ password_attributes = {
19
+ password: "secret_password",
20
+ password_confirmation: "secret_password",
21
+ }
22
+
23
+ stub_password_create_api(token, password_attributes)
24
+ password = DiscountNetwork::Password.create(token, password_attributes)
25
+
26
+ expect(password).not_to be_nil
27
+ expect(password.class).to eq(DiscountNetwork::ResponseObject)
28
+ end
29
+ end
30
+
31
+ describe ".validate" do
32
+ it "valides the password reset token" do
33
+ token = "ABCD_123"
34
+ stub_password_validate_api(token)
35
+ password = DiscountNetwork::Password.validate(token)
36
+
37
+ expect(password).not_to be_nil
38
+ expect(password.class).to eq(DiscountNetwork::ResponseObject)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Provider do
4
+ describe ".where" do
5
+ it "retrieve all providers for a specific type" do
6
+ provider_type = "hotel"
7
+ stub_provider_listing_api(provider_type)
8
+ providers = DiscountNetwork::Provider.where(type: provider_type)
9
+
10
+ expect(providers.count).to eq(2)
11
+ expect(providers.first.name).not_to be_nil
12
+ expect(providers.first.images.thumb).not_to be_nil
13
+ end
14
+ end
15
+
16
+ describe ".find_by_slug" do
17
+ it "retrieves a specific provider by a slug" do
18
+ provider_slug = "hotel-one"
19
+ stub_provider_find_by_slug_api(provider_slug)
20
+ provider = DiscountNetwork::Provider.find_by_slug(provider_slug)
21
+
22
+ expect(provider.name).not_to be_nil
23
+ expect(provider.slug).to eq(provider_slug)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe DiscountNetwork::Response do
4
+ describe "#parse" do
5
+ it "parses the json content in object" do
6
+ response = DiscountNetwork::Response.new(json_data).parse
7
+
8
+ expect(response.data).to eq("Pong!")
9
+ expect(response.class).to eq(DiscountNetwork::ResponseObject)
10
+ end
11
+ end
12
+
13
+ def json_data
14
+ @json_content ||= File.read("./spec/fixtures/ping.json")
15
+ end
16
+ end