diff --git a/.env b/.env
index 4f9009259..ee2ceeefc 100644
--- a/.env
+++ b/.env
@@ -92,3 +92,5 @@ OHLOH_ANALYTICS_CLIENT_REGISTRATION_ID=
JWT_SECRET=
COVERITY_SCAN_URL = 'https://scan.coverity.com'
+
+EXPIRATION_DAYS=21
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
index e1ef35115..9ddbcbc9b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -61,6 +61,7 @@ end
group :test do
gem 'haml_lint', '~> 0.21'
+ gem 'm', '~> 1.5.0'
gem 'minitest-rails'
gem 'minitest-spec-rails'
gem 'mocha'
diff --git a/Gemfile.lock b/Gemfile.lock
index 14d065be7..f229e200c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -407,7 +407,7 @@ GEM
sax-machine (1.3.2)
set (1.0.2)
sexp_processor (4.16.0)
- sidekiq (6.4.0)
+ sidekiq (6.4.2)
connection_pool (>= 2.2.2)
rack (~> 2.0)
redis (>= 4.2.0)
diff --git a/app/admin/accounts_admin.rb b/app/admin/accounts_admin.rb
index 08dffa1dd..d4faeb750 100644
--- a/app/admin/accounts_admin.rb
+++ b/app/admin/accounts_admin.rb
@@ -21,6 +21,10 @@
filter :last_seen_ip
filter :created_at
+ action_item :maintenance, only: :index do
+ link_to 'Set Maintenance Mode', maintenance_admin_accounts_path
+ end
+
index do
column :id
column :name do |account|
@@ -64,4 +68,9 @@
end
f.actions
end
+
+ collection_action :maintenance do
+ Account.maintenance
+ redirect_to_saved_path(notice: 'Accounts successfully logged out')
+ end
end
diff --git a/app/assets/javascripts/charts.js b/app/assets/javascripts/charts.js
index 6f1be1e76..2599913c0 100644
--- a/app/assets/javascripts/charts.js
+++ b/app/assets/javascripts/charts.js
@@ -56,13 +56,12 @@ var Charts = {
var first_day = new Date(this.value)
var last_day = new Date(first_day.getFullYear(), first_day.getMonth()+1, 0);
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
- return '';
- // if (months.includes(this.value.split(' ')[0]))
- // return '' +
- // this.value + '';
- // else
- // return '' +
- // this.value + '';
+ if (months.includes(this.value.split(' ')[0]))
+ return '' +
+ this.value + '';
+ else
+ return '' +
+ this.value + '';
}});
}
data.chart.renderTo = chart;
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 9db7dee1c..b0114a7f4 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -274,15 +274,7 @@ def access_denied
end
def report_errors(exception)
- if ENV['KUBERNETES_PORT']
- notify_airbrake(exception)
- else
- logger = Logger.new(Rails.root.join('log/errors.log'))
- logger.error(exception.message)
- logger.error(exception.backtrace)
- logger.error('-' * 150)
- logger.close
- end
+ notify_airbrake(exception)
end
def set_session_projects
@@ -333,6 +325,7 @@ def check_project_authorization
def update_last_seen_at_and_ip
return unless logged_in?
+ return if expired_token?
current_user.update_columns(last_seen_at: Time.current, last_seen_ip: request.remote_ip)
end
diff --git a/app/controllers/concerns/clearance_setup.rb b/app/controllers/concerns/clearance_setup.rb
index 0fc27fbe7..76fc669d3 100644
--- a/app/controllers/concerns/clearance_setup.rb
+++ b/app/controllers/concerns/clearance_setup.rb
@@ -16,6 +16,18 @@ def current_user
super || NilAccount.new
end
+ def expired_token?
+ return false unless current_user&.last_seen_at && current_user.last_seen_at < expiration_days.days.ago
+
+ current_user.reset_remember_token!
+ request.env[:clearance].sign_out
+ true
+ end
+
+ def expiration_days
+ ENV['EXPRIATION_DAYS'] ? ENV['EXPRIATION_DAYS'].to_i : 21 # default to 3 weeks
+ end
+
private
def sign_in_url
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 5a232e19b..1e723e3ed 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -23,11 +23,7 @@ def create
end
def health
- if ApplicationRecord.connected?
- render plain: Time.current
- else
- head :internal_server_error
- end
+ render plain: Time.current
end
private
diff --git a/app/decorators/home_decorator.rb b/app/decorators/home_decorator.rb
index 5c9e0c8c8..ccae14266 100644
--- a/app/decorators/home_decorator.rb
+++ b/app/decorators/home_decorator.rb
@@ -20,7 +20,7 @@ def most_active_contributors
def commit_count
projects = most_active_projects
map = projects.map do |project|
- project.best_analysis.thirty_day_summary.commits_count if project.best_analysis.present?
+ project.best_analysis&.thirty_day_summary&.commits_count
end
map.compact
end
diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb
index c53a12708..5a5f974a8 100644
--- a/app/helpers/dashboard_helper.rb
+++ b/app/helpers/dashboard_helper.rb
@@ -27,28 +27,47 @@ def get_revision_details
end
def accounts_count(level)
- number_with_delimiter(Account.where(level: level).count)
+ Rails.cache.fetch("Admin-accounts-count-cache_#{level}", expires_in: 1.day) do
+ number_with_delimiter(Account.group(:level).size[level])
+ end
end
- def updated_projects_count(from, to = nil)
- from = convert_to_datetime(from)
- to = convert_to_datetime(to) || Time.current
- projects_count = Project.active_enlistments.joins(:best_analysis)
- .where(analyses: { updated_on: from..to }).distinct.count
+ def days_projects_count
+ projects_count = Rails.cache.fetch('Admin-updated-project-count-cache')
number_to_percentage((projects_count.to_f / active_projects_count) * 100, precision: 2)
end
- def outdated_projects(date)
- projects_count = Project.active_enlistments.joins(:best_analysis)
- .where('analyses.updated_on < ?', date).distinct.count
+ def weeks_projects_count
+ projects_count = Rails.cache.fetch('Admin-updated-project-count-cache')
number_to_percentage((projects_count.to_f / active_projects_count) * 100, precision: 2)
end
- def convert_to_datetime(value)
- Time.current.ago(value).utc if value
+ def outdated_projects
+ projects_count = Rails.cache.fetch('Admin-outdated-project-count-cache') || 0
+ number_to_percentage((projects_count.to_f / active_projects_count) * 100, precision: 2)
end
def active_projects_count
- Project.active_enlistments.distinct.count
+ Rails.cache.fetch('Admin-active-project-count-cache') { Project.active_enlistments.distinct.size }
+ end
+
+ def analyses_count
+ Rails.cache.fetch('Admin-project-analyses-count-cache') || 0
+ end
+
+ def project_count
+ Rails.cache.fetch('Admin-project-count-cache') { Project.active.size }
+ end
+
+ def admin_project_trends
+ Rails.cache.fetch 'admin_project_trend', expires_in: 1.day do
+ render partial: 'project_trend_graph'
+ end
+ end
+
+ def admin_accounts_trends
+ Rails.cache.fetch 'admin_accounts_trend', expires_in: 1.day do
+ render partial: 'accounts_trend_graph'
+ end
end
end
diff --git a/app/helpers/statsd_helper.rb b/app/helpers/statsd_helper.rb
index c077d8685..88cbc0d1c 100644
--- a/app/helpers/statsd_helper.rb
+++ b/app/helpers/statsd_helper.rb
@@ -2,10 +2,10 @@
module StatsdHelper
def statsd_increment(msg)
- StatsD.increment(msg) unless ENV['KUBERNETES_PORT']
+ StatsD.increment(msg) if Rails.env.development?
end
def statsd_set(msg, params)
- StatsD.set(msg, params) unless ENV['KUBERNETES_PORT']
+ StatsD.set(msg, params) if Rails.env.development?
end
end
diff --git a/app/lib/data_dog_report.rb b/app/lib/data_dog_report.rb
index 630c3ae2d..b0bbac4ed 100644
--- a/app/lib/data_dog_report.rb
+++ b/app/lib/data_dog_report.rb
@@ -1,17 +1,16 @@
# frozen_string_literal: true
+# rubocop:disable Rails/Output
+
module DataDogReport
module_function
def error(message)
- request = DatadogAPIClient::V1::EventCreateRequest.new(text: message.truncate(4000),
- title: "OpenHub #{Rails.env} Error",
- alert_type: :error, date_happened: Time.current.to_i,
- host: ENV['HOSTNAME'])
- api_instance.create_event(request)
+ puts message
end
def api_instance
DatadogAPIClient::V1::EventsAPI.new
end
end
+# rubocop:enable Rails/Output
diff --git a/app/models/account.rb b/app/models/account.rb
index d69711c9b..37ac234df 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -125,5 +125,9 @@ def fetch_by_login_or_email(username_or_email)
def find_or_create_anonymous_account
find_by(login: AnonymousAccount::LOGIN) || AnonymousAccount.create!
end
+
+ def maintenance
+ logged_in.find_each(&:reset_remember_token!)
+ end
end
end
diff --git a/app/models/concerns/account_scopes.rb b/app/models/concerns/account_scopes.rb
index 08f60cb05..65089e1b6 100644
--- a/app/models/concerns/account_scopes.rb
+++ b/app/models/concerns/account_scopes.rb
@@ -3,6 +3,7 @@
module AccountScopes
ANONYMOUS_ACCOUNTS = %w[anonymous_coward ohloh_slave uber_data_crawler].freeze
ANONYMOUS_ACCOUNTS_EMAILS = %w[anon@openhub.net info@openhub.net uber_data_crawler@openhub.net].freeze
+ EXPIRATION_DAYS = (ENV['EXPIRATION_DAYS'].to_i || 21).days
extend ActiveSupport::Concern
@@ -33,6 +34,7 @@ module AccountScopes
scope :in_good_standing, -> { where('level >= 0') }
scope :from_param, ->(param) { in_good_standing.where(arel_table[:login].eq(param).or(arel_table[:id].eq(param))) }
scope :active, -> { where(level: 0) }
+ scope :logged_in, -> { where("last_seen_at > '#{EXPIRATION_DAYS.ago}'") }
scope :non_anonymous, -> { where.not(login: ANONYMOUS_ACCOUNTS, email: ANONYMOUS_ACCOUNTS_EMAILS) }
scope :reverification_not_initiated, lambda { |limit = 0|
diff --git a/app/models/concerns/project_scopes.rb b/app/models/concerns/project_scopes.rb
index cb9531a87..6f61a553c 100644
--- a/app/models/concerns/project_scopes.rb
+++ b/app/models/concerns/project_scopes.rb
@@ -48,6 +48,6 @@ module ProjectScopes
.having('count(*) >= ?', tags.split.flatten.length)
}
scope :with_analysis, -> { active.where.not(best_analysis_id: nil) }
- scope :active_enlistments, -> { active.joins(:enlistments).where(enlistments: { deleted: false }) }
+ scope :active_enlistments, -> { active.joins(:enlistments) }
end
end
diff --git a/app/views/oh_admin/dashboard/_accounts_trend_graph.html.haml b/app/views/oh_admin/dashboard/_accounts_trend_graph.html.haml
new file mode 100644
index 000000000..9d7903c11
--- /dev/null
+++ b/app/views/oh_admin/dashboard/_accounts_trend_graph.html.haml
@@ -0,0 +1,26 @@
+:ruby
+ chart_url = charts_oh_admin_accounts_url.to_s
+
+#three_months.account
+ %h1 3 Months Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=3' + '&filter_by=weekly' }
+
+#six_months.account
+ %h1 6 Months Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=6' + '&filter_by=weekly'}
+
+#one_year.account
+ %h1 1 Year Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=12' + '&filter_by=weekly'}
+
+#three_months_monthly.account
+ %h1 3 Months Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=3' + '&filter_by=monthly'}
+
+#six_months_monthly.account
+ %h1 6 Months Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=6' + '&filter_by=monthly'}
+
+#one_year_monthly.account
+ %h1 1 Year Accounts Creation Trend
+ .chart{ 'datasrc' => chart_url + '?period=12' + '&filter_by=monthly'}
\ No newline at end of file
diff --git a/app/views/oh_admin/dashboard/_project_trend_graph.html.haml b/app/views/oh_admin/dashboard/_project_trend_graph.html.haml
new file mode 100644
index 000000000..1a80392ad
--- /dev/null
+++ b/app/views/oh_admin/dashboard/_project_trend_graph.html.haml
@@ -0,0 +1,26 @@
+:ruby
+ project_chart_url = charts_oh_admin_projects_url.to_s
+
+#three_months_project.project
+ %h1 3 Months Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=3' + '&filter_by=weekly' }
+
+#six_months_project.project
+ %h1 6 Months Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=6' + '&filter_by=weekly'}
+
+#one_year_project.project
+ %h1 1 Year Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=12' + '&filter_by=weekly'}
+
+#three_months_monthly_project.project
+ %h1 3 Months Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=3' + '&filter_by=monthly'}
+
+#six_months_monthly_project.project
+ %h1 6 Months Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=6' + '&filter_by=monthly'}
+
+#one_year_monthly_project.project
+ %h1 1 Year Projects Creation Trend
+ .chart{ 'datasrc' => project_chart_url + '?period=12' + '&filter_by=monthly'}
\ No newline at end of file
diff --git a/app/views/oh_admin/dashboard/index.html.haml b/app/views/oh_admin/dashboard/index.html.haml
index dd382b459..51cc93ce5 100644
--- a/app/views/oh_admin/dashboard/index.html.haml
+++ b/app/views/oh_admin/dashboard/index.html.haml
@@ -9,18 +9,13 @@
'Projects with enlistments & Best Analysis (Not updated since 2 weeks)']
project_colors = ['bg-aqua', 'bg-green', 'bg-light-blue-active', 'bg-green', 'bg-yellow', 'bg-red']
project_icons = ['fa-area-chart', 'fa-bar-chart', 'fa-shield']
- analyses_count = Analysis.where(updated_on: get_window.utc..Time.current).count
- project_values = [analyses_count, Project.active.count, active_projects_count, updated_projects_count(3.days),
- updated_projects_count(2.weeks, 3.days), outdated_projects(2.weeks.ago.to_date)]
+ project_values = [analyses_count, project_count, active_projects_count, days_projects_count, weeks_projects_count, outdated_projects]
last_activity_icons = ['fa-calendar', 'fa-check-square', 'fa-server']
last_activity_text = ['Monthly Language Analysis', 'CII Projects', 'Deployment']
last_activity_info = [Analysis::MonthlyLanguage.last_run, ProjectBadge.check_cii_projects_last_run, last_deployment]
last_activity_bg = ['bg-aqua', 'bg-green', 'bg-yellow']
- chart_url = charts_oh_admin_accounts_url.to_s
- project_chart_url = charts_oh_admin_projects_url.to_s
-
%h1 Project Stats Overview
%p
.row
@@ -58,29 +53,7 @@
%input{name: "project_filter", type: "radio", value: "monthly"}
by monthly
-#three_months_project.project
- %h1 3 Months Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=3' + '&filter_by=weekly' }
-
-#six_months_project.project
- %h1 6 Months Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=6' + '&filter_by=weekly'}
-
-#one_year_project.project
- %h1 1 Year Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=12' + '&filter_by=weekly'}
-
-#three_months_monthly_project.project
- %h1 3 Months Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=3' + '&filter_by=monthly'}
-
-#six_months_monthly_project.project
- %h1 6 Months Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=6' + '&filter_by=monthly'}
-
-#one_year_monthly_project.project
- %h1 1 Year Projects Creation Trend
- .chart{ 'datasrc' => project_chart_url + '?period=12' + '&filter_by=monthly'}
+ = admin_project_trends
%h1 Accounts Overview
%p
@@ -114,29 +87,7 @@
%input{name: "radio", type: "radio", value: "monthly"}
by monthly
-#three_months.account
- %h1 3 Months Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=3' + '&filter_by=weekly' }
-
-#six_months.account
- %h1 6 Months Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=6' + '&filter_by=weekly'}
-
-#one_year.account
- %h1 1 Year Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=12' + '&filter_by=weekly'}
-
-#three_months_monthly.account
- %h1 3 Months Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=3' + '&filter_by=monthly'}
-
-#six_months_monthly.account
- %h1 6 Months Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=6' + '&filter_by=monthly'}
-
-#one_year_monthly.account
- %h1 1 Year Accounts Creation Trend
- .chart{ 'datasrc' => chart_url + '?period=12' + '&filter_by=monthly'}
+ = admin_accounts_trends
%h1 Last Activities
diff --git a/config/application.rb b/config/application.rb
index 76e17f9ea..4f9e49654 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -40,7 +40,7 @@ class Application < Rails::Application
config.passenger_version = matches ? matches[0] : '???'
redis_config = { host: ENV['REDIS_HOST'], port: ENV['REDIS_PORT'], namespace: ENV['REDIS_NAMESPACE'] }
- redis_config[:password] = ENV['REDIS_PASSWORD'] unless ENV['KUBERNETES_PORT']
+ redis_config[:password] = ENV['REDIS_PASSWORD'] if Rails.env.development?
config.cache_store = :redis_store, redis_config
config.action_dispatch.default_headers = { 'X-Content-Type-Options' => 'nosniff' }
config.active_record.dump_schemas = :all
diff --git a/config/environments/production.rb b/config/environments/production.rb
index c685b76ea..1921a2b5d 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -1,6 +1,5 @@
# frozen_string_literal: true
-# rubocop:disable Metrics/BlockLength
Rails.application.configure do
# Settings specified here will take precedence over those in
# config/application.rb.
@@ -68,20 +67,15 @@
# raise delivery errors.
# config.action_mailer.raise_delivery_errors = false
- if ENV['KUBERNETES_PORT']
- config.action_mailer.smtp_settings = {
- user_name: 'apikey', # This is the string literal 'apikey', NOT the ID of your API key
- password: ENV['SENDGRID_API_KEY'], # This is the secret sendgrid API key which was issued during API key creation
- domain: 'openhub.net',
- address: 'smtp.sendgrid.net',
- port: 587,
- authentication: :plain,
- enable_starttls_auto: true
- }
- else
- config.action_mailer.smtp_settings = { address: ENV['SMTP_ADDRESS'],
- openssl_verify_mode: OpenSSL::SSL::VERIFY_NONE }
- end
+ config.action_mailer.smtp_settings = {
+ user_name: 'apikey', # This is the string literal 'apikey', NOT the ID of your API key
+ password: ENV['SENDGRID_API_KEY'], # This is the secret sendgrid API key which was issued during API key creation
+ domain: 'openhub.net',
+ address: 'smtp.sendgrid.net',
+ port: 587,
+ authentication: :plain,
+ enable_starttls_auto: true
+ }
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation cannot be found).
config.i18n.fallbacks = true
@@ -102,4 +96,3 @@
SqlTracker::Config.tracked_sql_command = %w[sloc_metrics]
SqlTracker::Config.output_path = File.join(ENV['SQL_TRACER_TEMP_PATH'] || '/tmp', 'sql_tracker')
end
-# rubocop:enable Metrics/BlockLength
diff --git a/config/initializers/clearance.rb b/config/initializers/clearance.rb
index 89af59da4..08aedc26f 100644
--- a/config/initializers/clearance.rb
+++ b/config/initializers/clearance.rb
@@ -8,4 +8,5 @@
config.rotate_csrf_on_sign_in = true
config.sign_in_guards = [Account::DisabledGuard]
config.user_model = Account
+ config.cookie_expiration = ->(_cookies) { ENV['EXPIRATION_DAYS'].to_i.days.from_now }
end
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index 4017a95c8..dea1a2168 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -2,14 +2,14 @@
Sidekiq.configure_server do |config|
redis_config = { url: "redis://#{ENV['REDIS_HOST']}:#{ENV['REDIS_PORT']}/0" }
- redis_config[:password] = ENV['REDIS_PASSWORD'] unless ENV['KUBERNETES_PORT']
- redis_config[:id] = nil if ENV['KUBERNETES_PORT']
+ redis_config[:password] = ENV['REDIS_PASSWORD'] if Rails.env.development?
+ redis_config[:id] = nil
config.redis = redis_config
end
Sidekiq.configure_client do |config|
redis_config = { url: "redis://#{ENV['REDIS_HOST']}:#{ENV['REDIS_PORT']}/0" }
- redis_config[:password] = ENV['REDIS_PASSWORD'] unless ENV['KUBERNETES_PORT']
- redis_config[:id] = nil if ENV['KUBERNETES_PORT']
+ redis_config[:password] = ENV['REDIS_PASSWORD'] if Rails.env.development?
+ redis_config[:id] = nil
config.redis = redis_config
end
diff --git a/lib/tasks/admin_project_stats.rake b/lib/tasks/admin_project_stats.rake
new file mode 100644
index 000000000..6f8a39704
--- /dev/null
+++ b/lib/tasks/admin_project_stats.rake
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+desc 'Updates the project stats in admin page'
+
+task admin_project_stats: :environment do
+ analyses_count = Project.joins(:best_analysis)
+ .where('analyses.updated_on >= ? and analyses.updated_on <= ?', 1.hour.ago, Time.current).size
+ Rails.cache.write('Admin-project-analyses-count-cache', analyses_count)
+
+ projects_count = Project.active.joins(:enlistments, :best_analysis)
+ .where('analyses.updated_on < ?', 2.weeks.ago.to_date).distinct.size
+ Rails.cache.write('Admin-outdated-project-count-cache', projects_count)
+
+ updated_project_count = Project.active.joins(:enlistments, :best_analysis)
+ .where(analyses: { updated_on: 3.days.ago..Time.current }).distinct.size
+ Rails.cache.write('Admin-updated-project-count-cache', updated_project_count)
+
+ weeks_updated_project_count = Project.active.joins(:enlistments, :best_analysis)
+ .where(analyses: { updated_on: 2.weeks.ago..3.days.ago }).distinct.size
+
+ Rails.cache.write('Admin-weeks-updated-project-count-cache', weeks_updated_project_count)
+end
diff --git a/test/controllers/application_controller_test.rb b/test/controllers/application_controller_test.rb
index 67c724deb..9ee77056f 100644
--- a/test/controllers/application_controller_test.rb
+++ b/test/controllers/application_controller_test.rb
@@ -8,7 +8,6 @@ class ApplicationControllerTest < ActionController::TestCase
@controller = TestController.new
@controller.request = @request
@controller.response = @response
- ENV['KUBERNETES_PORT'] = 'true'
end
it 'render_404 as html' do
@@ -107,15 +106,6 @@ class ApplicationControllerTest < ActionController::TestCase
Rails.application.config.unstub(:consider_all_requests_local)
end
- it 'must log errors to file when not on kubernetes' do
- Rails.application.config.stubs(:consider_all_requests_local).returns false
- ENV.delete('KUBERNETES_PORT')
- Logger.any_instance.expects(:error).times(3)
- get :throws_standard_error
- assert_response :not_found
- Rails.application.config.unstub(:consider_all_requests_local)
- end
-
it 'reports to Datadog on FisbotApiError' do
Rails.application.config.stubs(:consider_all_requests_local)
DataDogReport.expects(:error).once
@@ -273,6 +263,24 @@ class ApplicationControllerTest < ActionController::TestCase
get :index
_(account.reload.last_seen_ip).must_equal ip
end
+
+ it 'should access with valid token' do
+ login_as account
+ get :new
+ assert_response :success
+ end
+
+ it 'should not access if not logged in' do
+ get :new
+ assert_redirected_to '/sessions/new'
+ end
+
+ it 'should not access with invalid token' do
+ account.update!(last_seen_at: 4.weeks.ago)
+ login_as account
+ get :new
+ assert_redirected_to '/sessions/new'
+ end
end
end
end
diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb
index a0937f530..2d1cdea87 100644
--- a/test/controllers/sessions_controller_test.rb
+++ b/test/controllers/sessions_controller_test.rb
@@ -77,7 +77,6 @@ class SessionsControllerTest < ActionController::TestCase
account.update!(auth_fail_count: auth_fail_count)
DataDogReport.expects(:error)
- AccountMailer.expects(:notify_disabled_account_for_login_failure).returns(stub(deliver_now: nil))
@controller.expects(:verify_recaptcha).returns(true)
post :create, params: { login: { login: account.login }, 'g-recaptcha-response': Faker::Internet.password }
@@ -126,11 +125,5 @@ class SessionsControllerTest < ActionController::TestCase
assert_response :success
_(response.body).must_match Time.current.strftime('%F %H')
end
-
- it 'must return status 500 when DB is inaccessible' do
- ActiveRecord::Base.stubs(:connected?)
- get :health
- _(response.status).must_equal 500
- end
end
end
diff --git a/test/decorators/home_decorator_test.rb b/test/decorators/home_decorator_test.rb
index 1c88a2472..a0083616e 100644
--- a/test/decorators/home_decorator_test.rb
+++ b/test/decorators/home_decorator_test.rb
@@ -11,5 +11,22 @@ class HomeDecoratorTest < ActiveSupport::TestCase
project.best_analysis.thirty_day_summary.update! affiliated_commits_count: commits_count
_(HomeDecorator.new.commit_count).must_equal [commits_count]
end
+
+ it 'must handle nil thirty_day_summary values' do
+ project = create(:project)
+
+ commits_count = 5
+ project.best_analysis.thirty_day_summary.update! affiliated_commits_count: commits_count
+
+ bad_project = create(:project)
+ bad_project.best_analysis.thirty_day_summary.destroy
+ bad_project.reload
+
+ home_decorator = HomeDecorator.new
+ # Simulate a scenario where cached most_active_projects has a project which now misses a thirty_day_summary.
+ home_decorator.stubs(:most_active_projects).returns([project, bad_project])
+
+ _(home_decorator.commit_count).must_equal [commits_count]
+ end
end
end
diff --git a/test/helpers/dashboard_helper_test.rb b/test/helpers/dashboard_helper_test.rb
index 031c874a9..28f5b4644 100644
--- a/test/helpers/dashboard_helper_test.rb
+++ b/test/helpers/dashboard_helper_test.rb
@@ -18,4 +18,12 @@ class DashboardHelperTest < ActionView::TestCase
_(get_revision_details).must_equal [commit_sha.strip, time]
end
+
+ it 'must return active project count' do
+ _(project_count).must_equal Project.active.count
+ end
+
+ it 'must return active enlistments project count' do
+ _(active_projects_count).must_equal Project.active_enlistments.distinct.size
+ end
end
diff --git a/test/integration/admin/accounts_admin_test.rb b/test/integration/admin/accounts_admin_test.rb
index ef39613f1..5b3c3c9ca 100644
--- a/test/integration/admin/accounts_admin_test.rb
+++ b/test/integration/admin/accounts_admin_test.rb
@@ -69,6 +69,22 @@ class AccountsAdminTest < ActionDispatch::IntegrationTest
assert_response :success
end
+ it 'redirects to ' do
+ # TODO: this test is failing on routes path
+ account = create(:account)
+ create_and_login_admin
+ get admin_account_path(account)
+ get maintenance_admin_accounts_path, headers: { 'HTTP_REFERER' => admin_account_path }
+ _(flash[:notice]).must_equal 'Accounts successfully logged out'
+ end
+
+ it 'tests maintenance route' do
+ create(:account)
+ create_and_login_admin
+ opts = { controller: 'admin/accounts', action: 'index' }
+ assert_routing '/admin/accounts', opts
+ end
+
it 'shows the edit page' do
account = create(:account)
create_and_login_admin
diff --git a/test/lib/data_dog_report_test.rb b/test/lib/data_dog_report_test.rb
index f7d476fcd..6e8571685 100644
--- a/test/lib/data_dog_report_test.rb
+++ b/test/lib/data_dog_report_test.rb
@@ -5,8 +5,7 @@
class DataDogReportTest < ActiveSupport::TestCase
it 'must send a create_event request to Datadog' do
VCR.use_cassette('datadog_error_request') do
- response = DataDogReport.error('This is an error sample')
- _(response.to_hash[:status]).must_equal 'ok'
+ assert_output(/This is error sample/) { DataDogReport.error('This is error sample') }
end
end
end
diff --git a/test/models/account_test.rb b/test/models/account_test.rb
index 0edc78af4..55997cb71 100644
--- a/test/models/account_test.rb
+++ b/test/models/account_test.rb
@@ -215,6 +215,24 @@ class AccountTest < ActiveSupport::TestCase
_(recently_active.count).must_equal 0
end
+ it 'should return no logged in accounts' do
+ logged_in = Account.logged_in
+ _(logged_in).must_be_empty
+ _(logged_in.count).must_equal 0
+ end
+
+ it 'should return all logged in accounts' do
+ create(:account, login: 'account-test', last_seen_at: DateTime.now)
+ logged_in = Account.logged_in
+ _(logged_in.count).must_equal 1
+ end
+
+ it 'should return all non-expired accounts' do
+ create(:account, login: 'account-test', last_seen_at: 22.days.ago)
+ logged_in = Account.logged_in
+ _(logged_in.count).must_equal 0
+ end
+
it 'should not include BOT accounts in active accounts' do
best_account_analysis = create(:best_account_analysis)
level = Account::Access::BOT
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 5d291f745..2a8ea5956 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -6,7 +6,7 @@
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
SimpleCov.start 'rails'
-SimpleCov.minimum_coverage 99.49
+SimpleCov.minimum_coverage 99.48
require 'dotenv'
Dotenv.load '.env.test'