123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- # frozen_string_literal: true
- require 'rails_helper'
- RSpec.describe BackupService 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
- 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 = export_json(:actor)
- 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
- it 'marks the backup as processed and exports files' do
- expect { service_call }.to process_backup
- expect_outbox_export
- expect_likes_export
- expect_bookmarks_export
- end
- def process_backup
- change(backup, :processed).from(false).to(true)
- end
- def expect_outbox_export
- body = export_json_raw(:outbox)
- json = Oj.load(body)
- aggregate_failures do
- expect(body.scan('@context').count).to eq 1
- expect(body.scan('orderedItems').count).to eq 1
- 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_create_item(status)
- expect(json['orderedItems'][1]).to include_create_item(private_status)
- end
- end
- def expect_likes_export
- json = export_json(:likes)
- aggregate_failures do
- expect(json['type']).to eq 'OrderedCollection'
- expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(favourite.status)]
- end
- end
- def expect_bookmarks_export
- json = export_json(:bookmarks)
- aggregate_failures do
- expect(json['type']).to eq 'OrderedCollection'
- expect(json['orderedItems']).to eq [ActivityPub::TagManager.instance.uri_for(bookmark.status)]
- end
- end
- def export_json_raw(type)
- read_zip_file(backup, "#{type}.json")
- end
- def export_json(type)
- Oj.load(export_json_raw(type))
- end
- def include_create_item(status)
- include({
- 'type' => 'Create',
- 'object' => include({
- 'id' => ActivityPub::TagManager.instance.uri_for(status),
- 'content' => "<p>#{status.text}</p>",
- }),
- })
- end
- end
|