qa_server 5.5.1 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +53 -0
  4. data/app/controllers/{qa_server/authority_validation_controller.rb → concerns/qa_server/authority_validation_behavior.rb} +13 -11
  5. data/app/controllers/qa_server/authority_list_controller.rb +5 -1
  6. data/app/controllers/qa_server/check_status_controller.rb +5 -1
  7. data/app/controllers/qa_server/monitor_status_controller.rb +40 -28
  8. data/app/jobs/qa_server/monitor_tests_job.rb +50 -0
  9. data/app/models/qa_server/performance_cache.rb +11 -3
  10. data/app/models/qa_server/performance_history.rb +24 -106
  11. data/app/models/qa_server/scenario_run_history.rb +161 -176
  12. data/app/models/qa_server/scenario_run_registry.rb +4 -4
  13. data/app/prepends/prepended_linked_data/find_term.rb +4 -4
  14. data/app/prepends/prepended_linked_data/search_query.rb +4 -4
  15. data/app/prepends/prepended_rdf/rdf_graph.rb +4 -4
  16. data/app/presenters/concerns/qa_server/monitor_status/performance_datatable_behavior.rb +23 -1
  17. data/app/presenters/qa_server/check_status_presenter.rb +4 -4
  18. data/app/presenters/qa_server/monitor_status/current_status_presenter.rb +17 -5
  19. data/app/presenters/qa_server/monitor_status/history_presenter.rb +40 -19
  20. data/app/presenters/qa_server/monitor_status/performance_presenter.rb +3 -1
  21. data/app/presenters/qa_server/monitor_status_presenter.rb +9 -9
  22. data/app/services/qa_server/monitor_cache_service.rb +22 -0
  23. data/app/services/qa_server/performance_calculator_service.rb +18 -7
  24. data/app/services/qa_server/performance_datatable_service.rb +82 -0
  25. data/app/services/qa_server/performance_graph_data_service.rb +140 -82
  26. data/app/services/qa_server/performance_graphing_service.rb +15 -12
  27. data/app/services/qa_server/time_period_service.rb +93 -0
  28. data/app/services/qa_server/time_service.rb +29 -0
  29. data/app/validators/qa_server/scenario_validator.rb +3 -3
  30. data/app/validators/qa_server/search_scenario_validator.rb +3 -3
  31. data/app/views/qa_server/monitor_status/_performance.html.erb +2 -1
  32. data/app/views/qa_server/monitor_status/_test_history.html.erb +1 -2
  33. data/app/views/qa_server/monitor_status/_test_summary.html.erb +2 -2
  34. data/config/locales/qa_server.en.yml +3 -4
  35. data/lib/generators/qa_server/templates/config/initializers/qa_server.rb +4 -0
  36. data/lib/qa_server.rb +0 -23
  37. data/lib/qa_server/configuration.rb +20 -0
  38. data/lib/qa_server/version.rb +1 -1
  39. data/spec/lib/qa_server_spec.rb +0 -51
  40. data/spec/services/qa_server/monitor_cache_service_spec.rb +20 -0
  41. data/spec/services/qa_server/time_period_service_spec.rb +246 -0
  42. data/spec/services/qa_server/time_service_spec.rb +50 -0
  43. metadata +14 -3
@@ -12,6 +12,7 @@ module QaServer
12
12
  # @param performance_data [Hash] hash of all performance data for all authorities
13
13
  # @see QaServer:PerformanceHistory
14
14
  def create_performance_graphs(performance_data:)
15
+ QaServer.config.monitor_logger.info("(QaServer::PerformanceGraphingService##{__method__}) - generating graphs")
15
16
  performance_data.each_key do |auth_name|
16
17
  create_graphs_for_authority(performance_data, auth_name.to_sym, :search)
17
18
  create_graphs_for_authority(performance_data, auth_name.to_sym, :fetch)
@@ -35,33 +36,35 @@ module QaServer
35
36
  end
36
37
 
37
38
  def create_performance_for_day_graph(performance_data, authority_name, action)
38
- auth_data = authority_performance_data(performance_data, authority_name)
39
- return unless auth_data
40
- gruff_data = rework_performance_data_for_gruff(auth_data[action][FOR_DAY], BY_HOUR)
39
+ data = authority_performance_data(performance_data, authority_name, action, FOR_DAY)
40
+ return if data.empty?
41
+ gruff_data = rework_performance_data_for_gruff(data, BY_HOUR)
41
42
  create_gruff_graph(gruff_data,
42
43
  performance_for_day_graph_full_path(authority_name, action),
43
44
  I18n.t('qa_server.monitor_status.performance.x_axis_hour'))
44
45
  end
45
46
 
46
47
  def create_performance_for_month_graph(performance_data, authority_name, action)
47
- auth_data = authority_performance_data(performance_data, authority_name)
48
- gruff_data = rework_performance_data_for_gruff(auth_data[action][FOR_MONTH], BY_DAY)
48
+ data = authority_performance_data(performance_data, authority_name, action, FOR_MONTH)
49
+ return if data.empty?
50
+ gruff_data = rework_performance_data_for_gruff(data, BY_DAY)
49
51
  create_gruff_graph(gruff_data,
50
52
  performance_for_month_graph_full_path(authority_name, action),
51
53
  I18n.t('qa_server.monitor_status.performance.x_axis_day'))
52
54
  end
53
55
 
54
56
  def create_performance_for_year_graph(performance_data, authority_name, action)
55
- auth_data = authority_performance_data(performance_data, authority_name)
56
- gruff_data = rework_performance_data_for_gruff(auth_data[action][FOR_YEAR], BY_MONTH)
57
+ data = authority_performance_data(performance_data, authority_name, action, FOR_YEAR)
58
+ return if data.empty?
59
+ gruff_data = rework_performance_data_for_gruff(data, BY_MONTH)
57
60
  create_gruff_graph(gruff_data,
58
61
  performance_for_year_graph_full_path(authority_name, action),
59
62
  I18n.t('qa_server.monitor_status.performance.x_axis_month'))
60
63
  end
61
64
 
62
- def authority_performance_data(data, authority_name)
65
+ def authority_performance_data(data, authority_name, action, time_period)
63
66
  auth_name = authority_name.nil? ? ALL_AUTH : authority_name
64
- data[auth_name]
67
+ data[auth_name][action].key?(time_period) ? data[auth_name][action][time_period] : {}
65
68
  end
66
69
 
67
70
  def performance_for_day_graph_full_path(authority_name, action)
@@ -92,7 +95,7 @@ module QaServer
92
95
  graph_load_data << graph_load_time(data)
93
96
  normalization_data << data[STATS][AVG_NORM]
94
97
  end
95
- [labels, normalization_data, graph_load_data, retrieve_data]
98
+ [labels, retrieve_data, graph_load_data, normalization_data]
96
99
  end
97
100
 
98
101
  def graph_load_time(data)
@@ -122,9 +125,9 @@ module QaServer
122
125
  g = Gruff::StackedBar.new
123
126
  performance_graph_theme(g, x_axis_label)
124
127
  g.labels = performance_data[0]
125
- g.data(I18n.t('qa_server.monitor_status.performance.normalization_time_ms'), performance_data[1])
128
+ g.data(I18n.t('qa_server.monitor_status.performance.retrieve_time_ms'), performance_data[1])
126
129
  g.data(I18n.t('qa_server.monitor_status.performance.graph_load_time_ms'), performance_data[2])
127
- g.data(I18n.t('qa_server.monitor_status.performance.retrieve_time_ms'), performance_data[3])
130
+ g.data(I18n.t('qa_server.monitor_status.performance.normalization_time_ms'), performance_data[3])
128
131
  g.write performance_graph_full_path
129
132
  end
130
133
  end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+ # Create where clauses for time periods and authorities.
3
+ module QaServer
4
+ class TimePeriodService
5
+ class << self
6
+ # Construct a hash to pass to ActiveRecord where method limiting to last 24 hours and optionally an authority.
7
+ # @param auth_name [String] authority name if limiting to an authority; otherwise, nil
8
+ # @param auth_table [Symbol] name of the table holding the authority name; or nil if in same table
9
+ # @param dt_table [Symbol] name of the table holding the date-time stamp; or nil if in same table
10
+ # @return [Hash] a where clause for the last 24 hours for an authority
11
+ # @example returned where for join
12
+ # { scenario_run_registry: { dt_stamp: start_hour..end_hour },
13
+ # scenario_run_history: { authority: 'LOC_DIRECT' } }
14
+ # @example returned where for join with no authority
15
+ # { scenario_run_registry: { dt_stamp: start_hour..end_hour } }
16
+ # @example returned where for same table
17
+ # { dt_stamp: start_hour..end_hour, authority: 'LOC_DIRECT' }
18
+ # @example returned where when no authority
19
+ # { dt_stamp: start_hour..end_hour }
20
+ def where_clause_for_last_24_hours(auth_name: nil, auth_table: nil, dt_table: nil)
21
+ validate_params(auth_name, auth_table, dt_table)
22
+ where_clause = where_for_dt_stamp(dt_table, 1.day)
23
+ where_with_authority(where_clause, auth_name, auth_table)
24
+ end
25
+
26
+ # Construct a hash to pass to ActiveRecord where method limiting to last 30 days and optionally an authority.
27
+ # @param auth_name [String] authority name if limiting to an authority; otherwise, nil
28
+ # @param auth_table [Symbol] name of the table holding the authority name; or nil if in same table
29
+ # @param dt_table [Symbol] name of the table holding the date-time stamp; or nil if in same table
30
+ # @return [Hash] a where clause for the last 30 days for an authority
31
+ # @example returned where for join
32
+ # { scenario_run_registry: { dt_stamp: start_day..end_day },
33
+ # scenario_run_history: { authority: 'LOC_DIRECT' } }
34
+ # @example returned where for join with no authority
35
+ # { scenario_run_registry: { dt_stamp: start_day..end_day } }
36
+ # @example returned where for same table
37
+ # { dt_stamp: start_day..end_day, authority: 'LOC_DIRECT' }
38
+ # @example returned where when no authority
39
+ # { dt_stamp: start_day..end_day }
40
+ def where_clause_for_last_30_days(auth_name: nil, auth_table: nil, dt_table: nil)
41
+ validate_params(auth_name, auth_table, dt_table)
42
+ where_clause = where_for_dt_stamp(dt_table, 1.month)
43
+ where_with_authority(where_clause, auth_name, auth_table)
44
+ end
45
+
46
+ # Construct a hash to pass to ActiveRecord where method limiting to last 12 months and optionally an authority.
47
+ # @param auth_name [String] authority name if limiting to an authority; otherwise, nil
48
+ # @param auth_table [Symbol] name of the table holding the authority name; or nil if in same table
49
+ # @param dt_table [Symbol] name of the table holding the date-time stamp; or nil if in same table
50
+ # @return [Hash] a where clause for the last 12 months for an authority
51
+ # @example returned where for join
52
+ # { scenario_run_registry: { dt_stamp: start_month..end_month },
53
+ # scenario_run_history: { authority: 'LOC_DIRECT' } }
54
+ # @example returned where for join with no authority
55
+ # { scenario_run_registry: { dt_stamp: start_month..end_month } }
56
+ # @example returned where for same table
57
+ # { dt_stamp: start_month..end_month, authority: 'LOC_DIRECT' }
58
+ # @example returned where when no authority
59
+ # { dt_stamp: start_month..end_month }
60
+ def where_clause_for_last_12_months(auth_name: nil, auth_table: nil, dt_table: nil)
61
+ validate_params(auth_name, auth_table, dt_table)
62
+ where_clause = where_for_dt_stamp(dt_table, 1.year)
63
+ where_with_authority(where_clause, auth_name, auth_table)
64
+ end
65
+
66
+ private
67
+
68
+ def where_for_dt_stamp(dt_table, time_period)
69
+ end_range = QaServer::TimeService.current_time
70
+ start_range = end_range - time_period
71
+ where_clause = { dt_stamp: start_range..end_range }
72
+ where_clause = { dt_table => where_clause } unless dt_table.nil?
73
+ where_clause
74
+ end
75
+
76
+ def where_with_authority(where_clause, auth_name, auth_table)
77
+ return where_clause if auth_name.nil?
78
+ if auth_table.nil?
79
+ where_clause[:authority] = auth_name
80
+ else
81
+ where_clause[auth_table] = { authority: auth_name }
82
+ end
83
+ where_clause
84
+ end
85
+
86
+ def validate_params(auth_name, auth_table, dt_table)
87
+ raise ArgumentError, "Do not specify auth_table when auth_name is not specified" if auth_table.present? && auth_name.nil?
88
+ return if auth_name.nil?
89
+ raise ArgumentError, "Either both table names need to be specified or neither" if auth_table.present? ^ dt_table.present?
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ # Create where clauses for time periods and authorities.
3
+ module QaServer
4
+ class TimeService
5
+ class << self
6
+ # @return [ActiveSupport::TimeWithZone] current DateTime in the configured preferred_time_zone_name
7
+ def current_time
8
+ Time.now.in_time_zone(QaServer.config.preferred_time_zone_name)
9
+ end
10
+
11
+ # @return [Float] current DateTime in seconds
12
+ def current_time_s
13
+ current_time.to_f
14
+ end
15
+
16
+ # @param dt [ActiveSupport::TimeWithZone] date time stamp
17
+ # @return [String] string version of date formatted with date and time (e.g. "02/01/2020 - 02:35 PM ET")
18
+ def pretty_time(dt)
19
+ dt.in_time_zone(QaServer.config.preferred_time_zone_name).strftime("%m/%d/%Y - %I:%M %p")
20
+ end
21
+
22
+ # @param dt [ActiveSupport::TimeWithZone] date time stamp
23
+ # @return [String] string version of date formatted with just date (e.g. "02/01/2020")
24
+ def pretty_date(dt)
25
+ dt.in_time_zone(QaServer.config.preferred_time_zone_name).strftime("%m/%d/%Y")
26
+ end
27
+ end
28
+ end
29
+ end
@@ -59,15 +59,15 @@ module QaServer
59
59
  # Runs the test in the block passed by the specific scenario type.
60
60
  # @return [Symbol] :good (PASS) or :unknown (UNKNOWN) based on whether enough results were returned
61
61
  def test_connection(min_expected_size: MIN_EXPECTED_SIZE, scenario_type_name:)
62
- dt_start = QaServer.current_time
62
+ dt_start = QaServer::TimeService.current_time
63
63
  results = yield if block_given?
64
- dt_end = QaServer.current_time
64
+ dt_end = QaServer::TimeService.current_time
65
65
  actual_size = results.to_s.length
66
66
  status = actual_size > min_expected_size ? PASS : UNKNOWN
67
67
  errmsg = status == PASS ? '' : "#{scenario_type_name.capitalize} scenario unknown status; cause: Results actual size (#{actual_size} < expected size (#{min_expected_size})"
68
68
  log(status: status, error_message: errmsg, normalization_run_time: (dt_end - dt_start)) # TODO: need to get run times from results
69
69
  rescue Exception => e
70
- dt_end = QaServer.current_time
70
+ dt_end = QaServer::TimeService.current_time
71
71
  log(status: FAIL, error_message: "Exception executing #{scenario_type_name} scenario; cause: #{e.message}", request_run_time: (dt_end - dt_start))
72
72
  end
73
73
 
@@ -40,9 +40,9 @@ module QaServer
40
40
 
41
41
  # Runs the accuracy test and log results
42
42
  def test_accuracy(subject_uri:, expected_by_position:)
43
- dt_start = QaServer.current_time
43
+ dt_start = QaServer::TimeService.current_time
44
44
  results = yield if block_given?
45
- dt_end = QaServer.current_time
45
+ dt_end = QaServer::TimeService.current_time
46
46
  if results.blank?
47
47
  log(status: UNKNOWN, errmsg: "Search position scenario failed; cause: no results found", expected: expected_by_position, target: subject_uri, request_run_time: (dt_end - dt_start))
48
48
  return
@@ -50,7 +50,7 @@ module QaServer
50
50
 
51
51
  check_position(results, subject_uri, expected_by_position, total_run_time: (dt_end - dt_start)) # TODO: need to get run times from results
52
52
  rescue Exception => e
53
- dt_end = QaServer.current_time
53
+ dt_end = QaServer::TimeService.current_time
54
54
  log(status: FAIL, errmsg: "Exception executing search position scenario; cause: #{e.message}",
55
55
  expected: expected_by_position, target: subject_uri, request_run_time: (dt_end - dt_start))
56
56
  end
@@ -83,7 +83,8 @@
83
83
 
84
84
  <% if @presenter.display_performance_datatable? && !@presenter.performance_data.nil? %>
85
85
  <div id="performance-datatable-section">
86
- <h4><%= @presenter.performance_table_description %></h4>
86
+ <h4><%= t('qa_server.monitor_status.performance.datatable_desc') %></h4>
87
+ <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.performance.datarange', from: @presenter.performance_data_start, to: @presenter.performance_data_end) %></p>
87
88
  <table class="status">
88
89
  <tr>
89
90
  <th></th>
@@ -1,8 +1,7 @@
1
1
  <% if @presenter.history? && @presenter.display_history_details?%>
2
2
  <div id="availability-history" class="status-section">
3
3
  <h3><%= t('qa_server.monitor_status.history.title') %></h3>
4
- <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.history.since', date: @presenter.first_updated) %></p>
5
- <%#= column_chart @presenter.historical_summary, stacked: true, colors: ["green", "red"], xtitle: 'Authority', ytitle: 'Pass-Fail', legend: 'bottom' %>
4
+ <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.history.range', from: @presenter.history_start, to: @presenter.history_end) %></p>
6
5
  <% if @presenter.display_historical_graph? %>
7
6
  <%= image_tag(@presenter.historical_graph, alt: 'History Graph Unavailable') %>
8
7
  <% end %>
@@ -19,7 +19,7 @@
19
19
  </table>
20
20
  <p class="status-update-dtstamp"><%= t('qa_server.monitor_status.summary.last_updated', date: @presenter.last_updated) %></p>
21
21
 
22
- <% if @presenter.failures? & !@status_data.nil? %>
22
+ <% if @presenter.failures? & !@presenter.failures.nil? %>
23
23
  <div id="failures" class="status-section">
24
24
  <h4><%= t('qa_server.monitor_status.failures.title') %></h4>
25
25
 
@@ -33,7 +33,7 @@
33
33
  <th><%= t('qa_server.monitor_status.failures.errmsg') %></th>
34
34
  </tr>
35
35
  <% current_authority = nil %>
36
- <% @status_data.each do |status| %>
36
+ <% @presenter.failures.each do |status| %>
37
37
  <% unless status[:authority_name] == current_authority %>
38
38
  <% current_authority = status[:authority_name] %>
39
39
  <tr>
@@ -69,6 +69,7 @@ en:
69
69
  history:
70
70
  title: Authority Connection History
71
71
  since: 'Since %{date} ET'
72
+ range: 'From %{from} to %{to}'
72
73
  authority: Authority
73
74
  days_failing: Days Failing
74
75
  days_passing: Days Passing
@@ -95,10 +96,8 @@ en:
95
96
  y_axis_ms: Milliseconds (ms)
96
97
  now: NOW
97
98
  today: TODAY
98
- datatable_day_desc: 'Performance tabulated data for last 24 hours'
99
- datatable_month_desc: 'Performance tabulated data for last 30 days'
100
- datatable_year_desc: 'Performance tabulated data for one year'
101
- datatable_all_desc: 'Performance tabulated data for all recorded data'
99
+ datatable_desc: 'Performance tabulated data'
100
+ datarange: 'From %{from} to %{to}'
102
101
  authority: Authority
103
102
  average_times: Average (ms)
104
103
  fastest_times: 10th percentile (ms)
@@ -20,6 +20,10 @@ QaServer.config do |config|
20
20
  # @param [Boolean] display history datatable when true
21
21
  # config.display_historical_datatable = true
22
22
 
23
+ # Historical datatable default time period.
24
+ # @param [Symbol] time period for calculating historical pass/fail (i.e., one of :month, :year, or :all)
25
+ # config.historical_datatable_default_time_period = :year
26
+
23
27
  # Displays a graph of performance test data when true
24
28
  # @param [Boolean] display performance graph when true
25
29
  # config.display_performance_graph = false
@@ -27,29 +27,6 @@ module QaServer
27
27
  @config
28
28
  end
29
29
 
30
- # @return [ActiveSupport::TimeWithZone] current DateTime in the configured preferred_time_zone_name
31
- def self.current_time
32
- Time.now.in_time_zone(QaServer.config.preferred_time_zone_name)
33
- end
34
-
35
- # @return [Float] current DateTime in seconds
36
- def self.current_time_s
37
- current_time.to_f
38
- end
39
-
40
- # @return [ActiveSupport::TimeWithZone] DateTime at which cache should expire
41
- def self.monitoring_expires_at
42
- offset = QaServer.config.hour_offset_to_expire_cache
43
- offset_time = current_time
44
- offset_time = offset_time.tomorrow unless (offset_time + 5.minutes).hour < offset
45
- offset_time.beginning_of_day + offset.hours - 5.minutes
46
- end
47
-
48
- # @return [Float] number of seconds until cache should expire
49
- def self.cache_expiry
50
- monitoring_expires_at - current_time
51
- end
52
-
53
30
  def self.log_agent_info(request)
54
31
  return if !Qa.config.respond_to?(:suppress_ip_data_from_log) || Qa.config.suppress_ip_data_from_log
55
32
  user_agent = request.respond_to?(:user_agent) && !request.user_agent.nil? ? ::UserAgent.parse(request.user_agent) : nil
@@ -59,6 +59,20 @@ module QaServer
59
59
  @display_historical_datatable = true
60
60
  end
61
61
 
62
+ # Historical datatable default time period.
63
+ # @param [Symbol] time period for calculating historical pass/fail (i.e., one of :month, :year, or :all)
64
+ # @raise [ArgumentError] if time_period is not one of :month, :year, or :all
65
+ def historical_datatable_default_time_period=(time_period)
66
+ raise ArgumentError, 'time_period must be one of :day, :month, or :year' unless [:month, :year, :all].include? time_period
67
+ @historical_datatable_default_time_period = time_period
68
+ end
69
+
70
+ # Historical datatable default time period.
71
+ # @return [Symbol] time period for calculating historical pass/fail (i.e., one of :month, :year, or :all)
72
+ def historical_datatable_default_time_period
73
+ @historical_datatable_default_time_period ||= :year
74
+ end
75
+
62
76
  # Displays a graph of performance test data when true
63
77
  # @param [Boolean] display performance graph when true
64
78
  attr_writer :display_performance_graph
@@ -187,9 +201,15 @@ module QaServer
187
201
  @suppress_logging_performance_datails ||= false
188
202
  end
189
203
 
204
+ # For internal use only
190
205
  # TODO: consider refactor performance caching to use Rails cache
191
206
  def performance_cache
192
207
  @performance_cache ||= QaServer::PerformanceCache.new
193
208
  end
209
+
210
+ # For internal use only
211
+ def monitor_logger
212
+ @monitor_logger ||= Logger.new(ENV['MONITOR_LOG_PATH'] || File.join("log", "monitor.log"))
213
+ end
194
214
  end
195
215
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module QaServer
3
- VERSION = '5.5.1'
3
+ VERSION = '6.0.0'
4
4
  end
@@ -3,57 +3,6 @@ require 'spec_helper'
3
3
 
4
4
  RSpec.describe QaServer do
5
5
  # rubocop:disable RSpec/MessageChain
6
- let(:timezone_name) { 'Eastern Time (US & Canada)' }
7
- before { allow(described_class).to receive_message_chain(:config, :preferred_time_zone_name).and_return(timezone_name) }
8
-
9
- describe '.current_time' do
10
- before do
11
- allow(Time).to receive(:now).and_return(DateTime.parse('2019-12-11 05:00:00 -0500').in_time_zone(timezone_name))
12
- end
13
-
14
- it 'returns the time in the preferred time zone' do
15
- puts 'Running QaServer.current_time spec'
16
- expect(described_class.current_time.zone).to eq 'EST'
17
- end
18
- end
19
-
20
- describe '.monitoring_expires_at' do
21
- before do
22
- allow(described_class).to receive_message_chain(:config, :hour_offset_to_expire_cache).and_return(3)
23
- end
24
-
25
- context 'when current hour is before offset time' do
26
- before do
27
- allow(described_class).to receive(:current_time).and_return(DateTime.parse('2019-12-11 02:54:00 -0500').in_time_zone(timezone_name))
28
- end
29
-
30
- it 'returns expiration on current date at offset time' do
31
- expect(described_class.monitoring_expires_at).to eq DateTime.parse('2019-12-11 02:55:00 -0500').in_time_zone(timezone_name)
32
- end
33
- end
34
-
35
- context 'when current hour is after offset time' do
36
- before do
37
- allow(described_class).to receive(:current_time).and_return(DateTime.parse('2019-12-11 02:56:00 -0500').in_time_zone(timezone_name))
38
- end
39
-
40
- it 'returns expiration on previous date at offset time' do
41
- expect(described_class.monitoring_expires_at).to eq DateTime.parse('2019-12-12 02:55:00 -0500').in_time_zone(timezone_name)
42
- end
43
- end
44
- end
45
-
46
- describe '.cache_expiry' do
47
- before do
48
- allow(described_class).to receive_message_chain(:config, :hour_offset_to_expire_cache).and_return(3)
49
- allow(Time).to receive(:now).and_return(DateTime.parse('2019-12-11 02:54:59 -0500').in_time_zone(timezone_name))
50
- end
51
-
52
- it 'returns seconds until offset time (simulates 1 second before offset time)' do
53
- expect(described_class.cache_expiry).to eq 1.second
54
- end
55
- end
56
-
57
6
  # rubocop:disable RSpec/MessageSpies
58
7
  describe '.log_agent_info' do
59
8
  let(:request) { double }
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ RSpec.describe QaServer::MonitorCacheService do
5
+ # rubocop:disable RSpec/MessageChain
6
+ let(:timezone_name) { 'Eastern Time (US & Canada)' }
7
+ before { allow(described_class).to receive_message_chain(:config, :preferred_time_zone_name).and_return(timezone_name) }
8
+
9
+ describe '.cache_expiry' do
10
+ before do
11
+ allow(described_class).to receive_message_chain(:config, :hour_offset_to_expire_cache).and_return(3)
12
+ allow(Time).to receive(:now).and_return(DateTime.parse('2019-12-11 02:54:59 -0500').in_time_zone(timezone_name))
13
+ end
14
+
15
+ it 'returns seconds until offset time (simulates 1 second before offset time)' do
16
+ expect(described_class.cache_expiry).to eq 1.second
17
+ end
18
+ end
19
+ # rubocop:enable RSpec/MessageChain
20
+ end