From f82b9e48ec038a3718aeeeb248b0a01c9f88fa33 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Thu, 31 Jul 2014 15:39:01 +0300
Subject: [PATCH] Dont stub gitlab-shell calls. Make test environment closer to
 real one

---
 config/gitlab.yml.example |   6 ++
 features/support/env.rb   |   1 -
 spec/factories.rb         |   4 +-
 spec/support/test_env.rb  | 158 ++++++--------------------------------
 4 files changed, 29 insertions(+), 140 deletions(-)

diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example
index dff709b66b8..7f31fb113c9 100644
--- a/config/gitlab.yml.example
+++ b/config/gitlab.yml.example
@@ -259,6 +259,12 @@ test:
   gitlab:
     host: localhost
     port: 80
+  satellites:
+    path: tmp/tests/gitlab-satellites/
+  gitlab_shell:
+    path: tmp/tests/gitlab-shell/
+    repos_path: tmp/tests/repositories/
+    hooks_path: tmp/tests/gitlab-shell/hooks/
   issues_tracker:
     redmine:
       title: "Redmine"
diff --git a/features/support/env.rb b/features/support/env.rb
index 3ab2ce0a3e6..5b3e78cbec3 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -39,7 +39,6 @@ Capybara.ignore_hidden_elements = false
 DatabaseCleaner.strategy = :truncation
 
 Spinach.hooks.before_scenario do
-  TestEnv.setup_stubs
   DatabaseCleaner.start
 end
 
diff --git a/spec/factories.rb b/spec/factories.rb
index ad4c56986c3..5ad410ac5de 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -61,9 +61,7 @@ FactoryGirl.define do
     path { 'gitlabhq' }
 
     after :create do |project|
-      TestEnv.clear_repo_dir(project.namespace, project.path)
-      TestEnv.reset_satellite_dir
-      TestEnv.create_repo(project.namespace, project.path)
+      TestEnv.copy_repo(project)
     end
   end
 
diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb
index 85059dfa9e9..fc1a920822e 100644
--- a/spec/support/test_env.rb
+++ b/spec/support/test_env.rb
@@ -5,24 +5,19 @@ module TestEnv
 
   # Test environment
   #
-  # all repositories and namespaces stored at
-  # RAILS_APP/tmp/test-git-base-path
-  #
-  # Next shell methods are stubbed and return true
-  # -  mv_repository
-  # -  remove_repository
-  # -  add_key
-  # -  remove_key
+  # See gitlab.yml.example test section for paths
   #
   def init(opts = {})
     RSpec::Mocks::setup(self)
 
     # Disable mailer for spinach tests
     disable_mailer if opts[:mailer] == false
-    setup_stubs
 
-    clear_test_repo_dir if opts[:init_repos] == true
-    setup_test_repos(opts) if opts[:repos] == true
+    # Setup GitLab shell for test instance
+    setup_gitlab_shell
+
+    # Create repository for FactoryGirl.create(:project)
+    setup_factory_repo
   end
 
   def disable_mailer
@@ -33,139 +28,30 @@ module TestEnv
     NotificationService.any_instance.unstub(:mailer)
   end
 
-  def setup_stubs()
-    # Use tmp dir for FS manipulations
-    repos_path = testing_path()
-    ProjectWiki.any_instance.stub(:init_repo) do |path|
-      create_temp_repo(File.join(repos_path, "#{path}.git"))
+  def setup_gitlab_shell
+    unless File.directory?(Gitlab.config.gitlab_shell.path)
+      %x[rake gitlab:shell:install]
     end
-
-    Gitlab.config.gitlab_shell.stub(repos_path: repos_path)
-
-    Gitlab.config.satellites.stub(path: satellite_path)
-
-    Gitlab::Git::Repository.stub(repos_path: repos_path)
-
-    Gitlab::Shell.any_instance.stub(
-      add_repository: true,
-      mv_repository: true,
-      remove_repository: true,
-      update_repository_head: true,
-      add_key: true,
-      remove_key: true,
-      version: '6.3.0'
-    )
-
-    Gitlab::Satellite::MergeAction.any_instance.stub(
-      merge!: true,
-    )
-
-    Gitlab::Satellite::Satellite.any_instance.stub(
-      exists?: true,
-      destroy: true,
-      create: true,
-      lock_files_dir: repos_path
-    )
-
-    MergeRequest.any_instance.stub(
-      check_if_can_be_merged: true
-    )
-    Repository.any_instance.stub(
-      size: 12.45
-    )
   end
 
-  def clear_repo_dir(namespace, name)
-    setup_stubs
-    # Clean any .wiki.git that may have been created
-    FileUtils.rm_rf File.join(testing_path(), "#{name}.wiki.git")
-  end
+  def setup_factory_repo
+    repo_path = repos_path + "/root/testme.git"
+    clone_url = 'https://gitlab.com/gitlab-org/testme.git'
 
-  def reset_satellite_dir
-    setup_stubs
-    [
-      %W(git reset --hard --quiet),
-      %W(git clean -fx --quiet),
-      %W(git checkout --quiet origin/master)
-    ].each do |git_cmd|
-      system(*git_cmd, chdir: seed_satellite_path)
+    unless File.directory?(repo_path)
+      git_cmd = %W(git clone --bare #{clone_url} #{repo_path})
+      puts git_cmd.inspect
+      system(*git_cmd)
     end
   end
 
-  # Create a repo and it's satellite
-  def create_repo(namespace, name)
-    setup_stubs
-    repo = repo(namespace, name)
-
-    # Symlink tmp/repositories/gitlabhq to tmp/test-git-base-path/gitlabhq
-    FileUtils.ln_sf(seed_repo_path, repo)
-    create_satellite(repo, namespace, name)
-  end
-
-  private
-
-  def testing_path
-    Rails.root.join('tmp', 'test-git-base-path')
-  end
-
-  def seed_repo_path
-    Rails.root.join('tmp', 'repositories', 'gitlabhq')
-  end
-
-  def seed_satellite_path
-    Rails.root.join('tmp', 'satellite', 'gitlabhq')
-  end
-
-  def satellite_path
-    "#{testing_path()}/satellite"
-  end
-
-  def repo(namespace, name)
-    unless (namespace.nil? || namespace.path.nil? || namespace.path.strip.empty?)
-      repo = File.join(testing_path(), "#{namespace.path}/#{name}.git")
-    else
-      repo = File.join(testing_path(), "#{name}.git")
-    end
-  end
-
-  def satellite(namespace, name)
-    unless (namespace.nil? || namespace.path.nil? || namespace.path.strip.empty?)
-      satellite_repo = File.join(satellite_path, namespace.path, name)
-    else
-      satellite_repo = File.join(satellite_path, name)
-    end
-  end
-
-  def setup_test_repos(opts ={})
-    create_repo(nil, 'gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('')
-    create_repo(nil, 'source_gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('source_')
-    create_repo(nil, 'target_gitlabhq') #unless opts[:repo].nil? || !opts[:repo].include?('target_')
-  end
-
-  def clear_test_repo_dir
-    setup_stubs
-
-    # Remove tmp/test-git-base-path
-    FileUtils.rm_rf Gitlab.config.gitlab_shell.repos_path
-
-    # Recreate tmp/test-git-base-path
-    FileUtils.mkdir_p Gitlab.config.gitlab_shell.repos_path
-
-    # Since much more is happening in satellites
-    FileUtils.mkdir_p Gitlab.config.satellites.path
-  end
-
-  # Create a testing satellite, and clone the source repo into it
-  def create_satellite(source_repo, namespace, satellite_name)
-    satellite_repo = satellite(namespace, satellite_name)
-    # Symlink tmp/satellite/gitlabhq to tmp/test-git-base-path/satellite/gitlabhq, create the directory if it doesn't exist already
-    satellite_dir = File.dirname(satellite_repo)
-    FileUtils.mkdir_p(satellite_dir) unless File.exists?(satellite_dir)
-    FileUtils.ln_sf(seed_satellite_path, satellite_repo)
+  def copy_repo(project)
+    base_repo_path = repos_path + "/root/testme.git"
+    target_repo_path = repos_path + "/#{project.namespace.path}/#{project.path}.git"
+    FileUtils.cp_r(base_repo_path, target_repo_path)
   end
 
-  def create_temp_repo(path)
-    FileUtils.mkdir_p path
-    system(*%W(git init --quiet --bare -- #{path}))
+  def repos_path
+    Gitlab.config.gitlab_shell.repos_path
   end
 end
-- 
GitLab