0
0
Fork 0

Change admin UI for hashtags and add back whitelisted trends (#11490)

Fix #271

Add back the `GET /api/v1/trends` API with the caveat that it does
not return tags that have not been allowed to trend by the staff.

When a hashtag begins to trend (internally) and that hashtag has
not been previously reviewed by the staff, the staff is notified.

The new admin UI for hashtags allows filtering hashtags by where
they are used (e.g. in the profile directory), whether they have
been reviewed or are pending reviewal, they show by how many people
the hashtag is used in the directory, how many people used it
today, how many statuses with it have been created today, and it
allows fixing the name of the hashtag to make it more readable.

The disallowed hashtags feature has been reworked. It is now
controlled from the admin UI for hashtags instead of from
the file `config/settings.yml`
This commit is contained in:
Eugen Rochko 2019-08-05 19:54:29 +02:00 committed by GitHub
parent 6201bfdfba
commit 115dab78f1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 258 additions and 173 deletions

View file

@ -3,42 +3,44 @@
require 'rails_helper'
RSpec.describe DisallowedHashtagsValidator, type: :validator do
let(:disallowed_tags) { [] }
describe '#validate' do
before do
allow_any_instance_of(described_class).to receive(:select_tags) { tags }
disallowed_tags.each { |name| Fabricate(:tag, name: name, usable: false) }
described_class.new.validate(status)
end
let(:status) { double(errors: errors, local?: local, reblog?: reblog, text: '') }
let(:status) { double(errors: errors, local?: local, reblog?: reblog, text: disallowed_tags.map { |x| '#' + x }.join(' ')) }
let(:errors) { double(add: nil) }
context 'unless status.local? && !status.reblog?' do
context 'for a remote reblog' do
let(:local) { false }
let(:reblog) { true }
it 'not calls errors.add' do
it 'does not add errors' do
expect(errors).not_to have_received(:add).with(:text, any_args)
end
end
context 'status.local? && !status.reblog?' do
context 'for a local original status' do
let(:local) { true }
let(:reblog) { false }
context 'tags.empty?' do
let(:tags) { [] }
context 'when does not contain any disallowed hashtags' do
let(:disallowed_tags) { [] }
it 'not calls errors.add' do
it 'does not add errors' do
expect(errors).not_to have_received(:add).with(:text, any_args)
end
end
context '!tags.empty?' do
let(:tags) { %w(a b c) }
context 'when contains disallowed hashtags' do
let(:disallowed_tags) { %w(a b c) }
it 'calls errors.add' do
it 'adds an error' do
expect(errors).to have_received(:add)
.with(:text, I18n.t('statuses.disallowed_hashtags', tags: tags.join(', '), count: tags.size))
.with(:text, I18n.t('statuses.disallowed_hashtags', tags: disallowed_tags.join(', '), count: disallowed_tags.size))
end
end
end