qa_server 7.5.1 → 7.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_fixme.yml +3 -2
  3. data/.travis.yml +1 -1
  4. data/CHANGELOG.md +28 -0
  5. data/app/assets/stylesheets/qa_server/_check-status.scss +4 -0
  6. data/app/assets/stylesheets/qa_server/_monitor-status.scss +45 -0
  7. data/app/cache_processors/concerns/qa_server/cache_keys.rb +1 -0
  8. data/app/cache_processors/qa_server/scenario_history_cache.rb +19 -1
  9. data/app/controllers/qa_server/monitor_status_controller.rb +39 -9
  10. data/app/models/qa_server/scenario_run_history.rb +12 -3
  11. data/app/models/qa_server/search_scenario.rb +6 -0
  12. data/app/presenters/qa_server/check_status_presenter.rb +1 -1
  13. data/app/presenters/qa_server/monitor_status/current_status_presenter.rb +9 -8
  14. data/app/presenters/qa_server/monitor_status/history_presenter.rb +55 -4
  15. data/app/presenters/qa_server/monitor_status/history_up_down_presenter.rb +58 -0
  16. data/app/presenters/qa_server/monitor_status_presenter.rb +7 -2
  17. data/app/services/qa_server/history_up_down_service.rb +103 -0
  18. data/app/services/qa_server/time_service.rb +6 -0
  19. data/app/views/qa_server/check_status/index.html.erb +7 -6
  20. data/app/views/qa_server/monitor_status/_test_summary.html.erb +1 -1
  21. data/app/views/qa_server/monitor_status/_test_up_down_connection_history.html.erb +30 -0
  22. data/app/views/qa_server/monitor_status/index.html.erb +2 -1
  23. data/config/locales/qa_server.en.yml +8 -7
  24. data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_tgn_ld4l_cache.json +24 -14
  25. data/lib/generators/qa_server/templates/config/authorities/linked_data/getty_ulan_ld4l_cache.json +104 -8
  26. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo2_ld4l_cache.json +4 -4
  27. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo3_ld4l_cache.json +4 -4
  28. data/lib/generators/qa_server/templates/config/authorities/linked_data/locnames_rwo_ld4l_cache.json +4 -4
  29. data/lib/generators/qa_server/templates/config/authorities/linked_data/locvocabs_ld4l_cache.json +1 -1
  30. data/lib/generators/qa_server/templates/config/authorities/linked_data/mesh_nlm_ld4l_cache.json +1 -0
  31. data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_direct.json +4 -0
  32. data/lib/generators/qa_server/templates/config/authorities/linked_data/oclcfast_ld4l_cache.json +1 -0
  33. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/cerl_ld4l_cache_validation.yml +3 -3
  34. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/geonames_ld4l_cache_validation.yml +2 -5
  35. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_aat_ld4l_cache_validation.yml +0 -3
  36. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_tgn_ld4l_cache_validation.yml +3 -7
  37. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/getty_ulan_ld4l_cache_validation.yml +5 -5
  38. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locdemographics_ld4l_cache_validation.yml +0 -4
  39. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locgenres_ld4l_cache_validation.yml +0 -9
  40. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_ld4l_cache_validation.yml +1 -7
  41. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo2_ld4l_cache_validation.yml +78 -0
  42. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo3_ld4l_cache_validation.yml +73 -0
  43. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locnames_rwo_ld4l_cache_validation.yml +11 -11
  44. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locsubjects_ld4l_cache_validation.yml +1 -3
  45. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/locvocabs_ld4l_cache_validation.yml +246 -0
  46. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/mesh_nlm_ld4l_cache_validation.yml +8 -5
  47. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_direct_validation.yml +13 -7
  48. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/oclcfast_ld4l_cache_validation.yml +19 -3
  49. data/lib/generators/qa_server/templates/config/authorities/linked_data/scenarios/rda_registry_ld4l_cache_validation.yml +0 -3
  50. data/lib/generators/qa_server/templates/config/initializers/qa_server.rb +8 -0
  51. data/lib/qa_server/configuration.rb +14 -0
  52. data/lib/qa_server/version.rb +1 -1
  53. data/qa_server.gemspec +5 -5
  54. data/spec/feature/accuracy_spec.rb +1 -1
  55. data/spec/i18n_spec.rb +0 -1
  56. data/spec/lib/configuration_spec.rb +22 -0
  57. data/spec/presenters/qa_server/monitor_status/history_presenter_spec.rb +81 -0
  58. data/spec/services/qa_server/history_up_down_service_spec.rb +86 -0
  59. metadata +39 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c0138684332f934add8000e85d76c86264162963e7df49fa170ee894783aa17
4
- data.tar.gz: 2f9e19975f53fa4e0d34feb8e4423f203e0d46bafe6bc30af614459256a6b66f
3
+ metadata.gz: 98c71b17c28452d0503ee1afd8ee920dbaa12332e578890d02527a402ce1a793
4
+ data.tar.gz: b569538f771243239ff2fe85428fbe11b9dd948947aa90e598a12c513aa2e4e2
5
5
  SHA512:
6
- metadata.gz: bd9de3a942001f3e6eca2790441fa2ea2f8d386033c4af93cca230ac2ee3dbb357d44378535bdf521a89e196d29b6fd7308b1f1a6246ece9c1293c6c521deb7d
7
- data.tar.gz: 933c7742a774144186e9a63f749a2b4d01c89c76b7849d8c18419e0ea95d0df28158ce5286ca694d516fa994f14796c8f668708e907ca2c037e880b101afc5e9
6
+ metadata.gz: 96ae15dfd8d90bab80600eea28865a6749347bd084df9771b0864e5d58c803bfb7dc23bff8025f4939ca78c5dfbbfa452a0a8f7fe028acb3c85ee7c3374d78ee
7
+ data.tar.gz: 04f668c250e1f95188ad2a0553b2ab8a09f33415e4a9028024e4ce97407aa1af041be643dbb6f7b603e61887df8f3b0d7b3b80d7a41c0c194aaa579cb07cd03d
data/.rubocop_fixme.yml CHANGED
@@ -16,5 +16,6 @@ Style/SpecialGlobalVars:
16
16
  Layout/AccessModifierIndentation:
17
17
  EnforcedStyle: outdent
18
18
 
19
- #Layout/IndentationWidth:
20
- # Enabled: false
19
+ Layout/HashAlignment:
20
+ Exclude:
21
+ - 'spec/presenters/qa_server/monitor_status/history_presenter_spec.rb'
data/.travis.yml CHANGED
@@ -26,7 +26,7 @@ env:
26
26
  # It should be sufficient to test only the latest of the patch versions for a minor version, they
27
27
  # should be compatible across patch versions (only bug fixes are released in patch versions).
28
28
  matrix:
29
- - "RAILS_VERSION=5.2.4"
29
+ - "RAILS_VERSION=5.2.5"
30
30
 
31
31
  services:
32
32
  - redis-server
data/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ ### 7.9.0 (2021-04-16)
2
+
3
+ * Add chart showing simulated graph (in table) of the last 30 days of up-down connection data
4
+
5
+ ### 7.8.0 (2021-04-14)
6
+
7
+ * add geographic subauth for Mesh-NLM
8
+ * dogear expected and actual cells when accuracy test is pending
9
+
10
+ ### 7.7.1 (2021-04-14)
11
+
12
+ * fix background colors in historical uptime table
13
+
14
+ ### 7.7.0 (2021-04-13)
15
+
16
+ * remove unused translations
17
+ * show notification when refreshing starts on monitor status page
18
+ * hide data in Authority Connection History for non-active authorities
19
+ * loosen threshold for caution in historical uptime table
20
+ * minor tweaks missed in original sync
21
+
22
+ ### 7.6.0 (2021-04-12)
23
+
24
+ * update authority configs and test scenarios to use the new cache indexing with results stored as blobs in the index
25
+ * update to Rails 5.2.5
26
+ * update dependencies
27
+ * fix exception when first time running monitor status
28
+
1
29
  ### 7.5.1 (2020-12-08)
2
30
 
3
31
  * define missing i18n translations
@@ -88,6 +88,10 @@ td.bold-left-border {
88
88
  border-left: 2px solid black;
89
89
  }
90
90
 
91
+ .status-dogear {
92
+ background: linear-gradient(135deg, #333 0%, #333 10%, transparent 10%, transparent 100%);
93
+ }
94
+
91
95
  .status-good {
92
96
  text-align: center;
93
97
  background-color: #ccffcc;
@@ -53,3 +53,48 @@ div#performance-by-the-day {
53
53
  div#performance-by-the-month {
54
54
  display: none;
55
55
  }
56
+
57
+ table.up-down-history {
58
+ border: none;
59
+ }
60
+
61
+ td.up-down-history {
62
+ font-size: .8em;
63
+ font-style: italic;
64
+ border: none;
65
+ }
66
+ th.up-down-history {
67
+ width: 20px;
68
+ border: none;
69
+ }
70
+
71
+ td.connection-up-down {
72
+ border-right: 8px white solid;
73
+ border-left: 8px white solid;
74
+ border-top: none;
75
+ border-bottom: 3px white solid;
76
+ }
77
+
78
+ td.connection-no-data {
79
+ background-color: white;
80
+ }
81
+
82
+ td.connection-fully-up {
83
+ background-color: #19AE19;
84
+ }
85
+
86
+ td.connection-mostly-up {
87
+ background-color: #19AEA7;
88
+ }
89
+
90
+ td.connection-timeouts {
91
+ background-color: #EDF908;
92
+ }
93
+
94
+ td.connection-barely-up {
95
+ background-color: #AE7619;
96
+ }
97
+
98
+ td.connection-down {
99
+ background-color: #CE0303;
100
+ }
@@ -5,6 +5,7 @@ module QaServer
5
5
  SCENARIO_RUN_SUMMARY_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_summary_data"
6
6
  SCENARIO_RUN_FAILURE_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_failure_data"
7
7
  SCENARIO_RUN_HISTORY_DATA_CACHE_KEY = "QaServer--CacheKeys--scenario_run_history_data"
8
+ SCENARIO_RUN_HISTORY_UP_DOWN_DATA_CACHE_KEY = "QaServer--CacheKeys--history_up_down_data"
8
9
 
9
10
  PERFORMANCE_DATATABLE_DATA_CACHE_KEY = "QaServer--Cache--performance_datatable_data"
10
11
  end
@@ -2,8 +2,9 @@
2
2
  # Maintain a cache of data for Authority Connection History table displayed on Monitor Status page
3
3
  module QaServer
4
4
  class ScenarioHistoryCache
5
- class_attribute :scenario_history_class
5
+ class_attribute :scenario_history_class, :scenario_up_down_class
6
6
  self.scenario_history_class = QaServer::ScenarioRunHistory
7
+ self.scenario_up_down_class = QaServer::HistoryUpDownService
7
8
 
8
9
  class << self
9
10
  include QaServer::CacheKeys
@@ -21,12 +22,29 @@ module QaServer
21
22
  end
22
23
  end
23
24
 
25
+ # Get a status for each of the last 30 days for queries that succeeded or failed.
26
+ # @param force [Boolean] if true, run the tests even if the cache hasn't expired; otherwise, use cache if not expired
27
+ # @returns [Hash<Array>] status for the last 30 days for each authority
28
+ # @example { auth_name => [:fully_up, :fully_up, :down, :mostly_up, ... ], ... }
29
+ # { 'agrovoc' => [ :fully_up, :fully_up, :down, :mostly_up, ...],
30
+ # 'geonames_ld4l_cache' => [ :fully_up, :mostly_up, :down, :fully_up, :timeouts, ...] }
31
+ def historical_up_down_data(force: false)
32
+ Rails.cache.fetch(cache_key_for_historical_up_down_data, expires_in: next_expiry, race_condition_ttl: 30.seconds, force: force) do
33
+ QaServer.config.monitor_logger.debug("(QaServer::ScenarioHistoryCache) - CALCULATING UP-DOWN STATUS HISTORY of scenario runs (force: #{force})")
34
+ scenario_up_down_class.new.last_30_days
35
+ end
36
+ end
37
+
24
38
  private
25
39
 
26
40
  def cache_key_for_historical_data
27
41
  SCENARIO_RUN_HISTORY_DATA_CACHE_KEY
28
42
  end
29
43
 
44
+ def cache_key_for_historical_up_down_data
45
+ SCENARIO_RUN_HISTORY_UP_DOWN_DATA_CACHE_KEY
46
+ end
47
+
30
48
  def next_expiry
31
49
  QaServer::CacheExpiryService.cache_expiry
32
50
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # Controller for Monitor Status header menu item
3
3
  module QaServer
4
- class MonitorStatusController < ApplicationController
4
+ class MonitorStatusController < ApplicationController # rubocop:disable Metrics/ClassLength
5
5
  layout 'qa_server'
6
6
 
7
7
  include QaServer::AuthorityValidationBehavior
@@ -19,9 +19,10 @@ module QaServer
19
19
  @presenter = presenter_class.new(current_summary: latest_summary,
20
20
  current_failure_data: latest_failures,
21
21
  historical_summary_data: historical_data,
22
+ historical_up_down_data: historical_up_down_data,
22
23
  performance_data: performance_table_data)
23
24
  QaServer.config.monitor_logger.debug("~~~~~~~~ DONE rendering monitor status")
24
- render 'index', status: :internal_server_error if latest_summary.failing_authority_count.positive?
25
+ render 'index', status: :internal_server_error if latest_summary&.failing_authority_count&.positive?
25
26
  end
26
27
 
27
28
  private
@@ -43,13 +44,13 @@ module QaServer
43
44
 
44
45
  # @returns [QaServer::ScenarioRunSummary] summary statistics on the latest run
45
46
  def latest_summary
46
- QaServer::ScenarioRunSummaryCache.summary_for_run(run: latest_test_run)
47
+ latest_test_run ? QaServer::ScenarioRunSummaryCache.summary_for_run(run: latest_test_run) : nil
47
48
  end
48
49
 
49
50
  # @returns [Array<Hash>] scenario details for any failing scenarios in the latest run
50
51
  # @see QaServer::ScenarioRunHistory#run_failures for structure of output
51
52
  def latest_failures
52
- QaServer::ScenarioRunFailuresCache.failures_for_run(run: latest_test_run)
53
+ latest_test_run ? QaServer::ScenarioRunFailuresCache.failures_for_run(run: latest_test_run) : nil
53
54
  end
54
55
 
55
56
  # Get a summary level of historical data
@@ -59,6 +60,13 @@ module QaServer
59
60
  @historical_data ||= QaServer::ScenarioHistoryCache.historical_summary(force: refresh_history?)
60
61
  end
61
62
 
63
+ # Get a summary level of historical data
64
+ # @returns [Array<Hash>] summary of passing/failing tests for each authority
65
+ # @see QaServer::ScenarioRunHistory#historical_summary for structure of output
66
+ def historical_up_down_data
67
+ @historical_up_down_data ||= QaServer::ScenarioHistoryCache.historical_up_down_data(force: refresh_history?)
68
+ end
69
+
62
70
  def update_historical_graph
63
71
  return unless QaServer.config.display_historical_graph?
64
72
  QaServer::ScenarioHistoryGraphCache.generate_graph(data: historical_data, force: refresh_history?)
@@ -77,7 +85,8 @@ module QaServer
77
85
  end
78
86
 
79
87
  def refresh?
80
- params.key?(:refresh) && validate_auth_reload_token("refresh status")
88
+ return @refresh unless @refresh.nil?
89
+ @refresh ||= params.key?(:refresh) && validate_auth_reload_token("refresh status")
81
90
  end
82
91
 
83
92
  def refresh_all?
@@ -86,15 +95,36 @@ module QaServer
86
95
  end
87
96
 
88
97
  def refresh_tests?
89
- refresh? ? (refresh_all? || params[:refresh].casecmp?('tests')) : false
98
+ return @refresh_tests unless @refresh_tests.nil?
99
+ @refresh_tests = refresh? && (refresh_all? || params[:refresh].casecmp?('tests'))
100
+ if @refresh_tests
101
+ msg = I18n.t('qa_server.monitor_status.refreshing_tests')
102
+ logger.info msg
103
+ flash.now[:success] = msg
104
+ end
105
+ @refresh_tests
90
106
  end
91
107
 
92
108
  def refresh_history?
93
- refresh? ? (refresh_all? || params[:refresh].casecmp?('history')) : false
109
+ return @refresh_history unless @refresh_history.nil?
110
+ @refresh_history = refresh? && (refresh_all? || params[:refresh].casecmp?('history'))
111
+ if @refresh_history
112
+ msg = I18n.t('qa_server.monitor_status.refreshing_history')
113
+ logger.info msg
114
+ flash.now[:success] = msg
115
+ end
116
+ @refresh_history
94
117
  end
95
118
 
96
119
  def refresh_performance?
97
- refresh? ? (refresh_all? || params[:refresh].casecmp?('performance')) : false
120
+ return @refresh_performance unless @refresh_performance.nil?
121
+ @refresh_performance = refresh? && (refresh_all? || params[:refresh].casecmp?('performance'))
122
+ if @refresh_performance
123
+ msg = I18n.t('qa_server.monitor_status.refreshing_performance')
124
+ logger.info msg
125
+ flash.now[:success] = msg
126
+ end
127
+ @refresh_performance
98
128
  end
99
129
 
100
130
  def refresh_performance_table?
@@ -117,7 +147,7 @@ module QaServer
117
147
  token = params.key?(:auth_token) ? params[:auth_token] : nil
118
148
  valid = Qa.config.valid_authority_reload_token?(token)
119
149
  return true if valid
120
- msg = "Permission denied. Unable to #{action}."
150
+ msg = I18n.t('qa_server.monitor_status.permission_denied', action: action)
121
151
  logger.warn msg
122
152
  flash.now[:error] = msg
123
153
  false
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  # Provide access to the scenario_run_history database table which tracks scenario runs over time.
3
3
  module QaServer
4
- class ScenarioRunHistory < ApplicationRecord
4
+ class ScenarioRunHistory < ApplicationRecord # rubocop:disable Metrics/ClassLength
5
5
  self.table_name = 'scenario_run_history'
6
6
  belongs_to :scenario_run_registry
7
7
  enum scenario_type: { connection: 0, accuracy: 1, performance: 2 }, _suffix: :type
@@ -11,9 +11,9 @@ module QaServer
11
11
  BAD_MARKER = 'X'
12
12
  UNKNOWN_MARKER = '?'
13
13
 
14
- class_attribute :summary_class
15
-
14
+ class_attribute :summary_class, :authority_lister_class
16
15
  self.summary_class = QaServer::ScenarioRunSummary
16
+ self.authority_lister_class = QaServer::AuthorityListerService
17
17
 
18
18
  class << self
19
19
  # Save a scenario result
@@ -92,12 +92,21 @@ module QaServer
92
92
  days_unknown = count_days(:unknown)
93
93
  keys = (days_good.keys + days_bad.keys + days_unknown.keys).uniq.sort
94
94
  keys.each_with_object({}) do |auth, hash|
95
+ next unless active_authority? auth
95
96
  hash[auth] = { good: day_count(auth, days_good), bad: day_count(auth, days_bad) + day_count(auth, days_unknown) }
96
97
  end
97
98
  end
98
99
 
99
100
  private
100
101
 
102
+ def active_authority?(auth)
103
+ active_authorities.include? auth.to_sym
104
+ end
105
+
106
+ def active_authorities
107
+ @active_authorities = authority_lister_class.authorities_list
108
+ end
109
+
101
110
  def day_count(auth, days)
102
111
  days&.key?(auth) ? days[auth] : 0
103
112
  end
@@ -60,5 +60,11 @@ module QaServer
60
60
  def subauthority?
61
61
  subauthority_name.present?
62
62
  end
63
+
64
+ def context?
65
+ # don't include context for accuracy tests
66
+ return false if expected_by_position.present?
67
+ super
68
+ end
63
69
  end
64
70
  end
@@ -81,7 +81,7 @@ module QaServer
81
81
 
82
82
  # @return [String] the name of the css style class to use for the status cell based on the status of the scenario test.
83
83
  def status_style_class(status)
84
- "status-#{status}"
84
+ status[:pending] ? "status-dogear status-#{status[:status]}" : "status-#{status[:status]}"
85
85
  end
86
86
 
87
87
  # @return [String] the name of the css style class to use for the status cell based on the status of the scenario test.
@@ -13,12 +13,13 @@ module QaServer::MonitorStatus
13
13
 
14
14
  # @return [ActiveSupport::TimeWithZone] date time stamp of last test run
15
15
  def last_updated_dt
16
- @current_summary.run_dt_stamp
16
+ @current_summary ? @current_summary.run_dt_stamp : QaServer::TimeService.current_time
17
17
  end
18
18
 
19
19
  # @return [String] date with time of last test run
20
20
  def last_updated
21
- QaServer::TimeService.pretty_time(last_updated_dt)
21
+ return I18n.t('qa_server.monitor_status.summary.no_data') if @current_summary.blank?
22
+ I18n.t('qa_server.monitor_status.summary.last_updated', date: QaServer::TimeService.pretty_time(last_updated_dt))
22
23
  end
23
24
 
24
25
  # @return [ActiveSupport::TimeWithZone] date time stamp of first recorded test run
@@ -33,12 +34,12 @@ module QaServer::MonitorStatus
33
34
 
34
35
  # @return [Integer] number of loaded authorities
35
36
  def authorities_count
36
- @current_summary.authority_count
37
+ @current_summary ? @current_summary.authority_count : "N/A"
37
38
  end
38
39
 
39
40
  # @return [Integer] number of authorities with failing tests in the latest test run
40
41
  def failing_authorities_count
41
- @current_failure_data.map { |f| f[:authority_name] }.uniq.count
42
+ @current_failure_data ? @current_failure_data.map { |f| f[:authority_name] }.uniq.count : "N/A"
42
43
  end
43
44
 
44
45
  # @return [String] css style class representing whether all tests passed or any failed
@@ -48,17 +49,17 @@ module QaServer::MonitorStatus
48
49
 
49
50
  # @return [Integer] number of tests in the latest test run
50
51
  def tests_count
51
- @current_summary.total_scenario_count
52
+ @current_summary ? @current_summary.total_scenario_count : 0
52
53
  end
53
54
 
54
55
  # @return [Integer] number of passing tests in the latest test run
55
56
  def passing_tests_count
56
- @current_summary.passing_scenario_count
57
+ @current_summary ? @current_summary.passing_scenario_count : 0
57
58
  end
58
59
 
59
60
  # @return [Integer] number of failing tests in the latest test run
60
61
  def failing_tests_count
61
- @current_summary.failing_scenario_count
62
+ @current_summary ? @current_summary.failing_scenario_count : 0
62
63
  end
63
64
 
64
65
  # @return [String] css style class representing whether all tests passed or any failed
@@ -77,7 +78,7 @@ module QaServer::MonitorStatus
77
78
  # url: '/qa/search/linked_data/locnames_ld4l_cache/person?q=mark twain&maxRecords=4',
78
79
  # err_message: 'Exception: Something went wrong.' }, ... ]
79
80
  def failures
80
- @current_failure_data
81
+ @current_failure_data ? @current_failure_data : []
81
82
  end
82
83
 
83
84
  # @return [Boolean] true if failure data exists for the latest test run; otherwise false
@@ -2,8 +2,16 @@
2
2
  # This presenter class provides historical testing data needed by the view that monitors status of authorities.
3
3
  module QaServer::MonitorStatus
4
4
  class HistoryPresenter
5
+ CAUTION_THRESHOLD = 0.05
6
+ WARNING_THRESHOLD = 0.1
7
+
5
8
  # @param parent [QaServer::MonitorStatusPresenter] parent presenter
6
9
  # @param historical_summary_data [Array<Hash>] summary of past failuring runs per authority to drive chart
10
+ # @example historical_summary_data
11
+ # {
12
+ # "AGROVOC_DIRECT"=>{:good=>4, :bad=>0},
13
+ # "AGROVOC_LD4L_CACHE"=>{:good=>4, :bad=>0}
14
+ # }
7
15
  def initialize(parent:, historical_summary_data:)
8
16
  @parent = parent
9
17
  @historical_summary_data = historical_summary_data
@@ -11,8 +19,10 @@ module QaServer::MonitorStatus
11
19
 
12
20
  # @return [Array<Hash>] historical test data to be displayed (authname, failing, passing)
13
21
  # @example
14
- # [ [ 'agrovoc', 0, 24 ],
15
- # [ 'geonames_ld4l_cache', 2, 22 ] ... ]
22
+ # {
23
+ # "AGROVOC_DIRECT"=>{:good=>4, :bad=>0},
24
+ # "AGROVOC_LD4L_CACHE"=>{:good=>4, :bad=>0}
25
+ # }
16
26
  def historical_summary
17
27
  @historical_summary_data
18
28
  end
@@ -69,47 +79,88 @@ module QaServer::MonitorStatus
69
79
  end
70
80
  end
71
81
 
82
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
83
+ # @return [String] name of the authority (e.g. 'AUTH_NAME')
84
+ # @example historical_entry
85
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
72
86
  def historical_data_authority_name(historical_entry)
73
87
  historical_entry[0]
74
88
  end
75
89
 
90
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
91
+ # @return [Integer] number of days with passing tests (e.g. 949)
92
+ # @example historical_entry
93
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
76
94
  def days_authority_passing(historical_entry)
77
95
  historical_entry[1][:good]
78
96
  end
79
97
 
98
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
99
+ # @return [Integer] number of days with failing tests (e.g. 51)
100
+ # @example historical_entry
101
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
80
102
  def days_authority_failing(historical_entry)
81
103
  historical_entry[1][:bad]
82
104
  end
83
105
 
106
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
107
+ # @return [Integer] number of days tested (e.g. 1000)
108
+ # @example historical_entry
109
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
84
110
  def days_authority_tested(historical_entry)
85
111
  days_authority_passing(historical_entry) + days_authority_failing(historical_entry)
86
112
  end
87
113
 
114
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
115
+ # @return [Float] percent of failing to passing tests (e.g. 0.05374 )
116
+ # @example historical_entry
117
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
88
118
  def percent_authority_failing(historical_entry)
89
119
  days_authority_failing(historical_entry).to_f / days_authority_tested(historical_entry)
90
120
  end
91
121
 
122
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
123
+ # @return [String] percent of failing to passing tests (e.g. '5.4%')
124
+ # @example historical_entry
125
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
92
126
  def percent_authority_failing_str(historical_entry)
93
127
  ActiveSupport::NumberHelper.number_to_percentage(percent_authority_failing(historical_entry) * 100, precision: 1)
94
128
  end
95
129
 
130
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
131
+ # @return [String] css class for background in Days Failing and Percent Failing columns (e.g. 'status-neutral', 'status-unknown', 'status-bad')
132
+ # @example historical_entry
133
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
96
134
  def failure_style_class(historical_entry)
97
- return "status-neutral" if days_authority_failing(historical_entry) <= 0
98
- percent_authority_failing(historical_entry) < 0.10 ? "status-unknown" : "status-bad"
135
+ case percent_authority_failing(historical_entry)
136
+ when 0.0...CAUTION_THRESHOLD
137
+ "status-neutral"
138
+ when CAUTION_THRESHOLD...WARNING_THRESHOLD
139
+ "status-unknown"
140
+ else
141
+ "status-bad"
142
+ end
99
143
  end
100
144
 
145
+ # @param historical_entry [Array<String,Hash>] data for a single authority including name, # passing tests (good), # failing tests (bad)
146
+ # @return [String] css class for background in Days Passing column (e.g. 'status-good', 'status-bad')
147
+ # @example historical_entry
148
+ # [ 'AUTH_NAME', { good: 949, bad: 51 } ]
101
149
  def passing_style_class(historical_entry)
102
150
  days_authority_passing(historical_entry) <= 0 ? "status-bad" : "status-good"
103
151
  end
104
152
 
153
+ # @return [Boolean] true if historical section should be visible; otherwise false
105
154
  def display_history_details?
106
155
  display_historical_graph? || display_historical_datatable?
107
156
  end
108
157
 
158
+ # @return [Boolean] true if historical graph should be visible; otherwise false
109
159
  def display_historical_graph?
110
160
  QaServer.config.display_historical_graph? && QaServer::HistoryGraphingService.history_graph_image_exists?
111
161
  end
112
162
 
163
+ # @return [Boolean] true if historical datatable should be visible; otherwise false
113
164
  def display_historical_datatable?
114
165
  QaServer.config.display_historical_datatable?
115
166
  end