imbriaco-integrity 0.1.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +12 -0
- data/CHANGES +36 -0
- data/README.markdown +79 -0
- data/Rakefile +79 -0
- data/bin/integrity +4 -0
- data/config/config.sample.ru +21 -0
- data/config/config.sample.yml +41 -0
- data/config/heroku/.gems +1 -0
- data/config/heroku/Rakefile +6 -0
- data/config/heroku/config.ru +7 -0
- data/config/heroku/integrity-config.rb +14 -0
- data/config/thin.sample.yml +13 -0
- data/integrity.gemspec +140 -0
- data/lib/integrity/app.rb +138 -0
- data/lib/integrity/author.rb +39 -0
- data/lib/integrity/build.rb +91 -0
- data/lib/integrity/commit.rb +63 -0
- data/lib/integrity/core_ext/object.rb +6 -0
- data/lib/integrity/helpers/authorization.rb +33 -0
- data/lib/integrity/helpers/breadcrumbs.rb +20 -0
- data/lib/integrity/helpers/forms.rb +29 -0
- data/lib/integrity/helpers/pretty_output.rb +45 -0
- data/lib/integrity/helpers/rendering.rb +25 -0
- data/lib/integrity/helpers/resources.rb +19 -0
- data/lib/integrity/helpers/urls.rb +59 -0
- data/lib/integrity/helpers.rb +16 -0
- data/lib/integrity/installer.rb +136 -0
- data/lib/integrity/migrations.rb +151 -0
- data/lib/integrity/notifier/base.rb +74 -0
- data/lib/integrity/notifier/test/fixtures.rb +108 -0
- data/lib/integrity/notifier/test/hpricot_matcher.rb +38 -0
- data/lib/integrity/notifier/test.rb +59 -0
- data/lib/integrity/notifier.rb +34 -0
- data/lib/integrity/project/deprecated.rb +17 -0
- data/lib/integrity/project/notifiers.rb +33 -0
- data/lib/integrity/project/push.rb +44 -0
- data/lib/integrity/project.rb +102 -0
- data/lib/integrity/project_builder.rb +56 -0
- data/lib/integrity/scm/git/uri.rb +57 -0
- data/lib/integrity/scm/git.rb +84 -0
- data/lib/integrity/scm.rb +19 -0
- data/lib/integrity.rb +101 -0
- data/public/buttons.css +82 -0
- data/public/reset.css +7 -0
- data/public/spinner.gif +0 -0
- data/test/acceptance/api_test.rb +97 -0
- data/test/acceptance/browse_project_builds_test.rb +65 -0
- data/test/acceptance/browse_project_test.rb +99 -0
- data/test/acceptance/build_notifications_test.rb +95 -0
- data/test/acceptance/create_project_test.rb +97 -0
- data/test/acceptance/delete_project_test.rb +53 -0
- data/test/acceptance/edit_project_test.rb +117 -0
- data/test/acceptance/error_page_test.rb +18 -0
- data/test/acceptance/installer_test.rb +79 -0
- data/test/acceptance/manual_build_project_test.rb +82 -0
- data/test/acceptance/not_found_page_test.rb +29 -0
- data/test/acceptance/project_syndication_test.rb +30 -0
- data/test/acceptance/stylesheet_test.rb +26 -0
- data/test/acceptance/unauthorized_page_test.rb +20 -0
- data/test/helpers/acceptance/email_notifier.rb +55 -0
- data/test/helpers/acceptance/git_helper.rb +99 -0
- data/test/helpers/acceptance/notifier_helper.rb +47 -0
- data/test/helpers/acceptance/textfile_notifier.rb +26 -0
- data/test/helpers/acceptance.rb +79 -0
- data/test/helpers/expectations/be_a.rb +23 -0
- data/test/helpers/expectations/change.rb +90 -0
- data/test/helpers/expectations/have.rb +105 -0
- data/test/helpers/expectations/predicates.rb +37 -0
- data/test/helpers/expectations.rb +4 -0
- data/test/helpers/fixtures.rb +87 -0
- data/test/helpers/initial_migration_fixture.sql +44 -0
- data/test/helpers.rb +87 -0
- data/test/unit/build_test.rb +86 -0
- data/test/unit/commit_test.rb +62 -0
- data/test/unit/helpers_test.rb +103 -0
- data/test/unit/integrity_test.rb +52 -0
- data/test/unit/migrations_test.rb +57 -0
- data/test/unit/notifier/base_test.rb +43 -0
- data/test/unit/notifier/test_test.rb +29 -0
- data/test/unit/notifier_test.rb +85 -0
- data/test/unit/project_builder_test.rb +118 -0
- data/test/unit/project_test.rb +371 -0
- data/test/unit/scm_test.rb +54 -0
- data/views/_commit_info.haml +24 -0
- data/views/build.haml +2 -0
- data/views/error.haml +37 -0
- data/views/home.haml +21 -0
- data/views/integrity.sass +400 -0
- data/views/layout.haml +29 -0
- data/views/new.haml +50 -0
- data/views/not_found.haml +31 -0
- data/views/notifier.haml +7 -0
- data/views/project.builder +21 -0
- data/views/project.haml +30 -0
- data/views/unauthorized.haml +38 -0
- metadata +327 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
require "helpers/acceptance/notifier_helper"
|
3
|
+
|
4
|
+
class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
|
5
|
+
include NotifierHelper
|
6
|
+
|
7
|
+
story <<-EOS
|
8
|
+
As an administrator,
|
9
|
+
I want to setup notifiers on my projects
|
10
|
+
So that I get alerts with every build
|
11
|
+
EOS
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
# This is needed before any available notifier is unset
|
15
|
+
# in the global #before
|
16
|
+
load "helpers/acceptance/textfile_notifier.rb"
|
17
|
+
load "helpers/acceptance/email_notifier.rb"
|
18
|
+
Notifier.register(Integrity::Notifier::Textfile)
|
19
|
+
Notifier.register(Integrity::Notifier::Email)
|
20
|
+
end
|
21
|
+
|
22
|
+
scenario "an admin sets up a notifier and issue a manual build" do
|
23
|
+
git_repo(:my_test_project).add_successful_commit
|
24
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
25
|
+
rm_f "/tmp/textfile_notifications.txt"
|
26
|
+
|
27
|
+
login_as "admin", "test"
|
28
|
+
|
29
|
+
visit "/my-test-project"
|
30
|
+
|
31
|
+
click_link "Edit Project"
|
32
|
+
check "enabled_notifiers_textfile"
|
33
|
+
fill_in "File", :with => "/tmp/textfile_notifications.txt"
|
34
|
+
click_button "Update Project"
|
35
|
+
|
36
|
+
click_button "manual build"
|
37
|
+
|
38
|
+
notification = File.read("/tmp/textfile_notifications.txt")
|
39
|
+
notification.should =~ /=== Built #{git_repo(:my_test_project).short_head} successfully ===/
|
40
|
+
notification.should =~ /Build #{git_repo(:my_test_project).head} was successful/
|
41
|
+
notification.should =~
|
42
|
+
%r(http://www.example.com/my-test-project/commits/#{git_repo(:my_test_project).head})
|
43
|
+
notification.should =~ /Commit Author: John Doe/
|
44
|
+
notification.should =~ /Commit Date: (.+)/
|
45
|
+
notification.should =~ /Commit Message: This commit will work/
|
46
|
+
notification.should =~ /Build Output:\n\nRunning tests...\n/
|
47
|
+
end
|
48
|
+
|
49
|
+
scenario "an admin can setup a notifier without enabling it" do
|
50
|
+
Project.gen(:integrity)
|
51
|
+
|
52
|
+
login_as "admin", "test"
|
53
|
+
|
54
|
+
visit "/integrity"
|
55
|
+
click_link "Edit Project"
|
56
|
+
fill_in_email_notifier
|
57
|
+
click_button "Update Project"
|
58
|
+
|
59
|
+
visit "/integrity/edit"
|
60
|
+
assert_have_email_notifier
|
61
|
+
end
|
62
|
+
|
63
|
+
scenario "an admin configures various notifiers accros multiple projects" do
|
64
|
+
Project.first(:permalink => "integrity").should be_nil
|
65
|
+
|
66
|
+
login_as "admin", "test"
|
67
|
+
|
68
|
+
visit "/"
|
69
|
+
|
70
|
+
add_project "Integrity", "git://github.com/foca/integrity.git"
|
71
|
+
click_link "projects"
|
72
|
+
|
73
|
+
add_project "Webrat", "git://github.com/brynary/webrat.git"
|
74
|
+
click_link "projects"
|
75
|
+
|
76
|
+
add_project "Rails", "git://github.com/rails/rails.git"
|
77
|
+
click_link "projects"
|
78
|
+
|
79
|
+
edit_project "integrity"
|
80
|
+
edit_project "webrat"
|
81
|
+
edit_project "rails"
|
82
|
+
|
83
|
+
visit "/integrity"
|
84
|
+
click_link "Edit Project"
|
85
|
+
assert_have_email_notifier
|
86
|
+
|
87
|
+
visit "/webrat"
|
88
|
+
click_link "Edit Project"
|
89
|
+
assert_have_email_notifier
|
90
|
+
|
91
|
+
visit "/rails"
|
92
|
+
click_link "Edit Project"
|
93
|
+
assert_have_email_notifier
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class CreateProjectTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an administrator,
|
6
|
+
I want to add projects to Integrity,
|
7
|
+
So that I can know their status whenever I push code
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "an admin can create a public project" do
|
11
|
+
Project.first(:permalink => "integrity").should be_nil
|
12
|
+
|
13
|
+
login_as "admin", "test"
|
14
|
+
|
15
|
+
visit "/new"
|
16
|
+
|
17
|
+
fill_in "Name", :with => "Integrity"
|
18
|
+
fill_in "Git repository", :with => "git://github.com/foca/integrity.git"
|
19
|
+
fill_in "Branch to track", :with => "master"
|
20
|
+
fill_in "Build script", :with => "rake"
|
21
|
+
check "Public project"
|
22
|
+
click_button "Create Project"
|
23
|
+
|
24
|
+
Project.first(:permalink => "integrity").should_not be_nil
|
25
|
+
|
26
|
+
assert_have_tag("h1", :content => "Integrity")
|
27
|
+
|
28
|
+
log_out
|
29
|
+
visit "/integrity"
|
30
|
+
|
31
|
+
assert_have_tag("h1", :content => "Integrity")
|
32
|
+
end
|
33
|
+
|
34
|
+
scenario "an admin can create a private project" do
|
35
|
+
Project.first(:permalink => "integrity").should be_nil
|
36
|
+
|
37
|
+
login_as "admin", "test"
|
38
|
+
|
39
|
+
visit "/new"
|
40
|
+
|
41
|
+
fill_in "Name", :with => "Integrity"
|
42
|
+
fill_in "Git repository", :with => "git://github.com/foca/integrity.git"
|
43
|
+
fill_in "Branch to track", :with => "master"
|
44
|
+
fill_in "Build script", :with => "rake"
|
45
|
+
uncheck "Public project"
|
46
|
+
click_button "Create Project"
|
47
|
+
|
48
|
+
assert_have_tag("h1", :content => "Integrity")
|
49
|
+
Project.first(:permalink => "integrity").should_not be_nil
|
50
|
+
|
51
|
+
log_out
|
52
|
+
visit "/integrity"
|
53
|
+
|
54
|
+
response_code.should == 401
|
55
|
+
assert_have_tag("h1", :content => "know the password?")
|
56
|
+
end
|
57
|
+
|
58
|
+
scenario "creating a project without required fields re-renders the new project form" do
|
59
|
+
Project.first(:permalink => "integrity").should be_nil
|
60
|
+
|
61
|
+
login_as "admin", "test"
|
62
|
+
|
63
|
+
visit "/new"
|
64
|
+
click_button "Create Project"
|
65
|
+
|
66
|
+
assert_have_tag(".with_errors label", :content => "Name must not be blank")
|
67
|
+
Project.first(:permalink => "integrity").should be_nil
|
68
|
+
|
69
|
+
fill_in "Name", :with => "Integrity"
|
70
|
+
fill_in "Git repository", :with => "git://github.com/foca/integrity.git"
|
71
|
+
click_button "Create Project"
|
72
|
+
|
73
|
+
assert_have_tag("h1", :content => 'Integrity')
|
74
|
+
Project.first(:permalink => "integrity").should_not be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
scenario "a user can't see the new project form" do
|
78
|
+
visit "/new"
|
79
|
+
response_code.should == 401
|
80
|
+
assert_have_tag("h1", :content => "know the password?")
|
81
|
+
end
|
82
|
+
|
83
|
+
scenario "a user can't post the project data (bypassing the form)" do
|
84
|
+
post "/", "project_data[name]" => "Integrity",
|
85
|
+
"project_data[uri]" => "git://github.com/foca/integrity.git",
|
86
|
+
"project_data[branch]" => "master",
|
87
|
+
"project_data[command]" => "rake"
|
88
|
+
|
89
|
+
response_code.should == 401
|
90
|
+
assert_have_tag("h1", :content => "know the password?")
|
91
|
+
Project.first(:permalink => "integrity").should be_nil
|
92
|
+
end
|
93
|
+
|
94
|
+
def post(path, data={})
|
95
|
+
webrat.request_page(path, :post, data)
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class DeleteProjectTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an administrator,
|
6
|
+
I want to delete projects I don't care about anymore
|
7
|
+
So that Integrity isn't cluttered with unimportant projects
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "an admin can delete a project from the 'Edit Project' screen" do
|
11
|
+
Project.generate(:integrity, :commits => 4.of { Commit.gen })
|
12
|
+
|
13
|
+
login_as "admin", "test"
|
14
|
+
|
15
|
+
visit "/integrity"
|
16
|
+
click_link "Edit Project"
|
17
|
+
click_button "Yes, I'm sure, nuke it"
|
18
|
+
visit "/"
|
19
|
+
|
20
|
+
assert_have_no_tag("ul#projects", :content => "Integrity")
|
21
|
+
|
22
|
+
visit "/integrity"
|
23
|
+
|
24
|
+
response_code.should == 404
|
25
|
+
end
|
26
|
+
|
27
|
+
scenario "an admin can delete a project with an invalid SCM URI just fine" do
|
28
|
+
Project.generate(:integrity, :uri => "unknown://example.org")
|
29
|
+
|
30
|
+
login_as "admin", "test"
|
31
|
+
visit "/integrity/edit"
|
32
|
+
click_button "Yes, I'm sure, nuke it"
|
33
|
+
visit "/integrity"
|
34
|
+
|
35
|
+
response_code.should == 404
|
36
|
+
end
|
37
|
+
|
38
|
+
scenario "a user can't delete a project by doing a manual DELETE request" do
|
39
|
+
Project.gen(:integrity)
|
40
|
+
|
41
|
+
delete "/integrity"
|
42
|
+
|
43
|
+
response_code.should == 401
|
44
|
+
|
45
|
+
visit "/integrity"
|
46
|
+
|
47
|
+
assert_have_tag("h1", :content => 'Integrity')
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(path, data={})
|
51
|
+
webrat.request_page(path, :delete, data)
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class EditProjectTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an administrator,
|
6
|
+
I want to be able to edit a project
|
7
|
+
So that I can correct mistakes or update the project after a change
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "an admin can edit the project information" do
|
11
|
+
Project.generate(:integrity)
|
12
|
+
|
13
|
+
login_as "admin", "test"
|
14
|
+
|
15
|
+
visit "/integrity"
|
16
|
+
click_link "Edit Project"
|
17
|
+
|
18
|
+
fill_in "Name", :with => "Integrity (test refactoring)"
|
19
|
+
fill_in "Branch to track", :with => "test-refactoring"
|
20
|
+
click_button "Update Project"
|
21
|
+
|
22
|
+
assert_have_tag("h1", :content => "Integrity (test refactoring)")
|
23
|
+
end
|
24
|
+
|
25
|
+
scenario "making a public project private will hide it from the home page for non-admins" do
|
26
|
+
Project.generate(:my_test_project, :public => true)
|
27
|
+
|
28
|
+
visit "/"
|
29
|
+
|
30
|
+
assert_contain("My Test Project")
|
31
|
+
|
32
|
+
login_as "admin", "test"
|
33
|
+
visit "/my-test-project"
|
34
|
+
click_link "Edit Project"
|
35
|
+
uncheck "Public project"
|
36
|
+
click_button "Update Project"
|
37
|
+
log_out
|
38
|
+
visit "/"
|
39
|
+
|
40
|
+
assert_have_no_tag("a", :content => "My Test Project")
|
41
|
+
end
|
42
|
+
|
43
|
+
scenario "making a private project public will show it in the home page for non-admins" do
|
44
|
+
Project.generate(:my_test_project, :public => false)
|
45
|
+
|
46
|
+
visit "/"
|
47
|
+
|
48
|
+
assert_not_contain("My Test Project")
|
49
|
+
|
50
|
+
login_as "admin", "test"
|
51
|
+
|
52
|
+
visit "/my-test-project"
|
53
|
+
click_link "Edit Project"
|
54
|
+
|
55
|
+
check "Public project"
|
56
|
+
click_button "Update Project"
|
57
|
+
|
58
|
+
log_out
|
59
|
+
|
60
|
+
visit "/"
|
61
|
+
|
62
|
+
assert_have_tag("a", :content => "My Test Project")
|
63
|
+
end
|
64
|
+
|
65
|
+
scenario "a user can't edit a project's information" do
|
66
|
+
Project.generate(:integrity)
|
67
|
+
|
68
|
+
visit "/integrity"
|
69
|
+
click_link "Edit Project"
|
70
|
+
|
71
|
+
response_code.should == 401
|
72
|
+
end
|
73
|
+
|
74
|
+
scenario "an admin can see the push URL on the edit page" do
|
75
|
+
disable_auth!
|
76
|
+
Project.generate(:my_test_project)
|
77
|
+
|
78
|
+
visit "/my-test-project"
|
79
|
+
click_link "Edit Project"
|
80
|
+
|
81
|
+
assert_have_tag("#push_url", :content => "http://www.example.com/my-test-project/push")
|
82
|
+
end
|
83
|
+
|
84
|
+
scenario "public projects have a ticked 'public' checkbox on edit form" do
|
85
|
+
Project.generate(:my_test_project, :public => true)
|
86
|
+
disable_auth!
|
87
|
+
visit "/my-test-project/edit"
|
88
|
+
|
89
|
+
assert_have_tag('input[@type="checkbox"][@checked="checked"][@name="project_data[public]"]')
|
90
|
+
end
|
91
|
+
|
92
|
+
scenario "private projects have an unticked 'public' checkbox on edit form" do
|
93
|
+
Project.generate(:my_test_project, :public => false)
|
94
|
+
disable_auth!
|
95
|
+
visit "/my-test-project/edit"
|
96
|
+
|
97
|
+
assert_have_no_tag('input[@type="checkbox"][@checked][@name="project_data[public]"]')
|
98
|
+
end
|
99
|
+
|
100
|
+
scenario "after I uncheck the public checkbox, it should still be uncheck after I save" do
|
101
|
+
Project.generate(:integrity, :public => true)
|
102
|
+
|
103
|
+
login_as "admin", "test"
|
104
|
+
|
105
|
+
visit "/integrity"
|
106
|
+
click_link "Edit Project"
|
107
|
+
|
108
|
+
assert_have_tag('input[@type="checkbox"][@checked="checked"][@name="project_data[public]"]')
|
109
|
+
|
110
|
+
uncheck "project_public"
|
111
|
+
click_button "Update Project"
|
112
|
+
|
113
|
+
click_link "Edit Project"
|
114
|
+
|
115
|
+
assert_have_no_tag('input[@type="checkbox"][@checked="checked"][@name="project_data[public]"]')
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class ErrorPageTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an user,
|
6
|
+
I want to be shown a friendly page when something go terribly wrong
|
7
|
+
So that I can understand what's going on
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "an error happen while I am browsing my Integrity install" do
|
11
|
+
stub(Project).only_public_unless(false) { raise ArgumentError }
|
12
|
+
lambda { visit "/" }.should raise_error(Webrat::PageLoadError)
|
13
|
+
|
14
|
+
response_code.should == 500
|
15
|
+
assert_have_tag("h1", :content => "Whatever you do")
|
16
|
+
assert_have_tag("strong", :content => "ArgumentError")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
require "integrity/installer"
|
3
|
+
|
4
|
+
class InstallerTest < Test::Unit::AcceptanceTestCase
|
5
|
+
include FileUtils
|
6
|
+
|
7
|
+
story <<-EOS
|
8
|
+
As an user,
|
9
|
+
I want to easily install Integrity
|
10
|
+
So that I can spend time actually writing code
|
11
|
+
EOS
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
rm_rf root if File.directory?(root)
|
15
|
+
end
|
16
|
+
|
17
|
+
def root
|
18
|
+
Pathname("/tmp/i-haz-integrity")
|
19
|
+
end
|
20
|
+
|
21
|
+
def install(option="")
|
22
|
+
installer = File.dirname(__FILE__) + "/../../bin/integrity"
|
23
|
+
IO.popen("#{installer} install #{root} #{option}".strip).read
|
24
|
+
end
|
25
|
+
|
26
|
+
scenario "Installing integrity into a given directory" do
|
27
|
+
post_install_message = install
|
28
|
+
|
29
|
+
assert post_install_message.include?("Awesome")
|
30
|
+
assert post_install_message.include?("integrity migrate_db #{root.join("config.yml")}")
|
31
|
+
|
32
|
+
assert root.join("builds").directory?
|
33
|
+
assert root.join("log").directory?
|
34
|
+
assert ! root.join("public").directory?
|
35
|
+
assert ! root.join("tmp").directory?
|
36
|
+
|
37
|
+
assert ! root.join("Rakefile").file?
|
38
|
+
assert ! root.join("integrity.rb").file?
|
39
|
+
assert ! root.join(".gems").file?
|
40
|
+
|
41
|
+
assert ! root.join("thin.yml").file?
|
42
|
+
assert root.join("config.ru").file?
|
43
|
+
|
44
|
+
config = YAML.load_file(root.join("config.yml"))
|
45
|
+
|
46
|
+
config[:export_directory].should == root.join("builds").to_s
|
47
|
+
config[:database_uri].should == "sqlite3://#{root}/integrity.db"
|
48
|
+
config[:log].should == root.join("log/integrity.log").to_s
|
49
|
+
end
|
50
|
+
|
51
|
+
scenario "Installing integrity for Passenger" do
|
52
|
+
install("--passenger")
|
53
|
+
|
54
|
+
assert root.join("public").directory?
|
55
|
+
assert root.join("tmp").directory?
|
56
|
+
end
|
57
|
+
|
58
|
+
scenario "Installing Integrity for Thin" do
|
59
|
+
install("--thin")
|
60
|
+
|
61
|
+
config = YAML.load_file(root.join("thin.yml"))
|
62
|
+
config["chdir"].should == root.to_s
|
63
|
+
config["pid"].should == root.join("thin.pid").to_s
|
64
|
+
config["rackup"].should == root.join("config.ru").to_s
|
65
|
+
config["log"].should == root.join("log/thin.log").to_s
|
66
|
+
end
|
67
|
+
|
68
|
+
scenario "Installing Integrity for Heroku" do
|
69
|
+
message = install("--heroku")
|
70
|
+
|
71
|
+
assert_equal "integrity --version 0.1.9.0", root.join(".gems").read.chomp
|
72
|
+
|
73
|
+
assert root.join("Rakefile").file?
|
74
|
+
assert root.join("integrity-config.rb").file?
|
75
|
+
assert root.join("config.ru").file?
|
76
|
+
|
77
|
+
assert message.include?("ready to be deployed onto Heroku")
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class ManualBuildProjectTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an administrator,
|
6
|
+
I want to manually build my project
|
7
|
+
So that I know if it builds properly
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "clicking on 'Manual Build' triggers a successful build" do
|
11
|
+
git_repo(:my_test_project).add_successful_commit
|
12
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
13
|
+
login_as "admin", "test"
|
14
|
+
|
15
|
+
visit "/my-test-project"
|
16
|
+
click_button "manual build"
|
17
|
+
|
18
|
+
assert_have_tag("h1", :content =>
|
19
|
+
"Built #{git_repo(:my_test_project).short_head} successfully")
|
20
|
+
assert_have_tag("blockquote p", :content => "This commit will work")
|
21
|
+
assert_have_tag("span.who", :content => "by: John Doe")
|
22
|
+
assert_have_tag("span.when", :content => "today")
|
23
|
+
assert_have_tag("pre.output", :content => "Running tests...")
|
24
|
+
end
|
25
|
+
|
26
|
+
scenario "clicking on 'Manual Build' triggers a failed build" do
|
27
|
+
git_repo(:my_test_project).add_failing_commit
|
28
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
29
|
+
login_as "admin", "test"
|
30
|
+
|
31
|
+
visit "/my-test-project"
|
32
|
+
click_button "manual build"
|
33
|
+
|
34
|
+
assert_have_tag("h1",
|
35
|
+
:content => "Built #{git_repo(:my_test_project).short_head} and failed")
|
36
|
+
assert_have_tag("blockquote p", :content => "This commit will fail")
|
37
|
+
end
|
38
|
+
|
39
|
+
scenario "fixing the build command and then rebuilding result in a successful build" do
|
40
|
+
git_repo(:my_test_project).add_successful_commit
|
41
|
+
Project.gen(:my_test_project,
|
42
|
+
:uri => git_repo(:my_test_project).path,
|
43
|
+
:command => "ruby not-found.rb")
|
44
|
+
|
45
|
+
login_as "admin", "test"
|
46
|
+
|
47
|
+
visit "/my-test-project"
|
48
|
+
click_button "manual build"
|
49
|
+
assert_have_tag("h1", :content => "failed")
|
50
|
+
|
51
|
+
visit "/my-test-project/edit"
|
52
|
+
fill_in "Build script", :with => "./test"
|
53
|
+
click_button "Update Project"
|
54
|
+
|
55
|
+
visit "/my-test-project"
|
56
|
+
click_button "Build the last commit"
|
57
|
+
|
58
|
+
assert_have_tag("h1", :content => "success")
|
59
|
+
end
|
60
|
+
|
61
|
+
scenario "Successful builds should not display the 'Rebuild' button" do
|
62
|
+
git_repo(:my_test_project).add_successful_commit
|
63
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
64
|
+
login_as "admin", "test"
|
65
|
+
|
66
|
+
visit "/my-test-project"
|
67
|
+
click_button "manual build"
|
68
|
+
|
69
|
+
assert_have_no_tag("button", :content => "Rebuild")
|
70
|
+
end
|
71
|
+
|
72
|
+
scenario "Failed builds should display the 'Rebuild' button" do
|
73
|
+
git_repo(:my_test_project).add_failing_commit
|
74
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
75
|
+
login_as "admin", "test"
|
76
|
+
|
77
|
+
visit "/my-test-project"
|
78
|
+
click_button "manual build"
|
79
|
+
|
80
|
+
assert_have_tag("button", :content => "Rebuild")
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class NotFoundPageTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an visitor,
|
6
|
+
I want to be shown a friendly four oh four
|
7
|
+
So that I DON'T HAVE TO THINK.
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "chilling on some Integrity instance found via The Holy Hub" do
|
11
|
+
project = Project.gen
|
12
|
+
|
13
|
+
visit "/42"
|
14
|
+
assert_equal 404, response_code
|
15
|
+
|
16
|
+
click_link "list of projects"
|
17
|
+
assert_contain(project.name)
|
18
|
+
|
19
|
+
visit "/42"
|
20
|
+
|
21
|
+
click_link "the projects list"
|
22
|
+
assert_contain(project.name)
|
23
|
+
|
24
|
+
visit "/42"
|
25
|
+
|
26
|
+
click_link "back from whence you came"
|
27
|
+
assert_contain("Add a new project")
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class ProjectSyndicationTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As a user,
|
6
|
+
I want to subscribe to a public project's Atom feed
|
7
|
+
So I can know the status of my favorite projects while having my morning coffee
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "a public project's page includes an autodiscovery link tag for the feed" do
|
11
|
+
Project.gen(:integrity, :public => true)
|
12
|
+
visit "/integrity"
|
13
|
+
|
14
|
+
assert_have_tag("link[@href='/integrity.atom']")
|
15
|
+
end
|
16
|
+
|
17
|
+
scenario "a public project's feed should include the latest builds" do
|
18
|
+
commits = 10.of { Commit.gen(:successful) } + 1.of { Commit.gen(:failed) }
|
19
|
+
Project.gen(:integrity, :public => true, :commits => commits)
|
20
|
+
|
21
|
+
visit "/integrity.atom"
|
22
|
+
|
23
|
+
# TODO: check for content-type
|
24
|
+
|
25
|
+
assert_have_tag("feed title", :content => "Build history for Integrity")
|
26
|
+
assert_have_tag("feed entry", :count => 11)
|
27
|
+
assert_have_tag("feed entry:first title", :content => "success")
|
28
|
+
assert_have_tag("feed entry:last title", :content => "failed")
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class IntegrityStylesheetTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As a user,
|
6
|
+
I want the stylesheet to work (even with Sinatra 0.9.1)
|
7
|
+
So that Integrity isn't a PITA to use
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "browsing on some Integrity install" do
|
11
|
+
visit "/"
|
12
|
+
assert_have_tag("link[@href='/integrity.css']")
|
13
|
+
visit "/integrity.css"
|
14
|
+
|
15
|
+
assert_contain("body {")
|
16
|
+
# TODO: Check that it actually returns a 302
|
17
|
+
assert_equal %Q{"2465c472aacf302259dde5146a841e45"},
|
18
|
+
webrat_session.send(:response).headers["ETag"]
|
19
|
+
|
20
|
+
visit "/reset.css"
|
21
|
+
assert_contain("Yahoo!")
|
22
|
+
|
23
|
+
visit "/buttons.css"
|
24
|
+
assert_contain("button {")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
+
|
3
|
+
class UnauthorizedPageTest < Test::Unit::AcceptanceTestCase
|
4
|
+
story <<-EOS
|
5
|
+
As an administrator,
|
6
|
+
I want to be shown a friendly login error page
|
7
|
+
So that I don't feel guilty of loosing my password
|
8
|
+
EOS
|
9
|
+
|
10
|
+
scenario "an administrator (who's amnesiac) tries to login" do
|
11
|
+
project = Project.gen(:public => false)
|
12
|
+
|
13
|
+
visit "/#{project.name}/edit"
|
14
|
+
assert_equal 401, response_code
|
15
|
+
|
16
|
+
# TODO click_link "try again"
|
17
|
+
assert_have_tag("a[@href='/login']", :content => "try again")
|
18
|
+
assert_have_tag("a[@href='/']", :content => "go back")
|
19
|
+
end
|
20
|
+
end
|