--- /dev/null
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe RemoteProfile do
+ let(:remote_profile) { RemoteProfile.new(body) }
+ let(:body) do
+ <<-XML
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <author>John</author>
+ XML
+ end
+
+ describe '.initialize' do
+ it 'calls Nokogiri::XML.parse' do
+ expect(Nokogiri::XML).to receive(:parse).with(body, nil, 'utf-8')
+ RemoteProfile.new(body)
+ end
+
+ it 'sets document' do
+ remote_profile = RemoteProfile.new(body)
+ expect(remote_profile).not_to be nil
+ end
+ end
+
+ describe '#root' do
+ let(:document) { remote_profile.document }
+
+ it 'callse document.at_xpath' do
+ expect(document).to receive(:at_xpath).with(
+ '/atom:feed|/atom:entry',
+ atom: OStatus::TagManager::XMLNS
+ )
+
+ remote_profile.root
+ end
+ end
+
+ describe '#author' do
+ let(:root) { remote_profile.root }
+
+ it 'calls root.at_xpath' do
+ expect(root).to receive(:at_xpath).with(
+ './atom:author|./dfrn:owner',
+ atom: OStatus::TagManager::XMLNS,
+ dfrn: OStatus::TagManager::DFRN_XMLNS
+ )
+
+ remote_profile.author
+ end
+ end
+
+ describe '#hub_link' do
+ let(:root) { remote_profile.root }
+
+ it 'calls #link_href_from_xml' do
+ expect(remote_profile).to receive(:link_href_from_xml).with(root, 'hub')
+ remote_profile.hub_link
+ end
+ end
+
+ describe '#display_name' do
+ let(:author) { remote_profile.author }
+
+ it 'calls author.at_xpath.content' do
+ expect(author).to receive_message_chain(:at_xpath, :content).with(
+ './poco:displayName',
+ poco: OStatus::TagManager::POCO_XMLNS
+ ).with(no_args)
+
+ remote_profile.display_name
+ end
+ end
+
+ describe '#note' do
+ let(:author) { remote_profile.author }
+
+ it 'calls author.at_xpath.content' do
+ expect(author).to receive_message_chain(:at_xpath, :content).with(
+ './atom:summary|./poco:note',
+ atom: OStatus::TagManager::XMLNS,
+ poco: OStatus::TagManager::POCO_XMLNS
+ ).with(no_args)
+
+ remote_profile.note
+ end
+ end
+
+ describe '#scope' do
+ let(:author) { remote_profile.author }
+
+ it 'calls author.at_xpath.content' do
+ expect(author).to receive_message_chain(:at_xpath, :content).with(
+ './mastodon:scope',
+ mastodon: OStatus::TagManager::MTDN_XMLNS
+ ).with(no_args)
+
+ remote_profile.scope
+ end
+ end
+
+ describe '#avatar' do
+ let(:author) { remote_profile.author }
+
+ it 'calls #link_href_from_xml' do
+ expect(remote_profile).to receive(:link_href_from_xml).with(author, 'avatar')
+ remote_profile.avatar
+ end
+ end
+
+ describe '#header' do
+ let(:author) { remote_profile.author }
+
+ it 'calls #link_href_from_xml' do
+ expect(remote_profile).to receive(:link_href_from_xml).with(author, 'header')
+ remote_profile.header
+ end
+ end
+
+ describe '#locked?' do
+ before do
+ allow(remote_profile).to receive(:scope).and_return(scope)
+ end
+
+ subject { remote_profile.locked? }
+
+ context 'scope is private' do
+ let(:scope) { 'private' }
+
+ it 'returns true' do
+ is_expected.to be true
+ end
+ end
+
+ context 'scope is not private' do
+ let(:scope) { 'public' }
+
+ it 'returns false' do
+ is_expected.to be false
+ end
+ end
+ end
+end