summaryrefslogtreecommitdiff
path: root/spec/requests/api/internal/base_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/api/internal/base_spec.rb')
-rw-r--r--spec/requests/api/internal/base_spec.rb73
1 files changed, 57 insertions, 16 deletions
diff --git a/spec/requests/api/internal/base_spec.rb b/spec/requests/api/internal/base_spec.rb
index 6414b1efe6a..d1a0ad57a84 100644
--- a/spec/requests/api/internal/base_spec.rb
+++ b/spec/requests/api/internal/base_spec.rb
@@ -513,24 +513,63 @@ RSpec.describe API::Internal::Base, feature_category: :system_access do
project.add_developer(user)
end
+ shared_context 'with env passed as a JSON' do
+ let(:obj_dir_relative) { './objects' }
+ let(:alt_obj_dirs_relative) { ['./alt-objects-1', './alt-objects-2'] }
+ let(:env) do
+ {
+ GIT_OBJECT_DIRECTORY_RELATIVE: obj_dir_relative,
+ GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE: alt_obj_dirs_relative
+ }
+ end
+ end
+
shared_examples 'sets hook env' do
- context 'with env passed as a JSON' do
- let(:obj_dir_relative) { './objects' }
- let(:alt_obj_dirs_relative) { ['./alt-objects-1', './alt-objects-2'] }
- let(:env) do
- {
- GIT_OBJECT_DIRECTORY_RELATIVE: obj_dir_relative,
- GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE: alt_obj_dirs_relative
- }
- end
+ include_context 'with env passed as a JSON'
- it 'sets env in RequestStore' do
- expect(Gitlab::Git::HookEnv).to receive(:set).with(gl_repository, env.stringify_keys)
+ it 'sets env in RequestStore' do
+ expect(Gitlab::Git::HookEnv).to receive(:set).with(gl_repository, env.stringify_keys)
- subject
+ subject
- expect(response).to have_gitlab_http_status(:ok)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ shared_examples 'sets hook env and routes to primary' do
+ include_context 'with env passed as a JSON'
+
+ let(:interceptor) do
+ Class.new(::GRPC::ClientInterceptor) do
+ def route_to_primary_received?
+ @route_to_primary_count.to_i > 0
+ end
+
+ def request_response(request:, call:, method:, metadata:) # rubocop:disable Lint/UnusedMethodArgument
+ @route_to_primary_count ||= 0
+ @route_to_primary_count += 1 if metadata['gitaly-route-repository-accessor-policy'] == 'primary-only'
+
+ yield
+ end
+ end.new
+ end
+
+ before do
+ Gitlab::GitalyClient.clear_stubs!
+ allow(::Gitlab::GitalyClient).to receive(:interceptors).and_return([interceptor])
+ end
+
+ after do
+ Gitlab::GitalyClient.clear_stubs!
+ end
+
+ it 'sets env in RequestStore and routes gRPC messages to primary', :request_store do
+ expect(Gitlab::Git::HookEnv).to receive(:set).with(gl_repository, env.stringify_keys).and_call_original
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(interceptor.route_to_primary_received?).to be_truthy
end
end
@@ -549,6 +588,8 @@ RSpec.describe API::Internal::Base, feature_category: :system_access do
expect(user.reload.last_activity_on).to eql(Date.today)
end
+ # Wiki repositories don't invoke any Gitaly RPCs to check for changes, so we can only test for the
+ # hook environment being set.
it_behaves_like 'sets hook env' do
let(:gl_repository) { Gitlab::GlRepository::WIKI.identifier_for_container(project.wiki) }
end
@@ -588,7 +629,7 @@ RSpec.describe API::Internal::Base, feature_category: :system_access do
expect(user.reload.last_activity_on).to eql(Date.today)
end
- it_behaves_like 'sets hook env' do
+ it_behaves_like 'sets hook env and routes to primary' do
let(:gl_repository) { Gitlab::GlRepository::SNIPPET.identifier_for_container(personal_snippet) }
end
end
@@ -620,7 +661,7 @@ RSpec.describe API::Internal::Base, feature_category: :system_access do
expect(user.reload.last_activity_on).to eql(Date.today)
end
- it_behaves_like 'sets hook env' do
+ it_behaves_like 'sets hook env and routes to primary' do
let(:gl_repository) { Gitlab::GlRepository::SNIPPET.identifier_for_container(project_snippet) }
end
end