diff --git a/app/models/instance_info.rb b/app/models/instance_info.rb index 20769b1113..cfcf6204b4 100644 --- a/app/models/instance_info.rb +++ b/app/models/instance_info.rb @@ -77,15 +77,18 @@ class InstanceInfo < ApplicationRecord def feature_available?(info, softwares, feature_name) return false if info.nil? - return true if softwares.include?(info['software']) - return false unless info.data.is_a?(Hash) - return false unless info.data['metadata'].is_a?(Hash) + softwares.include?(software_name(info)) || metadata_features(info)&.include?(feature_name) || false + end - features = info.data.dig('metadata', 'features') - return false unless features.is_a?(Array) + def metadata_features(info) + return nil unless info.data.is_a?(Hash) && info.data['metadata'].is_a?(Hash) && info.data['metadata']['features'].is_a?(Array) - features.include?(feature_name) + info.data['metadata']['features'] + end + + def software_name(info) + info.software end end diff --git a/spec/models/instance_info_spec.rb b/spec/models/instance_info_spec.rb index 6d3c5b4ff1..32208ee8f8 100644 --- a/spec/models/instance_info_spec.rb +++ b/spec/models/instance_info_spec.rb @@ -3,7 +3,7 @@ require 'rails_helper' RSpec.describe InstanceInfo do - describe '.available_features' do + describe '.available_features#emoji_reaction' do subject { described_class.available_features('example.com')[:emoji_reaction] } it 'availables if local account' do @@ -45,4 +45,18 @@ RSpec.describe InstanceInfo do expect(subject).to be false end end + + describe '.available_features#circle' do + subject { described_class.available_features('example.com')[:circle] } + + it 'does not available if misskey server' do + Fabricate(:instance_info, domain: 'example.com', software: 'misskey') + expect(subject).to be false + end + + it 'availables if misskey server with features' do + Fabricate(:instance_info, domain: 'example.com', software: 'misskey', data: { metadata: { features: ['circle'] } }) + expect(subject).to be true + end + end end