Commit 8da05a4ff7cd9cd84e74bd8a017baf59135ee39d

Authored by Dmitriy Zaporozhets
2 parents b03ee466 1dda0848

Merge pull request #1323 from tsigo/factory_girl

FactoryGirl and spec cleanup
@@ -107,6 +107,7 @@ group :development, :test do @@ -107,6 +107,7 @@ group :development, :test do
107 gem "awesome_print" 107 gem "awesome_print"
108 gem "database_cleaner" 108 gem "database_cleaner"
109 gem "launchy" 109 gem "launchy"
  110 + gem 'factory_girl_rails'
110 end 111 end
111 112
112 group :test do 113 group :test do
@@ -166,6 +166,11 @@ GEM @@ -166,6 +166,11 @@ GEM
166 eventmachine (0.12.10) 166 eventmachine (0.12.10)
167 execjs (1.4.0) 167 execjs (1.4.0)
168 multi_json (~> 1.0) 168 multi_json (~> 1.0)
  169 + factory_girl (4.0.0)
  170 + activesupport (>= 3.0.0)
  171 + factory_girl_rails (4.0.0)
  172 + factory_girl (~> 4.0.0)
  173 + railties (>= 3.0.0)
169 ffaker (1.14.0) 174 ffaker (1.14.0)
170 ffi (1.0.11) 175 ffi (1.0.11)
171 foreman (0.47.0) 176 foreman (0.47.0)
@@ -388,6 +393,7 @@ DEPENDENCIES @@ -388,6 +393,7 @@ DEPENDENCIES
388 devise (~> 2.1.0) 393 devise (~> 2.1.0)
389 draper 394 draper
390 email_spec 395 email_spec
  396 + factory_girl_rails
391 ffaker 397 ffaker
392 foreman 398 foreman
393 git 399 git
db/fixtures/test/001_repo.rb
1 -# create tmp dir if not exist  
2 -tmp_dir = File.join(Rails.root, "tmp")  
3 -Dir.mkdir(tmp_dir) unless File.exists?(tmp_dir)  
4 -  
5 -# Create dir for test repo  
6 -repo_dir = File.join(Rails.root, "tmp", "tests")  
7 -Dir.mkdir(repo_dir) unless File.exists?(repo_dir)  
8 -  
9 -`cp spec/seed_project.tar.gz tmp/tests/`  
10 -Dir.chdir(repo_dir)  
11 -`tar -xf seed_project.tar.gz`  
12 -3.times do |i|  
13 -`cp -r gitlabhq/ gitlabhq_#{i}/`  
14 -puts "Unpacked seed repo - tmp/tests/gitlabhq_#{i}" 1 +require 'fileutils'
  2 +
  3 +print "Unpacking seed repository..."
  4 +
  5 +SEED_REPO = 'seed_project.tar.gz'
  6 +REPO_PATH = File.join(Rails.root, 'tmp', 'repositories')
  7 +
  8 +# Make whatever directories we need to make
  9 +FileUtils.mkdir_p(REPO_PATH)
  10 +
  11 +# Copy the archive to the repo path
  12 +FileUtils.cp(File.join(Rails.root, 'spec', SEED_REPO), REPO_PATH)
  13 +
  14 +# chdir to the repo path
  15 +FileUtils.cd(REPO_PATH) do
  16 + # Extract the archive
  17 + `tar -xf #{SEED_REPO}`
  18 +
  19 + # Remove the copy
  20 + FileUtils.rm(SEED_REPO)
15 end 21 end
  22 +
  23 +puts ' done.'
db/pkey.example
@@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
1 -AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4  
2 -596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4  
3 -soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=  
features/step_definitions/dashboard_steps.rb
@@ -106,13 +106,9 @@ Given /^I have assigned issues$/ do @@ -106,13 +106,9 @@ Given /^I have assigned issues$/ do
106 end 106 end
107 107
108 Given /^I have authored merge requests$/ do 108 Given /^I have authored merge requests$/ do
109 - project1 = Factory :project,  
110 - :path => "gitlabhq_1",  
111 - :code => "gitlabhq_1" 109 + project1 = Factory :project
112 110
113 - project2 = Factory :project,  
114 - :path => "gitlabhq_2",  
115 - :code => "gitlabhq_2" 111 + project2 = Factory :project
116 112
117 project1.add_access(@user, :read, :write) 113 project1.add_access(@user, :read, :write)
118 project2.add_access(@user, :read, :write) 114 project2.add_access(@user, :read, :write)
features/support/env.rb
@@ -8,9 +8,8 @@ require 'webmock/cucumber' @@ -8,9 +8,8 @@ require 'webmock/cucumber'
8 8
9 WebMock.allow_net_connect! 9 WebMock.allow_net_connect!
10 10
11 -require Rails.root.join 'spec/factories'  
12 -require Rails.root.join 'spec/support/monkeypatch'  
13 require Rails.root.join 'spec/support/gitolite_stub' 11 require Rails.root.join 'spec/support/gitolite_stub'
  12 +require Rails.root.join 'spec/support/stubbed_repository'
14 require Rails.root.join 'spec/support/login_helpers' 13 require Rails.root.join 'spec/support/login_helpers'
15 require Rails.root.join 'spec/support/valid_commit' 14 require Rails.root.join 'spec/support/valid_commit'
16 15
@@ -53,6 +52,8 @@ require 'cucumber/rspec/doubles' @@ -53,6 +52,8 @@ require 'cucumber/rspec/doubles'
53 52
54 include GitoliteStub 53 include GitoliteStub
55 54
56 -Before do 55 +Before do
57 stub_gitolite! 56 stub_gitolite!
58 end 57 end
  58 +
  59 +World(FactoryGirl::Syntax::Methods)
spec/factories.rb
1 -require File.join(Rails.root, 'spec', 'factory')  
2 -  
3 -Factory.add(:project, Project) do |obj|  
4 - obj.name = Faker::Internet.user_name  
5 - obj.path = 'gitlabhq'  
6 - obj.owner = Factory(:user)  
7 - obj.code = 'LGT'  
8 -end  
9 -  
10 -Factory.add(:project_without_owner, Project) do |obj|  
11 - obj.name = Faker::Internet.user_name  
12 - obj.path = 'gitlabhq'  
13 - obj.code = 'LGT'  
14 -end  
15 -  
16 -Factory.add(:public_project, Project) do |obj|  
17 - obj.name = Faker::Internet.user_name  
18 - obj.path = 'gitlabhq'  
19 - obj.private_flag = false  
20 - obj.owner = Factory(:user)  
21 - obj.code = 'LGT'  
22 -end  
23 -  
24 -Factory.add(:user, User) do |obj|  
25 - obj.email = Faker::Internet.email  
26 - obj.password = "123456"  
27 - obj.name = Faker::Name.name  
28 - obj.password_confirmation = "123456"  
29 -end  
30 -  
31 -Factory.add(:admin, User) do |obj|  
32 - obj.email = Faker::Internet.email  
33 - obj.password = "123456"  
34 - obj.name = Faker::Name.name  
35 - obj.password_confirmation = "123456"  
36 - obj.admin = true  
37 -end  
38 -  
39 -Factory.add(:issue, Issue) do |obj|  
40 - obj.title = Faker::Lorem.sentence  
41 - obj.author = Factory :user  
42 - obj.assignee = Factory :user  
43 -end  
44 -  
45 -Factory.add(:merge_request, MergeRequest) do |obj|  
46 - obj.title = Faker::Lorem.sentence  
47 - obj.author = Factory :user  
48 - obj.assignee = Factory :user  
49 - obj.source_branch = "master"  
50 - obj.target_branch = "stable"  
51 - obj.closed = false  
52 -end  
53 -  
54 -Factory.add(:snippet, Snippet) do |obj|  
55 - obj.title = Faker::Lorem.sentence  
56 - obj.file_name = Faker::Lorem.sentence  
57 - obj.content = Faker::Lorem.sentences  
58 -end  
59 -  
60 -Factory.add(:note, Note) do |obj|  
61 - obj.note = Faker::Lorem.sentence  
62 -end  
63 -  
64 -Factory.add(:key, Key) do |obj|  
65 - obj.title = "Example key"  
66 - obj.key = File.read(File.join(Rails.root, "db", "pkey.example"))  
67 -end  
68 -  
69 -Factory.add(:project_hook, ProjectHook) do |obj|  
70 - obj.url = Faker::Internet.uri("http")  
71 -end  
72 -  
73 -Factory.add(:system_hook, SystemHook) do |obj|  
74 - obj.url = Faker::Internet.uri("http")  
75 -end  
76 -  
77 -Factory.add(:wiki, Wiki) do |obj|  
78 - obj.title = Faker::Lorem.sentence  
79 - obj.content = Faker::Lorem.sentence  
80 - obj.user = Factory(:user)  
81 - obj.project = Factory(:project)  
82 -end  
83 -  
84 -Factory.add(:event, Event) do |obj|  
85 - obj.title = Faker::Lorem.sentence  
86 - obj.project = Factory(:project)  
87 -end  
88 -  
89 -Factory.add(:milestone, Milestone) do |obj|  
90 - obj.title = Faker::Lorem.sentence  
91 - obj.due_date = Date.today + 1.month  
92 -end  
93 -  
94 -Factory.add(:users_project, UsersProject) do |obj|  
95 - obj.user = Factory :user  
96 - obj.project = Factory :project 1 +# Backwards compatibility with the old method
  2 +def Factory(type, *args)
  3 + FactoryGirl.create(type, *args)
  4 +end
  5 +
  6 +module Factory
  7 + def self.create(type, *args)
  8 + FactoryGirl.create(type, *args)
  9 + end
  10 +
  11 + def self.new(type, *args)
  12 + FactoryGirl.build(type, *args)
  13 + end
  14 +end
  15 +
  16 +FactoryGirl.define do
  17 + sequence :sentence, aliases: [:title, :content] do
  18 + Faker::Lorem.sentence
  19 + end
  20 +
  21 + sequence(:url) { Faker::Internet.uri('http') }
  22 +
  23 + factory :user, aliases: [:author, :assignee, :owner] do
  24 + email { Faker::Internet.email }
  25 + name { Faker::Name.name }
  26 + password "123456"
  27 + password_confirmation "123456"
  28 +
  29 + trait :admin do
  30 + admin true
  31 + end
  32 +
  33 + factory :admin, traits: [:admin]
  34 + end
  35 +
  36 + factory :project do
  37 + sequence(:name) { |n| "project#{n}" }
  38 + path { name }
  39 + code { name }
  40 + owner
  41 + end
  42 +
  43 + factory :users_project do
  44 + user
  45 + project
  46 + end
  47 +
  48 + factory :issue do
  49 + title
  50 + author
  51 + project
  52 +
  53 + trait :closed do
  54 + closed true
  55 + end
  56 +
  57 + factory :closed_issue, traits: [:closed]
  58 + end
  59 +
  60 + factory :merge_request do
  61 + title
  62 + author
  63 + project
  64 + source_branch "master"
  65 + target_branch "stable"
  66 + end
  67 +
  68 + factory :note do
  69 + project
  70 + note "Note"
  71 + end
  72 +
  73 + factory :event do
  74 + end
  75 +
  76 + factory :key do
  77 + title
  78 + key do
  79 + """
  80 + AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
  81 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
  82 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=
  83 + """
  84 + end
  85 +
  86 + factory :deploy_key do
  87 + project
  88 + end
  89 +
  90 + factory :personal_key do
  91 + user
  92 + end
  93 + end
  94 +
  95 + factory :milestone do
  96 + title
  97 + project
  98 + end
  99 +
  100 + factory :system_hook do
  101 + url
  102 + end
  103 +
  104 + factory :project_hook do
  105 + url
  106 + end
  107 +
  108 + factory :wiki do
  109 + title
  110 + content
  111 + user
  112 + end
  113 +
  114 + factory :snippet do
  115 + project
  116 + author
  117 + title
  118 + content
  119 + file_name { Faker::Lorem.sentence }
  120 + end
97 end 121 end
spec/factories_spec.rb 0 → 100644
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
  1 +require 'spec_helper'
  2 +
  3 +describe "Factories" do
  4 + describe 'User' do
  5 + it "builds a valid instance" do
  6 + build(:user).should be_valid
  7 + end
  8 +
  9 + it "builds a valid admin instance" do
  10 + build(:admin).should be_valid
  11 + end
  12 + end
  13 +
  14 + describe 'Project' do
  15 + it "builds a valid instance" do
  16 + build(:project).should be_valid
  17 + end
  18 + end
  19 +
  20 + describe 'Issue' do
  21 + it "builds a valid instance" do
  22 + build(:issue).should be_valid
  23 + end
  24 +
  25 + it "builds a valid closed instance" do
  26 + build(:closed_issue).should be_valid
  27 + end
  28 + end
  29 +
  30 + describe 'MergeRequest' do
  31 + it "builds a valid instance" do
  32 + build(:merge_request).should be_valid
  33 + end
  34 + end
  35 +
  36 + describe 'Note' do
  37 + it "builds a valid instance" do
  38 + build(:note).should be_valid
  39 + end
  40 + end
  41 +
  42 + describe 'Event' do
  43 + it "builds a valid instance" do
  44 + build(:event).should be_valid
  45 + end
  46 + end
  47 +
  48 + describe 'Key' do
  49 + it "builds a valid instance" do
  50 + build(:key).should be_valid
  51 + end
  52 +
  53 + it "builds a valid deploy key instance" do
  54 + build(:deploy_key).should be_valid
  55 + end
  56 +
  57 + it "builds a valid personal key instance" do
  58 + build(:personal_key).should be_valid
  59 + end
  60 + end
  61 +
  62 + describe 'Milestone' do
  63 + it "builds a valid instance" do
  64 + build(:milestone).should be_valid
  65 + end
  66 + end
  67 +
  68 + describe 'SystemHook' do
  69 + it "builds a valid instance" do
  70 + build(:system_hook).should be_valid
  71 + end
  72 + end
  73 +
  74 + describe 'ProjectHook' do
  75 + it "builds a valid instance" do
  76 + build(:project_hook).should be_valid
  77 + end
  78 + end
  79 +
  80 + describe 'Wiki' do
  81 + it "builds a valid instance" do
  82 + build(:wiki).should be_valid
  83 + end
  84 + end
  85 +
  86 + describe 'Snippet' do
  87 + it "builds a valid instance" do
  88 + build(:snippet).should be_valid
  89 + end
  90 + end
  91 +end
spec/factory.rb
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -class Factory  
2 - @factories = {}  
3 -  
4 - class << self  
5 - def add(name, klass, &block)  
6 - @factories[name] = [klass, block]  
7 - end  
8 -  
9 - def create(name, opts = {})  
10 - new(name, opts).tap(&:save!)  
11 - end  
12 -  
13 - def new(name, opts = {})  
14 - factory= @factories[name]  
15 - factory[0].new.tap do |obj|  
16 - factory[1].call(obj)  
17 - end.tap do |obj|  
18 - opts.each do |k, opt|  
19 - obj.send("#{k}=", opt)  
20 - end  
21 - end  
22 - end  
23 - end  
24 -end  
25 -  
26 -def Factory(name, opts={})  
27 - Factory.create name, opts  
28 -end  
29 -  
spec/helpers/gitlab_flavored_markdown_spec.rb
@@ -2,7 +2,7 @@ require &quot;spec_helper&quot; @@ -2,7 +2,7 @@ require &quot;spec_helper&quot;
2 2
3 describe GitlabMarkdownHelper do 3 describe GitlabMarkdownHelper do
4 before do 4 before do
5 - @project = Project.find_by_path("gitlabhq") || Factory(:project) 5 + @project = Factory(:project)
6 @commit = @project.repo.commits.first.parents.first 6 @commit = @project.repo.commits.first.parents.first
7 @commit = CommitDecorator.decorate(Commit.new(@commit)) 7 @commit = CommitDecorator.decorate(Commit.new(@commit))
8 @other_project = Factory :project, path: "OtherPath", code: "OtherCode" 8 @other_project = Factory :project, path: "OtherPath", code: "OtherCode"
@@ -157,7 +157,7 @@ describe GitlabMarkdownHelper do @@ -157,7 +157,7 @@ describe GitlabMarkdownHelper do
157 gfm("Let @#{user.name} fix the *mess* in #{@commit.id}").should == "Let #{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} fix the *mess* in #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}" 157 gfm("Let @#{user.name} fix the *mess* in #{@commit.id}").should == "Let #{link_to "@#{user.name}", project_team_member_path(@project, member), class: "gfm gfm-team_member "} fix the *mess* in #{link_to @commit.id, project_commit_path(@project, id: @commit.id), title: "Commit: #{@commit.author_name} - #{@commit.title}", class: "gfm gfm-commit "}"
158 end 158 end
159 159
160 - it "should not trip over other stuff", focus: true do 160 + it "should not trip over other stuff" do
161 gfm("_Please_ *stop* 'helping' and all the other b*$#%' you do.").should == "_Please_ *stop* 'helping' and all the other b*$#%' you do." 161 gfm("_Please_ *stop* 'helping' and all the other b*$#%' you do.").should == "_Please_ *stop* 'helping' and all the other b*$#%' you do."
162 end 162 end
163 163
spec/models/issue_spec.rb
@@ -19,11 +19,7 @@ describe Issue do @@ -19,11 +19,7 @@ describe Issue do
19 it { Issue.should respond_to :opened } 19 it { Issue.should respond_to :opened }
20 end 20 end
21 21
22 - subject { Factory.create(:issue,  
23 - author: Factory(:user),  
24 - assignee: Factory(:user),  
25 - project: Factory.create(:project)) }  
26 - it { should be_valid } 22 + subject { Factory.create(:issue) }
27 23
28 describe '#is_being_reassigned?' do 24 describe '#is_being_reassigned?' do
29 it 'returns true if the issue assignee has changed' do 25 it 'returns true if the issue assignee has changed' do
@@ -41,11 +37,7 @@ describe Issue do @@ -41,11 +37,7 @@ describe Issue do
41 subject.is_being_closed?.should be_true 37 subject.is_being_closed?.should be_true
42 end 38 end
43 it 'returns false if the closed attribute has changed and is now false' do 39 it 'returns false if the closed attribute has changed and is now false' do
44 - issue = Factory.create(:issue,  
45 - closed: true,  
46 - author: Factory(:user),  
47 - assignee: Factory(:user),  
48 - project: Factory.create(:project)) 40 + issue = Factory.create(:closed_issue)
49 issue.closed = false 41 issue.closed = false
50 issue.is_being_closed?.should be_false 42 issue.is_being_closed?.should be_false
51 end 43 end
@@ -57,11 +49,7 @@ describe Issue do @@ -57,11 +49,7 @@ describe Issue do
57 49
58 describe '#is_being_reopened?' do 50 describe '#is_being_reopened?' do
59 it 'returns true if the closed attribute has changed and is now false' do 51 it 'returns true if the closed attribute has changed and is now false' do
60 - issue = Factory.create(:issue,  
61 - closed: true,  
62 - author: Factory(:user),  
63 - assignee: Factory(:user),  
64 - project: Factory.create(:project)) 52 + issue = Factory.create(:closed_issue)
65 issue.closed = false 53 issue.closed = false
66 issue.is_being_reopened?.should be_true 54 issue.is_being_reopened?.should be_true
67 end 55 end
@@ -75,40 +63,33 @@ describe Issue do @@ -75,40 +63,33 @@ describe Issue do
75 end 63 end
76 64
77 describe "plus 1" do 65 describe "plus 1" do
78 - let(:project) { Factory(:project) }  
79 - subject {  
80 - Factory.create(:issue,  
81 - author: Factory(:user),  
82 - assignee: Factory(:user),  
83 - project: project)  
84 - } 66 + subject { Factory.create(:issue) }
85 67
86 it "with no notes has a 0/0 score" do 68 it "with no notes has a 0/0 score" do
87 subject.upvotes.should == 0 69 subject.upvotes.should == 0
88 end 70 end
89 71
90 it "should recognize non-+1 notes" do 72 it "should recognize non-+1 notes" do
91 - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) 73 + subject.notes << Factory(:note, note: "No +1 here")
92 subject.should have(1).note 74 subject.should have(1).note
93 subject.notes.first.upvote?.should be_false 75 subject.notes.first.upvote?.should be_false
94 subject.upvotes.should == 0 76 subject.upvotes.should == 0
95 end 77 end
96 78
97 it "should recognize a single +1 note" do 79 it "should recognize a single +1 note" do
98 - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) 80 + subject.notes << Factory(:note, note: "+1 This is awesome")
99 subject.upvotes.should == 1 81 subject.upvotes.should == 1
100 end 82 end
101 83
102 it "should recognize a multiple +1 notes" do 84 it "should recognize a multiple +1 notes" do
103 - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))  
104 - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) 85 + subject.notes << Factory(:note, note: "+1 This is awesome")
  86 + subject.notes << Factory(:note, note: "+1 I want this")
105 subject.upvotes.should == 2 87 subject.upvotes.should == 2
106 end 88 end
107 end 89 end
108 90
109 describe ".search" do 91 describe ".search" do
110 - let!(:issue) { Factory.create(:issue, title: "Searchable issue",  
111 - project: Factory.create(:project)) } 92 + let!(:issue) { Factory.create(:issue, title: "Searchable issue") }
112 93
113 it "matches by title" do 94 it "matches by title" do
114 Issue.search('able').all.should == [issue] 95 Issue.search('able').all.should == [issue]
spec/models/key_spec.rb
@@ -17,20 +17,15 @@ describe Key do @@ -17,20 +17,15 @@ describe Key do
17 context "validation of uniqueness" do 17 context "validation of uniqueness" do
18 18
19 context "as a deploy key" do 19 context "as a deploy key" do
20 - let(:project) { Factory.create(:project, path: 'alpha', code: 'alpha') }  
21 - let(:another_project) { Factory.create(:project, path: 'beta', code: 'beta') }  
22 -  
23 - before do  
24 - deploy_key = Factory.create(:key, project: project)  
25 - end 20 + let!(:deploy_key) { create(:deploy_key) }
26 21
27 it "does not accept the same key twice for a project" do 22 it "does not accept the same key twice for a project" do
28 - key = Factory.new(:key, project: project) 23 + key = build(:key, project: deploy_key.project)
29 key.should_not be_valid 24 key.should_not be_valid
30 end 25 end
31 26
32 it "does accept the same key for another project" do 27 it "does accept the same key for another project" do
33 - key = Factory.new(:key, project: another_project) 28 + key = build(:key, project_id: 0)
34 key.should be_valid 29 key.should be_valid
35 end 30 end
36 end 31 end
@@ -39,12 +34,12 @@ describe Key do @@ -39,12 +34,12 @@ describe Key do
39 let(:user) { Factory.create(:user) } 34 let(:user) { Factory.create(:user) }
40 35
41 it "accepts the key once" do 36 it "accepts the key once" do
42 - Factory.new(:key, user: user).should be_valid 37 + build(:key, user: user).should be_valid
43 end 38 end
44 39
45 it "does not accepts the key twice" do 40 it "does not accepts the key twice" do
46 - Factory.create(:key, user: user)  
47 - Factory.new(:key, user: user).should_not be_valid 41 + create(:key, user: user)
  42 + build(:key, user: user).should_not be_valid
48 end 43 end
49 end 44 end
50 end 45 end
spec/models/merge_request_spec.rb
@@ -20,46 +20,34 @@ describe MergeRequest do @@ -20,46 +20,34 @@ describe MergeRequest do
20 it { MergeRequest.should respond_to :opened } 20 it { MergeRequest.should respond_to :opened }
21 end 21 end
22 22
23 - it { Factory.create(:merge_request,  
24 - author: Factory(:user),  
25 - assignee: Factory(:user),  
26 - project: Factory.create(:project)).should be_valid }  
27 -  
28 describe "plus 1" do 23 describe "plus 1" do
29 - let(:project) { Factory(:project) }  
30 - subject {  
31 - Factory.create(:merge_request,  
32 - author: Factory(:user),  
33 - assignee: Factory(:user),  
34 - project: project)  
35 - } 24 + subject { Factory.create(:merge_request) }
36 25
37 it "with no notes has a 0/0 score" do 26 it "with no notes has a 0/0 score" do
38 subject.upvotes.should == 0 27 subject.upvotes.should == 0
39 end 28 end
40 29
41 it "should recognize non-+1 notes" do 30 it "should recognize non-+1 notes" do
42 - subject.notes << Factory(:note, note: "No +1 here", project: Factory(:project, path: 'plusone', code: 'plusone')) 31 + subject.notes << Factory(:note, note: "No +1 here")
43 subject.should have(1).note 32 subject.should have(1).note
44 subject.notes.first.upvote?.should be_false 33 subject.notes.first.upvote?.should be_false
45 subject.upvotes.should == 0 34 subject.upvotes.should == 0
46 end 35 end
47 36
48 it "should recognize a single +1 note" do 37 it "should recognize a single +1 note" do
49 - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone')) 38 + subject.notes << Factory(:note, note: "+1 This is awesome")
50 subject.upvotes.should == 1 39 subject.upvotes.should == 1
51 end 40 end
52 41
53 it "should recognize a multiple +1 notes" do 42 it "should recognize a multiple +1 notes" do
54 - subject.notes << Factory(:note, note: "+1 This is awesome", project: Factory(:project, path: 'plusone', code: 'plusone'))  
55 - subject.notes << Factory(:note, note: "+1 I want this", project: Factory(:project, path: 'plustwo', code: 'plustwo')) 43 + subject.notes << Factory(:note, note: "+1 This is awesome")
  44 + subject.notes << Factory(:note, note: "+1 I want this")
56 subject.upvotes.should == 2 45 subject.upvotes.should == 2
57 end 46 end
58 end 47 end
59 48
60 describe ".search" do 49 describe ".search" do
61 - let!(:issue) { Factory.create(:issue, title: "Searchable issue",  
62 - project: Factory.create(:project)) } 50 + let!(:issue) { Factory.create(:issue, title: "Searchable issue") }
63 51
64 it "matches by title" do 52 it "matches by title" do
65 Issue.search('able').all.should == [issue] 53 Issue.search('able').all.should == [issue]
spec/models/milestone_spec.rb
@@ -25,11 +25,8 @@ describe Milestone do @@ -25,11 +25,8 @@ describe Milestone do
25 it { should validate_presence_of(:project_id) } 25 it { should validate_presence_of(:project_id) }
26 end 26 end
27 27
28 - let(:project) { Factory :project }  
29 - let(:milestone) { Factory :milestone, project: project }  
30 - let(:issue) { Factory :issue, project: project }  
31 -  
32 - it { milestone.should be_valid } 28 + let(:milestone) { Factory :milestone }
  29 + let(:issue) { Factory :issue }
33 30
34 describe "#percent_complete" do 31 describe "#percent_complete" do
35 it "should not count open issues" do 32 it "should not count open issues" do
spec/models/note_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Note do 3 describe Note do
4 - let(:project) { Factory :project }  
5 - let!(:commit) { project.commit }  
6 -  
7 describe "Associations" do 4 describe "Associations" do
8 it { should belong_to(:project) } 5 it { should belong_to(:project) }
9 end 6 end
@@ -13,8 +10,6 @@ describe Note do @@ -13,8 +10,6 @@ describe Note do
13 it { should validate_presence_of(:project) } 10 it { should validate_presence_of(:project) }
14 end 11 end
15 12
16 - it { Factory.create(:note,  
17 - project: project).should be_valid }  
18 describe "Scopes" do 13 describe "Scopes" do
19 it "should have a today named scope that returns ..." do 14 it "should have a today named scope that returns ..." do
20 Note.today.where_values.should == ["created_at >= '#{Date.today}'"] 15 Note.today.where_values.should == ["created_at >= '#{Date.today}'"]
@@ -25,26 +20,27 @@ describe Note do @@ -25,26 +20,27 @@ describe Note do
25 let(:project) { Factory(:project) } 20 let(:project) { Factory(:project) }
26 21
27 it "recognizes a neutral note" do 22 it "recognizes a neutral note" do
28 - note = Factory(:note, project: project, note: "This is not a +1 note") 23 + note = Factory(:note, note: "This is not a +1 note")
29 note.should_not be_upvote 24 note.should_not be_upvote
30 end 25 end
31 26
32 it "recognizes a +1 note" do 27 it "recognizes a +1 note" do
33 - note = Factory(:note, project: project, note: "+1 for this") 28 + note = Factory(:note, note: "+1 for this")
34 note.should be_upvote 29 note.should be_upvote
35 end 30 end
36 31
37 it "recognizes a -1 note as no vote" do 32 it "recognizes a -1 note as no vote" do
38 - note = Factory(:note, project: project, note: "-1 for this") 33 + note = Factory(:note, note: "-1 for this")
39 note.should_not be_upvote 34 note.should_not be_upvote
40 end 35 end
41 end 36 end
42 37
43 - describe "Commit notes" do 38 + let(:project) { create(:project) }
  39 + let(:commit) { project.commit }
44 40
  41 + describe "Commit notes" do
45 before do 42 before do
46 @note = Factory :note, 43 @note = Factory :note,
47 - project: project,  
48 noteable_id: commit.id, 44 noteable_id: commit.id,
49 noteable_type: "Commit" 45 noteable_type: "Commit"
50 end 46 end
@@ -58,7 +54,6 @@ describe Note do @@ -58,7 +54,6 @@ describe Note do
58 describe "Pre-line commit notes" do 54 describe "Pre-line commit notes" do
59 before do 55 before do
60 @note = Factory :note, 56 @note = Factory :note,
61 - project: project,  
62 noteable_id: commit.id, 57 noteable_id: commit.id,
63 noteable_type: "Commit", 58 noteable_type: "Commit",
64 line_code: "0_16_1" 59 line_code: "0_16_1"
@@ -91,8 +86,8 @@ describe Note do @@ -91,8 +86,8 @@ describe Note do
91 86
92 describe :authorization do 87 describe :authorization do
93 before do 88 before do
94 - @p1 = project  
95 - @p2 = Factory :project, code: "alien", path: "gitlabhq_1" 89 + @p1 = create(:project)
  90 + @p2 = Factory :project
96 @u1 = Factory :user 91 @u1 = Factory :user
97 @u2 = Factory :user 92 @u2 = Factory :user
98 @u3 = Factory :user 93 @u3 = Factory :user
spec/models/project_spec.rb
@@ -85,7 +85,7 @@ describe Project do @@ -85,7 +85,7 @@ describe Project do
85 85
86 it "should return path to repo" do 86 it "should return path to repo" do
87 project = Project.new(path: "somewhere") 87 project = Project.new(path: "somewhere")
88 - project.path_to_repo.should == File.join(Rails.root, "tmp", "tests", "somewhere") 88 + project.path_to_repo.should == File.join(Rails.root, "tmp", "repositories", "somewhere")
89 end 89 end
90 90
91 it "returns the full web URL for this repo" do 91 it "returns the full web URL for this repo" do
spec/models/system_hook_spec.rb
@@ -10,13 +10,12 @@ describe SystemHook do @@ -10,13 +10,12 @@ describe SystemHook do
10 end 10 end
11 11
12 it "project_create hook" do 12 it "project_create hook" do
13 - user = Factory :user  
14 with_resque do 13 with_resque do
15 - project = Factory :project_without_owner, owner: user 14 + project = Factory :project
16 end 15 end
17 WebMock.should have_requested(:post, @system_hook.url).with(body: /project_create/).once 16 WebMock.should have_requested(:post, @system_hook.url).with(body: /project_create/).once
18 end 17 end
19 - 18 +
20 it "project_destroy hook" do 19 it "project_destroy hook" do
21 project = Factory :project 20 project = Factory :project
22 with_resque do 21 with_resque do
@@ -31,7 +30,7 @@ describe SystemHook do @@ -31,7 +30,7 @@ describe SystemHook do
31 end 30 end
32 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_create/).once 31 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_create/).once
33 end 32 end
34 - 33 +
35 it "user_destroy hook" do 34 it "user_destroy hook" do
36 user = Factory :user 35 user = Factory :user
37 with_resque do 36 with_resque do
@@ -39,7 +38,7 @@ describe SystemHook do @@ -39,7 +38,7 @@ describe SystemHook do
39 end 38 end
40 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_destroy/).once 39 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_destroy/).once
41 end 40 end
42 - 41 +
43 it "project_create hook" do 42 it "project_create hook" do
44 user = Factory :user 43 user = Factory :user
45 project = Factory :project 44 project = Factory :project
@@ -48,7 +47,7 @@ describe SystemHook do @@ -48,7 +47,7 @@ describe SystemHook do
48 end 47 end
49 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once 48 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once
50 end 49 end
51 - 50 +
52 it "project_destroy hook" do 51 it "project_destroy hook" do
53 user = Factory :user 52 user = Factory :user
54 project = Factory :project 53 project = Factory :project
spec/models/user_spec.rb
@@ -3,11 +3,12 @@ require &#39;spec_helper&#39; @@ -3,11 +3,12 @@ require &#39;spec_helper&#39;
3 describe User do 3 describe User do
4 describe "Associations" do 4 describe "Associations" do
5 it { should have_many(:projects) } 5 it { should have_many(:projects) }
6 - it { should have_many(:users_projects) }  
7 - it { should have_many(:issues) }  
8 - it { should have_many(:assigned_issues) }  
9 - it { should have_many(:merge_requests) }  
10 - it { should have_many(:assigned_merge_requests) } 6 + it { should have_many(:users_projects).dependent(:destroy) }
  7 + it { should have_many(:issues).dependent(:destroy) }
  8 + it { should have_many(:assigned_issues).dependent(:destroy) }
  9 + it { should have_many(:merge_requests).dependent(:destroy) }
  10 + it { should have_many(:assigned_merge_requests).dependent(:destroy) }
  11 + it { should have_many(:notes).dependent(:destroy) }
11 end 12 end
12 13
13 describe "Respond to" do 14 describe "Respond to" do
@@ -49,21 +50,6 @@ describe User do @@ -49,21 +50,6 @@ describe User do
49 user = Factory(:user) 50 user = Factory(:user)
50 user.authentication_token.should_not == "" 51 user.authentication_token.should_not == ""
51 end 52 end
52 -  
53 - describe "dependent" do  
54 - before do  
55 - @user = Factory :user  
56 - @note = Factory :note,  
57 - author: @user,  
58 - project: Factory(:project)  
59 - end  
60 -  
61 - it "should destroy all notes with user" do  
62 - Note.find_by_id(@note.id).should_not be_nil  
63 - @user.destroy  
64 - Note.find_by_id(@note.id).should be_nil  
65 - end  
66 - end  
67 end 53 end
68 # == Schema Information 54 # == Schema Information
69 # 55 #
spec/requests/admin/admin_projects_spec.rb
@@ -87,7 +87,7 @@ describe &quot;Admin::Projects&quot; do @@ -87,7 +87,7 @@ describe &quot;Admin::Projects&quot; do
87 visit new_admin_project_path 87 visit new_admin_project_path
88 fill_in 'project_name', with: 'NewProject' 88 fill_in 'project_name', with: 'NewProject'
89 fill_in 'project_code', with: 'NPR' 89 fill_in 'project_code', with: 'NPR'
90 - fill_in 'project_path', with: 'gitlabhq_1' 90 + fill_in 'project_path', with: 'newproject'
91 expect { click_button "Create project" }.to change { Project.count }.by(1) 91 expect { click_button "Create project" }.to change { Project.count }.by(1)
92 @project = Project.last 92 @project = Project.last
93 end 93 end
spec/requests/atom/dashboard_issues_spec.rb
@@ -6,13 +6,9 @@ describe &quot;User Issues Dashboard&quot; do @@ -6,13 +6,9 @@ describe &quot;User Issues Dashboard&quot; do
6 6
7 login_as :user 7 login_as :user
8 8
9 - @project1 = Factory :project,  
10 - path: "gitlabhq_0",  
11 - code: "TEST1" 9 + @project1 = Factory :project
12 10
13 - @project2 = Factory :project,  
14 - path: "gitlabhq_1",  
15 - code: "TEST2" 11 + @project2 = Factory :project
16 12
17 @project1.add_access(@user, :read, :write) 13 @project1.add_access(@user, :read, :write)
18 @project2.add_access(@user, :read, :write) 14 @project2.add_access(@user, :read, :write)
spec/spec_helper.rb
@@ -10,7 +10,6 @@ require &#39;rspec/rails&#39; @@ -10,7 +10,6 @@ require &#39;rspec/rails&#39;
10 require 'capybara/rails' 10 require 'capybara/rails'
11 require 'capybara/rspec' 11 require 'capybara/rspec'
12 require 'webmock/rspec' 12 require 'webmock/rspec'
13 -require 'factories'  
14 require 'email_spec' 13 require 'email_spec'
15 require 'headless' 14 require 'headless'
16 15
@@ -28,6 +27,7 @@ RSpec.configure do |config| @@ -28,6 +27,7 @@ RSpec.configure do |config|
28 27
29 config.include LoginHelpers, type: :request 28 config.include LoginHelpers, type: :request
30 config.include GitoliteStub 29 config.include GitoliteStub
  30 + config.include FactoryGirl::Syntax::Methods
31 31
32 # If you're not using ActiveRecord, or you'd prefer not to run each of your 32 # If you're not using ActiveRecord, or you'd prefer not to run each of your
33 # examples within a transaction, remove the following line or assign false 33 # examples within a transaction, remove the following line or assign false
spec/support/monkeypatch.rb
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -# Stubbing Project <-> git host path  
2 -# create project using Factory only  
3 -class Project  
4 - def path_to_repo  
5 - File.join(Rails.root, "tmp", "tests", path)  
6 - end  
7 -  
8 - def satellite  
9 - @satellite ||= FakeSatellite.new  
10 - end  
11 -end  
12 -  
13 -class FakeSatellite  
14 - def exists?  
15 - true  
16 - end  
17 -  
18 - def create  
19 - true  
20 - end  
21 -end  
spec/support/stubbed_repository.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +# Stubs out all Git repository access done by models so that specs can run
  2 +# against fake repositories without Grit complaining that they don't exist.
  3 +module StubbedRepository
  4 + def path_to_repo
  5 + if new_record? || path == 'newproject'
  6 + # There are a couple Project specs and features that expect the Project's
  7 + # path to be in the returned path, so let's patronize them.
  8 + File.join(Rails.root, 'tmp', 'repositories', path)
  9 + else
  10 + # For everything else, just give it the path to one of our real seeded
  11 + # repos.
  12 + File.join(Rails.root, 'tmp', 'repositories', 'gitlabhq')
  13 + end
  14 + end
  15 +
  16 + def satellite
  17 + FakeSatellite.new
  18 + end
  19 +
  20 + class FakeSatellite
  21 + def exists?
  22 + true
  23 + end
  24 +
  25 + def create
  26 + true
  27 + end
  28 + end
  29 +end
  30 +
  31 +Project.send(:include, StubbedRepository)