deep_thought 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +184 -0
- data/Rakefile +50 -0
- data/config.ru +5 -0
- data/db/migrate/20130414012805_create_projects.rb +15 -0
- data/db/migrate/20130426165010_create_states.rb +14 -0
- data/db/migrate/20130501003758_create_users.rb +14 -0
- data/db/migrate/20130508001711_add_api_key_to_users.rb +9 -0
- data/db/migrate/20130509014935_create_deploys.rb +27 -0
- data/db/migrate/20130514062148_create_delayed_jobs.rb +21 -0
- data/db/migrate/20130516042149_change_delayed_job_last_error_to_text.rb +9 -0
- data/db/migrate/20130517010210_add_ci_to_projects.rb +9 -0
- data/db/migrate/20130525001332_add_notification_url_to_users.rb +9 -0
- data/db/migrate/20131127022704_remove_deploy_type_and_ci_from_projects.rb +11 -0
- data/db/schema.rb +72 -0
- data/deep_thought.gemspec +45 -0
- data/lib/deep_thought.rb +62 -0
- data/lib/deep_thought/api.rb +156 -0
- data/lib/deep_thought/app.rb +342 -0
- data/lib/deep_thought/ci_service.rb +39 -0
- data/lib/deep_thought/ci_service/janky.rb +34 -0
- data/lib/deep_thought/deployer.rb +180 -0
- data/lib/deep_thought/deployer/deployer.rb +17 -0
- data/lib/deep_thought/deployer/shell.rb +45 -0
- data/lib/deep_thought/git.rb +76 -0
- data/lib/deep_thought/models/deploy.rb +27 -0
- data/lib/deep_thought/models/project.rb +32 -0
- data/lib/deep_thought/models/state.rb +6 -0
- data/lib/deep_thought/models/user.rb +45 -0
- data/lib/deep_thought/notifier.rb +13 -0
- data/lib/deep_thought/public/assets/javascripts/jquery.min.js +6 -0
- data/lib/deep_thought/public/assets/javascripts/main.js +36 -0
- data/lib/deep_thought/public/assets/stylesheets/main.css +438 -0
- data/lib/deep_thought/public/robots.txt +2 -0
- data/lib/deep_thought/scaler.rb +35 -0
- data/lib/deep_thought/tasks.rb +65 -0
- data/lib/deep_thought/version.rb +3 -0
- data/lib/deep_thought/views/history/index.haml +4 -0
- data/lib/deep_thought/views/history/show.haml +68 -0
- data/lib/deep_thought/views/layouts/layout.haml +32 -0
- data/lib/deep_thought/views/projects/edit.haml +15 -0
- data/lib/deep_thought/views/projects/index.haml +7 -0
- data/lib/deep_thought/views/projects/new.haml +8 -0
- data/lib/deep_thought/views/projects/show.haml +25 -0
- data/lib/deep_thought/views/sessions/login.haml +8 -0
- data/lib/deep_thought/views/users/index.haml +7 -0
- data/lib/deep_thought/views/users/new.haml +12 -0
- data/lib/deep_thought/views/users/show.haml +38 -0
- data/script/bootstrap +3 -0
- data/script/console +7 -0
- data/script/server +7 -0
- data/script/test +3 -0
- data/test/deep_thought_api_test.rb +114 -0
- data/test/deep_thought_app_test.rb +315 -0
- data/test/deep_thought_ci_service_test.rb +44 -0
- data/test/deep_thought_deployer_test.rb +72 -0
- data/test/deep_thought_git_test.rb +62 -0
- data/test/deep_thought_janky_test.rb +42 -0
- data/test/deep_thought_notifier_test.rb +35 -0
- data/test/deep_thought_project_test.rb +34 -0
- data/test/deep_thought_shell_test.rb +38 -0
- data/test/fixtures/project-test/HEAD +1 -0
- data/test/fixtures/project-test/config +8 -0
- data/test/fixtures/project-test/description +1 -0
- data/test/fixtures/project-test/hooks/applypatch-msg.sample +15 -0
- data/test/fixtures/project-test/hooks/commit-msg.sample +24 -0
- data/test/fixtures/project-test/hooks/post-update.sample +8 -0
- data/test/fixtures/project-test/hooks/pre-applypatch.sample +14 -0
- data/test/fixtures/project-test/hooks/pre-commit.sample +49 -0
- data/test/fixtures/project-test/hooks/pre-push.sample +54 -0
- data/test/fixtures/project-test/hooks/pre-rebase.sample +169 -0
- data/test/fixtures/project-test/hooks/prepare-commit-msg.sample +36 -0
- data/test/fixtures/project-test/hooks/update.sample +128 -0
- data/test/fixtures/project-test/info/exclude +6 -0
- data/test/fixtures/project-test/objects/13/8b8baba400e64fc384d468e80f10cf707e38d7 +1 -0
- data/test/fixtures/project-test/objects/6b/8fb16e1675767742afc70ac2ce038da46461f8 +0 -0
- data/test/fixtures/project-test/objects/7f/fc496d150b8a0015e3a16be8bacd47daed1a1c +0 -0
- data/test/fixtures/project-test/objects/8f/8606174a2aa11545d119fe3c4d6840fe0c4825 +0 -0
- data/test/fixtures/project-test/objects/9c/362942288a8ff6dc1addf7c5199bd9837e09de +0 -0
- data/test/fixtures/project-test/objects/b5/f7341de6145d3f8b95877cd2675d798fd172f1 +0 -0
- data/test/fixtures/project-test/objects/d1/f1e8664b0326316fb18796ac4ae1171e239cb6 +1 -0
- data/test/fixtures/project-test/objects/e6/d7ad6d61242936a2cd2bb9ae236adf43e59718 +0 -0
- data/test/fixtures/project-test/objects/fa/4cf5ff52462d17b6378a06fae8771c13b654b0 +1 -0
- data/test/fixtures/project-test/objects/fa/dda6bc20afa5cf93196bfb08a4989ee3b75ed7 +0 -0
- data/test/fixtures/project-test/packed-refs +4 -0
- data/test/fixtures/project-test/refs/heads/.gitkeep +0 -0
- data/test/fixtures/project-test/refs/tags/.gitkeep +0 -0
- data/test/test_helper.rb +42 -0
- metadata +462 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module DeepThought
|
4
|
+
module Scaler
|
5
|
+
def self.scale
|
6
|
+
if (ENV['RACK_ENV'] != 'development' && ENV['RACK_ENV'] != 'test') && (ENV['HEROKU_APP'] && ENV['HEROKU_APP'] != '') && (ENV['HEROKU_API_KEY'] && ENV['HEROKU_API_KEY'] != '')
|
7
|
+
if Delayed::Job.count > 0
|
8
|
+
scale_up
|
9
|
+
else
|
10
|
+
scale_down
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def self.scale_up
|
18
|
+
options = {:body => {:type => 'worker', :qty => '1'}, :basic_auth => {:username => '', :password => ENV['HEROKU_API_KEY']}}
|
19
|
+
HTTParty.post("https://api.heroku.com/apps/#{ENV['HEROKU_APP']}/ps/scale", options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.scale_down
|
23
|
+
options = {:body => {:type => 'worker', :qty => '0'}, :basic_auth => {:username => '', :password => ENV['HEROKU_API_KEY']}}
|
24
|
+
HTTParty.post("https://api.heroku.com/apps/#{ENV['HEROKU_APP']}/ps/scale", options)
|
25
|
+
end
|
26
|
+
|
27
|
+
Delayed::Backend::ActiveRecord::Job.class_eval do
|
28
|
+
after_destroy :after_destroy
|
29
|
+
|
30
|
+
def after_destroy
|
31
|
+
DeepThought::Scaler.scale
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "rake"
|
2
|
+
require "rake/tasklib"
|
3
|
+
require "active_record"
|
4
|
+
|
5
|
+
module DeepThought
|
6
|
+
module Tasks
|
7
|
+
extend Rake::DSL
|
8
|
+
|
9
|
+
desc "Create a user"
|
10
|
+
task :create_user, [:email, :password] do |t, args|
|
11
|
+
user = DeepThought::User.create(:email => "#{args[:email]}", :password => "#{args[:password]}", :password_confirmation => "#{args[:password]}")
|
12
|
+
|
13
|
+
if user.errors.count > 0
|
14
|
+
puts "Error when creating new user: #{user.errors.messages}"
|
15
|
+
else
|
16
|
+
puts "Created new user with email: #{user.email}."
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
namespace :jobs do
|
21
|
+
desc "Start a delayed_job worker"
|
22
|
+
task :work do
|
23
|
+
Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], :max_priority => ENV['MAX_PRIORITY']).start
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Get number of jobs in the delayed_job queue"
|
27
|
+
task :count do
|
28
|
+
puts Delayed::Job.count
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Clear the delayed_job queue"
|
32
|
+
task :clear do
|
33
|
+
Delayed::Job.delete_all
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
namespace :db do
|
38
|
+
desc "Migrate the database"
|
39
|
+
task :migrate do
|
40
|
+
ActiveRecord::Migration.verbose = true
|
41
|
+
ActiveRecord::Migrator.migrate(db("migrate"))
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Rolls the schema back to the previous version"
|
45
|
+
task :rollback do
|
46
|
+
ActiveRecord::Migration.verbose = true
|
47
|
+
ActiveRecord::Migrator.rollback(db("migrate"), 1)
|
48
|
+
end
|
49
|
+
|
50
|
+
desc 'Reset the database'
|
51
|
+
task :reset do
|
52
|
+
ActiveRecord::Migration.verbose = true
|
53
|
+
ActiveRecord::Migrator.down(db("migrate"))
|
54
|
+
ActiveRecord::Migrator.migrate(db("migrate"))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def self.db(action = '')
|
61
|
+
@db ||= Pathname(__FILE__).expand_path.join("../../../db")
|
62
|
+
@db.join(action).to_s
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,4 @@
|
|
1
|
+
%ul.list
|
2
|
+
- deploys.each do |deploy|
|
3
|
+
%li
|
4
|
+
%a{:class => "#{'alert' if !deploy.was_successful}", :href => "/projects/#{project.name}/deploys/#{deploy.id}"}= "#{deploy.created_at.strftime('%m/%d/%Y | %H:%M:%S')}: deploy #{deploy.branch}#{' to ' + deploy.environment if deploy.environment}#{'/' + deploy.box if deploy.box} by #{deploy.user.email}"
|
@@ -0,0 +1,68 @@
|
|
1
|
+
- if deploy.in_progress
|
2
|
+
.field
|
3
|
+
%label.two-column.left in progress:
|
4
|
+
%span.two-column.right.info= deploy.in_progress
|
5
|
+
- else
|
6
|
+
.field
|
7
|
+
%label.two-column.left was successful:
|
8
|
+
%span.two-column.right.info= deploy.was_successful
|
9
|
+
|
10
|
+
.field
|
11
|
+
%label.two-column.left created at:
|
12
|
+
%span.two-column.right.info= deploy.created_at.strftime('%m/%d/%Y %H:%M:%S')
|
13
|
+
|
14
|
+
.field
|
15
|
+
%label.two-column.left by:
|
16
|
+
%span.two-column.right.info.long-line= deploy.user.email
|
17
|
+
|
18
|
+
- if deploy.on_behalf_of
|
19
|
+
.field
|
20
|
+
%label.two-column.left on behalf of:
|
21
|
+
%span.two-column.right.info.long-line= deploy.on_behalf_of
|
22
|
+
|
23
|
+
.field
|
24
|
+
%label.two-column.left via:
|
25
|
+
%span.two-column.right.info= deploy.via
|
26
|
+
|
27
|
+
- if deploy.started_at
|
28
|
+
.field
|
29
|
+
%label.two-column.left started at:
|
30
|
+
%span.two-column.right.info= deploy.started_at.strftime('%m/%d/%Y %H:%M:%S')
|
31
|
+
|
32
|
+
- if deploy.finished_at
|
33
|
+
.field
|
34
|
+
%label.two-column.left finished at:
|
35
|
+
%span.two-column.right.info= deploy.finished_at.strftime('%m/%d/%Y %H:%M:%S')
|
36
|
+
|
37
|
+
.field
|
38
|
+
%label.two-column.left branch:
|
39
|
+
%span.two-column.right.info.long-line= deploy.branch
|
40
|
+
|
41
|
+
.field
|
42
|
+
%label.two-column.left commit:
|
43
|
+
%span.two-column.right.info.long-line= deploy.commit
|
44
|
+
|
45
|
+
- if deploy.environment
|
46
|
+
.field
|
47
|
+
%label.two-column.left environment:
|
48
|
+
%span.two-column.right.info.long-line= deploy.environment
|
49
|
+
|
50
|
+
- if deploy.box
|
51
|
+
.field
|
52
|
+
%label.two-column.left box:
|
53
|
+
%span.two-column.right.info.long-line= deploy.box
|
54
|
+
|
55
|
+
- if deploy.actions
|
56
|
+
- YAML.load(deploy.actions).each do |action|
|
57
|
+
.field
|
58
|
+
%label.two-column.left action:
|
59
|
+
%span.two-column.right.info.long-line= action
|
60
|
+
|
61
|
+
- if deploy.variables
|
62
|
+
- YAML.load(deploy.variables).each do |variable|
|
63
|
+
.field
|
64
|
+
%label.two-column.left.long-line= "#{variable[0]}:"
|
65
|
+
%span.two-column.right.info.long-line= variable[1]
|
66
|
+
|
67
|
+
- if deploy.log
|
68
|
+
%span.info.log= deploy.log
|
@@ -0,0 +1,32 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title Deep Thought
|
5
|
+
%meta{:charset => 'utf-8'}
|
6
|
+
%meta{:name => 'robots', :content => 'noindex'}
|
7
|
+
%link{:href => 'https://fonts.googleapis.com/css?family=Noto+Sans:400,700|Droid+Sans+Mono', :rel => 'stylesheet', :type => 'text/css'}
|
8
|
+
%link{:href => '/assets/stylesheets/main.css', :rel => 'stylesheet', :type => 'text/css'}
|
9
|
+
%meta{:name => 'viewport', :content => 'user-scalable=0, initial-scale=1.0'}
|
10
|
+
%body
|
11
|
+
%header
|
12
|
+
%nav
|
13
|
+
- if current_user
|
14
|
+
%ul
|
15
|
+
%li
|
16
|
+
%a{:href => "/", :class => current_route('projects')} projects
|
17
|
+
%li
|
18
|
+
%a{:href => "/users", :class => current_route('users')} users
|
19
|
+
%li
|
20
|
+
%a{:href => "/users/#{@current_user.id}", :class => current_route('me')} me
|
21
|
+
%li
|
22
|
+
%form{:class => 'logout', :"accept-charset" => "UTF-8", :action => "/logout", :method => "POST"}
|
23
|
+
= csrf_tag
|
24
|
+
%input{:type => 'hidden', :name => "_method", :value => "delete"}
|
25
|
+
%input{:type => "submit", :value => "logout"}
|
26
|
+
%div{:class => "deep-thought #{'alert' if is_deploying?}"}
|
27
|
+
%h1= settings.deep_thought_message
|
28
|
+
.content
|
29
|
+
= yield
|
30
|
+
|
31
|
+
%script{:src => '/assets/javascripts/jquery.min.js', :type => 'text/javascript'}
|
32
|
+
%script{:src => '/assets/javascripts/main.js', :type => 'text/javascript'}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
%form{:"accept-charset" => "UTF-8", :action => "/projects/edit/#{project.name}", :method => "POST"}
|
2
|
+
= csrf_tag
|
3
|
+
%input{:type => 'hidden', :name => "_method", :value => "put"}
|
4
|
+
.field
|
5
|
+
%input{:id => "name", :name => "project[name]", :placeholder => "name", :value => project.name, :type => "text"}
|
6
|
+
.field
|
7
|
+
%input{:id => "repo", :name => "project[repo_url]", :placeholder => "repository url", :value => project.repo_url, :type => "text"}
|
8
|
+
.field
|
9
|
+
%input{:class => "button", :type => "submit", :value => "update project"}
|
10
|
+
|
11
|
+
.delete-project
|
12
|
+
%form{:"accept-charset" => "UTF-8", :action => "/projects/delete/#{project.name}", :method => "POST"}
|
13
|
+
= csrf_tag
|
14
|
+
%input{:type => 'hidden', :name => "_method", :value => "delete"}
|
15
|
+
%input{:class => "button", :type => "submit", :value => "delete project"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
%form{:"accept-charset" => "UTF-8", :action => "/projects/add/new", :method => "POST"}
|
2
|
+
= csrf_tag
|
3
|
+
.field
|
4
|
+
%input{:id => "name", :name => "project[name]", :placeholder => "name", :value => project.name, :type => "text"}
|
5
|
+
.field
|
6
|
+
%input{:id => "repo", :name => "project[repo_url]", :placeholder => "repository url", :value => project.repo_url, :type => "text"}
|
7
|
+
.field
|
8
|
+
%input{:class => "button", :type => "submit", :value => "create project"}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
.deploy
|
2
|
+
%form{:"accept-charset" => "UTF-8", :action => "/projects/#{project.name}/deploy", :method => "POST"}
|
3
|
+
= csrf_tag
|
4
|
+
.field
|
5
|
+
%label.two-column{:for => 'branch'} branch:
|
6
|
+
%select.two-column{:id => 'branch', :name => "deploy[branch]"}
|
7
|
+
- branches.each do |branch|
|
8
|
+
%option= branch
|
9
|
+
.field
|
10
|
+
%input{:id => "environment", :name => "deploy[environment]", :placeholder => "environment <default>", :type => "text"}
|
11
|
+
.field
|
12
|
+
%input{:id => "box", :name => "deploy[box]", :placeholder => "box <default>", :type => "text"}
|
13
|
+
.field
|
14
|
+
%a.box#add-action{:href => "#"} + add action
|
15
|
+
.field
|
16
|
+
%a.box#add-variable{:href => "#"} + add variable
|
17
|
+
.field
|
18
|
+
- if is_deploying?
|
19
|
+
%input{:id => "deploy", :class => "button disabled", :type => "submit", :value => "can't deploy while deploying", :disabled => "disabled"}
|
20
|
+
- else
|
21
|
+
%input{:id => "deploy", :class => "button", :type => "submit", :value => "deploy"}
|
22
|
+
|
23
|
+
%a.box{:href => "/projects/edit/#{project.name}"} edit...
|
24
|
+
|
25
|
+
%a.box{:href => "/projects/#{project.name}/deploys"} history...
|
@@ -0,0 +1,8 @@
|
|
1
|
+
%form{:"accept-charset" => "UTF-8", :action => "/login", :method => "POST"}
|
2
|
+
= csrf_tag
|
3
|
+
.field
|
4
|
+
%input{:id => "email", :name => "email", :placeholder => "your@email.here", :type => "text"}
|
5
|
+
.field
|
6
|
+
%input{:id => "password", :name => "password", :placeholder => "password", :type => "password"}
|
7
|
+
.field
|
8
|
+
%input{:class => "button", :type => "submit", :value => "login"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
%form{:"accept-charset" => "UTF-8", :action => "/users/new", :method => "POST"}
|
2
|
+
= csrf_tag
|
3
|
+
.field
|
4
|
+
%input{:id => "email", :name => "user[email]", :placeholder => "user@email.here", :value => user.email, :type => "text"}
|
5
|
+
.field
|
6
|
+
%input{:id => "password", :name => "user[password]", :placeholder => "password", :type => "password"}
|
7
|
+
.field
|
8
|
+
%input{:id => "password_confirmation", :name => "user[password_confirmation]", :placeholder => "confirm password", :type => "password"}
|
9
|
+
.field
|
10
|
+
%input.long-line{:id => "notification_url", :name => "user[notification_url]", :placeholder => "notification url (if you're a bot)", :type => "text"}
|
11
|
+
.field
|
12
|
+
%input{:class => "button", :type => "submit", :value => "create user"}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
- if current_user.id == user.id
|
2
|
+
.user-info
|
3
|
+
%form{:"accept-charset" => "UTF-8", :action => "/users/#{user.id}", :method => "POST"}
|
4
|
+
= csrf_tag
|
5
|
+
%input{:type => 'hidden', :name => "_method", :value => "put"}
|
6
|
+
.field
|
7
|
+
%input{:id => "email", :name => "user[email]", :value => user.email, :type => "text"}
|
8
|
+
.field
|
9
|
+
%input{:id => "password", :name => "user[password]", :placeholder => "new password", :type => "password"}
|
10
|
+
.field
|
11
|
+
%input{:id => "password_confirmation", :name => "user[password_confirmation]", :placeholder => "confirm password", :type => "password"}
|
12
|
+
.field
|
13
|
+
%input.long-line{:id => "notification_url", :name => "user[notification_url]", :value => user.notification_url, :placeholder => "notification url (if you're a bot)", :type => "text"}
|
14
|
+
.field
|
15
|
+
%input{:class => "button", :type => "submit", :value => "update"}
|
16
|
+
|
17
|
+
.user-api-key
|
18
|
+
- if current_user.api_key
|
19
|
+
%span.info.long-line= current_user.api_key
|
20
|
+
- else
|
21
|
+
%span.info no api key (yet)
|
22
|
+
|
23
|
+
%form{:"accept-charset" => "UTF-8", :action => "/users/#{user.id}/key", :method => "POST"}
|
24
|
+
= csrf_tag
|
25
|
+
%input{:class => "button", :type => "submit", :value => "generate new api key"}
|
26
|
+
- else
|
27
|
+
%ul.list
|
28
|
+
%li
|
29
|
+
%p= user.email
|
30
|
+
- if user.notification_url
|
31
|
+
%li
|
32
|
+
%p= user.notification_url
|
33
|
+
|
34
|
+
.delete-user
|
35
|
+
%form{:"accept-charset" => "UTF-8", :action => "/users/#{user.id}", :method => "POST"}
|
36
|
+
= csrf_tag
|
37
|
+
%input{:type => 'hidden', :name => "_method", :value => "delete"}
|
38
|
+
%input{:class => "button", :type => "submit", :value => "delete user"}
|
data/script/bootstrap
ADDED
data/script/console
ADDED
data/script/server
ADDED
data/script/test
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
require File.expand_path '../test_helper.rb', __FILE__
|
2
|
+
|
3
|
+
class DeepThoughtApiTest < MiniTest::Unit::TestCase
|
4
|
+
include Rack::Test::Methods
|
5
|
+
|
6
|
+
def setup
|
7
|
+
DatabaseCleaner.start
|
8
|
+
|
9
|
+
if File.directory?(".projects/_test")
|
10
|
+
FileUtils.rm_rf(".projects/_test")
|
11
|
+
end
|
12
|
+
|
13
|
+
deployer = mock('class')
|
14
|
+
deployer.stubs(:new).returns(deployer)
|
15
|
+
deployer.stubs(:setup)
|
16
|
+
DeepThought::Deployer.register_adapter('mock', deployer)
|
17
|
+
|
18
|
+
@user = DeepThought::User.create(:email => 'test@test.com', :password => 'secret', :password_confirmation => 'secret', :api_key => '12345')
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown
|
22
|
+
if File.directory?(".projects/_test")
|
23
|
+
FileUtils.rm_rf(".projects/_test")
|
24
|
+
end
|
25
|
+
|
26
|
+
DatabaseCleaner.clean
|
27
|
+
end
|
28
|
+
|
29
|
+
def app
|
30
|
+
DeepThought.app
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_api_unauthorized
|
34
|
+
header 'Accept', 'application/json'
|
35
|
+
get '/deploy/'
|
36
|
+
assert !last_response.ok?
|
37
|
+
assert_equal 401, last_response.status
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_api_get
|
41
|
+
header 'Accept', 'application/json'
|
42
|
+
get '/deploy/', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
43
|
+
assert !last_response.ok?
|
44
|
+
assert_equal "I don't got what you're trying to GET.", last_response.body
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_api_post_empty
|
48
|
+
header 'Accept', 'application/json'
|
49
|
+
post '/deploy/', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
50
|
+
assert !last_response.ok?
|
51
|
+
assert_equal "Must supply app name.", last_response.body
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_api_setup_success
|
55
|
+
header 'Accept', 'application/json'
|
56
|
+
post '/deploy/setup/_test', {:repo_url => './test/fixtures/project-test'}.to_json, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
57
|
+
assert last_response.ok?
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_api_setup_failed
|
61
|
+
header 'Accept', 'application/json'
|
62
|
+
post '/deploy/setup/_test', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
63
|
+
assert !last_response.ok?
|
64
|
+
assert_equal "Sorry, but I need a project name and repo url. No exceptions, despite how nicely you ask.", last_response.body
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_api_non_project
|
68
|
+
header 'Accept', 'application/json'
|
69
|
+
post '/deploy/_test', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
70
|
+
assert !last_response.ok?
|
71
|
+
assert_equal "Hmm, that project doesn't appear to exist. Have you set it up?", last_response.body
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_api_no_repo
|
75
|
+
project = DeepThought::Project.create(:name => '_test', :repo_url => 'http://fake.url')
|
76
|
+
header 'Accept', 'application/json'
|
77
|
+
post '/deploy/_test', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
78
|
+
assert !last_response.ok?
|
79
|
+
assert_equal "I can't seem to access that repo. Are you sure the URL is correct and that I have access to it?", last_response.body
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_api_no_branch
|
83
|
+
project = DeepThought::Project.create(:name => '_test', :repo_url => './test/fixtures/project-test')
|
84
|
+
branch = 'no-branch'
|
85
|
+
header 'Accept', 'application/json'
|
86
|
+
post '/deploy/_test', {:branch => branch}.to_json, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
87
|
+
assert !last_response.ok?
|
88
|
+
assert_equal "#{project.name} doesn't appear to have a branch called #{branch}. Have you pushed it?", last_response.body
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_api_in_deployment
|
92
|
+
DeepThought::Deployer.lock_deployer
|
93
|
+
project = DeepThought::Project.create(:name => '_test', :repo_url => './test/fixtures/project-test')
|
94
|
+
header 'Accept', 'application/json'
|
95
|
+
post '/deploy/_test', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
96
|
+
assert !last_response.ok?
|
97
|
+
assert_equal "Sorry, but I'm currently in mid-deployment. Ask me again when I'm done.", last_response.body
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_api_status_ready
|
101
|
+
header 'Accept', 'application/json'
|
102
|
+
get '/deploy/status', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
103
|
+
assert last_response.ok?
|
104
|
+
assert_equal "I'm ready to ponder the infinitely complex questions of the universe.", last_response.body
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_api_status_busy
|
108
|
+
DeepThought::Deployer.lock_deployer
|
109
|
+
header 'Accept', 'application/json'
|
110
|
+
get '/deploy/status', {}, {"HTTP_AUTHORIZATION" => 'Token token="12345"'}
|
111
|
+
assert !last_response.ok?
|
112
|
+
assert_equal "I'm currently in mid-deployment.", last_response.body
|
113
|
+
end
|
114
|
+
end
|