Merge branch 'main' into glitch-soc/merge-upstream
- `.env.production.sample`: Our sample config file is very different from upstream since it is much more complete. Upstream added documentation for a few env variables. Copied the new variables/documentation from upstream. - `app/lib/feed_manager.rb`: Upstream added a timeline type (hashtags), while glitch-soc already had an extra one (direct messages). Not really a conflict but textually close changes. Ported upstream's changes. - `app/models/custom_emoji.rb`: Upstream upped the custom emoji size limit, while glitch-soc had configurable limits. Upped the default limits accordingly. - `streaming/index.js`: Upstream reworked how hastags were normalized. Minor conflict due to glitch-soc's handling of instance-local posts. Ported upstream's changes.
This commit is contained in:
23
spec/controllers/api/v1/followed_tags_controller_spec.rb
Normal file
23
spec/controllers/api/v1/followed_tags_controller_spec.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Api::V1::FollowedTagsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:scopes) { 'read:follows' }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
||||
|
||||
before { allow(controller).to receive(:doorkeeper_token) { token } }
|
||||
|
||||
describe 'GET #index' do
|
||||
let!(:tag_follows) { Fabricate.times(5, :tag_follow, account: user.account) }
|
||||
|
||||
before do
|
||||
get :index, params: { limit: 1 }
|
||||
end
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
end
|
||||
end
|
||||
82
spec/controllers/api/v1/tags_controller_spec.rb
Normal file
82
spec/controllers/api/v1/tags_controller_spec.rb
Normal file
@@ -0,0 +1,82 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Api::V1::TagsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { Fabricate(:user) }
|
||||
let(:scopes) { 'write:follows' }
|
||||
let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
|
||||
|
||||
before { allow(controller).to receive(:doorkeeper_token) { token } }
|
||||
|
||||
describe 'GET #show' do
|
||||
before do
|
||||
get :show, params: { id: name }
|
||||
end
|
||||
|
||||
context 'with existing tag' do
|
||||
let!(:tag) { Fabricate(:tag) }
|
||||
let(:name) { tag.name }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with non-existing tag' do
|
||||
let(:name) { 'hoge' }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'POST #follow' do
|
||||
before do
|
||||
post :follow, params: { id: name }
|
||||
end
|
||||
|
||||
context 'with existing tag' do
|
||||
let!(:tag) { Fabricate(:tag) }
|
||||
let(:name) { tag.name }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'creates follow' do
|
||||
expect(TagFollow.where(tag: tag, account: user.account).exists?).to be true
|
||||
end
|
||||
end
|
||||
|
||||
context 'with non-existing tag' do
|
||||
let(:name) { 'hoge' }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'creates follow' do
|
||||
expect(TagFollow.where(tag: Tag.find_by!(name: name), account: user.account).exists?).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'POST #unfollow' do
|
||||
let!(:tag) { Fabricate(:tag, name: 'foo') }
|
||||
let!(:tag_follow) { Fabricate(:tag_follow, account: user.account, tag: tag) }
|
||||
|
||||
before do
|
||||
post :unfollow, params: { id: tag.name }
|
||||
end
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'removes the follow' do
|
||||
expect(TagFollow.where(tag: tag, account: user.account).exists?).to be false
|
||||
end
|
||||
end
|
||||
end
|
||||
4
spec/fabricators/tag_follow_fabricator.rb
Normal file
4
spec/fabricators/tag_follow_fabricator.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
Fabricator(:tag_follow) do
|
||||
tag
|
||||
account
|
||||
end
|
||||
29
spec/lib/hashtag_normalizer_spec.rb
Normal file
29
spec/lib/hashtag_normalizer_spec.rb
Normal file
@@ -0,0 +1,29 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe HashtagNormalizer do
|
||||
subject { described_class.new }
|
||||
|
||||
describe '#normalize' do
|
||||
it 'converts full-width Latin characters into basic Latin characters' do
|
||||
expect(subject.normalize('Synthwave')).to eq 'synthwave'
|
||||
end
|
||||
|
||||
it 'converts half-width Katakana into Kana characters' do
|
||||
expect(subject.normalize('シーサイドライナー')).to eq 'シーサイドライナー'
|
||||
end
|
||||
|
||||
it 'converts modified Latin characters into basic Latin characters' do
|
||||
expect(subject.normalize('BLÅHAJ')).to eq 'blahaj'
|
||||
end
|
||||
|
||||
it 'strips out invalid characters' do
|
||||
expect(subject.normalize('#foo')).to eq 'foo'
|
||||
end
|
||||
|
||||
it 'keeps valid characters' do
|
||||
expect(subject.normalize('a·b')).to eq 'a·b'
|
||||
end
|
||||
end
|
||||
end
|
||||
4
spec/models/tag_follow_spec.rb
Normal file
4
spec/models/tag_follow_spec.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TagFollow, type: :model do
|
||||
end
|
||||
@@ -91,7 +91,7 @@ RSpec.describe Tag, type: :model do
|
||||
upcase_string = 'abcABCabcABCやゆよ'
|
||||
downcase_string = 'abcabcabcabcやゆよ';
|
||||
|
||||
tag = Fabricate(:tag, name: downcase_string)
|
||||
tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
|
||||
expect(Tag.find_normalized(upcase_string)).to eq tag
|
||||
end
|
||||
end
|
||||
@@ -101,12 +101,12 @@ RSpec.describe Tag, type: :model do
|
||||
upcase_string = 'abcABCabcABCやゆよ'
|
||||
downcase_string = 'abcabcabcabcやゆよ';
|
||||
|
||||
tag = Fabricate(:tag, name: downcase_string)
|
||||
tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
|
||||
expect(Tag.matches_name(upcase_string)).to eq [tag]
|
||||
end
|
||||
|
||||
it 'uses the LIKE operator' do
|
||||
expect(Tag.matches_name('100%abc').to_sql).to eq %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100\\%abc%')]
|
||||
expect(Tag.matches_name('100%abc').to_sql).to eq %q[SELECT "tags".* FROM "tags" WHERE LOWER("tags"."name") LIKE LOWER('100abc%')]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -115,7 +115,7 @@ RSpec.describe Tag, type: :model do
|
||||
upcase_string = 'abcABCabcABCやゆよ'
|
||||
downcase_string = 'abcabcabcabcやゆよ';
|
||||
|
||||
tag = Fabricate(:tag, name: downcase_string)
|
||||
tag = Fabricate(:tag, name: HashtagNormalizer.new.normalize(downcase_string))
|
||||
expect(Tag.matching_name(upcase_string)).to eq [tag]
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user