Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions app/helpers/mission_control/jobs/interface_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ def blank_status_emoji(status)
end
end

def jobs_count_for(status)
count = ActiveJob.jobs.with_status(status).count
value = count.infinite? ? MissionControl::Jobs.count_limit : count
suffix = count.infinite? ? "+" : ""

units = { thousand: "K", million: "M", billion: "B", trillion: "T", quadrillion: "Q" }

number_to_human(value, format: "%n%u", units: units) + suffix
end

def modifier_for_status(status)
case status.to_s
when "failed" then "is-danger"
Expand Down
2 changes: 1 addition & 1 deletion app/views/mission_control/jobs/jobs/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
<% if @jobs_page.empty? %>
<%= blank_status_notice "No #{jobs_status.dasherize} jobs found with the given filters" %>
<% else %>
<%= "Total #{jobs_status.titleize} jobs: #{jobs_count_for(jobs_status)}" %>
<%= render "mission_control/jobs/jobs/jobs_page", jobs_page: @jobs_page %>

<%= render "mission_control/jobs/shared/pagination_toolbar", page: @jobs_page, filter_param: jobs_filter_param %>
<% end %>
<% end %>

119 changes: 119 additions & 0 deletions test/helpers/interface_helper_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
require "test_helper"

class MissionControl::Jobs::InterfaceHelperTest < ActionView::TestCase
include MissionControl::Jobs::InterfaceHelper

test "jobs_count_for returns formatted count for finite numbers" do
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ :failed ]
mock_count.expect :count, 1000

result = jobs_count_for(:failed)
assert_equal "1K", result

mock_with_status.verify
mock_count.verify
end
end

test "jobs_count_for returns formatted count with plus suffix for infinite count" do
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ :failed ]
mock_count.expect :count, Float::INFINITY

result = jobs_count_for(:failed)
expected = number_to_human(MissionControl::Jobs.count_limit,
format: "%n%u",
units: { thousand: "K", million: "M", billion: "B", trillion: "T", quadrillion: "Q" }) + "+"

assert_equal expected, result

mock_with_status.verify
mock_count.verify
end
end

test "jobs_count_for works with different statuses" do
statuses = [ :pending, :finished, :failed, :blocked, :scheduled, :in_progress ]

statuses.each do |status|
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ status ]
mock_count.expect :count, 1000

result = jobs_count_for(status)
assert_equal "1K", result

mock_with_status.verify
mock_count.verify
end
end
end

test "jobs_count_for handles zero count" do
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ :pending ]
mock_count.expect :count, 0

result = jobs_count_for(:pending)
assert_equal "0", result

mock_with_status.verify
mock_count.verify
end
end

test "jobs_count_for handles small numbers without abbreviation" do
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ :pending ]
mock_count.expect :count, 500

result = jobs_count_for(:pending)
assert_equal "500", result

mock_with_status.verify
mock_count.verify
end
end

test "jobs_count_for handles large numbers with proper formatting" do
test_cases = [
[ 1500, "1.5K" ],
[ 2500000, "2.5M" ],
[ 1000000000, "1B" ],
[ 1000000000000, "1T" ],
[ 1000000000000000, "1Q" ]
]

test_cases.each do |count, expected|
mock_with_status = Minitest::Mock.new
mock_count = Minitest::Mock.new

ActiveJob.stub :jobs, mock_with_status do
mock_with_status.expect :with_status, mock_count, [ :finished ]
mock_count.expect :count, count

result = jobs_count_for(:finished)
assert_equal expected, result

mock_with_status.verify
mock_count.verify
end
end
end
end