From 692f7b162d834da4ba6586200067f793d5da6abc Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Fri, 5 Sep 2025 10:40:47 -0400 Subject: [PATCH 1/7] basic test --- .../dashboard/test/system/active_jobs_test.rb | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 apps/dashboard/test/system/active_jobs_test.rb diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb new file mode 100644 index 0000000000..81972c1e17 --- /dev/null +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +require 'application_system_test_case' +require 'ood_core/job/adapters/slurm' + +class ActiveJobsTest < ApplicationSystemTestCase + JavascriptWaitTime = 5 + # Set alias + NodeInfo = OodCore::Job::NodeInfo + + def setup + # Enable routes guarded by this flag + Configuration.stubs(:can_access_activejobs?).returns(true) + + testclusters = OodCore::Clusters.load_file('test/fixtures/config/clusters.d') + # Use one cluster here to prevent duplicate jobs + ActiveJobs::JobsJsonRequestHandler.any_instance.stubs(:clusters).returns([testclusters.first]) + OodCore::Cluster.any_instance.stubs(:job_config).returns({adapter:'slurm'}) + jobs = [ + OodCore::Job::Info.new( + id: '123', + job_name: 'Sample1', + accounting_id: 'account1', + queue_name: 'normal', + wallclock_time: 3600, + job_owner: "not_currentuser", + allocated_nodes: [NodeInfo.new(name: 'node001'), NodeInfo.new(name: 'node002')], + status: :running + ), + OodCore::Job::Info.new( + id: '345', + job_name: 'Sample2', + accounting_id: 'account2', + queue_name: 'short', + wallclock_time: 120, + job_owner: "currentuser", + allocated_nodes: [NodeInfo.new(name: 'node003')], + status: :queued + ), + OodCore::Job::Info.new( + id: '567', + job_name: 'Sample3', + accounting_id: 'account3', + queue_name: 'short', + wallclock_time: 120, + job_owner: "currentuser", + allocated_nodes: [NodeInfo.new(name: 'node001'), NodeInfo.new(name: 'node002')], + status: :queued + ), + OodCore::Job::Info.new( + id: '789', + job_name: 'Sample4', + accounting_id: 'account4', + queue_name: 'short', + wallclock_time: 120, + job_owner: "not_currentuser", + allocated_nodes: [NodeInfo.new(name: 'node003')], + status: :queued + ) + ] + + # These stubs need to change for multi-cluster tests + OodCore::Job::Adapter.any_instance.stubs(:supports_job_arrays?).returns(true) + OodCore::Job::Adapter.any_instance.stubs(:info_where_owner_each).returns(jobs.select{ |job| job.job_owner == 'currentuser'}) + OodCore::Job::Adapter.any_instance.stubs(:info_all_each).returns(jobs) + end + + + test 'defaults to your jobs' do + visit active_jobs_url(cluster_id:'all') + # Finish loading + assert_selector '#job_status_table tbody tr', minimum: 1 + # The UI should default to the "Your Jobs" filter + assert_selector('#selected-filter-label', text: 'Your Jobs') + # The list should have exactly two jobs in it + box = find('#job_status_table tbody') + rows = box.all('tr') + assert_equal 2, rows.length + # Test row content (dropping the button which has no text) + first_row_text = rows[0].all('td').map(&:text).drop(1) + expected_fr = [ + '345', + 'Sample2', + 'currentuser', + 'account2', + '00:02:00', + 'short', + 'Queued', + 'Oakley', + '' + ] + assert_equal 9, first_row_text.length + assert_equal expected_fr, first_row_text + + second_row_text = rows[1].all('td').map(&:text).drop(1) + expected_sr = [ + '567', + 'Sample3', + 'currentuser', + 'account3', + '00:02:00', + 'short', + 'Queued', + 'Oakley', + '' + ] + assert_equal 9, second_row_text.length + assert_equal expected_sr, second_row_text + + # check buttons + assert_equal 2, all('#job_status_table .details-control').length + end +end From 015e22cae8a1d8963fc01b091e2480c5b1d64862 Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Mon, 8 Sep 2025 03:26:14 -0400 Subject: [PATCH 2/7] added tests for buttons --- .../dashboard/test/system/active_jobs_test.rb | 192 +++++++++++++++++- 1 file changed, 184 insertions(+), 8 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index 81972c1e17..48bdb7c428 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -8,6 +8,32 @@ class ActiveJobsTest < ApplicationSystemTestCase # Set alias NodeInfo = OodCore::Job::NodeInfo + DetailsHeaders = [ + 'Cluster', + 'Job Id', + 'Array Job Id', + 'Array Task Id', + 'Job Name', + 'User', + 'Account', + 'Partition', + 'State', + 'Reason', + 'Total Nodes', + 'Total CPUs', + 'Time Limit', + 'Time Used', + 'Start Time', + 'End Time', + 'Memory', + 'GRES' + ] + + # Define selector statements + MainbodySelect = '#job_status_table tbody' + ButtonSelect = "#{MainbodySelect} .details-control" + DetailsSelect = "#{MainbodySelect} div.panel.panel-default" + def setup # Enable routes guarded by this flag Configuration.stubs(:can_access_activejobs?).returns(true) @@ -35,7 +61,21 @@ def setup wallclock_time: 120, job_owner: "currentuser", allocated_nodes: [NodeInfo.new(name: 'node003')], - status: :queued + status: :queued, + native: { + array_job_id: '12345', + array_task_id: '1', + state: 'running', + reason: 'None', + nodes: 2, + cpus: 64, + time_limit: '01:00:00', + start_time: '2025-08-28T14:00:00', + end_time: '2025-08-28T15:00:00', + min_memory: '128GB', + gres: 'gres:gpu:2', + work_dir: '/home/user/slurm_job' + } ), OodCore::Job::Info.new( id: '567', @@ -63,17 +103,25 @@ def setup OodCore::Job::Adapter.any_instance.stubs(:supports_job_arrays?).returns(true) OodCore::Job::Adapter.any_instance.stubs(:info_where_owner_each).returns(jobs.select{ |job| job.job_owner == 'currentuser'}) OodCore::Job::Adapter.any_instance.stubs(:info_all_each).returns(jobs) + # Stub the info method one by one (this one had to be slurm specific for some reason) + jobs.each do |job| + OodCore::Job::Adapters::Slurm.any_instance.stubs(:info).with(job.id).returns(job) + end + # Allow OODClusters to respond to Oakley + OODClusters.stubs(:[]).with(:oakley).returns(testclusters.first) + OODClusters.stubs(:[]).with('oakley').returns(testclusters.first) + OODClusters.stubs(:[]).with('all').returns(testclusters) end - test 'defaults to your jobs' do - visit active_jobs_url(cluster_id:'all') + visit active_jobs_url + # Finish loading - assert_selector '#job_status_table tbody tr', minimum: 1 + assert_selector("#{MainbodySelect} tr", minimum: 2) # The UI should default to the "Your Jobs" filter assert_selector('#selected-filter-label', text: 'Your Jobs') # The list should have exactly two jobs in it - box = find('#job_status_table tbody') + box = find(MainbodySelect) rows = box.all('tr') assert_equal 2, rows.length # Test row content (dropping the button which has no text) @@ -107,7 +155,135 @@ def setup assert_equal 9, second_row_text.length assert_equal expected_sr, second_row_text - # check buttons - assert_equal 2, all('#job_status_table .details-control').length + # Check buttons + assert_equal 2, all(ButtonSelect).length + + # Click buttons + all(ButtonSelect).map(&:click) + + + # Wait for load + assert_selector("#{DetailsSelect} tr") + + # Confirm details + card_header_items = all("#{DetailsSelect} div.card-header span") + exp_header_data = ['Queued', 'Sample2', '345'] + assert_equal exp_header_data, card_header_items.map(&:text) + + headers = all("#{DetailsSelect} div.card-body td.col-xs-2") + details = all("#{DetailsSelect} div.card-body td.col-xs-10") + + exp_details = [ + 'Oakley', + '345', + '12345', + '1', + 'Sample2', + 'currentuser', + 'account2', + 'short', + 'running', + 'None', + '2', + '64', + '01:00:00', + '00:02:00', + '2025-08-28 14:00:00', + '2025-08-28 15:00:00', + '128GB', + 'gpu:2' + ] + + assert_equal DetailsHeaders, headers.map(&:text) + assert_equal exp_details, details.map(&:text) + + assert_selector('div.alert-warning') + end + + + test 'refreshes when filter is switched' do + visit active_jobs_url#(cluster_id: 'all') + + # Finish loading + assert_selector("#{MainbodySelect} tr", minimum: 2) + + # Open the filters dropdown (first group is filters) + first('div.btn-group').find('button.dropdown-toggle').click + click_on 'All Jobs' + + # The page should reload with the new filter in the query string + assert_match(/jobfilter=all/, page.current_url) + assert_selector('#selected-filter-label', text: 'All Jobs') + + # Check number of rows + assert_selector("#{MainbodySelect} tr", minimum: 4) + + # Check non-user job info + assert_text('Sample1') + assert_text('Sample4') + assert_text('account1') + assert_text('account4') + assert_text('not_currentuser') + + # Switch back to your jobs + first('div.btn-group').find('button.dropdown-toggle').click + click_on 'Your Jobs' + + # Check url + assert_match(/jobfilter=user/, page.current_url) + assert_selector('#selected-filter-label', text: 'Your Jobs') + + # Check non-user info is not displayed + refute_text('Sample1') + refute_text('Sample4') + refute_text('account1') + refute_text('account4') + refute_text('not_currentuser') + end + + test 'many jobs paginate' do + # duplicate jobs and fix id overlap + current_jobs = OodCore::Job::Adapter.new.info_all_each + id = 0 + new_jobs = (current_jobs*100).map do |job| + id += 1 + OodCore::Job::Info.new(**job.to_h.merge({id: id.to_s})) + end + OodCore::Job::Adapter.any_instance.stubs(:info_all_each).returns(new_jobs) + + visit active_jobs_url(jobfilter:'all') + + # Finish loading + assert_selector("#{MainbodySelect} tr", minimum: 50) + + # Grab first row text + first_row = first("#{MainbodySelect} tr") + first_row_text = first_row.all('td').map(&:text).drop(1) + + # check pager text + assert_text('Showing 1 to 50 of 400 entries') + + # check pager object + pager_select = 'div#job_status_table_paginate' + assert_selector(pager_select) + + # check highlight + assert_selector("#{pager_select} li.active", text: '1') + + # Show next page + find("#{pager_select} li", text: '2').click + + # Finish loading + assert_selector("#{MainbodySelect} tr", minimum: 50) + + # Ensure rows changed + new_row = first("#{MainbodySelect} tr") + new_row_text = new_row.all('td').map(&:text).drop(1) + + # Ensure highlight changed + assert_selector("#{pager_select} li.active", text: '2') + + # Ensure text changed + assert_text('Showing 51 to 100 of 400 entries') end -end +end \ No newline at end of file From c0a0a8f6627b614030d9f9c33a097d2b1c63e6ef Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Tue, 9 Sep 2025 12:54:59 -0400 Subject: [PATCH 3/7] finished tests --- .../dashboard/test/system/active_jobs_test.rb | 205 ++++++++++++++---- 1 file changed, 167 insertions(+), 38 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index 48bdb7c428..3b963ff737 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -31,8 +31,7 @@ class ActiveJobsTest < ApplicationSystemTestCase # Define selector statements MainbodySelect = '#job_status_table tbody' - ButtonSelect = "#{MainbodySelect} .details-control" - DetailsSelect = "#{MainbodySelect} div.panel.panel-default" + PagerSelect = 'div#job_status_table_paginate' def setup # Enable routes guarded by this flag @@ -85,7 +84,7 @@ def setup wallclock_time: 120, job_owner: "currentuser", allocated_nodes: [NodeInfo.new(name: 'node001'), NodeInfo.new(name: 'node002')], - status: :queued + status: :completed ), OodCore::Job::Info.new( id: '789', @@ -113,6 +112,17 @@ def setup OODClusters.stubs(:[]).with('all').returns(testclusters) end + def prepare_many_jobs(multiplier:) + # duplicate jobs and fix id overlap + current_jobs = OodCore::Job::Adapter.new.info_all_each + id = 0 + new_jobs = (current_jobs*multiplier).map do |job| + id += 1 + OodCore::Job::Info.new(**job.to_h.merge({id: id.to_s})) + end + OodCore::Job::Adapter.any_instance.stubs(:info_all_each).returns(new_jobs) + end + test 'defaults to your jobs' do visit active_jobs_url @@ -121,9 +131,8 @@ def setup # The UI should default to the "Your Jobs" filter assert_selector('#selected-filter-label', text: 'Your Jobs') # The list should have exactly two jobs in it - box = find(MainbodySelect) - rows = box.all('tr') - assert_equal 2, rows.length + rows = all("#{MainbodySelect} tr") + assert_equal 2, rows.length # Test row content (dropping the button which has no text) first_row_text = rows[0].all('td').map(&:text).drop(1) expected_fr = [ @@ -148,7 +157,7 @@ def setup 'account3', '00:02:00', 'short', - 'Queued', + 'Completed', 'Oakley', '' ] @@ -156,22 +165,24 @@ def setup assert_equal expected_sr, second_row_text # Check buttons - assert_equal 2, all(ButtonSelect).length + button_select = "#{MainbodySelect} .details-control" + assert_equal 2, all(button_select).length # Click buttons - all(ButtonSelect).map(&:click) + all(button_select).map(&:click) # Wait for load - assert_selector("#{DetailsSelect} tr") + details_select = "#{MainbodySelect} div.panel.panel-default" + assert_selector("#{details_select} tr") # Confirm details - card_header_items = all("#{DetailsSelect} div.card-header span") + card_header_items = all("#{details_select} div.card-header span") exp_header_data = ['Queued', 'Sample2', '345'] assert_equal exp_header_data, card_header_items.map(&:text) - headers = all("#{DetailsSelect} div.card-body td.col-xs-2") - details = all("#{DetailsSelect} div.card-body td.col-xs-10") + headers = all("#{details_select} div.card-body td.col-xs-2") + details = all("#{details_select} div.card-body td.col-xs-10") exp_details = [ 'Oakley', @@ -205,7 +216,7 @@ def setup visit active_jobs_url#(cluster_id: 'all') # Finish loading - assert_selector("#{MainbodySelect} tr", minimum: 2) + assert_selector("#{MainbodySelect} tr", count: 2) # Open the filters dropdown (first group is filters) first('div.btn-group').find('button.dropdown-toggle').click @@ -216,7 +227,7 @@ def setup assert_selector('#selected-filter-label', text: 'All Jobs') # Check number of rows - assert_selector("#{MainbodySelect} tr", minimum: 4) + assert_selector("#{MainbodySelect} tr", count: 4) # Check non-user job info assert_text('Sample1') @@ -242,19 +253,12 @@ def setup end test 'many jobs paginate' do - # duplicate jobs and fix id overlap - current_jobs = OodCore::Job::Adapter.new.info_all_each - id = 0 - new_jobs = (current_jobs*100).map do |job| - id += 1 - OodCore::Job::Info.new(**job.to_h.merge({id: id.to_s})) - end - OodCore::Job::Adapter.any_instance.stubs(:info_all_each).returns(new_jobs) + prepare_many_jobs(multiplier: 100) visit active_jobs_url(jobfilter:'all') # Finish loading - assert_selector("#{MainbodySelect} tr", minimum: 50) + assert_selector("#{MainbodySelect} tr", count: 50) # Grab first row text first_row = first("#{MainbodySelect} tr") @@ -264,26 +268,151 @@ def setup assert_text('Showing 1 to 50 of 400 entries') # check pager object - pager_select = 'div#job_status_table_paginate' - assert_selector(pager_select) - - # check highlight - assert_selector("#{pager_select} li.active", text: '1') + assert_selector(PagerSelect) - # Show next page - find("#{pager_select} li", text: '2').click + # check highlight and prev button + assert_selector("#{PagerSelect} li.active", text: '1') + assert_selector("#{PagerSelect} li.paginate_button.disabled", text: 'Previous') - # Finish loading - assert_selector("#{MainbodySelect} tr", minimum: 50) + # Show next page and repeat + find("#{PagerSelect} li", text: '2').click - # Ensure rows changed + assert_selector("#{MainbodySelect} tr", count: 50) new_row = first("#{MainbodySelect} tr") new_row_text = new_row.all('td').map(&:text).drop(1) + assert_selector("#{PagerSelect} li.active", text: '2') + refute_selector("#{PagerSelect} li.paginate_button.previous.disabled") + refute_selector("#{PagerSelect} li.paginate_button.next.disabled") + assert_text('Showing 51 to 100 of 400 entries') - # Ensure highlight changed - assert_selector("#{pager_select} li.active", text: '2') + # click next button and repeat + find("#{PagerSelect} li", text: 'Next').click + assert_selector("#{MainbodySelect} tr", count: 50) + assert_selector("#{PagerSelect} li.active", text: '3') + assert_text('Showing 101 to 150 of 400 entries') + + # Click last page + find("#{PagerSelect} li", text: '8').click + assert_selector("#{MainbodySelect} tr", count: 50) + assert_selector("#{PagerSelect} li.active", text: '8') + assert_selector("#{PagerSelect} li.paginate_button.disabled", text: 'Next') + assert_text('Showing 351 to 400 of 400 entries') + + # Click prev button + find("#{PagerSelect} li", text: 'Previous').click + assert_selector("#{MainbodySelect} tr", count: 50) + assert_selector("#{PagerSelect} li.active", text: '7') + assert_text('Showing 301 to 350 of 400 entries') + end - # Ensure text changed - assert_text('Showing 51 to 100 of 400 entries') + test 'results-per-page setting works' do + prepare_many_jobs(multiplier: 150) + + visit active_jobs_url(jobfilter: 'all') + + res_per_page_selector = 'div#job_status_table_length select' + assert_selector(res_per_page_selector, text: '50') + assert_selector("#{MainbodySelect} tr", count: 50) + assert_text('Showing 1 to 50 of 600 entries') + assert_selector("#{PagerSelect} li", text: '12') + + # Change setting + find(res_per_page_selector).click + find("#{res_per_page_selector} option[value='10']").click + assert_selector(res_per_page_selector, text: '10') + assert_selector("#{MainbodySelect} tr", count: 10) + assert_text('Showing 1 to 10 of 600 entries') + assert_selector("#{PagerSelect} li", text: '60') + + # Change setting + find(res_per_page_selector).click + find("#{res_per_page_selector} option[value='25']").click + assert_selector(res_per_page_selector, text: '25') + assert_selector("#{MainbodySelect} tr", count: 25) + assert_text('Showing 1 to 25 of 600 entries') + assert_selector("#{PagerSelect} li", text: '24') + + # Move page and select setting + find("#{PagerSelect} li", text: '5').click + assert_text('Showing 101 to 125 of 600 entries') + # Now changes should stay starting at 101 + find(res_per_page_selector).click + find("#{res_per_page_selector} option[value='50']").click + assert_text('Showing 101 to 150 of 600 entries') + assert_selector("#{PagerSelect} li.active", text: '3') + + # Use all setting + find(res_per_page_selector).click + find("#{res_per_page_selector} option[value='-1']").click + assert_selector(res_per_page_selector, text: 'All') + assert_selector("#{MainbodySelect} tr", count: 600) + assert_text('Showing 1 to 600 of 600 entries') + assert_selector("#{PagerSelect} li.active", text: '1') + refute_selector("#{PagerSelect} li", text: '2') + end + + test 'text filter works' do + visit active_jobs_url(jobfilter: 'all') + + # Verify filter input is rendered + filter_selector = 'div#job_status_table_filter input' + assert_selector(filter_selector) + + # Verify filter reads ids + find(filter_selector).set('345') + # Wait for load + assert_selector("#{MainbodySelect} tr") + assert_text '345' + assert_text 'Sample2' + assert_text 'account2' + + # Verify filter reads job names + find(filter_selector).set('Sample4') + assert_selector("#{MainbodySelect} tr") + assert_text '789' + assert_text 'Sample4' + assert_text 'account4' + + # Verify filter reads users + find(filter_selector).set('not_') + assert_selector("#{MainbodySelect} tr", count: 2) + assert_text '123' + assert_text 'Sample1' + assert_text 'account1' + assert_text '789' + assert_text 'Sample4' + assert_text 'account4' + + # Verify filter reads accounts + find(filter_selector).set('account3') + assert_selector("#{MainbodySelect} tr", count: 1) + assert_text '567' + assert_text 'Sample3' + assert_text 'account3' + + # Verify filter reads queue + find(filter_selector).set('normal') + assert_selector("#{MainbodySelect} tr", count: 1) + assert_text '123' + assert_text 'Sample1' + assert_text 'account1' + + # Verify filter reads status + find(filter_selector).set('queue') + assert_selector("#{MainbodySelect} tr", count: 2) + assert_text '345' + assert_text 'Sample2' + assert_text 'account2' + assert_text '789' + assert_text 'Sample4' + assert_text 'account4' + + + # Verify filter finds text in middle/end of string + find(filter_selector).set('ple1') + assert_selector("#{MainbodySelect} tr", count: 1) + assert_text '123' + assert_text 'Sample1' + assert_text 'account1' end end \ No newline at end of file From 2d64890af4edb4c9c1e9da191e45a2bcbe8d5fc7 Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Wed, 8 Oct 2025 16:20:15 -0400 Subject: [PATCH 4/7] remove unused wait time constant --- apps/dashboard/test/system/active_jobs_test.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index 3b963ff737..33a0c4f16f 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -4,7 +4,6 @@ require 'ood_core/job/adapters/slurm' class ActiveJobsTest < ApplicationSystemTestCase - JavascriptWaitTime = 5 # Set alias NodeInfo = OodCore::Job::NodeInfo @@ -415,4 +414,4 @@ def prepare_many_jobs(multiplier:) assert_text 'Sample1' assert_text 'account1' end -end \ No newline at end of file +end From 049eb3efe8be336b5b572bab4bd737e1ada297f8 Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Wed, 8 Oct 2025 16:29:29 -0400 Subject: [PATCH 5/7] update constants to capital snake case --- .../dashboard/test/system/active_jobs_test.rb | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index 33a0c4f16f..dd5a2dd0a2 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -29,8 +29,8 @@ class ActiveJobsTest < ApplicationSystemTestCase ] # Define selector statements - MainbodySelect = '#job_status_table tbody' - PagerSelect = 'div#job_status_table_paginate' + MAINBODY_SELECT = '#job_status_table tbody' + PAGER_SELECT = 'div#job_status_table_paginate' def setup # Enable routes guarded by this flag @@ -126,11 +126,11 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url # Finish loading - assert_selector("#{MainbodySelect} tr", minimum: 2) + assert_selector("#{MAINBODY_SELECT} tr", minimum: 2) # The UI should default to the "Your Jobs" filter assert_selector('#selected-filter-label', text: 'Your Jobs') # The list should have exactly two jobs in it - rows = all("#{MainbodySelect} tr") + rows = all("#{MAINBODY_SELECT} tr") assert_equal 2, rows.length # Test row content (dropping the button which has no text) first_row_text = rows[0].all('td').map(&:text).drop(1) @@ -164,7 +164,7 @@ def prepare_many_jobs(multiplier:) assert_equal expected_sr, second_row_text # Check buttons - button_select = "#{MainbodySelect} .details-control" + button_select = "#{MAINBODY_SELECT} .details-control" assert_equal 2, all(button_select).length # Click buttons @@ -172,7 +172,7 @@ def prepare_many_jobs(multiplier:) # Wait for load - details_select = "#{MainbodySelect} div.panel.panel-default" + details_select = "#{MAINBODY_SELECT} div.panel.panel-default" assert_selector("#{details_select} tr") # Confirm details @@ -215,7 +215,7 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url#(cluster_id: 'all') # Finish loading - assert_selector("#{MainbodySelect} tr", count: 2) + assert_selector("#{MAINBODY_SELECT} tr", count: 2) # Open the filters dropdown (first group is filters) first('div.btn-group').find('button.dropdown-toggle').click @@ -226,7 +226,7 @@ def prepare_many_jobs(multiplier:) assert_selector('#selected-filter-label', text: 'All Jobs') # Check number of rows - assert_selector("#{MainbodySelect} tr", count: 4) + assert_selector("#{MAINBODY_SELECT} tr", count: 4) # Check non-user job info assert_text('Sample1') @@ -257,50 +257,50 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url(jobfilter:'all') # Finish loading - assert_selector("#{MainbodySelect} tr", count: 50) + assert_selector("#{MAINBODY_SELECT} tr", count: 50) # Grab first row text - first_row = first("#{MainbodySelect} tr") + first_row = first("#{MAINBODY_SELECT} tr") first_row_text = first_row.all('td').map(&:text).drop(1) # check pager text assert_text('Showing 1 to 50 of 400 entries') # check pager object - assert_selector(PagerSelect) + assert_selector(PAGER_SELECT) # check highlight and prev button - assert_selector("#{PagerSelect} li.active", text: '1') - assert_selector("#{PagerSelect} li.paginate_button.disabled", text: 'Previous') + assert_selector("#{PAGER_SELECT} li.active", text: '1') + assert_selector("#{PAGER_SELECT} li.paginate_button.disabled", text: 'Previous') # Show next page and repeat - find("#{PagerSelect} li", text: '2').click + find("#{PAGER_SELECT} li", text: '2').click - assert_selector("#{MainbodySelect} tr", count: 50) - new_row = first("#{MainbodySelect} tr") + assert_selector("#{MAINBODY_SELECT} tr", count: 50) + new_row = first("#{MAINBODY_SELECT} tr") new_row_text = new_row.all('td').map(&:text).drop(1) - assert_selector("#{PagerSelect} li.active", text: '2') - refute_selector("#{PagerSelect} li.paginate_button.previous.disabled") - refute_selector("#{PagerSelect} li.paginate_button.next.disabled") + assert_selector("#{PAGER_SELECT} li.active", text: '2') + refute_selector("#{PAGER_SELECT} li.paginate_button.previous.disabled") + refute_selector("#{PAGER_SELECT} li.paginate_button.next.disabled") assert_text('Showing 51 to 100 of 400 entries') # click next button and repeat - find("#{PagerSelect} li", text: 'Next').click - assert_selector("#{MainbodySelect} tr", count: 50) - assert_selector("#{PagerSelect} li.active", text: '3') + find("#{PAGER_SELECT} li", text: 'Next').click + assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{PAGER_SELECT} li.active", text: '3') assert_text('Showing 101 to 150 of 400 entries') # Click last page - find("#{PagerSelect} li", text: '8').click - assert_selector("#{MainbodySelect} tr", count: 50) - assert_selector("#{PagerSelect} li.active", text: '8') - assert_selector("#{PagerSelect} li.paginate_button.disabled", text: 'Next') + find("#{PAGER_SELECT} li", text: '8').click + assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{PAGER_SELECT} li.active", text: '8') + assert_selector("#{PAGER_SELECT} li.paginate_button.disabled", text: 'Next') assert_text('Showing 351 to 400 of 400 entries') # Click prev button - find("#{PagerSelect} li", text: 'Previous').click - assert_selector("#{MainbodySelect} tr", count: 50) - assert_selector("#{PagerSelect} li.active", text: '7') + find("#{PAGER_SELECT} li", text: 'Previous').click + assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{PAGER_SELECT} li.active", text: '7') assert_text('Showing 301 to 350 of 400 entries') end @@ -311,43 +311,43 @@ def prepare_many_jobs(multiplier:) res_per_page_selector = 'div#job_status_table_length select' assert_selector(res_per_page_selector, text: '50') - assert_selector("#{MainbodySelect} tr", count: 50) + assert_selector("#{MAINBODY_SELECT} tr", count: 50) assert_text('Showing 1 to 50 of 600 entries') - assert_selector("#{PagerSelect} li", text: '12') + assert_selector("#{PAGER_SELECT} li", text: '12') # Change setting find(res_per_page_selector).click find("#{res_per_page_selector} option[value='10']").click assert_selector(res_per_page_selector, text: '10') - assert_selector("#{MainbodySelect} tr", count: 10) + assert_selector("#{MAINBODY_SELECT} tr", count: 10) assert_text('Showing 1 to 10 of 600 entries') - assert_selector("#{PagerSelect} li", text: '60') + assert_selector("#{PAGER_SELECT} li", text: '60') # Change setting find(res_per_page_selector).click find("#{res_per_page_selector} option[value='25']").click assert_selector(res_per_page_selector, text: '25') - assert_selector("#{MainbodySelect} tr", count: 25) + assert_selector("#{MAINBODY_SELECT} tr", count: 25) assert_text('Showing 1 to 25 of 600 entries') - assert_selector("#{PagerSelect} li", text: '24') + assert_selector("#{PAGER_SELECT} li", text: '24') # Move page and select setting - find("#{PagerSelect} li", text: '5').click + find("#{PAGER_SELECT} li", text: '5').click assert_text('Showing 101 to 125 of 600 entries') # Now changes should stay starting at 101 find(res_per_page_selector).click find("#{res_per_page_selector} option[value='50']").click assert_text('Showing 101 to 150 of 600 entries') - assert_selector("#{PagerSelect} li.active", text: '3') + assert_selector("#{PAGER_SELECT} li.active", text: '3') # Use all setting find(res_per_page_selector).click find("#{res_per_page_selector} option[value='-1']").click assert_selector(res_per_page_selector, text: 'All') - assert_selector("#{MainbodySelect} tr", count: 600) + assert_selector("#{MAINBODY_SELECT} tr", count: 600) assert_text('Showing 1 to 600 of 600 entries') - assert_selector("#{PagerSelect} li.active", text: '1') - refute_selector("#{PagerSelect} li", text: '2') + assert_selector("#{PAGER_SELECT} li.active", text: '1') + refute_selector("#{PAGER_SELECT} li", text: '2') end test 'text filter works' do @@ -360,21 +360,21 @@ def prepare_many_jobs(multiplier:) # Verify filter reads ids find(filter_selector).set('345') # Wait for load - assert_selector("#{MainbodySelect} tr") + assert_selector("#{MAINBODY_SELECT} tr") assert_text '345' assert_text 'Sample2' assert_text 'account2' # Verify filter reads job names find(filter_selector).set('Sample4') - assert_selector("#{MainbodySelect} tr") + assert_selector("#{MAINBODY_SELECT} tr") assert_text '789' assert_text 'Sample4' assert_text 'account4' # Verify filter reads users find(filter_selector).set('not_') - assert_selector("#{MainbodySelect} tr", count: 2) + assert_selector("#{MAINBODY_SELECT} tr", count: 2) assert_text '123' assert_text 'Sample1' assert_text 'account1' @@ -384,21 +384,21 @@ def prepare_many_jobs(multiplier:) # Verify filter reads accounts find(filter_selector).set('account3') - assert_selector("#{MainbodySelect} tr", count: 1) + assert_selector("#{MAINBODY_SELECT} tr", count: 1) assert_text '567' assert_text 'Sample3' assert_text 'account3' # Verify filter reads queue find(filter_selector).set('normal') - assert_selector("#{MainbodySelect} tr", count: 1) + assert_selector("#{MAINBODY_SELECT} tr", count: 1) assert_text '123' assert_text 'Sample1' assert_text 'account1' # Verify filter reads status find(filter_selector).set('queue') - assert_selector("#{MainbodySelect} tr", count: 2) + assert_selector("#{MAINBODY_SELECT} tr", count: 2) assert_text '345' assert_text 'Sample2' assert_text 'account2' @@ -409,7 +409,7 @@ def prepare_many_jobs(multiplier:) # Verify filter finds text in middle/end of string find(filter_selector).set('ple1') - assert_selector("#{MainbodySelect} tr", count: 1) + assert_selector("#{MAINBODY_SELECT} tr", count: 1) assert_text '123' assert_text 'Sample1' assert_text 'account1' From 7efb512f582eabf6c84ea705f16e25013c9748cc Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Wed, 8 Oct 2025 16:34:17 -0400 Subject: [PATCH 6/7] correct DetailsHeaders to capital snake case --- apps/dashboard/test/system/active_jobs_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index dd5a2dd0a2..09278b7f99 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -7,7 +7,7 @@ class ActiveJobsTest < ApplicationSystemTestCase # Set alias NodeInfo = OodCore::Job::NodeInfo - DetailsHeaders = [ + DETAILS_HEADERS = [ 'Cluster', 'Job Id', 'Array Job Id', @@ -204,7 +204,7 @@ def prepare_many_jobs(multiplier:) 'gpu:2' ] - assert_equal DetailsHeaders, headers.map(&:text) + assert_equal DETAILS_HEADERS, headers.map(&:text) assert_equal exp_details, details.map(&:text) assert_selector('div.alert-warning') From 5693cfed32e943c08f1a170526474bb3dbe3e97b Mon Sep 17 00:00:00 2001 From: Braeden Singleton Date: Wed, 8 Oct 2025 18:13:18 -0400 Subject: [PATCH 7/7] Fix word break in MAIN_BODY_SELECT --- .../dashboard/test/system/active_jobs_test.rb | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/dashboard/test/system/active_jobs_test.rb b/apps/dashboard/test/system/active_jobs_test.rb index 09278b7f99..d60599be4c 100644 --- a/apps/dashboard/test/system/active_jobs_test.rb +++ b/apps/dashboard/test/system/active_jobs_test.rb @@ -29,7 +29,7 @@ class ActiveJobsTest < ApplicationSystemTestCase ] # Define selector statements - MAINBODY_SELECT = '#job_status_table tbody' + MAIN_BODY_SELECT = '#job_status_table tbody' PAGER_SELECT = 'div#job_status_table_paginate' def setup @@ -126,11 +126,11 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url # Finish loading - assert_selector("#{MAINBODY_SELECT} tr", minimum: 2) + assert_selector("#{MAIN_BODY_SELECT} tr", minimum: 2) # The UI should default to the "Your Jobs" filter assert_selector('#selected-filter-label', text: 'Your Jobs') # The list should have exactly two jobs in it - rows = all("#{MAINBODY_SELECT} tr") + rows = all("#{MAIN_BODY_SELECT} tr") assert_equal 2, rows.length # Test row content (dropping the button which has no text) first_row_text = rows[0].all('td').map(&:text).drop(1) @@ -164,7 +164,7 @@ def prepare_many_jobs(multiplier:) assert_equal expected_sr, second_row_text # Check buttons - button_select = "#{MAINBODY_SELECT} .details-control" + button_select = "#{MAIN_BODY_SELECT} .details-control" assert_equal 2, all(button_select).length # Click buttons @@ -172,7 +172,7 @@ def prepare_many_jobs(multiplier:) # Wait for load - details_select = "#{MAINBODY_SELECT} div.panel.panel-default" + details_select = "#{MAIN_BODY_SELECT} div.panel.panel-default" assert_selector("#{details_select} tr") # Confirm details @@ -215,7 +215,7 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url#(cluster_id: 'all') # Finish loading - assert_selector("#{MAINBODY_SELECT} tr", count: 2) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 2) # Open the filters dropdown (first group is filters) first('div.btn-group').find('button.dropdown-toggle').click @@ -226,7 +226,7 @@ def prepare_many_jobs(multiplier:) assert_selector('#selected-filter-label', text: 'All Jobs') # Check number of rows - assert_selector("#{MAINBODY_SELECT} tr", count: 4) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 4) # Check non-user job info assert_text('Sample1') @@ -257,10 +257,10 @@ def prepare_many_jobs(multiplier:) visit active_jobs_url(jobfilter:'all') # Finish loading - assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) # Grab first row text - first_row = first("#{MAINBODY_SELECT} tr") + first_row = first("#{MAIN_BODY_SELECT} tr") first_row_text = first_row.all('td').map(&:text).drop(1) # check pager text @@ -276,8 +276,8 @@ def prepare_many_jobs(multiplier:) # Show next page and repeat find("#{PAGER_SELECT} li", text: '2').click - assert_selector("#{MAINBODY_SELECT} tr", count: 50) - new_row = first("#{MAINBODY_SELECT} tr") + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) + new_row = first("#{MAIN_BODY_SELECT} tr") new_row_text = new_row.all('td').map(&:text).drop(1) assert_selector("#{PAGER_SELECT} li.active", text: '2') refute_selector("#{PAGER_SELECT} li.paginate_button.previous.disabled") @@ -286,20 +286,20 @@ def prepare_many_jobs(multiplier:) # click next button and repeat find("#{PAGER_SELECT} li", text: 'Next').click - assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) assert_selector("#{PAGER_SELECT} li.active", text: '3') assert_text('Showing 101 to 150 of 400 entries') # Click last page find("#{PAGER_SELECT} li", text: '8').click - assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) assert_selector("#{PAGER_SELECT} li.active", text: '8') assert_selector("#{PAGER_SELECT} li.paginate_button.disabled", text: 'Next') assert_text('Showing 351 to 400 of 400 entries') # Click prev button find("#{PAGER_SELECT} li", text: 'Previous').click - assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) assert_selector("#{PAGER_SELECT} li.active", text: '7') assert_text('Showing 301 to 350 of 400 entries') end @@ -311,7 +311,7 @@ def prepare_many_jobs(multiplier:) res_per_page_selector = 'div#job_status_table_length select' assert_selector(res_per_page_selector, text: '50') - assert_selector("#{MAINBODY_SELECT} tr", count: 50) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 50) assert_text('Showing 1 to 50 of 600 entries') assert_selector("#{PAGER_SELECT} li", text: '12') @@ -319,7 +319,7 @@ def prepare_many_jobs(multiplier:) find(res_per_page_selector).click find("#{res_per_page_selector} option[value='10']").click assert_selector(res_per_page_selector, text: '10') - assert_selector("#{MAINBODY_SELECT} tr", count: 10) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 10) assert_text('Showing 1 to 10 of 600 entries') assert_selector("#{PAGER_SELECT} li", text: '60') @@ -327,7 +327,7 @@ def prepare_many_jobs(multiplier:) find(res_per_page_selector).click find("#{res_per_page_selector} option[value='25']").click assert_selector(res_per_page_selector, text: '25') - assert_selector("#{MAINBODY_SELECT} tr", count: 25) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 25) assert_text('Showing 1 to 25 of 600 entries') assert_selector("#{PAGER_SELECT} li", text: '24') @@ -344,7 +344,7 @@ def prepare_many_jobs(multiplier:) find(res_per_page_selector).click find("#{res_per_page_selector} option[value='-1']").click assert_selector(res_per_page_selector, text: 'All') - assert_selector("#{MAINBODY_SELECT} tr", count: 600) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 600) assert_text('Showing 1 to 600 of 600 entries') assert_selector("#{PAGER_SELECT} li.active", text: '1') refute_selector("#{PAGER_SELECT} li", text: '2') @@ -360,21 +360,21 @@ def prepare_many_jobs(multiplier:) # Verify filter reads ids find(filter_selector).set('345') # Wait for load - assert_selector("#{MAINBODY_SELECT} tr") + assert_selector("#{MAIN_BODY_SELECT} tr") assert_text '345' assert_text 'Sample2' assert_text 'account2' # Verify filter reads job names find(filter_selector).set('Sample4') - assert_selector("#{MAINBODY_SELECT} tr") + assert_selector("#{MAIN_BODY_SELECT} tr") assert_text '789' assert_text 'Sample4' assert_text 'account4' # Verify filter reads users find(filter_selector).set('not_') - assert_selector("#{MAINBODY_SELECT} tr", count: 2) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 2) assert_text '123' assert_text 'Sample1' assert_text 'account1' @@ -384,21 +384,21 @@ def prepare_many_jobs(multiplier:) # Verify filter reads accounts find(filter_selector).set('account3') - assert_selector("#{MAINBODY_SELECT} tr", count: 1) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 1) assert_text '567' assert_text 'Sample3' assert_text 'account3' # Verify filter reads queue find(filter_selector).set('normal') - assert_selector("#{MAINBODY_SELECT} tr", count: 1) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 1) assert_text '123' assert_text 'Sample1' assert_text 'account1' # Verify filter reads status find(filter_selector).set('queue') - assert_selector("#{MAINBODY_SELECT} tr", count: 2) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 2) assert_text '345' assert_text 'Sample2' assert_text 'account2' @@ -409,7 +409,7 @@ def prepare_many_jobs(multiplier:) # Verify filter finds text in middle/end of string find(filter_selector).set('ple1') - assert_selector("#{MAINBODY_SELECT} tr", count: 1) + assert_selector("#{MAIN_BODY_SELECT} tr", count: 1) assert_text '123' assert_text 'Sample1' assert_text 'account1'