mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 00:23:41 +08:00
875f0d8fd8
This feature adds the ability to define synonyms for tags, and the ability to merge one tag into another while keeping it as a synonym. For example, tags named "js" and "java-script" can be synonyms of "javascript". When searching and creating topics using synonyms, they will be mapped to the base tag. Along with this change is a new UI found on each tag's page (for example, `/tags/javascript`) where more information about the tag can be shown. It will list the synonyms, which categories it's restricted to (if any), and which tag groups it belongs to (if tag group names are public on the `/tags` page by enabling the "tags listed by group" setting). Staff users will be able to manage tags in this UI, merge tags, and add/remove synonyms.
151 lines
3.8 KiB
Ruby
151 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Helpers
|
|
extend ActiveSupport::Concern
|
|
|
|
def self.next_seq
|
|
@next_seq = (@next_seq || 0) + 1
|
|
end
|
|
|
|
def log_in(fabricator = nil)
|
|
user = Fabricate(fabricator || :user)
|
|
log_in_user(user)
|
|
user
|
|
end
|
|
|
|
def log_in_user(user)
|
|
provider = Discourse.current_user_provider.new(request.env)
|
|
provider.log_on_user(user, session, cookies)
|
|
provider
|
|
end
|
|
|
|
def log_out_user(provider)
|
|
provider.log_off_user(session, cookies)
|
|
end
|
|
|
|
def fixture_file(filename)
|
|
return '' if filename.blank?
|
|
file_path = File.expand_path(Rails.root + 'spec/fixtures/' + filename)
|
|
File.read(file_path)
|
|
end
|
|
|
|
def build(*args)
|
|
Fabricate.build(*args)
|
|
end
|
|
|
|
def create_topic(args = {})
|
|
args[:title] ||= "This is my title #{Helpers.next_seq}"
|
|
user = args.delete(:user) || Fabricate(:user)
|
|
guardian = Guardian.new(user)
|
|
args[:category] = args[:category].id if args[:category].is_a?(Category)
|
|
TopicCreator.create(user, guardian, args)
|
|
end
|
|
|
|
def create_post(args = {})
|
|
args[:title] ||= "This is my title #{Helpers.next_seq}"
|
|
args[:raw] ||= "This is the raw body of my post, it is cool #{Helpers.next_seq}"
|
|
args[:topic_id] = args[:topic].id if args[:topic]
|
|
user = args.delete(:user) || Fabricate(:user)
|
|
args[:category] = args[:category].id if args[:category].is_a?(Category)
|
|
creator = PostCreator.new(user, args)
|
|
post = creator.create
|
|
|
|
if creator.errors.present?
|
|
raise StandardError.new(creator.errors.full_messages.join(" "))
|
|
end
|
|
|
|
post
|
|
end
|
|
|
|
def generate_username(length = 10)
|
|
range = [*'a'..'z']
|
|
Array.new(length) { range.sample }.join
|
|
end
|
|
|
|
def stub_guardian(user)
|
|
guardian = Guardian.new(user)
|
|
yield(guardian) if block_given?
|
|
Guardian.stubs(new: guardian).with(user, anything)
|
|
end
|
|
|
|
def wait_for(on_fail: nil, &blk)
|
|
i = 0
|
|
result = false
|
|
while !result && i < 1000
|
|
result = blk.call
|
|
i += 1
|
|
sleep 0.001
|
|
end
|
|
|
|
on_fail&.call
|
|
expect(result).to eq(true)
|
|
end
|
|
|
|
def fill_email(mail, from, to, body = nil, subject = nil, cc = nil)
|
|
result = mail.gsub("FROM", from).gsub("TO", to)
|
|
result.gsub!(/Hey.*/m, body) if body
|
|
result.sub!(/We .*/, subject) if subject
|
|
result.sub!("CC", cc.presence || "")
|
|
result
|
|
end
|
|
|
|
def email(email_name)
|
|
fixture_file("emails/#{email_name}.eml")
|
|
end
|
|
|
|
def create_staff_tags(tag_names)
|
|
tag_group = Fabricate(:tag_group, name: 'Staff Tags')
|
|
TagGroupPermission.create!(
|
|
tag_group: tag_group,
|
|
group_id: Group::AUTO_GROUPS[:everyone],
|
|
permission_type: TagGroupPermission.permission_types[:readonly]
|
|
)
|
|
TagGroupPermission.create!(
|
|
tag_group: tag_group,
|
|
group_id: Group::AUTO_GROUPS[:staff],
|
|
permission_type: TagGroupPermission.permission_types[:full]
|
|
)
|
|
tag_names.each do |name|
|
|
tag_group.tags << (Tag.where(name: name).first || Fabricate(:tag, name: name))
|
|
end
|
|
end
|
|
|
|
def create_hidden_tags(tag_names)
|
|
tag_group = Fabricate(:tag_group,
|
|
name: 'Hidden Tags',
|
|
permissions: { staff: :full }
|
|
)
|
|
tag_names.each do |name|
|
|
tag_group.tags << (Tag.where(name: name).first || Fabricate(:tag, name: name))
|
|
end
|
|
end
|
|
|
|
def sorted_tag_names(tag_records)
|
|
tag_records.map { |t| t.is_a?(String) ? t : t.name }.sort
|
|
end
|
|
|
|
def expect_same_tag_names(a, b)
|
|
expect(sorted_tag_names(a)).to eq(sorted_tag_names(b))
|
|
end
|
|
|
|
def capture_stdout
|
|
old_stdout = $stdout
|
|
io = StringIO.new
|
|
$stdout = io
|
|
yield
|
|
io.string
|
|
ensure
|
|
$stdout = old_stdout
|
|
end
|
|
|
|
def set_subfolder(f)
|
|
global_setting :relative_url_root, f
|
|
old_root = ActionController::Base.config.relative_url_root
|
|
ActionController::Base.config.relative_url_root = f
|
|
|
|
before_next_spec do
|
|
ActionController::Base.config.relative_url_root = old_root
|
|
end
|
|
end
|
|
end
|