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.
Files changed (96) hide show
  1. data/.gitignore +12 -0
  2. data/CHANGES +36 -0
  3. data/README.markdown +79 -0
  4. data/Rakefile +79 -0
  5. data/bin/integrity +4 -0
  6. data/config/config.sample.ru +21 -0
  7. data/config/config.sample.yml +41 -0
  8. data/config/heroku/.gems +1 -0
  9. data/config/heroku/Rakefile +6 -0
  10. data/config/heroku/config.ru +7 -0
  11. data/config/heroku/integrity-config.rb +14 -0
  12. data/config/thin.sample.yml +13 -0
  13. data/integrity.gemspec +140 -0
  14. data/lib/integrity/app.rb +138 -0
  15. data/lib/integrity/author.rb +39 -0
  16. data/lib/integrity/build.rb +91 -0
  17. data/lib/integrity/commit.rb +63 -0
  18. data/lib/integrity/core_ext/object.rb +6 -0
  19. data/lib/integrity/helpers/authorization.rb +33 -0
  20. data/lib/integrity/helpers/breadcrumbs.rb +20 -0
  21. data/lib/integrity/helpers/forms.rb +29 -0
  22. data/lib/integrity/helpers/pretty_output.rb +45 -0
  23. data/lib/integrity/helpers/rendering.rb +25 -0
  24. data/lib/integrity/helpers/resources.rb +19 -0
  25. data/lib/integrity/helpers/urls.rb +59 -0
  26. data/lib/integrity/helpers.rb +16 -0
  27. data/lib/integrity/installer.rb +136 -0
  28. data/lib/integrity/migrations.rb +151 -0
  29. data/lib/integrity/notifier/base.rb +74 -0
  30. data/lib/integrity/notifier/test/fixtures.rb +108 -0
  31. data/lib/integrity/notifier/test/hpricot_matcher.rb +38 -0
  32. data/lib/integrity/notifier/test.rb +59 -0
  33. data/lib/integrity/notifier.rb +34 -0
  34. data/lib/integrity/project/deprecated.rb +17 -0
  35. data/lib/integrity/project/notifiers.rb +33 -0
  36. data/lib/integrity/project/push.rb +44 -0
  37. data/lib/integrity/project.rb +102 -0
  38. data/lib/integrity/project_builder.rb +56 -0
  39. data/lib/integrity/scm/git/uri.rb +57 -0
  40. data/lib/integrity/scm/git.rb +84 -0
  41. data/lib/integrity/scm.rb +19 -0
  42. data/lib/integrity.rb +101 -0
  43. data/public/buttons.css +82 -0
  44. data/public/reset.css +7 -0
  45. data/public/spinner.gif +0 -0
  46. data/test/acceptance/api_test.rb +97 -0
  47. data/test/acceptance/browse_project_builds_test.rb +65 -0
  48. data/test/acceptance/browse_project_test.rb +99 -0
  49. data/test/acceptance/build_notifications_test.rb +95 -0
  50. data/test/acceptance/create_project_test.rb +97 -0
  51. data/test/acceptance/delete_project_test.rb +53 -0
  52. data/test/acceptance/edit_project_test.rb +117 -0
  53. data/test/acceptance/error_page_test.rb +18 -0
  54. data/test/acceptance/installer_test.rb +79 -0
  55. data/test/acceptance/manual_build_project_test.rb +82 -0
  56. data/test/acceptance/not_found_page_test.rb +29 -0
  57. data/test/acceptance/project_syndication_test.rb +30 -0
  58. data/test/acceptance/stylesheet_test.rb +26 -0
  59. data/test/acceptance/unauthorized_page_test.rb +20 -0
  60. data/test/helpers/acceptance/email_notifier.rb +55 -0
  61. data/test/helpers/acceptance/git_helper.rb +99 -0
  62. data/test/helpers/acceptance/notifier_helper.rb +47 -0
  63. data/test/helpers/acceptance/textfile_notifier.rb +26 -0
  64. data/test/helpers/acceptance.rb +79 -0
  65. data/test/helpers/expectations/be_a.rb +23 -0
  66. data/test/helpers/expectations/change.rb +90 -0
  67. data/test/helpers/expectations/have.rb +105 -0
  68. data/test/helpers/expectations/predicates.rb +37 -0
  69. data/test/helpers/expectations.rb +4 -0
  70. data/test/helpers/fixtures.rb +87 -0
  71. data/test/helpers/initial_migration_fixture.sql +44 -0
  72. data/test/helpers.rb +87 -0
  73. data/test/unit/build_test.rb +86 -0
  74. data/test/unit/commit_test.rb +62 -0
  75. data/test/unit/helpers_test.rb +103 -0
  76. data/test/unit/integrity_test.rb +52 -0
  77. data/test/unit/migrations_test.rb +57 -0
  78. data/test/unit/notifier/base_test.rb +43 -0
  79. data/test/unit/notifier/test_test.rb +29 -0
  80. data/test/unit/notifier_test.rb +85 -0
  81. data/test/unit/project_builder_test.rb +118 -0
  82. data/test/unit/project_test.rb +371 -0
  83. data/test/unit/scm_test.rb +54 -0
  84. data/views/_commit_info.haml +24 -0
  85. data/views/build.haml +2 -0
  86. data/views/error.haml +37 -0
  87. data/views/home.haml +21 -0
  88. data/views/integrity.sass +400 -0
  89. data/views/layout.haml +29 -0
  90. data/views/new.haml +50 -0
  91. data/views/not_found.haml +31 -0
  92. data/views/notifier.haml +7 -0
  93. data/views/project.builder +21 -0
  94. data/views/project.haml +30 -0
  95. data/views/unauthorized.haml +38 -0
  96. 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