integrity 0.1.9.1 → 0.1.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.gitignore +12 -0
  2. data/CHANGES +28 -0
  3. data/README.markdown +6 -0
  4. data/Rakefile +44 -83
  5. data/config/heroku/.gems +0 -3
  6. data/config/heroku/integrity-config.rb +4 -1
  7. data/integrity.gemspec +18 -6
  8. data/lib/integrity.rb +9 -5
  9. data/lib/integrity/app.rb +8 -8
  10. data/lib/integrity/build.rb +7 -7
  11. data/lib/integrity/helpers/authorization.rb +1 -1
  12. data/lib/integrity/helpers/breadcrumbs.rb +1 -1
  13. data/lib/integrity/helpers/rendering.rb +8 -2
  14. data/lib/integrity/helpers/urls.rb +33 -23
  15. data/lib/integrity/installer.rb +18 -17
  16. data/lib/integrity/notifier/base.rb +7 -2
  17. data/lib/integrity/project.rb +2 -2
  18. data/test/acceptance/api_test.rb +1 -1
  19. data/test/acceptance/browse_project_builds_test.rb +1 -1
  20. data/test/acceptance/browse_project_test.rb +1 -1
  21. data/test/acceptance/build_notifications_test.rb +1 -1
  22. data/test/acceptance/create_project_test.rb +1 -1
  23. data/test/acceptance/delete_project_test.rb +1 -1
  24. data/test/acceptance/edit_project_test.rb +1 -1
  25. data/test/acceptance/error_page_test.rb +1 -1
  26. data/test/acceptance/installer_test.rb +2 -6
  27. data/test/acceptance/manual_build_project_test.rb +1 -1
  28. data/test/acceptance/not_found_page_test.rb +29 -0
  29. data/test/acceptance/notifier_test.rb +1 -1
  30. data/test/acceptance/project_syndication_test.rb +1 -1
  31. data/test/acceptance/stylesheet_test.rb +10 -2
  32. data/test/acceptance/unauthorized_page_test.rb +20 -0
  33. data/test/helpers.rb +13 -7
  34. data/test/helpers/acceptance.rb +1 -0
  35. data/test/unit/build_test.rb +10 -0
  36. data/test/unit/helpers_test.rb +63 -20
  37. data/test/unit/integrity_test.rb +23 -6
  38. data/test/unit/notifier_test.rb +5 -0
  39. data/test/unit/project_test.rb +5 -0
  40. data/views/home.haml +2 -2
  41. data/views/layout.haml +6 -5
  42. data/views/new.haml +1 -1
  43. data/views/not_found.haml +2 -2
  44. data/views/unauthorized.haml +4 -4
  45. metadata +105 -6
  46. data/test/acceptance/helpers.rb +0 -2
  47. data/vendor/sinatra-ditties/README.rdoc +0 -3
  48. data/vendor/sinatra-ditties/lib/sinatra/ditties.rb +0 -12
  49. data/vendor/sinatra-ditties/lib/sinatra/ditties/authorization.rb +0 -61
  50. data/vendor/sinatra-ditties/lib/sinatra/ditties/mailer.rb +0 -146
@@ -1,9 +1,15 @@
1
1
  module Integrity
2
2
  module Helpers
3
3
  module Rendering
4
+ def stylesheets(*sheets)
5
+ sheets.each { |sheet|
6
+ haml_tag(:link, :href => root_path("/#{sheet}.css"),
7
+ :type => "text/css", :rel => "stylesheet")
8
+ }
9
+ end
10
+
4
11
  def stylesheet_hash
5
- @_hash ||= Digest::MD5.file(
6
- options.views + "/integrity.sass").tap { |file| file.hexdigest }
12
+ @_hash ||= Digest::MD5.file(options.views + "/integrity.sass").hexdigest
7
13
  end
8
14
 
9
15
  def show(view, options={})
@@ -1,49 +1,59 @@
1
1
  module Integrity
2
2
  module Helpers
3
3
  module Urls
4
- def url(path)
5
- Addressable::URI.parse(request.url).join(path).to_s
6
- end
7
-
8
4
  def root_url
9
- url("/")
5
+ @url ||= Addressable::URI.parse(base_url)
10
6
  end
11
7
 
12
- def project_path(project, *path)
13
- "/" << [project.permalink, *path].join("/")
8
+ def root_path(path="")
9
+ url(path).path
14
10
  end
15
11
 
16
12
  def project_url(project, *path)
17
- url project_path(project, *path)
13
+ url("/" << [project.permalink, *path].flatten.join("/"))
18
14
  end
19
15
 
20
- def push_url_for(project)
21
- Addressable::URI.parse(project_url(project, "push")).tap do |url|
22
- if Integrity.config[:use_basic_auth]
23
- url.user = Integrity.config[:admin_username]
24
- url.password = Integrity.config[:hash_admin_password] ?
25
- "<password>" : Integrity.config[:admin_password]
26
- end
27
- end.to_s
16
+ def project_path(project, *path)
17
+ project_url(project, path).path
18
+ end
19
+
20
+ def commit_url(commit)
21
+ project_url(commit.project, "commits", commit.identifier)
28
22
  end
29
23
 
30
24
  def commit_path(commit, *path)
31
- project_path(commit.project, "commits", commit.identifier, *path)
25
+ commit_url(commit).path
32
26
  end
33
27
 
34
28
  def build_path(build, *path)
35
- warn "#build_path is deprecated, use #commit_path instead"
29
+ warn "#build_path is deprecated, use #commit_path instead (#{caller[0]})"
36
30
  commit_path build.commit, *path
37
31
  end
38
32
 
39
- def commit_url(commit)
40
- url commit_path(commit)
41
- end
42
-
43
33
  def build_url(build)
44
- warn "#build_url is deprecated, use #commit_url instead"
34
+ warn "#build_url is deprecated, use #commit_url instead (#{caller[0]})"
45
35
  commit_url build.commit
46
36
  end
37
+
38
+ def push_url_for(project)
39
+ Addressable::URI.parse(project_url(project, "push")).tap do |url|
40
+ if Integrity.config[:use_basic_auth]
41
+ url.user = Integrity.config[:admin_username]
42
+ url.password = Integrity.config[:hash_admin_password] ?
43
+ "<password>" : Integrity.config[:admin_password]
44
+ end
45
+ end.to_s
46
+ end
47
+
48
+ private
49
+ def url(path="")
50
+ root_url.dup.tap { |url| url.path = root_url.path + path }
51
+ end
52
+
53
+ def base_url
54
+ Integrity.config[:base_uri] || ((respond_to?(:request) &&
55
+ request.respond_to?(:url)) ? request.url : fail("set base_uri"))
56
+ end
47
57
  end
48
58
  end
49
59
  end
@@ -16,20 +16,13 @@ module Integrity
16
16
 
17
17
  if options[:heroku]
18
18
  cp_r Pathname(__FILE__).join("../../../config/heroku"), root
19
- puts <<EOF
20
- Your Integrity install is ready to be deployed onto Heroku. Next steps:
21
-
22
- 1. git init && git add . && git commit -am "Initial import"
23
- 2. heroku create
24
- 3. git push heroku master
25
- 4. heroku rake db:migrate
26
- EOF
19
+ puts post_heroku_install_message
27
20
  else
28
21
  create_dir_structure
29
22
  copy_template_files
30
23
  edit_template_files
31
24
  migrate_db(root.join("config.yml"))
32
- after_setup_message
25
+ puts post_install_message
33
26
  end
34
27
  end
35
28
 
@@ -50,11 +43,8 @@ EOF
50
43
  require "thin"
51
44
  require "do_sqlite3"
52
45
 
53
- if File.file?(options[:config].to_s)
54
- Integrity.new(options[:config])
55
- else
56
- DataMapper.setup(:default, "sqlite3::memory:")
57
- end
46
+ File.file?(options[:config].to_s) ?
47
+ Integrity.new(options[:config]) : Integrity.new
58
48
 
59
49
  DataMapper.auto_migrate!
60
50
 
@@ -104,8 +94,19 @@ EOF
104
94
  File.open(root / "thin.yml", 'w') { |f| f.puts config }
105
95
  end
106
96
 
107
- def after_setup_message
108
- puts <<EOF
97
+ def post_heroku_install_message
98
+ <<EOF
99
+ Your Integrity install is ready to be deployed onto Heroku. Next steps:
100
+
101
+ 1. git init && git add . && git commit -am "Initial import"
102
+ 2. heroku create
103
+ 3. git push heroku master
104
+ 4. heroku rake db:migrate
105
+ EOF
106
+ end
107
+
108
+ def post_install_message
109
+ <<EOF
109
110
  Awesome! Integrity was installed successfully!
110
111
 
111
112
  If you want to enable notifiers, install the gems and then require them
@@ -113,7 +114,7 @@ in #{root}/config.ru
113
114
 
114
115
  For example:
115
116
 
116
- sudo gem install -s http://gems.github.com foca-integrity-email)
117
+ sudo gem install -s http://gems.github.com foca-integrity-email
117
118
 
118
119
  And then in #{root}/config.ru add:
119
120
 
@@ -17,7 +17,7 @@ module Integrity
17
17
  end
18
18
 
19
19
  def build
20
- warn "Notifier::Base#build is deprecated, use Notifier::Base#commit instead"
20
+ warn "Notifier::Base#build is deprecated, use Notifier::Base#commit instead (#{caller[0]})"
21
21
  commit
22
22
  end
23
23
 
@@ -50,6 +50,11 @@ EOM
50
50
  Integrity.config[:base_uri] / commit.project.permalink / "commits" / commit.identifier
51
51
  end
52
52
 
53
+ def build_url
54
+ warn "Notifier::Base#build_url is deprecated, use Notifier::Base#commit_url instead (#{caller[0]})"
55
+ commit_url
56
+ end
57
+
53
58
  private
54
59
 
55
60
  def stripped_commit_output
@@ -57,7 +62,7 @@ EOM
57
62
  end
58
63
 
59
64
  def stripped_build_output
60
- warn "Notifier::Base#stripped_build_output is deprecated, use Notifier::base#stripped_commit_output instead"
65
+ warn "Notifier::Base#stripped_build_output is deprecated, use Notifier::base#stripped_commit_output instead (#{caller[0]})"
61
66
  stripped_commit_output
62
67
  end
63
68
  end
@@ -57,7 +57,7 @@ module Integrity
57
57
  end
58
58
 
59
59
  def last_build
60
- warn "Project#last_build is deprecated, use Project#last_commit"
60
+ warn "Project#last_build is deprecated, use Project#last_commit (#{caller[0]})"
61
61
  last_commit
62
62
  end
63
63
 
@@ -66,7 +66,7 @@ module Integrity
66
66
  end
67
67
 
68
68
  def previous_builds
69
- warn "Project#previous_builds is deprecated, use Project#previous_commits"
69
+ warn "Project#previous_builds is deprecated, use Project#previous_commits (#{caller[0]})"
70
70
  previous_commits
71
71
  end
72
72
 
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class ApiTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOF
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class BrowseProjectBuildsTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class BrowsePublicProjectsTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
  require "helpers/acceptance/textfile_notifier"
3
3
 
4
4
  class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class CreateProjectTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class DeleteProjectTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class EditProjectTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class ErrorPageTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
  require "integrity/installer"
3
3
 
4
4
  class InstallerTest < Test::Unit::AcceptanceTestCase
@@ -65,11 +65,7 @@ class InstallerTest < Test::Unit::AcceptanceTestCase
65
65
  scenario "Installing Integrity for Heroku" do
66
66
  message = install("--heroku")
67
67
 
68
- gemifest = root.join(".gems").read
69
- assert gemifest.include?("mailfactory")
70
- assert gemifest.include?("tlsmail")
71
- assert gemifest.include?("foca-sinatra-ditties")
72
- assert gemifest.include?("integrity")
68
+ assert_equal "integrity --version 0.1.9.0", root.join(".gems").read.chomp
73
69
 
74
70
  assert root.join("Rakefile").file?
75
71
  assert root.join("integrity-config.rb").file?
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class ManualBuildProjectTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -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
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class NotifierConfigIssues < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class ProjectSyndicationTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + "/helpers"
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
 
3
3
  class IntegrityStylesheetTest < Test::Unit::AcceptanceTestCase
4
4
  story <<-EOS
@@ -8,11 +8,19 @@ class IntegrityStylesheetTest < Test::Unit::AcceptanceTestCase
8
8
  EOS
9
9
 
10
10
  scenario "browsing on some Integrity install" do
11
+ visit "/"
12
+ assert_have_tag("link[@href='/integrity.css']")
11
13
  visit "/integrity.css"
12
14
 
13
15
  assert_contain("body {")
14
- # TODO: better test
16
+ # TODO: Check that it actually returns a 302
15
17
  assert_equal %Q{"2465c472aacf302259dde5146a841e45"},
16
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 {")
17
25
  end
18
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
@@ -1,5 +1,4 @@
1
- $:.unshift File.dirname(__FILE__) + "/../lib", File.dirname(__FILE__),
2
- File.dirname(__FILE__) + "/../vendor/webrat/lib"
1
+ $:.unshift File.dirname(__FILE__) + "/../lib", File.dirname(__FILE__)
3
2
 
4
3
  %w(test/unit
5
4
  context
@@ -9,19 +8,18 @@ storyteller
9
8
  webrat/sinatra
10
9
  rr
11
10
  mocha
12
- test/zentest_assertions
13
11
  dm-sweatshop).each { |dependency|
14
12
  begin
15
13
  require dependency
16
- rescue LoadError
14
+ rescue LoadError => e
17
15
  puts "You're missing some gems required to run the tests."
18
- puts "Please run `rake test:install_dependencies`"
19
- puts "You'll probably need to run that command as root or with sudo."
16
+ puts "Please run `rake test:setup`"
17
+ puts "NOTE: You'll probably need to run that command as root or with sudo."
20
18
 
21
19
  puts "Thanks :)"
22
20
  puts
23
21
 
24
- exit 1
22
+ raise
25
23
  end
26
24
  }
27
25
 
@@ -39,6 +37,14 @@ module TestHelper
39
37
  def ignore_logs!
40
38
  Integrity.config[:log] = "/tmp/integrity.test.log"
41
39
  end
40
+
41
+ def util_capture
42
+ output = StringIO.new
43
+ $stdout = output
44
+ yield
45
+ $stdout = STDOUT
46
+ output
47
+ end
42
48
  end
43
49
 
44
50
  class Test::Unit::TestCase
@@ -1,3 +1,4 @@
1
+ require File.dirname(__FILE__) + "/../helpers"
1
2
  require "helpers/acceptance/git_helper"
2
3
 
3
4
  module AcceptanceHelper
@@ -36,6 +36,16 @@ class BuildTest < Test::Unit::TestCase
36
36
  @build.successful = false
37
37
  @build.status.should be(:failed)
38
38
  end
39
+
40
+ test "deprecated properties" do
41
+ @build.short_commit_identifier.should == @build.commit.short_identifier
42
+ @build.commit_identifier.should == @build.commit.identifier
43
+ @build.commit_author.should == @build.commit.author
44
+ @build.commit_message.should == @build.commit.message
45
+ @build.commited_at.should == @build.commit.committed_at
46
+ @build.project_id.should == @build.commit.project_id
47
+ @build.should respond_to(:commit_metadata)
48
+ end
39
49
  end
40
50
 
41
51
  describe "Pending builds" do