Standardize on Thor methods in CLI classes (#28566)

This commit is contained in:
Matt Jankowski 2024-01-03 10:08:08 -05:00 committed by GitHub
parent 905794fd57
commit f92d8c654d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 35 deletions

View File

@ -1,7 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt'
module Mastodon::CLI module Mastodon::CLI
module Federation module Federation
extend ActiveSupport::Concern extend ActiveSupport::Concern
@ -30,45 +28,39 @@ module Mastodon::CLI
LONG_DESC LONG_DESC
def self_destruct def self_destruct
if SelfDestructHelper.self_destruct? if SelfDestructHelper.self_destruct?
prompt.ok('Self-destruct mode is already enabled for this Mastodon server') say('Self-destruct mode is already enabled for this Mastodon server', :green)
pending_accounts = Account.local.without_suspended.count + Account.local.suspended.joins(:deletion_request).count pending_accounts = Account.local.without_suspended.count + Account.local.suspended.joins(:deletion_request).count
sidekiq_stats = Sidekiq::Stats.new sidekiq_stats = Sidekiq::Stats.new
if pending_accounts.positive? if pending_accounts.positive?
prompt.warn("#{pending_accounts} accounts are still pending deletion.") say("#{pending_accounts} accounts are still pending deletion.", :yellow)
elsif sidekiq_stats.enqueued.positive? elsif sidekiq_stats.enqueued.positive?
prompt.warn('Deletion notices are still being processed') say('Deletion notices are still being processed', :yellow)
elsif sidekiq_stats.retry_size.positive? elsif sidekiq_stats.retry_size.positive?
prompt.warn('At least one delivery attempt for each deletion notice has been made, but some have failed and are scheduled for retry') say('At least one delivery attempt for each deletion notice has been made, but some have failed and are scheduled for retry', :yellow)
else else
prompt.ok('Every deletion notice has been sent! You can safely delete all data and decomission your servers!') say('Every deletion notice has been sent! You can safely delete all data and decomission your servers!', :green)
end end
exit(0) exit(0)
end end
exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain exit(1) unless ask('Type in the domain of the server to confirm:') == Rails.configuration.x.local_domain
prompt.warn('This operation WILL NOT be reversible.') say('This operation WILL NOT be reversible.', :yellow)
prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') say('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.', :yellow)
prompt.warn('The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).') say('The deletion process itself may take a long time, and will be handled by Sidekiq, so do not shut it down until it has finished (you will be able to re-run this command to see the state of the self-destruct process).', :yellow)
exit(1) if prompt.no?('Are you sure you want to proceed?') exit(1) if no?('Are you sure you want to proceed?')
self_destruct_value = Rails.application.message_verifier('self-destruct').generate(Rails.configuration.x.local_domain) self_destruct_value = Rails.application.message_verifier('self-destruct').generate(Rails.configuration.x.local_domain)
prompt.ok('To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:') say('To switch Mastodon to self-destruct mode, add the following variable to your evironment (e.g. by adding a line to your `.env.production`) and restart all Mastodon processes:', :green)
prompt.ok(" SELF_DESTRUCT=#{self_destruct_value}") say(" SELF_DESTRUCT=#{self_destruct_value}", :green)
prompt.ok("\nYou can re-run this command to see the state of the self-destruct process.") say("\nYou can re-run this command to see the state of the self-destruct process.", :green)
rescue TTY::Reader::InputInterrupt rescue Interrupt
exit(1) exit(1)
end end
private
def prompt
@prompt ||= TTY::Prompt.new
end
end end
end end
end end

View File

@ -1,6 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tty-prompt'
require_relative 'base' require_relative 'base'
module Mastodon::CLI module Mastodon::CLI

View File

@ -100,33 +100,77 @@ describe Mastodon::CLI::Main do
end end
context 'with an incorrect response to hostname' do context 'with an incorrect response to hostname' do
let(:prompt_double) { instance_double(TTY::Prompt, ask: 'wrong') }
before do before do
allow(TTY::Prompt).to receive(:new).and_return(prompt_double) answer_hostname_incorrectly
end end
it 'reports failed answer' do it 'exits silently' do
expect { subject } expect { subject }
.to raise_error(SystemExit) .to raise_error(SystemExit)
end end
end end
context 'with a correct response to hostname' do context 'with a correct response to hostname but no to proceed' do
# TODO: Update after tty-prompt replace with Thor methods
let(:prompt_double) { instance_double(TTY::Prompt, ask: Rails.configuration.x.local_domain, warn: nil, no?: false, ok: nil) }
before do before do
allow(TTY::Prompt).to receive(:new).and_return(prompt_double) answer_hostname_correctly
decline_proceed
end
it 'passes first step but stops before instructions' do
expect { subject }
.to output_results('operation WILL NOT')
.and raise_error(SystemExit)
end
end
context 'with a correct response to hostname and yes to proceed' do
before do
answer_hostname_correctly
accept_proceed
end end
it 'instructs to set the appropriate environment variable' do it 'instructs to set the appropriate environment variable' do
expect { subject } expect { subject }
.to_not raise_error .to output_results(
# TODO: Update after tty-prompt replace with Thor methods 'operation WILL NOT',
expect(prompt_double).to have_received(:ok).with(/add the following variable/) 'the following variable'
)
end end
end end
private
def answer_hostname_incorrectly
allow(cli.shell)
.to receive(:ask)
.with('Type in the domain of the server to confirm:')
.and_return('wrong.host')
.once
end
def answer_hostname_correctly
allow(cli.shell)
.to receive(:ask)
.with('Type in the domain of the server to confirm:')
.and_return(Rails.configuration.x.local_domain)
.once
end
def decline_proceed
allow(cli.shell)
.to receive(:no?)
.with('Are you sure you want to proceed?')
.and_return(true)
.once
end
def accept_proceed
allow(cli.shell)
.to receive(:no?)
.with('Are you sure you want to proceed?')
.and_return(false)
.once
end
end end
end end
end end