alphasights-integrity 0.1.9.3

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 (93) hide show
  1. data/.gitignore +13 -0
  2. data/CHANGES +48 -0
  3. data/README.md +82 -0
  4. data/Rakefile +58 -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 +137 -0
  14. data/lib/integrity.rb +77 -0
  15. data/lib/integrity/app.rb +138 -0
  16. data/lib/integrity/author.rb +39 -0
  17. data/lib/integrity/build.rb +52 -0
  18. data/lib/integrity/commit.rb +61 -0
  19. data/lib/integrity/core_ext/object.rb +6 -0
  20. data/lib/integrity/helpers.rb +16 -0
  21. data/lib/integrity/helpers/authorization.rb +33 -0
  22. data/lib/integrity/helpers/breadcrumbs.rb +20 -0
  23. data/lib/integrity/helpers/gravatar.rb +16 -0
  24. data/lib/integrity/helpers/pretty_output.rb +45 -0
  25. data/lib/integrity/helpers/rendering.rb +49 -0
  26. data/lib/integrity/helpers/resources.rb +19 -0
  27. data/lib/integrity/helpers/urls.rb +59 -0
  28. data/lib/integrity/installer.rb +138 -0
  29. data/lib/integrity/migrations.rb +153 -0
  30. data/lib/integrity/notifier.rb +44 -0
  31. data/lib/integrity/notifier/base.rb +74 -0
  32. data/lib/integrity/notifier/test.rb +52 -0
  33. data/lib/integrity/notifier/test/fixtures.rb +108 -0
  34. data/lib/integrity/notifier/test/hpricot_matcher.rb +38 -0
  35. data/lib/integrity/project.rb +94 -0
  36. data/lib/integrity/project/notifiers.rb +31 -0
  37. data/lib/integrity/project/push.rb +43 -0
  38. data/lib/integrity/project_builder.rb +56 -0
  39. data/lib/integrity/scm.rb +19 -0
  40. data/lib/integrity/scm/git.rb +84 -0
  41. data/lib/integrity/scm/git/uri.rb +57 -0
  42. data/public/buttons.css +82 -0
  43. data/public/reset.css +7 -0
  44. data/public/spinner.gif +0 -0
  45. data/test/acceptance/api_test.rb +97 -0
  46. data/test/acceptance/browse_project_builds_test.rb +65 -0
  47. data/test/acceptance/browse_project_test.rb +99 -0
  48. data/test/acceptance/build_notifications_test.rb +114 -0
  49. data/test/acceptance/create_project_test.rb +97 -0
  50. data/test/acceptance/delete_project_test.rb +53 -0
  51. data/test/acceptance/edit_project_test.rb +117 -0
  52. data/test/acceptance/error_page_test.rb +21 -0
  53. data/test/acceptance/installer_test.rb +81 -0
  54. data/test/acceptance/manual_build_project_test.rb +82 -0
  55. data/test/acceptance/not_found_page_test.rb +29 -0
  56. data/test/acceptance/project_syndication_test.rb +30 -0
  57. data/test/acceptance/stylesheet_test.rb +26 -0
  58. data/test/acceptance/unauthorized_page_test.rb +20 -0
  59. data/test/helpers.rb +75 -0
  60. data/test/helpers/acceptance.rb +82 -0
  61. data/test/helpers/acceptance/email_notifier.rb +52 -0
  62. data/test/helpers/acceptance/git_helper.rb +99 -0
  63. data/test/helpers/acceptance/notifier_helper.rb +47 -0
  64. data/test/helpers/acceptance/textfile_notifier.rb +26 -0
  65. data/test/helpers/expectations.rb +4 -0
  66. data/test/helpers/expectations/be_a.rb +23 -0
  67. data/test/helpers/expectations/change.rb +90 -0
  68. data/test/helpers/expectations/have.rb +105 -0
  69. data/test/helpers/expectations/predicates.rb +37 -0
  70. data/test/helpers/initial_migration_fixture.sql +44 -0
  71. data/test/unit/build_test.rb +72 -0
  72. data/test/unit/commit_test.rb +66 -0
  73. data/test/unit/helpers_test.rb +103 -0
  74. data/test/unit/integrity_test.rb +35 -0
  75. data/test/unit/migrations_test.rb +57 -0
  76. data/test/unit/notifier/base_test.rb +43 -0
  77. data/test/unit/notifier_test.rb +96 -0
  78. data/test/unit/project_builder_test.rb +118 -0
  79. data/test/unit/project_test.rb +344 -0
  80. data/test/unit/scm_test.rb +54 -0
  81. data/views/_commit_info.haml +30 -0
  82. data/views/build.haml +2 -0
  83. data/views/error.haml +37 -0
  84. data/views/home.haml +22 -0
  85. data/views/integrity.sass +424 -0
  86. data/views/layout.haml +29 -0
  87. data/views/new.haml +50 -0
  88. data/views/not_found.haml +31 -0
  89. data/views/notifier.haml +7 -0
  90. data/views/project.builder +21 -0
  91. data/views/project.haml +31 -0
  92. data/views/unauthorized.haml +38 -0
  93. metadata +324 -0
@@ -0,0 +1,65 @@
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
+
3
+ class BrowseProjectBuildsTest < Test::Unit::AcceptanceTestCase
4
+ story <<-EOS
5
+ As a user,
6
+ I want to browse the builds of a project in Integrity
7
+ So I can see the history of a project
8
+ EOS
9
+
10
+ scenario "a project with no builds should say so in a friendly manner" do
11
+ Project.gen(:integrity, :public => true, :commits => [])
12
+
13
+ visit "/integrity"
14
+
15
+ assert_have_no_tag("#last_build")
16
+ assert_have_no_tag("#previous_builds")
17
+ assert_contain("No builds for this project, buddy")
18
+ end
19
+
20
+ scenario "a user can see the last build and the list of previous builds on a project page" do
21
+ Project.gen(:integrity, :public => true, :commits => \
22
+ 3.of { Commit.gen(:successful) } +
23
+ 2.of { Commit.gen(:failed) } +
24
+ 2.of { Commit.gen(:pending) })
25
+
26
+ visit "/integrity"
27
+
28
+ assert_have_tag("#last_build")
29
+
30
+ within("ul#previous_builds") do
31
+ assert_have_tag("li.pending", :count => 2)
32
+ assert_have_tag("li.failed", :count => 2)
33
+ assert_have_tag("li.success", :count => 2)
34
+ end
35
+ end
36
+
37
+ scenario "a user can see details about the last build on the project page" do
38
+ commit = Commit.gen(:successful, :identifier => "7fee3f0014b529e2b76d591a8085d76eab0ff923",
39
+ :author => "Nicolas Sanguinetti <contacto@nicolassanguinetti.info>",
40
+ :message => "No more pending tests :)",
41
+ :committed_at => Time.mktime(2008, 12, 15, 18))
42
+ commit.build.update_attributes(:output => "This is the build output")
43
+ Project.gen(:integrity, :public => true, :commits => [commit])
44
+
45
+ visit "/integrity"
46
+
47
+ assert_have_tag("h1", :content => "Built 7fee3f0 successfully")
48
+ assert_have_tag("blockquote p", :content => "No more pending tests")
49
+ assert_have_tag("span.who", :content => "by: Nicolas Sanguinetti")
50
+ assert_have_tag("span.when", :content => "Dec 15th")
51
+ assert_have_tag("pre.output", :content => "This is the build output")
52
+ end
53
+
54
+ scenario "a user can browse to individual build pages" do
55
+ Project.gen(:integrity, :public => true, :commits => [
56
+ Commit.gen(:successful, :identifier => "7fee3f0014b529e2b76d591a8085d76eab0ff923"),
57
+ Commit.gen(:successful, :identifier => "87e673a83d273ecde121624a3fcfae57a04f2b76")
58
+ ])
59
+
60
+ visit "/integrity"
61
+ click_link(/Build 87e673a/)
62
+
63
+ assert_have_tag("h1", :content => "Built 87e673a successfully")
64
+ end
65
+ end
@@ -0,0 +1,99 @@
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
+
3
+ class BrowsePublicProjectsTest < Test::Unit::AcceptanceTestCase
4
+ story <<-EOS
5
+ As a user,
6
+ I want to browse public projects on Integrity,
7
+ So I can follow the status of my favorite OSS projects
8
+ EOS
9
+
10
+ scenario "a user can see a public project listed on the home page" do
11
+ Project.gen(:integrity, :public => true)
12
+ Project.gen(:my_test_project, :public => true)
13
+
14
+ visit "/"
15
+
16
+ assert_have_tag("a", :content => "Integrity")
17
+ assert_have_tag("a", :content => "My Test Project")
18
+ end
19
+
20
+ scenario "a user can't see a private project listed on the home page" do
21
+ Project.gen(:my_test_project, :public => false)
22
+ Project.gen(:integrity, :public => true)
23
+
24
+ visit "/"
25
+
26
+ assert_have_no_tag("a", :content => "My Test Project")
27
+ assert_have_tag("a", :content => "Integrity")
28
+ end
29
+
30
+ scenario "a user can see the projects status on the home page" do
31
+ integrity = Project.gen(:integrity, :commits => 3.of { Commit.gen(:successful) })
32
+ test = Project.gen(:my_test_project, :commits => 2.of { Commit.gen(:failed) })
33
+ no_build = Project.gen(:public => true, :building => false)
34
+ building = Project.gen(:public => true, :building => true)
35
+
36
+ visit "/"
37
+
38
+ assert_contain("Built #{integrity.last_commit.short_identifier} successfully")
39
+ assert_contain("Built #{test.last_commit.short_identifier} and failed")
40
+ assert_contain("Never built yet")
41
+ assert_contain("Building!")
42
+ end
43
+
44
+ scenario "a user clicking through a link on the home page for a public project arrives at the project page" do
45
+ Project.gen(:my_test_project, :public => true)
46
+
47
+ visit "/"
48
+ click_link "My Test Project"
49
+
50
+ assert_have_tag("h1", :content => "My Test Project")
51
+
52
+ # He can then go back to the project listing
53
+ click_link "projects"
54
+ assert_have_tag("a", :content => "My Test Project")
55
+ end
56
+
57
+ scenario "a user gets a 404 when browsing to an unexisting project" do
58
+ visit "/who-are-you"
59
+
60
+ response_code.should == 404
61
+ assert_have_tag("h1", :content => "you seem a bit lost, sir")
62
+ end
63
+
64
+ scenario "a user browsing to the url of a private project gets a 401" do
65
+ Project.gen(:my_test_project, :public => false)
66
+
67
+ visit "/my-test-project"
68
+
69
+ response_code.should == 401
70
+ assert_have_tag("h1", :content => "know the password?")
71
+ end
72
+
73
+ scenario "an admin can browse to a private project just fine" do
74
+ Project.gen(:my_test_project, :public => false)
75
+
76
+ login_as "admin", "test"
77
+
78
+ visit "/"
79
+ click_link "My Test Project"
80
+
81
+ assert_have_tag("h1", :content => "My Test Project")
82
+ end
83
+
84
+ scenario "a user browsing to a public project with no build see a friendly message" do
85
+ project = Project.gen(:my_test_project, :public => true)
86
+
87
+ visit "/my-test-project"
88
+ assert_contain("No builds for this project, buddy")
89
+ end
90
+
91
+ scenario "an admin browsing to a private project with no build see a friendly message" do
92
+ Project.gen(:my_test_project, :public => false)
93
+
94
+ login_as "admin", "test"
95
+ visit "/my-test-project"
96
+
97
+ assert_contain("No builds for this project, buddy")
98
+ end
99
+ end
@@ -0,0 +1,114 @@
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
+ require "helpers/acceptance/notifier_helper"
3
+ require "helpers/acceptance/textfile_notifier"
4
+ require "helpers/acceptance/email_notifier"
5
+
6
+ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
7
+ include NotifierHelper
8
+
9
+ story <<-EOS
10
+ As an administrator,
11
+ I want to setup notifiers on my projects
12
+ So that I get alerts with every build
13
+ EOS
14
+
15
+ before(:each) do
16
+ # This is needed before any available notifier is unset
17
+ # in the global #before
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 sets up the Textfile notifier but do not enable it" do
50
+ git_repo(:my_test_project).add_successful_commit
51
+ Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
52
+ rm_f "/tmp/textfile_notifications.txt"
53
+
54
+ login_as "admin", "test"
55
+
56
+ visit "/my-test-project"
57
+
58
+ click_link "Edit Project"
59
+ uncheck "enabled_notifiers_textfile"
60
+ fill_in "File", :with => "/tmp/textfile_notifications.txt"
61
+ click_button "Update Project"
62
+
63
+ click_button "manual build"
64
+
65
+ assert ! File.file?("/tmp/textfile_notifications.txt")
66
+ end
67
+
68
+ scenario "an admin can setup a notifier without enabling it" do
69
+ Project.gen(:integrity)
70
+
71
+ login_as "admin", "test"
72
+
73
+ visit "/integrity"
74
+ click_link "Edit Project"
75
+ fill_in_email_notifier
76
+ click_button "Update Project"
77
+
78
+ visit "/integrity/edit"
79
+ assert_have_email_notifier
80
+ end
81
+
82
+ scenario "an admin configures various notifiers accros multiple projects" do
83
+ Project.first(:permalink => "integrity").should be_nil
84
+
85
+ login_as "admin", "test"
86
+
87
+ visit "/"
88
+
89
+ add_project "Integrity", "git://github.com/foca/integrity.git"
90
+ click_link "projects"
91
+
92
+ add_project "Webrat", "git://github.com/brynary/webrat.git"
93
+ click_link "projects"
94
+
95
+ add_project "Rails", "git://github.com/rails/rails.git"
96
+ click_link "projects"
97
+
98
+ edit_project "integrity"
99
+ edit_project "webrat"
100
+ edit_project "rails"
101
+
102
+ visit "/integrity"
103
+ click_link "Edit Project"
104
+ assert_have_email_notifier
105
+
106
+ visit "/webrat"
107
+ click_link "Edit Project"
108
+ assert_have_email_notifier
109
+
110
+ visit "/rails"
111
+ click_link "Edit Project"
112
+ assert_have_email_notifier
113
+ end
114
+ 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