summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorAsh McKenzie <amckenzie@gitlab.com>2020-04-17 16:23:12 +1000
committerAsh McKenzie <amckenzie@gitlab.com>2020-04-17 16:23:33 +1000
commit4f4acf4a1e523678355b06234016fa632bae282e (patch)
tree17f7c90485d0a339e5ecb14fb6131a4c2636903d /spec
parent118143ba6c49573d1437f99cf2b44168bd09b8d1 (diff)
downloadgitlab-shell-4f4acf4a1e523678355b06234016fa632bae282e.tar.gz
Geo Pull custom action support
Diffstat (limited to 'spec')
-rw-r--r--spec/gitlab_shell_custom_git_upload_pack_spec.rb118
1 files changed, 118 insertions, 0 deletions
diff --git a/spec/gitlab_shell_custom_git_upload_pack_spec.rb b/spec/gitlab_shell_custom_git_upload_pack_spec.rb
new file mode 100644
index 0000000..6770344
--- /dev/null
+++ b/spec/gitlab_shell_custom_git_upload_pack_spec.rb
@@ -0,0 +1,118 @@
+require_relative 'spec_helper'
+
+require 'open3'
+require 'json'
+require 'base64'
+
+describe 'Custom bin/gitlab-shell git-upload-pack' do
+ include_context 'gitlab shell'
+
+ let(:env) { {'SSH_CONNECTION' => 'fake', 'SSH_ORIGINAL_COMMAND' => 'git-upload-pack group/repo' } }
+ let(:divider) { "remote: ========================================================================\n" }
+
+ before(:context) do
+ write_config("gitlab_url" => "http+unix://#{CGI.escape(tmp_socket_path)}")
+ end
+
+ def mock_server(server)
+ server.mount_proc('/geo/proxy_git_ssh/info_refs_upload_pack') do |req, res|
+ res.content_type = 'application/json'
+ res.status = 200
+
+ res.body = {"result" => "#{Base64.encode64('custom')}"}.to_json
+ end
+
+ server.mount_proc('/geo/proxy_git_ssh/upload_pack') do |req, res|
+ res.content_type = 'application/json'
+ res.status = 200
+
+ output = JSON.parse(req.body)['output']
+
+ res.body = {"result" => output}.to_json
+ end
+
+ server.mount_proc('/api/v4/internal/allowed') do |req, res|
+ res.content_type = 'application/json'
+
+ key_id = req.query['key_id'] || req.query['username']
+
+ unless key_id
+ body = JSON.parse(req.body)
+ key_id = body['key_id'] || body['username'].to_s
+ end
+
+ case key_id
+ when '100', 'someone' then
+ res.status = 300
+ body = {
+ "gl_id" => "user-100",
+ "status" => true,
+ "payload" => {
+ "action" => "geo_proxy_to_primary",
+ "data" => {
+ "api_endpoints" => ["/geo/proxy_git_ssh/info_refs_upload_pack", "/geo/proxy_git_ssh/upload_pack"],
+ "gl_username" => "custom",
+ "primary_repo" => "https://repo/path"
+ },
+ },
+ "gl_console_messages" => ["console", "message"]
+ }
+ res.body = body.to_json
+ else
+ res.status = 403
+ end
+ end
+ end
+
+ describe 'dialog for performing a custom action' do
+ context 'when API calls perform successfully' do
+ let(:remote_blank_line) { "remote: \n" }
+ def verify_successful_call!(cmd)
+ Open3.popen3(env, cmd) do |stdin, stdout, stderr|
+ expect(stderr.gets).to eq(remote_blank_line)
+ expect(stderr.gets).to eq("remote: console\n")
+ expect(stderr.gets).to eq("remote: message\n")
+ expect(stderr.gets).to eq(remote_blank_line)
+
+ stdin.puts("0032want 343d70886785dc1f98aaf70f3b4ca87c93a5d0dd\n")
+ stdin.close
+
+ expect(stdout.gets(6)).to eq("custom")
+ expect(stdout.flush.read).to eq("0032want 343d70886785dc1f98aaf70f3b4ca87c93a5d0dd\n")
+ end
+ end
+
+ context 'when key is provided' do
+ let(:cmd) { "#{gitlab_shell_path} key-100" }
+
+ it 'custom action is performed' do
+ verify_successful_call!(cmd)
+ end
+ end
+
+ context 'when username is provided' do
+ let(:cmd) { "#{gitlab_shell_path} username-someone" }
+
+ it 'custom action is performed' do
+ verify_successful_call!(cmd)
+ end
+ end
+ end
+
+ context 'when API error occurs' do
+ let(:cmd) { "#{gitlab_shell_path} key-101" }
+
+ it 'custom action is not performed' do
+ Open3.popen2e(env, cmd) do |stdin, stdout|
+ expect(stdout.gets).to eq("remote: \n")
+ expect(stdout.gets).to eq(divider)
+ expect(stdout.gets).to eq("remote: \n")
+ expect(stdout.gets).to eq("remote: Internal API error (403)\n")
+ expect(stdout.gets).to eq("remote: \n")
+ expect(stdout.gets).to eq(divider)
+ expect(stdout.gets).to eq("remote: \n")
+ end
+ end
+ end
+ end
+end