2023-05-02 09:09:43 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
RSpec.describe BackupService, type: :service do
|
|
|
|
subject(:service_call) { described_class.new.call(backup) }
|
|
|
|
|
|
|
|
let!(:user) { Fabricate(:user) }
|
|
|
|
let!(:attachment) { Fabricate(:media_attachment, account: user.account) }
|
|
|
|
let!(:status) { Fabricate(:status, account: user.account, text: 'Hello', visibility: :public, media_attachments: [attachment]) }
|
|
|
|
let!(:private_status) { Fabricate(:status, account: user.account, text: 'secret', visibility: :private) }
|
|
|
|
let!(:favourite) { Fabricate(:favourite, account: user.account) }
|
|
|
|
let!(:bookmark) { Fabricate(:bookmark, account: user.account) }
|
|
|
|
let!(:backup) { Fabricate(:backup, user: user) }
|
|
|
|
|
|
|
|
def read_zip_file(backup, filename)
|
|
|
|
file = Paperclip.io_adapters.for(backup.dump)
|
|
|
|
Zip::File.open(file) do |zipfile|
|
|
|
|
entry = zipfile.glob(filename).first
|
|
|
|
return entry.get_input_stream.read
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-05-19 06:04:18 -04:00
|
|
|
context 'when the user has an avatar and header' do
|
|
|
|
before do
|
|
|
|
user.account.update!(avatar: attachment_fixture('avatar.gif'))
|
|
|
|
user.account.update!(header: attachment_fixture('emojo.png'))
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'stores them as expected' do
|
|
|
|
service_call
|
|
|
|
|
|
|
|
json = Oj.load(read_zip_file(backup, 'actor.json'))
|
|
|
|
avatar_path = json.dig('icon', 'url')
|
|
|
|
header_path = json.dig('image', 'url')
|
|
|
|
|
|
|
|
expect(avatar_path).to_not be_nil
|
|
|
|
expect(header_path).to_not be_nil
|
|
|
|
|
|
|
|
expect(read_zip_file(backup, avatar_path)).to be_present
|
|
|
|
expect(read_zip_file(backup, header_path)).to be_present
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-05-02 09:09:43 -04:00
|
|
|
it 'marks the backup as processed' do
|
|
|
|
expect { service_call }.to change(backup, :processed).from(false).to(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'exports outbox.json as expected' do
|
|
|
|
service_call
|
|
|
|
|
|
|
|
json = Oj.load(read_zip_file(backup, 'outbox.json'))
|
|
|
|
expect(json['@context']).to_not be_nil
|
|
|
|
expect(json['type']).to eq 'OrderedCollection'
|
|
|
|
expect(json['totalItems']).to eq 2
|
|
|
|
expect(json['orderedItems'][0]['@context']).to be_nil
|
|
|
|
expect(json['orderedItems'][0]).to include({
|
|
|
|
'type' => 'Create',
|
|
|
|
'object' => include({
|
|
|
|
'id' => ActivityPub::TagManager.instance.uri_for(status),
|
|
|
|
'content' => '<p>Hello</p>',
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
expect(json['orderedItems'][1]).to include({
|
|
|
|
'type' => 'Create',
|
|
|
|
'object' => include({
|
|
|
|
'id' => ActivityPub::TagManager.instance.uri_for(private_status),
|
|
|
|
'content' => '<p>secret</p>',
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'exports likes.json as expected' do
|
|
|
|
service_call
|
|
|
|
|
|
|
|
json = Oj.load(read_zip_file(backup, 'likes.json'))
|
|
|
|
expect(json['type']).to eq 'OrderedCollection'
|
|
|
|
expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(favourite.status)]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'exports bookmarks.json as expected' do
|
|
|
|
service_call
|
|
|
|
|
|
|
|
json = Oj.load(read_zip_file(backup, 'bookmarks.json'))
|
|
|
|
expect(json['type']).to eq 'OrderedCollection'
|
|
|
|
expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(bookmark.status)]
|
|
|
|
end
|
|
|
|
end
|