Formalize some patterns in cli specs (#28255)
This commit is contained in:
		
							parent
							
								
									5d97a897c8
								
							
						
					
					
						commit
						ad34d33bfd
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -4,22 +4,29 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/cache' | require 'mastodon/cli/cache' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Cache do | describe Mastodon::CLI::Cache do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#clear' do |   describe '#clear' do | ||||||
|  |     let(:action) { :clear } | ||||||
|  | 
 | ||||||
|     before { allow(Rails.cache).to receive(:clear) } |     before { allow(Rails.cache).to receive(:clear) } | ||||||
| 
 | 
 | ||||||
|     it 'clears the Rails cache' do |     it 'clears the Rails cache' do | ||||||
|       expect { cli.invoke(:clear) }.to output( |       expect { subject } | ||||||
|         a_string_including('OK') |         .to output_results('OK') | ||||||
|       ).to_stdout |  | ||||||
|       expect(Rails.cache).to have_received(:clear) |       expect(Rails.cache).to have_received(:clear) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#recount' do |   describe '#recount' do | ||||||
|  |     let(:action) { :recount } | ||||||
|  | 
 | ||||||
|     context 'with the `accounts` argument' do |     context 'with the `accounts` argument' do | ||||||
|       let(:arguments) { ['accounts'] } |       let(:arguments) { ['accounts'] } | ||||||
|       let(:account_stat) { Fabricate(:account_stat) } |       let(:account_stat) { Fabricate(:account_stat) } | ||||||
| @ -29,9 +36,8 @@ describe Mastodon::CLI::Cache do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 're-calculates account records in the cache' do |       it 're-calculates account records in the cache' do | ||||||
|         expect { cli.invoke(:recount, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|         expect(account_stat.reload.statuses_count).to be_zero |         expect(account_stat.reload.statuses_count).to be_zero | ||||||
|       end |       end | ||||||
| @ -46,9 +52,8 @@ describe Mastodon::CLI::Cache do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 're-calculates account records in the cache' do |       it 're-calculates account records in the cache' do | ||||||
|         expect { cli.invoke(:recount, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|         expect(status_stat.reload.replies_count).to be_zero |         expect(status_stat.reload.replies_count).to be_zero | ||||||
|       end |       end | ||||||
| @ -58,9 +63,9 @@ describe Mastodon::CLI::Cache do | |||||||
|       let(:arguments) { ['other-type'] } |       let(:arguments) { ['other-type'] } | ||||||
| 
 | 
 | ||||||
|       it 'Exits with an error message' do |       it 'Exits with an error message' do | ||||||
|         expect { cli.invoke(:recount, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('Unknown') |           .to output_results('Unknown') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,42 +4,45 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/canonical_email_blocks' | require 'mastodon/cli/canonical_email_blocks' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::CanonicalEmailBlocks do | describe Mastodon::CLI::CanonicalEmailBlocks do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#find' do |   describe '#find' do | ||||||
|  |     let(:action) { :find } | ||||||
|     let(:arguments) { ['user@example.com'] } |     let(:arguments) { ['user@example.com'] } | ||||||
| 
 | 
 | ||||||
|     context 'when a block is present' do |     context 'when a block is present' do | ||||||
|       before { Fabricate(:canonical_email_block, email: 'user@example.com') } |       before { Fabricate(:canonical_email_block, email: 'user@example.com') } | ||||||
| 
 | 
 | ||||||
|       it 'announces the presence of the block' do |       it 'announces the presence of the block' do | ||||||
|         expect { cli.invoke(:find, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('user@example.com is blocked') |           .to output_results('user@example.com is blocked') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when a block is not present' do |     context 'when a block is not present' do | ||||||
|       it 'announces the absence of the block' do |       it 'announces the absence of the block' do | ||||||
|         expect { cli.invoke(:find, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('user@example.com is not blocked') |           .to output_results('user@example.com is not blocked') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#remove' do |   describe '#remove' do | ||||||
|  |     let(:action) { :remove } | ||||||
|     let(:arguments) { ['user@example.com'] } |     let(:arguments) { ['user@example.com'] } | ||||||
| 
 | 
 | ||||||
|     context 'when a block is present' do |     context 'when a block is present' do | ||||||
|       before { Fabricate(:canonical_email_block, email: 'user@example.com') } |       before { Fabricate(:canonical_email_block, email: 'user@example.com') } | ||||||
| 
 | 
 | ||||||
|       it 'removes the block' do |       it 'removes the block' do | ||||||
|         expect { cli.invoke(:remove, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('Unblocked user@example.com') |           .to output_results('Unblocked user@example.com') | ||||||
|         ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|         expect(CanonicalEmailBlock.matching_email('user@example.com')).to be_empty |         expect(CanonicalEmailBlock.matching_email('user@example.com')).to be_empty | ||||||
|       end |       end | ||||||
| @ -47,9 +50,8 @@ describe Mastodon::CLI::CanonicalEmailBlocks do | |||||||
| 
 | 
 | ||||||
|     context 'when a block is not present' do |     context 'when a block is not present' do | ||||||
|       it 'announces the absence of the block' do |       it 'announces the absence of the block' do | ||||||
|         expect { cli.invoke(:remove, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('user@example.com is not blocked') |           .to output_results('user@example.com is not blocked') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,20 +4,26 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/domains' | require 'mastodon/cli/domains' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Domains do | describe Mastodon::CLI::Domains do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#purge' do |   describe '#purge' do | ||||||
|  |     let(:action) { :purge } | ||||||
|  | 
 | ||||||
|     context 'with accounts from the domain' do |     context 'with accounts from the domain' do | ||||||
|       let(:options) { {} } |  | ||||||
|       let(:domain) { 'host.example' } |       let(:domain) { 'host.example' } | ||||||
|       let!(:account) { Fabricate(:account, domain: domain) } |       let!(:account) { Fabricate(:account, domain: domain) } | ||||||
|  |       let(:arguments) { [domain] } | ||||||
| 
 | 
 | ||||||
|       it 'removes the account' do |       it 'removes the account' do | ||||||
|         expect { cli.invoke(:purge, [domain], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Removed 1 accounts') |           .to output_results('Removed 1 accounts') | ||||||
|         ).to_stdout | 
 | ||||||
|         expect { account.reload }.to raise_error(ActiveRecord::RecordNotFound) |         expect { account.reload }.to raise_error(ActiveRecord::RecordNotFound) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  | |||||||
| @ -4,96 +4,99 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/email_domain_blocks' | require 'mastodon/cli/email_domain_blocks' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::EmailDomainBlocks do | describe Mastodon::CLI::EmailDomainBlocks do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#list' do |   describe '#list' do | ||||||
|  |     let(:action) { :list } | ||||||
|  | 
 | ||||||
|     context 'with email domain block records' do |     context 'with email domain block records' do | ||||||
|       let!(:parent_block) { Fabricate(:email_domain_block) } |       let!(:parent_block) { Fabricate(:email_domain_block) } | ||||||
|       let!(:child_block) { Fabricate(:email_domain_block, parent: parent_block) } |       let!(:child_block) { Fabricate(:email_domain_block, parent: parent_block) } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|       it 'lists the blocks' do |       it 'lists the blocks' do | ||||||
|         expect { cli.invoke(:list, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including(parent_block.domain) |           .to output_results( | ||||||
|           .and(a_string_including(child_block.domain)) |             parent_block.domain, | ||||||
|         ).to_stdout |             child_block.domain | ||||||
|  |           ) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#add' do |   describe '#add' do | ||||||
|     context 'without any options' do |     let(:action) { :add } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|  |     context 'without any options' do | ||||||
|       it 'warns about usage and exits' do |       it 'warns about usage and exits' do | ||||||
|         expect { cli.invoke(:add, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('No domain(s) given') |           .to output_results('No domain(s) given') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when blocks exist' do |     context 'when blocks exist' do | ||||||
|       let(:options) { {} } |       let(:options) { {} } | ||||||
|       let(:domain) { 'host.example' } |       let(:domain) { 'host.example' } | ||||||
|  |       let(:arguments) { [domain] } | ||||||
| 
 | 
 | ||||||
|       before { Fabricate(:email_domain_block, domain: domain) } |       before { Fabricate(:email_domain_block, domain: domain) } | ||||||
| 
 | 
 | ||||||
|       it 'does not add a new block' do |       it 'does not add a new block' do | ||||||
|         expect { cli.invoke(:add, [domain], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('is already blocked') |           .to output_results('is already blocked') | ||||||
|         ).to_stdout |  | ||||||
|           .and(not_change(EmailDomainBlock, :count)) |           .and(not_change(EmailDomainBlock, :count)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when no blocks exist' do |     context 'when no blocks exist' do | ||||||
|       let(:options) { {} } |  | ||||||
|       let(:domain) { 'host.example' } |       let(:domain) { 'host.example' } | ||||||
|  |       let(:arguments) { [domain] } | ||||||
| 
 | 
 | ||||||
|       it 'adds a new block' do |       it 'adds a new block' do | ||||||
|         expect { cli.invoke(:add, [domain], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Added 1') |           .to output_results('Added 1') | ||||||
|         ).to_stdout |  | ||||||
|           .and(change(EmailDomainBlock, :count).by(1)) |           .and(change(EmailDomainBlock, :count).by(1)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#remove' do |   describe '#remove' do | ||||||
|     context 'without any options' do |     let(:action) { :remove } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|  |     context 'without any options' do | ||||||
|       it 'warns about usage and exits' do |       it 'warns about usage and exits' do | ||||||
|         expect { cli.invoke(:remove, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('No domain(s) given') |           .to output_results('No domain(s) given') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when blocks exist' do |     context 'when blocks exist' do | ||||||
|       let(:options) { {} } |  | ||||||
|       let(:domain) { 'host.example' } |       let(:domain) { 'host.example' } | ||||||
|  |       let(:arguments) { [domain] } | ||||||
| 
 | 
 | ||||||
|       before { Fabricate(:email_domain_block, domain: domain) } |       before { Fabricate(:email_domain_block, domain: domain) } | ||||||
| 
 | 
 | ||||||
|       it 'removes the block' do |       it 'removes the block' do | ||||||
|         expect { cli.invoke(:remove, [domain], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Removed 1') |           .to output_results('Removed 1') | ||||||
|         ).to_stdout |  | ||||||
|           .and(change(EmailDomainBlock, :count).by(-1)) |           .and(change(EmailDomainBlock, :count).by(-1)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when no blocks exist' do |     context 'when no blocks exist' do | ||||||
|       let(:options) { {} } |  | ||||||
|       let(:domain) { 'host.example' } |       let(:domain) { 'host.example' } | ||||||
|  |       let(:arguments) { [domain] } | ||||||
| 
 | 
 | ||||||
|       it 'does not remove a block' do |       it 'does not remove a block' do | ||||||
|         expect { cli.invoke(:remove, [domain], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('is not yet blocked') |           .to output_results('is not yet blocked') | ||||||
|         ).to_stdout |  | ||||||
|           .and(not_change(EmailDomainBlock, :count)) |           .and(not_change(EmailDomainBlock, :count)) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  | |||||||
| @ -4,10 +4,10 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/emoji' | require 'mastodon/cli/emoji' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Emoji do | describe Mastodon::CLI::Emoji do | ||||||
|   subject { cli.invoke(action, args, options) } |   subject { cli.invoke(action, arguments, options) } | ||||||
| 
 | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|   let(:args) { [] } |   let(:arguments) { [] } | ||||||
|   let(:options) { {} } |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| @ -29,7 +29,7 @@ describe Mastodon::CLI::Emoji do | |||||||
|     context 'with existing custom emoji' do |     context 'with existing custom emoji' do | ||||||
|       let(:import_path) { Rails.root.join('spec', 'fixtures', 'files', 'elite-assets.tar.gz') } |       let(:import_path) { Rails.root.join('spec', 'fixtures', 'files', 'elite-assets.tar.gz') } | ||||||
|       let(:action) { :import } |       let(:action) { :import } | ||||||
|       let(:args) { [import_path] } |       let(:arguments) { [import_path] } | ||||||
| 
 | 
 | ||||||
|       it 'reports about imported emoji' do |       it 'reports about imported emoji' do | ||||||
|         expect { subject } |         expect { subject } | ||||||
| @ -51,7 +51,7 @@ describe Mastodon::CLI::Emoji do | |||||||
|       after { FileUtils.rm_rf(export_path.dirname) } |       after { FileUtils.rm_rf(export_path.dirname) } | ||||||
| 
 | 
 | ||||||
|       let(:export_path) { Rails.root.join('tmp', 'cli-tests', 'export.tar.gz') } |       let(:export_path) { Rails.root.join('tmp', 'cli-tests', 'export.tar.gz') } | ||||||
|       let(:args) { [export_path.dirname.to_s] } |       let(:arguments) { [export_path.dirname.to_s] } | ||||||
|       let(:action) { :export } |       let(:action) { :export } | ||||||
| 
 | 
 | ||||||
|       it 'reports about exported emoji' do |       it 'reports about exported emoji' do | ||||||
| @ -61,8 +61,4 @@ describe Mastodon::CLI::Emoji do | |||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 |  | ||||||
|   def output_results(string) |  | ||||||
|     output(a_string_including(string)).to_stdout |  | ||||||
|   end |  | ||||||
| end | end | ||||||
|  | |||||||
| @ -4,20 +4,25 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/feeds' | require 'mastodon/cli/feeds' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Feeds do | describe Mastodon::CLI::Feeds do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#build' do |   describe '#build' do | ||||||
|  |     let(:action) { :build } | ||||||
|  | 
 | ||||||
|     before { Fabricate(:account) } |     before { Fabricate(:account) } | ||||||
| 
 | 
 | ||||||
|     context 'with --all option' do |     context 'with --all option' do | ||||||
|       let(:options) { { all: true } } |       let(:options) { { all: true } } | ||||||
| 
 | 
 | ||||||
|       it 'regenerates feeds for all accounts' do |       it 'regenerates feeds for all accounts' do | ||||||
|         expect { cli.invoke(:build, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Regenerated feeds') |           .to output_results('Regenerated feeds') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -27,9 +32,8 @@ describe Mastodon::CLI::Feeds do | |||||||
|       let(:arguments) { ['alice'] } |       let(:arguments) { ['alice'] } | ||||||
| 
 | 
 | ||||||
|       it 'regenerates feeds for the account' do |       it 'regenerates feeds for the account' do | ||||||
|         expect { cli.invoke(:build, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -37,22 +41,23 @@ describe Mastodon::CLI::Feeds do | |||||||
|       let(:arguments) { ['invalid-username'] } |       let(:arguments) { ['invalid-username'] } | ||||||
| 
 | 
 | ||||||
|       it 'displays an error and exits' do |       it 'displays an error and exits' do | ||||||
|         expect { cli.invoke(:build, arguments) }.to output( |         expect { subject } | ||||||
|           a_string_including('No such account') |           .to output_results('No such account') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#clear' do |   describe '#clear' do | ||||||
|  |     let(:action) { :clear } | ||||||
|  | 
 | ||||||
|     before do |     before do | ||||||
|       allow(redis).to receive(:del).with(key_namespace) |       allow(redis).to receive(:del).with(key_namespace) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     it 'clears the redis `feed:*` namespace' do |     it 'clears the redis `feed:*` namespace' do | ||||||
|       expect { cli.invoke(:clear) }.to output( |       expect { subject } | ||||||
|         a_string_including('OK') |         .to output_results('OK') | ||||||
|       ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|       expect(redis).to have_received(:del).with(key_namespace).once |       expect(redis).to have_received(:del).with(key_namespace).once | ||||||
|     end |     end | ||||||
|  | |||||||
| @ -4,11 +4,16 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/ip_blocks' | require 'mastodon/cli/ip_blocks' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::IpBlocks do | describe Mastodon::CLI::IpBlocks do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#add' do |   describe '#add' do | ||||||
|  |     let(:action) { :add } | ||||||
|     let(:ip_list) do |     let(:ip_list) do | ||||||
|       [ |       [ | ||||||
|         '192.0.2.1', |         '192.0.2.1', | ||||||
| @ -25,10 +30,11 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       ] |       ] | ||||||
|     end |     end | ||||||
|     let(:options) { { severity: 'no_access' } } |     let(:options) { { severity: 'no_access' } } | ||||||
|  |     let(:arguments) { ip_list } | ||||||
| 
 | 
 | ||||||
|     shared_examples 'ip address blocking' do |     shared_examples 'ip address blocking' do | ||||||
|       it 'blocks all specified IP addresses' do |       it 'blocks all specified IP addresses' do | ||||||
|         cli.invoke(:add, ip_list, options) |         subject | ||||||
| 
 | 
 | ||||||
|         blocked_ip_addresses = IpBlock.where(ip: ip_list).pluck(:ip) |         blocked_ip_addresses = IpBlock.where(ip: ip_list).pluck(:ip) | ||||||
|         expected_ip_addresses = ip_list.map { |ip| IPAddr.new(ip) } |         expected_ip_addresses = ip_list.map { |ip| IPAddr.new(ip) } | ||||||
| @ -37,7 +43,7 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'sets the severity for all blocked IP addresses' do |       it 'sets the severity for all blocked IP addresses' do | ||||||
|         cli.invoke(:add, ip_list, options) |         subject | ||||||
| 
 | 
 | ||||||
|         blocked_ips_severity = IpBlock.where(ip: ip_list).pluck(:severity).all?(options[:severity]) |         blocked_ips_severity = IpBlock.where(ip: ip_list).pluck(:severity).all?(options[:severity]) | ||||||
| 
 | 
 | ||||||
| @ -45,9 +51,8 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays a success message with a summary' do |       it 'displays a success message with a summary' do | ||||||
|         expect { cli.invoke(:add, ip_list, options) }.to output( |         expect { subject } | ||||||
|           a_string_including("Added #{ip_list.size}, skipped 0, failed 0") |           .to output_results("Added #{ip_list.size}, skipped 0, failed 0") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -57,19 +62,19 @@ describe Mastodon::CLI::IpBlocks do | |||||||
| 
 | 
 | ||||||
|     context 'when a specified IP address is already blocked' do |     context 'when a specified IP address is already blocked' do | ||||||
|       let!(:blocked_ip) { IpBlock.create(ip: ip_list.last, severity: options[:severity]) } |       let!(:blocked_ip) { IpBlock.create(ip: ip_list.last, severity: options[:severity]) } | ||||||
|  |       let(:arguments) { ip_list } | ||||||
| 
 | 
 | ||||||
|       it 'skips the already blocked IP address' do |       it 'skips the already blocked IP address' do | ||||||
|         allow(IpBlock).to receive(:new).and_call_original |         allow(IpBlock).to receive(:new).and_call_original | ||||||
| 
 | 
 | ||||||
|         cli.invoke(:add, ip_list, options) |         subject | ||||||
| 
 | 
 | ||||||
|         expect(IpBlock).to_not have_received(:new).with(ip: ip_list.last) |         expect(IpBlock).to_not have_received(:new).with(ip: ip_list.last) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays the correct summary' do |       it 'displays the correct summary' do | ||||||
|         expect { cli.invoke(:add, ip_list, options) }.to output( |         expect { subject } | ||||||
|           a_string_including("#{ip_list.last} is already blocked\nAdded #{ip_list.size - 1}, skipped 1, failed 0") |           .to output_results("#{ip_list.last} is already blocked\nAdded #{ip_list.size - 1}, skipped 1, failed 0") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       context 'with --force option' do |       context 'with --force option' do | ||||||
| @ -77,7 +82,7 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|         let(:options) { { severity: 'sign_up_requires_approval', force: true } } |         let(:options) { { severity: 'sign_up_requires_approval', force: true } } | ||||||
| 
 | 
 | ||||||
|         it 'overwrites the existing IP block record' do |         it 'overwrites the existing IP block record' do | ||||||
|           expect { cli.invoke(:add, ip_list, options) } |           expect { subject } | ||||||
|             .to change { blocked_ip.reload.severity } |             .to change { blocked_ip.reload.severity } | ||||||
|             .from('no_access') |             .from('no_access') | ||||||
|             .to('sign_up_requires_approval') |             .to('sign_up_requires_approval') | ||||||
| @ -89,11 +94,11 @@ describe Mastodon::CLI::IpBlocks do | |||||||
| 
 | 
 | ||||||
|     context 'when a specified IP address is invalid' do |     context 'when a specified IP address is invalid' do | ||||||
|       let(:ip_list) { ['320.15.175.0', '9.5.105.255', '0.0.0.0'] } |       let(:ip_list) { ['320.15.175.0', '9.5.105.255', '0.0.0.0'] } | ||||||
|  |       let(:arguments) { ip_list } | ||||||
| 
 | 
 | ||||||
|       it 'displays the correct summary' do |       it 'displays the correct summary' do | ||||||
|         expect { cli.invoke(:add, ip_list, options) }.to output( |         expect { subject } | ||||||
|           a_string_including("#{ip_list.first} is invalid\nAdded #{ip_list.size - 1}, skipped 0, failed 1") |           .to output_results("#{ip_list.first} is invalid\nAdded #{ip_list.size - 1}, skipped 0, failed 1") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -124,6 +129,7 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|     context 'when a specified IP address fails to be blocked' do |     context 'when a specified IP address fails to be blocked' do | ||||||
|       let(:ip_address) { '127.0.0.1' } |       let(:ip_address) { '127.0.0.1' } | ||||||
|       let(:ip_block) { instance_double(IpBlock, ip: ip_address, save: false) } |       let(:ip_block) { instance_double(IpBlock, ip: ip_address, save: false) } | ||||||
|  |       let(:arguments) { [ip_address] } | ||||||
| 
 | 
 | ||||||
|       before do |       before do | ||||||
|         allow(IpBlock).to receive(:new).and_return(ip_block) |         allow(IpBlock).to receive(:new).and_return(ip_block) | ||||||
| @ -132,24 +138,25 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays an error message' do |       it 'displays an error message' do | ||||||
|         expect { cli.invoke(:add, [ip_address], options) } |         expect { subject } | ||||||
|           .to output( |           .to output_results("#{ip_address} could not be saved") | ||||||
|             a_string_including("#{ip_address} could not be saved") |  | ||||||
|           ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when no IP address is provided' do |     context 'when no IP address is provided' do | ||||||
|  |       let(:arguments) { [] } | ||||||
|  | 
 | ||||||
|       it 'exits with an error message' do |       it 'exits with an error message' do | ||||||
|         expect { cli.add }.to output( |         expect { subject } | ||||||
|           a_string_including('No IP(s) given') |           .to output_results('No IP(s) given') | ||||||
|         ).to_stdout |  | ||||||
|           .and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#remove' do |   describe '#remove' do | ||||||
|  |     let(:action) { :remove } | ||||||
|  | 
 | ||||||
|     context 'when removing exact matches' do |     context 'when removing exact matches' do | ||||||
|       let(:ip_list) do |       let(:ip_list) do | ||||||
|         [ |         [ | ||||||
| @ -166,21 +173,21 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|           '::/128', |           '::/128', | ||||||
|         ] |         ] | ||||||
|       end |       end | ||||||
|  |       let(:arguments) { ip_list } | ||||||
| 
 | 
 | ||||||
|       before do |       before do | ||||||
|         ip_list.each { |ip| IpBlock.create(ip: ip, severity: :no_access) } |         ip_list.each { |ip| IpBlock.create(ip: ip, severity: :no_access) } | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'removes exact IP blocks' do |       it 'removes exact IP blocks' do | ||||||
|         cli.invoke(:remove, ip_list) |         subject | ||||||
| 
 | 
 | ||||||
|         expect(IpBlock.where(ip: ip_list)).to_not exist |         expect(IpBlock.where(ip: ip_list)).to_not exist | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays success message with a summary' do |       it 'displays success message with a summary' do | ||||||
|         expect { cli.invoke(:remove, ip_list) }.to output( |         expect { subject } | ||||||
|           a_string_including("Removed #{ip_list.size}, skipped 0") |           .to output_results("Removed #{ip_list.size}, skipped 0") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -192,13 +199,13 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       let(:options) { { force: true } } |       let(:options) { { force: true } } | ||||||
| 
 | 
 | ||||||
|       it 'removes blocks for IP ranges that cover given IP(s)' do |       it 'removes blocks for IP ranges that cover given IP(s)' do | ||||||
|         cli.invoke(:remove, arguments, options) |         subject | ||||||
| 
 | 
 | ||||||
|         expect(IpBlock.where(id: [first_ip_range_block.id, second_ip_range_block.id])).to_not exist |         expect(IpBlock.where(id: [first_ip_range_block.id, second_ip_range_block.id])).to_not exist | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'does not remove other IP ranges' do |       it 'does not remove other IP ranges' do | ||||||
|         cli.invoke(:remove, arguments, options) |         subject | ||||||
| 
 | 
 | ||||||
|         expect(IpBlock.where(id: third_ip_range_block.id)).to exist |         expect(IpBlock.where(id: third_ip_range_block.id)).to exist | ||||||
|       end |       end | ||||||
| @ -206,47 +213,46 @@ describe Mastodon::CLI::IpBlocks do | |||||||
| 
 | 
 | ||||||
|     context 'when a specified IP address is not blocked' do |     context 'when a specified IP address is not blocked' do | ||||||
|       let(:unblocked_ip) { '192.0.2.1' } |       let(:unblocked_ip) { '192.0.2.1' } | ||||||
|  |       let(:arguments) { [unblocked_ip] } | ||||||
| 
 | 
 | ||||||
|       it 'skips the IP address' do |       it 'skips the IP address' do | ||||||
|         expect { cli.invoke(:remove, [unblocked_ip]) }.to output( |         expect { subject } | ||||||
|           a_string_including("#{unblocked_ip} is not yet blocked") |           .to output_results("#{unblocked_ip} is not yet blocked") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays the summary correctly' do |       it 'displays the summary correctly' do | ||||||
|         expect { cli.invoke(:remove, [unblocked_ip]) }.to output( |         expect { subject } | ||||||
|           a_string_including('Removed 0, skipped 1') |           .to output_results('Removed 0, skipped 1') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when a specified IP address is invalid' do |     context 'when a specified IP address is invalid' do | ||||||
|       let(:invalid_ip) { '320.15.175.0' } |       let(:invalid_ip) { '320.15.175.0' } | ||||||
|  |       let(:arguments) { [invalid_ip] } | ||||||
| 
 | 
 | ||||||
|       it 'skips the invalid IP address' do |       it 'skips the invalid IP address' do | ||||||
|         expect { cli.invoke(:remove, [invalid_ip]) }.to output( |         expect { subject } | ||||||
|           a_string_including("#{invalid_ip} is invalid") |           .to output_results("#{invalid_ip} is invalid") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays the summary correctly' do |       it 'displays the summary correctly' do | ||||||
|         expect { cli.invoke(:remove, [invalid_ip]) }.to output( |         expect { subject } | ||||||
|           a_string_including('Removed 0, skipped 1') |           .to output_results('Removed 0, skipped 1') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when no IP address is provided' do |     context 'when no IP address is provided' do | ||||||
|       it 'exits with an error message' do |       it 'exits with an error message' do | ||||||
|         expect { cli.remove }.to output( |         expect { subject } | ||||||
|           a_string_including('No IP(s) given') |           .to output_results('No IP(s) given') | ||||||
|         ).to_stdout |  | ||||||
|           .and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#export' do |   describe '#export' do | ||||||
|  |     let(:action) { :export } | ||||||
|  | 
 | ||||||
|     let(:first_ip_range_block) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } |     let(:first_ip_range_block) { IpBlock.create(ip: '192.168.0.0/24', severity: :no_access) } | ||||||
|     let(:second_ip_range_block) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } |     let(:second_ip_range_block) { IpBlock.create(ip: '10.0.0.0/16', severity: :no_access) } | ||||||
|     let(:third_ip_range_block) { IpBlock.create(ip: '127.0.0.1', severity: :sign_up_block) } |     let(:third_ip_range_block) { IpBlock.create(ip: '127.0.0.1', severity: :sign_up_block) } | ||||||
| @ -255,15 +261,13 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       let(:options) { { format: 'plain' } } |       let(:options) { { format: 'plain' } } | ||||||
| 
 | 
 | ||||||
|       it 'exports blocked IPs with "no_access" severity in plain format' do |       it 'exports blocked IPs with "no_access" severity in plain format' do | ||||||
|         expect { cli.invoke(:export, nil, options) }.to output( |         expect { subject } | ||||||
|           a_string_including("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") |           .to output_results("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'does not export bloked IPs with different severities' do |       it 'does not export bloked IPs with different severities' do | ||||||
|         expect { cli.invoke(:export, nil, options) }.to_not output( |         expect { subject } | ||||||
|           a_string_including("#{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}") |           .to_not output_results("#{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -271,23 +275,20 @@ describe Mastodon::CLI::IpBlocks do | |||||||
|       let(:options) { { format: 'nginx' } } |       let(:options) { { format: 'nginx' } } | ||||||
| 
 | 
 | ||||||
|       it 'exports blocked IPs with "no_access" severity in plain format' do |       it 'exports blocked IPs with "no_access" severity in plain format' do | ||||||
|         expect { cli.invoke(:export, nil, options) }.to output( |         expect { subject } | ||||||
|           a_string_including("deny #{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};\ndeny #{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix};") |           .to output_results("deny #{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};\ndeny #{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix};") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'does not export bloked IPs with different severities' do |       it 'does not export bloked IPs with different severities' do | ||||||
|         expect { cli.invoke(:export, nil, options) }.to_not output( |         expect { subject } | ||||||
|           a_string_including("deny #{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};") |           .to_not output_results("deny #{third_ip_range_block.ip}/#{first_ip_range_block.ip.prefix};") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'when --format option is not provided' do |     context 'when --format option is not provided' do | ||||||
|       it 'exports blocked IPs in plain format by default' do |       it 'exports blocked IPs in plain format by default' do | ||||||
|         expect { cli.export }.to output( |         expect { subject } | ||||||
|           a_string_including("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") |           .to output_results("#{first_ip_range_block.ip}/#{first_ip_range_block.ip.prefix}\n#{second_ip_range_block.ip}/#{second_ip_range_block.ip.prefix}") | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,13 +4,20 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/main' | require 'mastodon/cli/main' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Main do | 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' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe 'version' do |   describe '#version' do | ||||||
|  |     let(:action) { :version } | ||||||
|  | 
 | ||||||
|     it 'returns the Mastodon version' do |     it 'returns the Mastodon version' do | ||||||
|       expect { described_class.new.invoke(:version) }.to output( |       expect { subject } | ||||||
|         a_string_including(Mastodon::Version.to_s) |         .to output_results(Mastodon::Version.to_s) | ||||||
|       ).to_stdout |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  | |||||||
| @ -4,20 +4,26 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/maintenance' | require 'mastodon/cli/maintenance' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Maintenance do | describe Mastodon::CLI::Maintenance do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#fix_duplicates' do |   describe '#fix_duplicates' do | ||||||
|  |     let(:action) { :fix_duplicates } | ||||||
|  | 
 | ||||||
|     context 'when the database version is too old' do |     context 'when the database version is too old' do | ||||||
|       before do |       before do | ||||||
|         allow(ActiveRecord::Migrator).to receive(:current_version).and_return(2000_01_01_000000) # Earlier than minimum |         allow(ActiveRecord::Migrator).to receive(:current_version).and_return(2000_01_01_000000) # Earlier than minimum | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'Exits with error message' do |       it 'Exits with error message' do | ||||||
|         expect { cli.invoke :fix_duplicates }.to output( |         expect { subject } | ||||||
|           a_string_including('is too old') |           .to output_results('is too old') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -28,9 +34,9 @@ describe Mastodon::CLI::Maintenance do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'Exits with error message' do |       it 'Exits with error message' do | ||||||
|         expect { cli.invoke :fix_duplicates }.to output( |         expect { subject } | ||||||
|           a_string_including('more recent') |           .to output_results('more recent') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -41,9 +47,9 @@ describe Mastodon::CLI::Maintenance do | |||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'Exits with error message' do |       it 'Exits with error message' do | ||||||
|         expect { cli.invoke :fix_duplicates }.to output( |         expect { subject } | ||||||
|           a_string_including('Sidekiq is running') |           .to output_results('Sidekiq is running') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,18 +4,24 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/media' | require 'mastodon/cli/media' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Media do | describe Mastodon::CLI::Media do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#remove' do |   describe '#remove' do | ||||||
|  |     let(:action) { :remove } | ||||||
|  | 
 | ||||||
|     context 'with --prune-profiles and --remove-headers' do |     context 'with --prune-profiles and --remove-headers' do | ||||||
|       let(:options) { { prune_profiles: true, remove_headers: true } } |       let(:options) { { prune_profiles: true, remove_headers: true } } | ||||||
| 
 | 
 | ||||||
|       it 'warns about usage and exits' do |       it 'warns about usage and exits' do | ||||||
|         expect { cli.invoke(:remove, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('--prune-profiles and --remove-headers should not be specified simultaneously') |           .to output_results('--prune-profiles and --remove-headers should not be specified simultaneously') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -23,9 +29,9 @@ describe Mastodon::CLI::Media do | |||||||
|       let(:options) { { include_follows: true } } |       let(:options) { { include_follows: true } } | ||||||
| 
 | 
 | ||||||
|       it 'warns about usage and exits' do |       it 'warns about usage and exits' do | ||||||
|         expect { cli.invoke(:remove, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('--include-follows can only be used with --prune-profiles or --remove-headers') |           .to output_results('--include-follows can only be used with --prune-profiles or --remove-headers') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -38,9 +44,8 @@ describe Mastodon::CLI::Media do | |||||||
|         let(:options) { { prune_profiles: true } } |         let(:options) { { prune_profiles: true } } | ||||||
| 
 | 
 | ||||||
|         it 'removes account avatars' do |         it 'removes account avatars' do | ||||||
|           expect { cli.invoke(:remove, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('Visited 1') |             .to output_results('Visited 1') | ||||||
|           ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|           expect(account.reload.avatar).to be_blank |           expect(account.reload.avatar).to be_blank | ||||||
|         end |         end | ||||||
| @ -50,9 +55,8 @@ describe Mastodon::CLI::Media do | |||||||
|         let(:options) { { remove_headers: true } } |         let(:options) { { remove_headers: true } } | ||||||
| 
 | 
 | ||||||
|         it 'removes account header' do |         it 'removes account header' do | ||||||
|           expect { cli.invoke(:remove, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('Visited 1') |             .to output_results('Visited 1') | ||||||
|           ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|           expect(account.reload.header).to be_blank |           expect(account.reload.header).to be_blank | ||||||
|         end |         end | ||||||
| @ -64,9 +68,8 @@ describe Mastodon::CLI::Media do | |||||||
| 
 | 
 | ||||||
|       context 'without options' do |       context 'without options' do | ||||||
|         it 'removes account avatars' do |         it 'removes account avatars' do | ||||||
|           expect { cli.invoke(:remove) }.to output( |           expect { subject } | ||||||
|             a_string_including('Removed 1') |             .to output_results('Removed 1') | ||||||
|           ).to_stdout |  | ||||||
| 
 | 
 | ||||||
|           expect(media_attachment.reload.file).to be_blank |           expect(media_attachment.reload.file).to be_blank | ||||||
|           expect(media_attachment.reload.thumbnail).to be_blank |           expect(media_attachment.reload.thumbnail).to be_blank | ||||||
| @ -76,25 +79,24 @@ describe Mastodon::CLI::Media do | |||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#usage' do |   describe '#usage' do | ||||||
|     context 'without options' do |     let(:action) { :usage } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|  |     context 'without options' do | ||||||
|       it 'reports about storage size' do |       it 'reports about storage size' do | ||||||
|         expect { cli.invoke(:usage, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('0 Bytes') |           .to output_results('0 Bytes') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   describe '#refresh' do |   describe '#refresh' do | ||||||
|     context 'without any options' do |     let(:action) { :refresh } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|  |     context 'without any options' do | ||||||
|       it 'warns about usage and exits' do |       it 'warns about usage and exits' do | ||||||
|         expect { cli.invoke(:refresh, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Specify the source') |           .to output_results('Specify the source') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -108,9 +110,8 @@ describe Mastodon::CLI::Media do | |||||||
|       let(:status) { Fabricate(:status) } |       let(:status) { Fabricate(:status) } | ||||||
| 
 | 
 | ||||||
|       it 'redownloads the attachment file' do |       it 'redownloads the attachment file' do | ||||||
|         expect { cli.invoke(:refresh, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Downloaded 1 media') |           .to output_results('Downloaded 1 media') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
| @ -119,9 +120,9 @@ describe Mastodon::CLI::Media do | |||||||
|         let(:options) { { account: 'not-real-user@example.host' } } |         let(:options) { { account: 'not-real-user@example.host' } } | ||||||
| 
 | 
 | ||||||
|         it 'warns about usage and exits' do |         it 'warns about usage and exits' do | ||||||
|           expect { cli.invoke(:refresh, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('No such account') |             .to output_results('No such account') | ||||||
|           ).to_stdout.and raise_error(SystemExit) |             .and raise_error(SystemExit) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
| @ -135,9 +136,8 @@ describe Mastodon::CLI::Media do | |||||||
|         let(:account) { Fabricate(:account) } |         let(:account) { Fabricate(:account) } | ||||||
| 
 | 
 | ||||||
|         it 'redownloads the attachment file' do |         it 'redownloads the attachment file' do | ||||||
|           expect { cli.invoke(:refresh, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('Downloaded 1 media') |             .to output_results('Downloaded 1 media') | ||||||
|           ).to_stdout |  | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| @ -153,9 +153,8 @@ describe Mastodon::CLI::Media do | |||||||
|       let(:account) { Fabricate(:account, domain: domain) } |       let(:account) { Fabricate(:account, domain: domain) } | ||||||
| 
 | 
 | ||||||
|       it 'redownloads the attachment file' do |       it 'redownloads the attachment file' do | ||||||
|         expect { cli.invoke(:refresh, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Downloaded 1 media') |           .to output_results('Downloaded 1 media') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,11 +4,17 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/preview_cards' | require 'mastodon/cli/preview_cards' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::PreviewCards do | describe Mastodon::CLI::PreviewCards do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#remove' do |   describe '#remove' do | ||||||
|  |     let(:action) { :remove } | ||||||
|  | 
 | ||||||
|     context 'with relevant preview cards' do |     context 'with relevant preview cards' do | ||||||
|       before do |       before do | ||||||
|         Fabricate(:preview_card, updated_at: 10.years.ago, type: :link) |         Fabricate(:preview_card, updated_at: 10.years.ago, type: :link) | ||||||
| @ -18,10 +24,11 @@ describe Mastodon::CLI::PreviewCards do | |||||||
| 
 | 
 | ||||||
|       context 'with no arguments' do |       context 'with no arguments' do | ||||||
|         it 'deletes thumbnails for local preview cards' do |         it 'deletes thumbnails for local preview cards' do | ||||||
|           expect { cli.invoke(:remove) }.to output( |           expect { subject } | ||||||
|             a_string_including('Removed 2 preview cards') |             .to output_results( | ||||||
|               .and(a_string_including('approx. 119 KB')) |               'Removed 2 preview cards', | ||||||
|           ).to_stdout |               'approx. 119 KB' | ||||||
|  |             ) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
| @ -29,10 +36,11 @@ describe Mastodon::CLI::PreviewCards do | |||||||
|         let(:options) { { link: true } } |         let(:options) { { link: true } } | ||||||
| 
 | 
 | ||||||
|         it 'deletes thumbnails for local preview cards' do |         it 'deletes thumbnails for local preview cards' do | ||||||
|           expect { cli.invoke(:remove, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('Removed 1 link-type preview cards') |             .to output_results( | ||||||
|               .and(a_string_including('approx. 59.6 KB')) |               'Removed 1 link-type preview cards', | ||||||
|           ).to_stdout |               'approx. 59.6 KB' | ||||||
|  |             ) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
| @ -40,10 +48,11 @@ describe Mastodon::CLI::PreviewCards do | |||||||
|         let(:options) { { days: 365 } } |         let(:options) { { days: 365 } } | ||||||
| 
 | 
 | ||||||
|         it 'deletes thumbnails for local preview cards' do |         it 'deletes thumbnails for local preview cards' do | ||||||
|           expect { cli.invoke(:remove, [], options) }.to output( |           expect { subject } | ||||||
|             a_string_including('Removed 1 preview cards') |             .to output_results( | ||||||
|               .and(a_string_including('approx. 59.6 KB')) |               'Removed 1 preview cards', | ||||||
|           ).to_stdout |               'approx. 59.6 KB' | ||||||
|  |             ) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|  | |||||||
| @ -7,59 +7,64 @@ describe Mastodon::CLI::Settings do | |||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe 'subcommand "registrations"' do |   describe 'subcommand "registrations"' do | ||||||
|  |     subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|     let(:cli) { Mastodon::CLI::Registrations.new } |     let(:cli) { Mastodon::CLI::Registrations.new } | ||||||
|  |     let(:arguments) { [] } | ||||||
|  |     let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|     before do |     before do | ||||||
|       Setting.registrations_mode = nil |       Setting.registrations_mode = nil | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     describe '#open' do |     describe '#open' do | ||||||
|  |       let(:action) { :open } | ||||||
|  | 
 | ||||||
|       it 'changes "registrations_mode" to "open"' do |       it 'changes "registrations_mode" to "open"' do | ||||||
|         expect { cli.open }.to change(Setting, :registrations_mode).from(nil).to('open') |         expect { subject }.to change(Setting, :registrations_mode).from(nil).to('open') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays success message' do |       it 'displays success message' do | ||||||
|         expect { cli.open }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     describe '#approved' do |     describe '#approved' do | ||||||
|  |       let(:action) { :approved } | ||||||
|  | 
 | ||||||
|       it 'changes "registrations_mode" to "approved"' do |       it 'changes "registrations_mode" to "approved"' do | ||||||
|         expect { cli.approved }.to change(Setting, :registrations_mode).from(nil).to('approved') |         expect { subject }.to change(Setting, :registrations_mode).from(nil).to('approved') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays success message' do |       it 'displays success message' do | ||||||
|         expect { cli.approved }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       context 'with --require-reason' do |       context 'with --require-reason' do | ||||||
|         before do |         let(:options) { { require_reason: true } } | ||||||
|           cli.options = { require_reason: true } |  | ||||||
|         end |  | ||||||
| 
 | 
 | ||||||
|         it 'changes "registrations_mode" to "approved"' do |         it 'changes "registrations_mode" to "approved"' do | ||||||
|           expect { cli.approved }.to change(Setting, :registrations_mode).from(nil).to('approved') |           expect { subject }.to change(Setting, :registrations_mode).from(nil).to('approved') | ||||||
|         end |         end | ||||||
| 
 | 
 | ||||||
|         it 'sets "require_invite_text" to "true"' do |         it 'sets "require_invite_text" to "true"' do | ||||||
|           expect { cli.approved }.to change(Setting, :require_invite_text).from(false).to(true) |           expect { subject }.to change(Setting, :require_invite_text).from(false).to(true) | ||||||
|         end |         end | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     describe '#close' do |     describe '#close' do | ||||||
|  |       let(:action) { :close } | ||||||
|  | 
 | ||||||
|       it 'changes "registrations_mode" to "none"' do |       it 'changes "registrations_mode" to "none"' do | ||||||
|         expect { cli.close }.to change(Setting, :registrations_mode).from(nil).to('none') |         expect { subject }.to change(Setting, :registrations_mode).from(nil).to('none') | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'displays success message' do |       it 'displays success message' do | ||||||
|         expect { cli.close }.to output( |         expect { subject } | ||||||
|           a_string_including('OK') |           .to output_results('OK') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,26 +4,31 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/statuses' | require 'mastodon/cli/statuses' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Statuses do | describe Mastodon::CLI::Statuses do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#remove', use_transactional_tests: false do |   describe '#remove', use_transactional_tests: false do | ||||||
|  |     let(:action) { :remove } | ||||||
|  | 
 | ||||||
|     context 'with small batch size' do |     context 'with small batch size' do | ||||||
|       let(:options) { { batch_size: 0 } } |       let(:options) { { batch_size: 0 } } | ||||||
| 
 | 
 | ||||||
|       it 'exits with error message' do |       it 'exits with error message' do | ||||||
|         expect { cli.invoke :remove, [], options }.to output( |         expect { subject } | ||||||
|           a_string_including('Cannot run') |           .to output_results('Cannot run') | ||||||
|         ).to_stdout.and raise_error(SystemExit) |           .and raise_error(SystemExit) | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     context 'with default batch size' do |     context 'with default batch size' do | ||||||
|       it 'removes unreferenced statuses' do |       it 'removes unreferenced statuses' do | ||||||
|         expect { cli.invoke :remove }.to output( |         expect { subject } | ||||||
|           a_string_including('Done after') |           .to output_results('Done after') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -4,23 +4,26 @@ require 'rails_helper' | |||||||
| require 'mastodon/cli/upgrade' | require 'mastodon/cli/upgrade' | ||||||
| 
 | 
 | ||||||
| describe Mastodon::CLI::Upgrade do | describe Mastodon::CLI::Upgrade do | ||||||
|  |   subject { cli.invoke(action, arguments, options) } | ||||||
|  | 
 | ||||||
|   let(:cli) { described_class.new } |   let(:cli) { described_class.new } | ||||||
|  |   let(:arguments) { [] } | ||||||
|  |   let(:options) { {} } | ||||||
| 
 | 
 | ||||||
|   it_behaves_like 'CLI Command' |   it_behaves_like 'CLI Command' | ||||||
| 
 | 
 | ||||||
|   describe '#storage_schema' do |   describe '#storage_schema' do | ||||||
|     context 'with records that dont need upgrading' do |     let(:action) { :storage_schema } | ||||||
|       let(:options) { {} } |  | ||||||
| 
 | 
 | ||||||
|  |     context 'with records that dont need upgrading' do | ||||||
|       before do |       before do | ||||||
|         Fabricate(:account) |         Fabricate(:account) | ||||||
|         Fabricate(:media_attachment) |         Fabricate(:media_attachment) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'does not upgrade storage for the attachments' do |       it 'does not upgrade storage for the attachments' do | ||||||
|         expect { cli.invoke(:storage_schema, [], options) }.to output( |         expect { subject } | ||||||
|           a_string_including('Upgraded storage schema of 0 records') |           .to output_results('Upgraded storage schema of 0 records') | ||||||
|         ).to_stdout |  | ||||||
|       end |       end | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | |||||||
| @ -88,6 +88,7 @@ RSpec.configure do |config| | |||||||
|   config.include Chewy::Rspec::Helpers |   config.include Chewy::Rspec::Helpers | ||||||
|   config.include Redisable |   config.include Redisable | ||||||
|   config.include SignedRequestHelpers, type: :request |   config.include SignedRequestHelpers, type: :request | ||||||
|  |   config.include CommandLineHelpers, type: :cli | ||||||
| 
 | 
 | ||||||
|   config.around(:each, use_transactional_tests: false) do |example| |   config.around(:each, use_transactional_tests: false) do |example| | ||||||
|     self.use_transactional_tests = false |     self.use_transactional_tests = false | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								spec/support/command_line_helpers.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								spec/support/command_line_helpers.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | # frozen_string_literal: true | ||||||
|  | 
 | ||||||
|  | module CommandLineHelpers | ||||||
|  |   def output_results(*args) | ||||||
|  |     output( | ||||||
|  |       include(*args) | ||||||
|  |     ).to_stdout | ||||||
|  |   end | ||||||
|  | end | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user