Files
ubicloud/spec/thawed_mock.rb
Jeremy Evans 17a1abfa29 Add UI for tag management
This allows, for subject, action, and object tags:

* Creating tags
* Renaming tags
* Removing tags
* Adding members to tags
* Removing members from tags

The Admin subject tag is special, and cannot be renamed, removed, or included
in other tags.  It also cannot have all accounts removed from it, to ensure
there is at least one account with full access.

Just as with access control entries, when showing tag membership,
tokens are hidden. This may only affect the Admin subject tag, as
that is the tag that tokens will be added to by default.

This uses the same routing tree and views to manage all tag types,
which significantly DRYs things up.
2025-01-09 09:55:55 -08:00

115 lines
4.1 KiB
Ruby

# frozen_string_literal: true
module ThawedMock
OBJECTS = {}
def self.allow_mocking(obj, *methods)
mod, mock = OBJECTS[obj]
unless mod
mod = Module.new
mock = Object.new
obj.singleton_class.prepend(mod)
OBJECTS[obj] = [mod, mock].freeze
end
methods.each do |method|
original_method = obj.method(method)
mock.define_singleton_method(method) do |*a, **kw, &b|
original_method.call(*a, **kw, &b)
end
mod.define_method(method) do |*a, **kw, &b|
mock.send(method, *a, **kw, &b)
end
end
end
module ExpectOverride
[:allow, :expect].each do |method|
define_method(method) do |obj = nil, &block|
return super(&block) if obj.nil? && block
_, mock = OBJECTS[obj]
super(mock || obj, &block)
end
end
end
RSpec::Core::ExampleGroup.prepend(ExpectOverride)
# Ruby Core Classes
allow_mocking(File, :exist?, :open, :rename, :write)
allow_mocking(Kernel, :exit, :exit!, :URI)
allow_mocking(Thread, :new, :list)
allow_mocking(Time, :now)
# Database
allow_mocking(DB, :[])
# Models
allow_mocking(Account, :[])
allow_mocking(Address, :where)
allow_mocking(ArchivedRecord, :create)
allow_mocking(AssignedVmAddress, :create_with_id)
allow_mocking(BillingRecord, :create_with_id)
allow_mocking(BootImage, :where)
allow_mocking(DnsRecord, :[], :create)
allow_mocking(DnsZone, :[], :where)
allow_mocking(FirewallsPrivateSubnets, :where)
allow_mocking(FirewallRule, :create_with_id)
allow_mocking(Github, :app_client, :failed_deliveries, :installation_client, :oauth_client, :redeliver_failed_deliveries)
allow_mocking(GithubRunner, :[], :any?, :first, :join)
allow_mocking(HetznerHost, :create)
allow_mocking(IpsecTunnel, :[], :create)
allow_mocking(MinioCluster, :[])
allow_mocking(Nic, :[], :create)
allow_mocking(Page, :from_tag_parts)
allow_mocking(PrivateSubnet, :[], :from_ubid, :random_subnet)
allow_mocking(PostgresLsnMonitor, :new)
allow_mocking(PostgresMetricDestination, :from_ubid)
allow_mocking(PostgresResource, :[])
allow_mocking(PostgresServer, :create, :run_query)
allow_mocking(Project, :[], :from_ubid)
allow_mocking(Semaphore, :where)
allow_mocking(Sshable, :create, :repl?)
allow_mocking(StorageKeyEncryptionKey, :create)
allow_mocking(Strand, :create, :create_with_id)
allow_mocking(UsageAlert, :where)
allow_mocking(VmHost, :[])
allow_mocking(Vm, :[], :where)
allow_mocking(VmPool, :[], :where)
# Progs
allow_mocking(Prog::Ai::InferenceEndpointNexus, :assemble, :model_for_id)
allow_mocking(Prog::Ai::InferenceEndpointReplicaNexus, :assemble)
allow_mocking(Prog::Github::DestroyGithubInstallation, :assemble)
allow_mocking(Prog::PageNexus, :assemble)
allow_mocking(Prog::Postgres::PostgresResourceNexus, :dns_zone)
allow_mocking(Prog::Postgres::PostgresServerNexus, :assemble)
allow_mocking(Prog::Postgres::PostgresTimelineNexus, :assemble)
allow_mocking(Prog::Vm::GithubRunner, :assemble)
allow_mocking(Prog::Vm::HostNexus, :assemble)
allow_mocking(Prog::Vm::Nexus, :assemble, :assemble_with_sshable)
allow_mocking(Prog::Vm::VmPool, :assemble)
allow_mocking(Prog::Vnet::NicNexus, :assemble, :gen_mac, :rand)
allow_mocking(Prog::Vnet::SubnetNexus, :assemble, :random_private_ipv4, :random_private_ipv6)
# Other Classes
allow_mocking(BillingRate, :from_resource_properties)
allow_mocking(Clog, :emit)
allow_mocking(CloudflareClient, :new)
allow_mocking(Hosting::Apis, :pull_data_center, :pull_ips, :reimage_server, :set_server_name)
allow_mocking(Minio::Client, :new)
allow_mocking(Minio::Crypto, :new)
allow_mocking(Scheduling::Allocator, :allocate)
allow_mocking(Scheduling::Allocator::Allocation, :best_allocation, :candidate_hosts, :new, :random_score, :update_vm)
allow_mocking(Scheduling::Allocator::StorageAllocation, :new)
allow_mocking(Scheduling::Allocator::VmHostAllocation, :new)
allow_mocking(Serializers::Vm, :serialize_internal)
allow_mocking(SshKey, :generate)
allow_mocking(ThreadPrinter, :puts, :run)
allow_mocking(Util, :create_certificate, :create_root_certificate, :rootish_ssh, :send_email)
allow_mocking(UBID, :class_match?)
end