Files
ubicloud/spec/routes/web/admin/admin_spec.rb
Jeremy Evans 34af58831b Add error handler to admin site
Without this, errors would be caught by Clover instead of CloverAdmin,
and probably would have been have looked bad, since it would try to
use the Clover stylesheet, and that would result in a 404.

This also changes the emit so we can differentiate admin route
exceptions from normal route exceptions.
2025-07-18 16:49:27 -07:00

183 lines
6.1 KiB
Ruby

# frozen_string_literal: true
require_relative "spec_helper"
RSpec.describe CloverAdmin do
def object_data
page.all(".object-table tbody tr").map { it.all("td").map(&:text) }.to_h.transform_keys(&:to_sym).except(:created_at)
end
def page_data
page.all(".page-table tbody tr").map do
tds = it.all("td").map(&:text)
tds.delete_at(-3)
tds
end
end
before do
admin_account_setup_and_login
end
let(:vm_pool) do
vp = VmPool.create(
size: 3,
vm_size: "standard-2",
boot_image: "img",
location_id: Location::HETZNER_FSN1_ID,
storage_size_gib: 86
)
Strand.create(prog: "Vm::VmPool", label: "create_new_vm") { it.id = vp.id }
vp
end
it "allows searching by ubid and navigating to related objects" do
expect(page.title).to eq "Ubicloud Admin"
account = create_account
fill_in "UBID", with: account.ubid
click_button "Show Object"
expect(page.title).to eq "Ubicloud Admin - Account #{account.ubid}"
expect(object_data).to eq(email: "user@example.com", name: "", status_id: "2", suspended_at: "")
project = account.projects.first
click_link project.ubid
expect(page.title).to eq "Ubicloud Admin - Project #{project.ubid}"
expect(object_data).to eq(billable: "true", billing_info_id: "", credit: "0.0", discount: "0", feature_flags: "{}", name: "Default", reputation: "new", visible: "true")
subject_tag = project.subject_tags.first
click_link subject_tag.ubid
expect(page.title).to eq "Ubicloud Admin - SubjectTag #{subject_tag.ubid}"
expect(object_data).to eq(name: "Admin", project_id: project.ubid)
# Column Link
click_link project.ubid
expect(page.title).to eq "Ubicloud Admin - Project #{project.ubid}"
end
it "shows semaphores set on the object, if any" do
fill_in "UBID", with: vm_pool.ubid
click_button "Show Object"
expect(page.title).to eq "Ubicloud Admin - VmPool #{vm_pool.ubid}"
expect(page).to have_no_content "Semaphores Set:"
vm_pool.incr_destroy
page.refresh
expect(page).to have_content "Semaphores Set: destroy"
end
it "shows object's strand, if any" do
fill_in "UBID", with: vm_pool.ubid
click_button "Show Object"
path = page.current_path
expect(page.title).to eq "Ubicloud Admin - VmPool #{vm_pool.ubid}"
expect(page).to have_content "Strand: Vm::VmPool#create_new_vm | schedule: 2"
expect(page).to have_no_content "| try"
vm_pool.strand.update(try: 3)
visit path
expect(page).to have_content "| try: 3"
click_link "Strand"
expect(page.title).to eq "Ubicloud Admin - Strand #{vm_pool.ubid}"
vm_pool.strand.destroy
visit path
expect(page).to have_no_content "Strand"
end
it "shows sshable information for object, if any" do
vm_host = Prog::Vm::HostNexus.assemble("1.2.3.4").subject
fill_in "UBID", with: vm_host.ubid
click_button "Show Object"
expect(page.title).to eq "Ubicloud Admin - VmHost #{vm_host.ubid}"
expect(page).to have_content "SSH Command: ssh -i <PRIVATE_KEY_PATH> rhizome@1.2.3.4"
visit "/"
fill_in "UBID", with: vm_pool.ubid
click_button "Show Object"
expect(page).to have_no_content "SSH Command"
end
it "shows active pages on index page, grouped by related host" do
expect(page).to have_no_content "Active Pages"
page1 = Page.create(summary: "some problem", tag: "a")
page.refresh
expect(page).to have_content "Active Pages"
expect(page_data).to eq [
["", page1.ubid, "some problem", "{}"]
]
click_link page1.ubid
expect(page.title).to eq "Ubicloud Admin - Page #{page1.ubid}"
page2 = Page.create(summary: "another problem", tag: "b", details: {"related_resources" => [vm_pool.ubid]})
visit "/"
expect(page_data).to eq [
["", page1.ubid, "some problem", "{}"],
[page2.ubid, "another problem", "{\"related_resources\" => [\"#{vm_pool.ubid}\"]}"]
]
click_link vm_pool.ubid
expect(page.title).to eq "Ubicloud Admin - VmPool #{vm_pool.ubid}"
vmh = Prog::Vm::HostNexus.assemble("1.2.3.4").subject
pj = Project.create(name: "test")
vm = Prog::Vm::Nexus.assemble("a a", pj.id).subject
vm.update(vm_host_id: vmh.id)
page3 = Page.create(summary: "third problem", tag: "c", details: {"related_resources" => [vm.ubid]})
visit "/"
expect(page_data).to eq [
[vmh.ubid, page3.ubid, "third problem", "{\"related_resources\" => [\"#{vm.ubid}\"]}"],
["", page1.ubid, "some problem", "{}"],
[page2.ubid, "another problem", "{\"related_resources\" => [\"#{vm_pool.ubid}\"]}"]
]
click_link vmh.ubid
expect(page.title).to eq "Ubicloud Admin - VmHost #{vmh.ubid}"
visit "/"
click_link vm.ubid
expect(page.title).to eq "Ubicloud Admin - Vm #{vm.ubid}"
end
it "handles request for invalid ubid" do
fill_in "UBID", with: "foo"
click_button "Show Object"
expect(page.title).to eq "Ubicloud Admin"
expect(page).to have_flash_error("Invalid ubid provided")
fill_in "UBID", with: "ts1cyaqvp5ha6j5jt8ypbyagw9"
click_button "Show Object"
expect(page.title).to eq "Ubicloud Admin - File Not Found"
end
it "handles request for invalid model or missing object" do
visit "/model/Foo/ts1cyaqvp5ha6j5jt8ypbyagw9"
expect(page.title).to eq "Ubicloud Admin - File Not Found"
visit "/model/ArchivedRecord/ts1cyaqvp5ha6j5jt8ypbyagw9"
expect(page.title).to eq "Ubicloud Admin - File Not Found"
visit "/model/SubjectTag/ts1cyaqvp5ha6j5jt8ypbyagw9"
expect(page.title).to eq "Ubicloud Admin - File Not Found"
end
it "handles 404 page" do
visit "/invalid-page"
expect(page.title).to eq "Ubicloud Admin - File Not Found"
end
it "raises errors if SHOW_ERRORS environment variable is set" do
show_errors, ENV["SHOW_ERRORS"] = ENV["SHOW_ERRORS"], "1"
expect { visit "/error" }.to raise_error(RuntimeError)
ensure
ENV.delete("SHOW_ERRORS") unless show_errors
end
it "shows error page for errors if SHOW_ERRORS environment variable is not set" do
expect(Clog).to receive(:emit).with("admin route exception").and_call_original
visit "/error"
expect(page.title).to eq "Ubicloud Admin - Internal Server Error"
end
end