qa_server 7.5.1 → 7.9.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.
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