mirror of https://github.com/glitch-soc/mastodon
177 lines
4.6 KiB
Ruby
177 lines
4.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
require 'mastodon/cli/main'
|
|
|
|
RSpec.describe Mastodon::CLI::Main do
|
|
subject { cli.invoke(action, arguments, options) }
|
|
|
|
let(:cli) { described_class.new }
|
|
let(:arguments) { [] }
|
|
let(:options) { {} }
|
|
|
|
it_behaves_like 'CLI Command'
|
|
|
|
describe '#version' do
|
|
let(:action) { :version }
|
|
|
|
it 'returns the Mastodon version' do
|
|
expect { subject }
|
|
.to output_results(Mastodon::Version.to_s)
|
|
end
|
|
end
|
|
|
|
describe '#self_destruct' do
|
|
let(:action) { :self_destruct }
|
|
|
|
context 'with self destruct mode enabled' do
|
|
before do
|
|
allow(SelfDestructHelper).to receive(:self_destruct?).and_return(true)
|
|
end
|
|
|
|
context 'with pending accounts' do
|
|
before { Fabricate(:account) }
|
|
|
|
it 'reports about pending accounts' do
|
|
expect { subject }
|
|
.to output_results(
|
|
'already enabled',
|
|
'still pending deletion'
|
|
)
|
|
.and raise_error(SystemExit)
|
|
end
|
|
end
|
|
|
|
context 'with sidekiq notices being processed' do
|
|
before do
|
|
Account.delete_all
|
|
stats_double = instance_double(Sidekiq::Stats, enqueued: 5)
|
|
allow(Sidekiq::Stats).to receive(:new).and_return(stats_double)
|
|
end
|
|
|
|
it 'reports about notices' do
|
|
expect { subject }
|
|
.to output_results(
|
|
'already enabled',
|
|
'notices are still being'
|
|
)
|
|
.and raise_error(SystemExit)
|
|
end
|
|
end
|
|
|
|
context 'with sidekiq failed deliveries' do
|
|
before do
|
|
Account.delete_all
|
|
stats_double = instance_double(Sidekiq::Stats, enqueued: 0, retry_size: 10)
|
|
allow(Sidekiq::Stats).to receive(:new).and_return(stats_double)
|
|
end
|
|
|
|
it 'reports about notices' do
|
|
expect { subject }
|
|
.to output_results(
|
|
'already enabled',
|
|
'some have failed and are scheduled'
|
|
)
|
|
.and raise_error(SystemExit)
|
|
end
|
|
end
|
|
|
|
context 'with self descruct mode ready' do
|
|
before do
|
|
Account.delete_all
|
|
stats_double = instance_double(Sidekiq::Stats, enqueued: 0, retry_size: 0)
|
|
allow(Sidekiq::Stats).to receive(:new).and_return(stats_double)
|
|
end
|
|
|
|
it 'reports about notices' do
|
|
expect { subject }
|
|
.to output_results(
|
|
'already enabled',
|
|
'can safely delete all data'
|
|
)
|
|
.and raise_error(SystemExit)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with self destruct mode disabled' do
|
|
before do
|
|
allow(SelfDestructHelper).to receive(:self_destruct?).and_return(false)
|
|
end
|
|
|
|
context 'with an incorrect response to hostname' do
|
|
before do
|
|
answer_hostname_incorrectly
|
|
end
|
|
|
|
it 'exits with mismatch error message' do
|
|
expect { subject }
|
|
.to raise_error(Thor::Error, /Domains do not match/)
|
|
end
|
|
end
|
|
|
|
context 'with a correct response to hostname but no to proceed' do
|
|
before do
|
|
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(Thor::Error, /Self-destruct will not begin/)
|
|
end
|
|
end
|
|
|
|
context 'with a correct response to hostname and yes to proceed' do
|
|
before do
|
|
answer_hostname_correctly
|
|
accept_proceed
|
|
end
|
|
|
|
it 'instructs to set the appropriate environment variable' do
|
|
expect { subject }
|
|
.to output_results(
|
|
'operation WILL NOT',
|
|
'the following variable'
|
|
)
|
|
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
|