application_insights 0.1.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.
- checksums.yaml +15 -0
- data/.gitignore +40 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +106 -0
- data/Rakefile +10 -0
- data/application_insights.gemspec +25 -0
- data/lib/application_insights.rb +2 -0
- data/lib/application_insights/channel/contracts/application.rb +35 -0
- data/lib/application_insights/channel/contracts/data.rb +47 -0
- data/lib/application_insights/channel/contracts/data_point.rb +125 -0
- data/lib/application_insights/channel/contracts/data_point_type.rb +16 -0
- data/lib/application_insights/channel/contracts/dependency_kind.rb +22 -0
- data/lib/application_insights/channel/contracts/dependency_source_type.rb +19 -0
- data/lib/application_insights/channel/contracts/device.rb +243 -0
- data/lib/application_insights/channel/contracts/envelope.rb +254 -0
- data/lib/application_insights/channel/contracts/event_data.rb +77 -0
- data/lib/application_insights/channel/contracts/exception_data.rb +105 -0
- data/lib/application_insights/channel/contracts/exception_details.rb +125 -0
- data/lib/application_insights/channel/contracts/internal.rb +51 -0
- data/lib/application_insights/channel/contracts/json_serializable.rb +59 -0
- data/lib/application_insights/channel/contracts/location.rb +35 -0
- data/lib/application_insights/channel/contracts/message_data.rb +76 -0
- data/lib/application_insights/channel/contracts/metric_data.rb +60 -0
- data/lib/application_insights/channel/contracts/operation.rb +83 -0
- data/lib/application_insights/channel/contracts/page_view_data.rb +109 -0
- data/lib/application_insights/channel/contracts/remote_dependency_data.rb +218 -0
- data/lib/application_insights/channel/contracts/request_data.rb +173 -0
- data/lib/application_insights/channel/contracts/session.rb +67 -0
- data/lib/application_insights/channel/contracts/severity_level.rb +25 -0
- data/lib/application_insights/channel/contracts/stack_frame.rb +91 -0
- data/lib/application_insights/channel/contracts/user.rb +83 -0
- data/lib/application_insights/channel/queue_base.rb +48 -0
- data/lib/application_insights/channel/sender_base.rb +46 -0
- data/lib/application_insights/channel/synchronous_queue.rb +28 -0
- data/lib/application_insights/channel/synchronous_sender.rb +13 -0
- data/lib/application_insights/channel/telemetry_channel.rb +81 -0
- data/lib/application_insights/channel/telemetry_context.rb +49 -0
- data/lib/application_insights/telemetry_client.rb +111 -0
- data/lib/application_insights/version.rb +3 -0
- data/test/application_insights.rb +9 -0
- data/test/application_insights/channel/contracts/test_application.rb +31 -0
- data/test/application_insights/channel/contracts/test_data.rb +44 -0
- data/test/application_insights/channel/contracts/test_data_point.rb +109 -0
- data/test/application_insights/channel/contracts/test_device.rb +200 -0
- data/test/application_insights/channel/contracts/test_envelope.rb +209 -0
- data/test/application_insights/channel/contracts/test_event_data.rb +62 -0
- data/test/application_insights/channel/contracts/test_exception_data.rb +85 -0
- data/test/application_insights/channel/contracts/test_exception_details.rb +106 -0
- data/test/application_insights/channel/contracts/test_internal.rb +44 -0
- data/test/application_insights/channel/contracts/test_location.rb +31 -0
- data/test/application_insights/channel/contracts/test_message_data.rb +66 -0
- data/test/application_insights/channel/contracts/test_metric_data.rb +50 -0
- data/test/application_insights/channel/contracts/test_operation.rb +70 -0
- data/test/application_insights/channel/contracts/test_page_view_data.rb +88 -0
- data/test/application_insights/channel/contracts/test_remote_dependency_data.rb +183 -0
- data/test/application_insights/channel/contracts/test_request_data.rb +153 -0
- data/test/application_insights/channel/contracts/test_session.rb +57 -0
- data/test/application_insights/channel/contracts/test_stack_frame.rb +83 -0
- data/test/application_insights/channel/contracts/test_user.rb +70 -0
- data/test/application_insights/channel/test_queue_base.rb +88 -0
- data/test/application_insights/channel/test_sender_base.rb +96 -0
- data/test/application_insights/channel/test_synchronous_queue.rb +42 -0
- data/test/application_insights/channel/test_synchronous_sender.rb +11 -0
- data/test/application_insights/channel/test_telemetry_channel.rb +102 -0
- data/test/application_insights/channel/test_telemetry_context.rb +72 -0
- data/test/application_insights/test_telemetry_client.rb +107 -0
- metadata +166 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
module ApplicationInsights
|
5
|
+
module Channel
|
6
|
+
# The base class for all of our senders.
|
7
|
+
class SenderBase
|
8
|
+
# Initializes a new instance of the sender class.
|
9
|
+
def initialize(service_endpoint_uri)
|
10
|
+
raise ArgumentError, 'Service endpoint URI was required but not provided' unless service_endpoint_uri
|
11
|
+
@service_endpoint_uri = service_endpoint_uri
|
12
|
+
@queue = nil
|
13
|
+
@send_buffer_size = 100
|
14
|
+
end
|
15
|
+
|
16
|
+
# Gets the service endpoint URI property. This is where we send data to.
|
17
|
+
attr_accessor :service_endpoint_uri
|
18
|
+
|
19
|
+
# The queue that we will be draining
|
20
|
+
attr_accessor :queue
|
21
|
+
|
22
|
+
# Gets or sets the buffer size for a single batch of telemetry. This is the maximum number of items in a single service request we are going to send.
|
23
|
+
attr_accessor :send_buffer_size
|
24
|
+
|
25
|
+
# Sends the data to send list to the service immediately.
|
26
|
+
def send(data_to_send)
|
27
|
+
uri = URI(@service_endpoint_uri)
|
28
|
+
request = Net::HTTP::Post.new(uri.path, { 'Accept' => 'application/json', 'Content-Type' => 'application/json; charset=utf-8' })
|
29
|
+
request.body = data_to_send.to_json
|
30
|
+
|
31
|
+
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
32
|
+
http.request(request)
|
33
|
+
end
|
34
|
+
|
35
|
+
case response
|
36
|
+
when Net::HTTPSuccess, Net::HTTPRedirection, Net::HTTPBadRequest
|
37
|
+
return
|
38
|
+
else
|
39
|
+
data_to_send.each do |item|
|
40
|
+
@queue.push item
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'queue_base'
|
2
|
+
|
3
|
+
module ApplicationInsights
|
4
|
+
module Channel
|
5
|
+
# A synchronous queue for use in conjunction with the SynchronousSender. The queue will flush either when it reaches max_queue_length or when someone calls flush().
|
6
|
+
class SynchronousQueue < QueueBase
|
7
|
+
# Initializes a new instance of the synchronous queue class.
|
8
|
+
def initialize(sender)
|
9
|
+
super sender
|
10
|
+
end
|
11
|
+
|
12
|
+
# Flushes the current queue to the passed in sender.
|
13
|
+
def flush
|
14
|
+
while TRUE
|
15
|
+
# get at most send_buffer_size items and send them
|
16
|
+
data = []
|
17
|
+
while data.length < @sender.send_buffer_size
|
18
|
+
item = pop()
|
19
|
+
break if not item
|
20
|
+
data.push item
|
21
|
+
end
|
22
|
+
break if data.length == 0
|
23
|
+
@sender.send(data)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'sender_base'
|
2
|
+
|
3
|
+
module ApplicationInsights
|
4
|
+
module Channel
|
5
|
+
# A synchronous sender that works in conjunction with SynchronousQueue.
|
6
|
+
class SynchronousSender < SenderBase
|
7
|
+
# Initializes a new instance of the synchronous sender class.
|
8
|
+
def initialize(service_endpoint_uri='http://dc.services.visualstudio.com/v2/track')
|
9
|
+
super service_endpoint_uri
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require_relative 'telemetry_context'
|
2
|
+
require_relative 'synchronous_queue'
|
3
|
+
require_relative 'synchronous_sender'
|
4
|
+
require_relative 'contracts/envelope'
|
5
|
+
require_relative 'contracts/data'
|
6
|
+
require_relative 'contracts/internal'
|
7
|
+
|
8
|
+
module ApplicationInsights
|
9
|
+
module Channel
|
10
|
+
# The telemetry channel is responsible for constructing an envelope an sending it.
|
11
|
+
class TelemetryChannel
|
12
|
+
# Initializes a new instance of the telemetry channel class.
|
13
|
+
def initialize(context=nil, queue=nil)
|
14
|
+
@context = context || TelemetryContext.new
|
15
|
+
@queue = queue || SynchronousQueue.new(SynchronousSender.new)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Gets the context associated with this channel.
|
19
|
+
attr_reader :context
|
20
|
+
|
21
|
+
# Gets the queue associated with this channel.
|
22
|
+
attr_reader :queue
|
23
|
+
|
24
|
+
# Gets the sender associated with this channel.
|
25
|
+
def sender
|
26
|
+
@queue.sender
|
27
|
+
end
|
28
|
+
|
29
|
+
# Flushes the current queue.
|
30
|
+
def flush
|
31
|
+
@queue.flush
|
32
|
+
end
|
33
|
+
|
34
|
+
# Writes the passed in data to the sending queue.
|
35
|
+
def write(data, context=nil)
|
36
|
+
local_context = context || @context
|
37
|
+
raise ArgumentError, 'Context was required but not provided' unless local_context
|
38
|
+
data_type = data.class.name.gsub(/^.*::/, '')
|
39
|
+
set_properties data, local_context
|
40
|
+
data_attributes = {
|
41
|
+
:base_type => data_type,
|
42
|
+
:base_data => data
|
43
|
+
}
|
44
|
+
envelope_attributes = {
|
45
|
+
:name => 'Microsoft.ApplicationInsights.' + data_type[0..-5],
|
46
|
+
:time => Time.now.getutc.strftime('%FT%T.%6NZ'),
|
47
|
+
:i_key => local_context.instrumentation_key,
|
48
|
+
:tags => get_tags(local_context),
|
49
|
+
:data => Contracts::Data.new(data_attributes)
|
50
|
+
}
|
51
|
+
envelope = Contracts::Envelope.new envelope_attributes
|
52
|
+
@queue.push(envelope)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def get_tags(context)
|
58
|
+
hash = {}
|
59
|
+
internal_context_attributes = {
|
60
|
+
:sdk_version => 'rb:0.1.0'
|
61
|
+
}
|
62
|
+
internal_context = Contracts::Internal.new internal_context_attributes
|
63
|
+
contexts = [ internal_context, context.application, context.device, context.user, context.session, context.location, context.operation ]
|
64
|
+
contexts.each { |c| hash.merge!(c.to_h) if c }
|
65
|
+
hash
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_properties(data, context)
|
69
|
+
if context.properties
|
70
|
+
properties = data.properties || {}
|
71
|
+
context.properties.each do |key, value|
|
72
|
+
unless properties.key?(key)
|
73
|
+
properties[key] = value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
data.properties = properties
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative 'contracts/application'
|
2
|
+
require_relative 'contracts/device'
|
3
|
+
require_relative 'contracts/user'
|
4
|
+
require_relative 'contracts/session'
|
5
|
+
require_relative 'contracts/operation'
|
6
|
+
require_relative 'contracts/location'
|
7
|
+
|
8
|
+
module ApplicationInsights
|
9
|
+
module Channel
|
10
|
+
# Represents a context for sending telemetry to the Application Insights service.
|
11
|
+
class TelemetryContext
|
12
|
+
# Initializes a new instance of the TelemetryContext class.
|
13
|
+
def initialize
|
14
|
+
@instrumentation_key = nil
|
15
|
+
@application = Contracts::Application.new
|
16
|
+
@device = Contracts::Device.new
|
17
|
+
@user = Contracts::User.new
|
18
|
+
@session = Contracts::Session.new
|
19
|
+
@operation = Contracts::Operation.new
|
20
|
+
@location = Contracts::Location.new
|
21
|
+
@properties = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
# Gets or sets the instrumentation key.
|
25
|
+
attr_accessor :instrumentation_key
|
26
|
+
|
27
|
+
# Gets or sets the application context.
|
28
|
+
attr_accessor :application
|
29
|
+
|
30
|
+
# Gets or sets the device context.
|
31
|
+
attr_accessor :device
|
32
|
+
|
33
|
+
# Gets or sets the user context.
|
34
|
+
attr_accessor :user
|
35
|
+
|
36
|
+
# Gets or sets the session context.
|
37
|
+
attr_accessor :session
|
38
|
+
|
39
|
+
# Gets or sets the operation context.
|
40
|
+
attr_accessor :operation
|
41
|
+
|
42
|
+
# Gets or sets the location context.
|
43
|
+
attr_accessor :location
|
44
|
+
|
45
|
+
# Gets a dictionary of application-defined property values.
|
46
|
+
attr_reader :properties
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require_relative 'channel/telemetry_context'
|
2
|
+
require_relative 'channel/telemetry_channel'
|
3
|
+
require_relative 'channel/contracts/page_view_data'
|
4
|
+
require_relative 'channel/contracts/exception_data'
|
5
|
+
require_relative 'channel/contracts/exception_details'
|
6
|
+
require_relative 'channel/contracts/event_data'
|
7
|
+
require_relative 'channel/contracts/data_point'
|
8
|
+
require_relative 'channel/contracts/data_point_type'
|
9
|
+
require_relative 'channel/contracts/metric_data'
|
10
|
+
require_relative 'channel/contracts/message_data'
|
11
|
+
|
12
|
+
module ApplicationInsights
|
13
|
+
# The telemetry client used for sending all types of telemetry.
|
14
|
+
class TelemetryClient
|
15
|
+
# Initializes a new instance of the TelemetryClient class.
|
16
|
+
def initialize(telemetry_channel = nil)
|
17
|
+
@context = Channel::TelemetryContext.new
|
18
|
+
@channel = telemetry_channel || Channel::TelemetryChannel.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# Gets the context associated with this telemetry client.
|
22
|
+
attr_reader :context
|
23
|
+
|
24
|
+
# Gets the channel associated with this telemetry client.
|
25
|
+
attr_reader :channel
|
26
|
+
|
27
|
+
# Send information about the page viewed in the application.
|
28
|
+
def track_page_view(name, url, options={})
|
29
|
+
data_attributes = {
|
30
|
+
:name => name || 'Null',
|
31
|
+
:url => url,
|
32
|
+
:duration => options[:duration],
|
33
|
+
:properties => options.fetch(:properties) { {} },
|
34
|
+
:measurements => options.fetch(:measurements) { {} }
|
35
|
+
}
|
36
|
+
data = Channel::Contracts::PageViewData.new data_attributes
|
37
|
+
self.channel.write(data, self.context)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Send an ExceptionTelemetry object for display in Diagnostic Search.
|
41
|
+
def track_exception(exception, options={})
|
42
|
+
if exception.is_a? Exception
|
43
|
+
details_attributes = {
|
44
|
+
:id => 1,
|
45
|
+
:outer_id => 0,
|
46
|
+
:type_name => exception.class,
|
47
|
+
:message => exception.message,
|
48
|
+
:has_full_stack => true,
|
49
|
+
:stack => exception.backtrace.join("\n")
|
50
|
+
}
|
51
|
+
details = Channel::Contracts::ExceptionDetails.new details_attributes
|
52
|
+
|
53
|
+
data_attributes = {
|
54
|
+
:handled_at => 'UserCode',
|
55
|
+
:exceptions => [ details ],
|
56
|
+
:properties => options.fetch(:properties) { {} },
|
57
|
+
:measurements => options.fetch(:measurements) { {} }
|
58
|
+
}
|
59
|
+
data = Channel::Contracts::ExceptionData.new data_attributes
|
60
|
+
self.channel.write(data, self.context)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Send an EventTelemetry object for display in Diagnostic Search and aggregation in Metrics Explorer.
|
65
|
+
def track_event(name, options={})
|
66
|
+
data_attributes = {
|
67
|
+
:name => name || 'Null',
|
68
|
+
:properties => options.fetch(:properties) { {} },
|
69
|
+
:measurements => options.fetch(:measurements) { {} }
|
70
|
+
}
|
71
|
+
data = Channel::Contracts::EventData.new data_attributes
|
72
|
+
self.channel.write(data, self.context)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Send a MetricTelemetry object for aggregation in Metric Explorer.
|
76
|
+
def track_metric(name, value, options={})
|
77
|
+
data_point_attributes = {
|
78
|
+
:name => name || 'Null',
|
79
|
+
:value => value || 0,
|
80
|
+
:kind => options.fetch(:type) { Channel::Contracts::DataPointType::AGGREGATION },
|
81
|
+
:count => options[:count],
|
82
|
+
:min => options[:min],
|
83
|
+
:max => options[:max],
|
84
|
+
:std_dev => options[:std_dev]
|
85
|
+
}
|
86
|
+
data_point = Channel::Contracts::DataPoint.new data_point_attributes
|
87
|
+
|
88
|
+
data_attributes = {
|
89
|
+
:metrics => [ data_point ],
|
90
|
+
:properties => options.fetch(:measurements) { {} }
|
91
|
+
}
|
92
|
+
data = Channel::Contracts::MetricData.new data_attributes
|
93
|
+
self.channel.write(data, self.context)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Send a trace message for display in Diagnostic Search.
|
97
|
+
def track_trace(name, options={})
|
98
|
+
data_attributes = {
|
99
|
+
:message => name || 'Null',
|
100
|
+
:properties => options.fetch(:measurements) { {} }
|
101
|
+
}
|
102
|
+
data = Channel::Contracts::MessageData.new data_attributes
|
103
|
+
self.channel.write(data, self.context)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Flushes the current queue.
|
107
|
+
def flush
|
108
|
+
self.channel.flush
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../../../../lib/application_insights/channel/contracts/application'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
include ApplicationInsights::Channel
|
5
|
+
|
6
|
+
class TestApplication < Test::Unit::TestCase
|
7
|
+
def test_initialize
|
8
|
+
item = Contracts::Application.new
|
9
|
+
assert_not_nil item
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_ver_works_as_expected
|
13
|
+
expected = 'Test string'
|
14
|
+
item = Contracts::Application.new
|
15
|
+
item.ver = expected
|
16
|
+
actual = item.ver
|
17
|
+
assert_equal expected, actual
|
18
|
+
expected = 'Other string'
|
19
|
+
item.ver = expected
|
20
|
+
actual = item.ver
|
21
|
+
assert_equal expected, actual
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_to_json_works_as_expected
|
25
|
+
item = Contracts::Application.new
|
26
|
+
item.ver = 'Test string'
|
27
|
+
actual = item.to_json
|
28
|
+
expected = '{"ai.application.ver":"Test string"}'
|
29
|
+
assert_equal expected, actual
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative '../../../../lib/application_insights/channel/contracts/data'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
include ApplicationInsights::Channel
|
5
|
+
|
6
|
+
class TestData < Test::Unit::TestCase
|
7
|
+
def test_initialize
|
8
|
+
item = Contracts::Data.new
|
9
|
+
assert_not_nil item
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_base_type_works_as_expected
|
13
|
+
expected = 'Test string'
|
14
|
+
item = Contracts::Data.new
|
15
|
+
item.base_type = expected
|
16
|
+
actual = item.base_type
|
17
|
+
assert_equal expected, actual
|
18
|
+
expected = 'Other string'
|
19
|
+
item.base_type = expected
|
20
|
+
actual = item.base_type
|
21
|
+
assert_equal expected, actual
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_base_data_works_as_expected
|
25
|
+
expected = { 'key' => 'value' }
|
26
|
+
item = Contracts::Data.new
|
27
|
+
item.base_data = expected
|
28
|
+
actual = item.base_data
|
29
|
+
assert_equal expected, actual
|
30
|
+
expected = { 'key' => 'value' }
|
31
|
+
item.base_data = expected
|
32
|
+
actual = item.base_data
|
33
|
+
assert_equal expected, actual
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_to_json_works_as_expected
|
37
|
+
item = Contracts::Data.new
|
38
|
+
item.base_type = 'Test string'
|
39
|
+
item.base_data = { 'key' => 'value' }
|
40
|
+
actual = item.to_json
|
41
|
+
expected = '{"baseType":"Test string","baseData":{"key":"value"}}'
|
42
|
+
assert_equal expected, actual
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require_relative '../../../../lib/application_insights/channel/contracts/data_point'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
include ApplicationInsights::Channel
|
5
|
+
|
6
|
+
class TestDataPoint < Test::Unit::TestCase
|
7
|
+
def test_initialize
|
8
|
+
item = Contracts::DataPoint.new
|
9
|
+
assert_not_nil item
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_name_works_as_expected
|
13
|
+
expected = 'Test string'
|
14
|
+
item = Contracts::DataPoint.new
|
15
|
+
item.name = expected
|
16
|
+
actual = item.name
|
17
|
+
assert_equal expected, actual
|
18
|
+
expected = 'Other string'
|
19
|
+
item.name = expected
|
20
|
+
actual = item.name
|
21
|
+
assert_equal expected, actual
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_kind_works_as_expected
|
25
|
+
expected = { 'key' => 'value' }
|
26
|
+
item = Contracts::DataPoint.new
|
27
|
+
item.kind = expected
|
28
|
+
actual = item.kind
|
29
|
+
assert_equal expected, actual
|
30
|
+
expected = { 'key' => 'value' }
|
31
|
+
item.kind = expected
|
32
|
+
actual = item.kind
|
33
|
+
assert_equal expected, actual
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_value_works_as_expected
|
37
|
+
expected = 1.5
|
38
|
+
item = Contracts::DataPoint.new
|
39
|
+
item.value = expected
|
40
|
+
actual = item.value
|
41
|
+
assert_equal expected, actual
|
42
|
+
expected = 4.8
|
43
|
+
item.value = expected
|
44
|
+
actual = item.value
|
45
|
+
assert_equal expected, actual
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_count_works_as_expected
|
49
|
+
expected = 42
|
50
|
+
item = Contracts::DataPoint.new
|
51
|
+
item.count = expected
|
52
|
+
actual = item.count
|
53
|
+
assert_equal expected, actual
|
54
|
+
expected = 13
|
55
|
+
item.count = expected
|
56
|
+
actual = item.count
|
57
|
+
assert_equal expected, actual
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_min_works_as_expected
|
61
|
+
expected = 1.5
|
62
|
+
item = Contracts::DataPoint.new
|
63
|
+
item.min = expected
|
64
|
+
actual = item.min
|
65
|
+
assert_equal expected, actual
|
66
|
+
expected = 4.8
|
67
|
+
item.min = expected
|
68
|
+
actual = item.min
|
69
|
+
assert_equal expected, actual
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_max_works_as_expected
|
73
|
+
expected = 1.5
|
74
|
+
item = Contracts::DataPoint.new
|
75
|
+
item.max = expected
|
76
|
+
actual = item.max
|
77
|
+
assert_equal expected, actual
|
78
|
+
expected = 4.8
|
79
|
+
item.max = expected
|
80
|
+
actual = item.max
|
81
|
+
assert_equal expected, actual
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_std_dev_works_as_expected
|
85
|
+
expected = 1.5
|
86
|
+
item = Contracts::DataPoint.new
|
87
|
+
item.std_dev = expected
|
88
|
+
actual = item.std_dev
|
89
|
+
assert_equal expected, actual
|
90
|
+
expected = 4.8
|
91
|
+
item.std_dev = expected
|
92
|
+
actual = item.std_dev
|
93
|
+
assert_equal expected, actual
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_to_json_works_as_expected
|
97
|
+
item = Contracts::DataPoint.new
|
98
|
+
item.name = 'Test string'
|
99
|
+
item.kind = { 'key' => 'value' }
|
100
|
+
item.value = 1.5
|
101
|
+
item.count = 42
|
102
|
+
item.min = 1.5
|
103
|
+
item.max = 1.5
|
104
|
+
item.std_dev = 1.5
|
105
|
+
actual = item.to_json
|
106
|
+
expected = '{"name":"Test string","kind":{"key":"value"},"value":1.5,"count":42,"min":1.5,"max":1.5,"stdDev":1.5}'
|
107
|
+
assert_equal expected, actual
|
108
|
+
end
|
109
|
+
end
|