2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2015-09-25 12:07:36 +05:30
require 'spec_helper'
2020-07-28 23:09:34 +05:30
RSpec . describe RepositoryForkWorker do
2018-12-13 13:39:08 +05:30
include ProjectForksHelper
2018-03-17 18:26:18 +05:30
describe 'modules' do
it 'includes ProjectImportOptions' do
expect ( described_class ) . to include_module ( ProjectImportOptions )
end
2016-06-02 11:05:42 +05:30
end
2015-09-25 12:07:36 +05:30
describe " # perform " do
2018-12-13 13:39:08 +05:30
let ( :project ) { create ( :project , :public , :repository ) }
let ( :forked_project ) { create ( :project , :repository , :import_scheduled ) }
before do
fork_project ( project , forked_project . creator , target_project : forked_project , repository : true )
end
2018-03-17 18:26:18 +05:30
2018-05-09 12:01:36 +05:30
shared_examples 'RepositoryForkWorker performing' do
2020-04-08 14:13:33 +05:30
def expect_fork_repository ( success : )
allow ( :: Gitlab :: GitalyClient :: RepositoryService ) . to receive ( :new ) . and_call_original
expect_next_instance_of ( :: Gitlab :: GitalyClient :: RepositoryService , forked_project . repository . raw ) do | svc |
exp = expect ( svc ) . to receive ( :fork_repository ) . with ( project . repository . raw )
if success
exp . and_return ( true )
else
exp . and_raise ( GRPC :: BadStatus , 'Fork failed in tests' )
end
end
2018-05-09 12:01:36 +05:30
end
2018-03-17 18:26:18 +05:30
2018-05-09 12:01:36 +05:30
describe 'when a worker was reset without cleanup' do
let ( :jid ) { '12345678' }
2015-09-25 12:07:36 +05:30
2018-05-09 12:01:36 +05:30
it 'creates a new repository from a fork' do
allow ( subject ) . to receive ( :jid ) . and_return ( jid )
2018-03-17 18:26:18 +05:30
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2018-03-17 18:26:18 +05:30
2018-05-09 12:01:36 +05:30
perform!
end
end
it " creates a new repository from a fork " do
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2018-03-17 18:26:18 +05:30
perform!
end
2018-05-09 12:01:36 +05:30
it 'protects the default branch' do
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2018-03-17 18:26:18 +05:30
2018-05-09 12:01:36 +05:30
perform!
2018-12-13 13:39:08 +05:30
expect ( forked_project . protected_branches . first . name ) . to eq ( forked_project . default_branch )
2018-05-09 12:01:36 +05:30
end
it 'flushes various caches' do
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2018-03-17 18:26:18 +05:30
2018-11-08 19:23:39 +05:30
# Works around https://github.com/rspec/rspec-mocks/issues/910
2018-12-13 13:39:08 +05:30
expect ( Project ) . to receive ( :find ) . with ( forked_project . id ) . and_return ( forked_project )
expect ( forked_project . repository ) . to receive ( :expire_emptiness_caches )
2018-05-09 12:01:36 +05:30
. and_call_original
2018-12-13 13:39:08 +05:30
expect ( forked_project . repository ) . to receive ( :expire_exists_cache )
2018-11-08 19:23:39 +05:30
. and_call_original
2018-12-13 13:39:08 +05:30
expect ( forked_project . wiki . repository ) . to receive ( :expire_emptiness_caches )
2018-11-08 19:23:39 +05:30
. and_call_original
2018-12-13 13:39:08 +05:30
expect ( forked_project . wiki . repository ) . to receive ( :expire_exists_cache )
2018-05-09 12:01:36 +05:30
. and_call_original
2018-03-17 18:26:18 +05:30
2018-05-09 12:01:36 +05:30
perform!
end
2020-03-13 15:44:24 +05:30
it 'handles bad fork' do
error_message = " Unable to fork project #{ forked_project . id } for repository #{ project . disk_path } -> #{ forked_project . disk_path } : Failed to create fork repository "
2015-09-25 12:07:36 +05:30
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : false )
2016-04-02 18:10:28 +05:30
2018-05-09 12:01:36 +05:30
expect { perform! } . to raise_error ( StandardError , error_message )
end
2020-03-13 15:44:24 +05:30
it 'calls Projects::LfsPointers::LfsLinkService#execute with OIDs of source project LFS objects' do
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2020-03-13 15:44:24 +05:30
expect_next_instance_of ( Projects :: LfsPointers :: LfsLinkService ) do | service |
2020-11-24 15:15:51 +05:30
expect ( service ) . to receive ( :execute ) . with ( project . lfs_objects_oids )
2020-03-13 15:44:24 +05:30
end
perform!
end
it " handles LFS objects link failure " do
error_message = " Unable to fork project #{ forked_project . id } for repository #{ project . disk_path } -> #{ forked_project . disk_path } : Source project has too many LFS objects "
2020-04-08 14:13:33 +05:30
expect_fork_repository ( success : true )
2020-03-13 15:44:24 +05:30
expect_next_instance_of ( Projects :: LfsPointers :: LfsLinkService ) do | service |
expect ( service ) . to receive ( :execute ) . and_raise ( Projects :: LfsPointers :: LfsLinkService :: TooManyOidsError )
end
expect { perform! } . to raise_error ( StandardError , error_message )
end
2018-05-09 12:01:36 +05:30
end
2016-04-02 18:10:28 +05:30
2018-05-09 12:01:36 +05:30
context 'only project ID passed' do
def perform!
2018-12-13 13:39:08 +05:30
subject . perform ( forked_project . id )
2018-05-09 12:01:36 +05:30
end
2016-06-02 11:05:42 +05:30
2018-05-09 12:01:36 +05:30
it_behaves_like 'RepositoryForkWorker performing'
2016-04-02 18:10:28 +05:30
end
2018-05-09 12:01:36 +05:30
context 'project ID, storage and repo paths passed' do
def perform!
2018-12-13 13:39:08 +05:30
subject . perform ( forked_project . id , TestEnv . repos_path , project . disk_path )
2018-05-09 12:01:36 +05:30
end
2017-09-10 17:25:29 +05:30
2018-05-09 12:01:36 +05:30
it_behaves_like 'RepositoryForkWorker performing'
2015-09-25 12:07:36 +05:30
end
end
end