discourse/spec/integrity/coding_style_spec.rb

62 lines
2.1 KiB
Ruby

# frozen_string_literal: true
def list_files(base_dir, pattern = "*")
Dir[File.join("#{base_dir}", pattern)]
end
def grep_files(files, regex)
files.select { |file| grep_file(file, regex) }
end
def grep_file(file, regex)
lines = File.open(file).grep(regex)
lines.count > 0 ? file : nil
end
RSpec.describe "Coding style" do
describe "Post Migrations" do
def check_offenses(files, method_name, constant_name)
method_name_regex = /#{Regexp.escape(method_name)}/
constant_name_regex = /#{Regexp.escape(constant_name)}/
offenses = files.reject { |file| is_valid?(file, method_name_regex, constant_name_regex) }
expect(offenses).to be_empty, <<~TEXT
You need to use the constant #{constant_name} when you use
#{method_name} in order to help with restoring backups.
Please take a look at existing migrations to see how to use it correctly.
Offenses:
#{offenses.join("\n")}
TEXT
end
def is_valid?(file, method_name_regex, constant_name_regex)
contains_method_name = File.open(file).grep(method_name_regex).any?
contains_constant_name = File.open(file).grep(constant_name_regex).any?
contains_method_name ? contains_constant_name : true
end
it "ensures dropped tables and columns are stored in constants" do
migration_files = list_files("db/post_migrate", "**/*.rb")
check_offenses(migration_files, "ColumnDropper.execute_drop", "DROPPED_COLUMNS")
check_offenses(migration_files, "TableDropper.execute_drop", "DROPPED_TABLES")
end
end
describe "non-colocated component templates" do
{
"discourse" => "app/assets/javascripts/discourse/app/templates/components",
"admin" => "app/assets/javascripts/admin/addon/templates/components",
"chat/discourse" => "plugins/chat/assets/javascripts/discourse/templates/components",
"chat/admin" => "plugins/chat/assets/javascripts/admin/templates/components",
}.each_pair do |name, dir|
it "do not exist for #{name}" do
expect(list_files(dir)).to eq([])
end
end
end
end