shipit-engine 0.15.0 → 0.16.0
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.
- checksums.yaml +4 -4
- data/README.md +34 -1
- data/app/assets/javascripts/shipit/page_updater.js.coffee +63 -0
- data/app/assets/javascripts/shipit/stacks.js.coffee +9 -21
- data/app/assets/stylesheets/_base/_base.scss +2 -2
- data/app/assets/stylesheets/_base/_colors.scss +0 -1
- data/app/assets/stylesheets/_base/_forms.scss +14 -0
- data/app/assets/stylesheets/_pages/_commits.scss +16 -6
- data/app/assets/stylesheets/_pages/_settings.scss +8 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +1 -1
- data/app/controllers/shipit/api/base_controller.rb +7 -3
- data/app/controllers/shipit/api/ccmenu_controller.rb +33 -0
- data/app/controllers/shipit/api/pull_requests_controller.rb +36 -0
- data/app/controllers/shipit/api/stacks_controller.rb +1 -0
- data/app/controllers/shipit/ccmenu_url_controller.rb +22 -0
- data/app/controllers/shipit/pull_requests_controller.rb +30 -0
- data/app/controllers/shipit/stacks_controller.rb +7 -2
- data/app/controllers/shipit/webhooks_controller.rb +1 -2
- data/app/helpers/shipit/github_url_helper.rb +8 -2
- data/app/helpers/shipit/shipit_helper.rb +9 -0
- data/app/helpers/shipit/stacks_helper.rb +22 -7
- data/app/jobs/shipit/background_job/unique.rb +19 -1
- data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -1
- data/app/jobs/shipit/merge_pull_requests_job.rb +26 -0
- data/app/jobs/shipit/perform_task_job.rb +1 -1
- data/app/jobs/shipit/refresh_pull_request_job.rb +8 -0
- data/app/models/concerns/shipit/deferred_touch.rb +6 -1
- data/app/models/shipit/anonymous_user.rb +4 -0
- data/app/models/shipit/application_record.rb +5 -0
- data/app/models/shipit/commit.rb +51 -49
- data/app/models/shipit/commit_message.rb +32 -0
- data/app/models/shipit/deploy.rb +5 -0
- data/app/models/shipit/deploy_spec.rb +26 -1
- data/app/models/shipit/deploy_spec/file_system.rb +6 -1
- data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +10 -13
- data/app/models/shipit/deploy_spec/npm_discovery.rb +2 -1
- data/app/models/shipit/duration.rb +3 -1
- data/app/models/shipit/hook.rb +1 -0
- data/app/models/shipit/pull_request.rb +252 -0
- data/app/models/shipit/stack.rb +33 -17
- data/app/models/shipit/status.rb +1 -16
- data/app/models/shipit/status/common.rb +45 -0
- data/app/models/shipit/status/group.rb +82 -0
- data/app/models/shipit/status/missing.rb +30 -0
- data/app/models/shipit/status/unknown.rb +33 -0
- data/app/models/shipit/unlimited_api_client.rb +10 -0
- data/app/serializers/shipit/commit_serializer.rb +1 -1
- data/app/serializers/shipit/pull_request_serializer.rb +20 -0
- data/app/serializers/shipit/stack_serializer.rb +6 -2
- data/app/views/layouts/shipit.html.erb +41 -39
- data/app/views/shipit/ccmenu/project.xml.builder +13 -0
- data/app/views/shipit/commits/_commit.html.erb +1 -1
- data/app/views/shipit/deploys/_deploy.html.erb +1 -1
- data/app/views/shipit/pull_requests/_pull_request.html.erb +29 -0
- data/app/views/shipit/pull_requests/index.html.erb +20 -0
- data/app/views/shipit/shared/_author.html.erb +7 -0
- data/app/views/shipit/stacks/_header.html.erb +5 -0
- data/app/views/shipit/stacks/settings.html.erb +13 -0
- data/app/views/shipit/stacks/show.html.erb +3 -2
- data/app/views/shipit/statuses/_group.html.erb +1 -1
- data/app/views/shipit/tasks/_task.html.erb +1 -1
- data/config/initializers/inflections.rb +3 -0
- data/config/locales/en.yml +1 -3
- data/config/routes.rb +8 -0
- data/db/migrate/20170130113633_create_shipit_pull_requests.rb +25 -0
- data/db/migrate/20170208143657_add_pull_request_number_and_title_to_commits.rb +7 -0
- data/db/migrate/20170208154609_backfill_merge_commits.rb +13 -0
- data/db/migrate/20170209160355_add_branch_to_pull_requests.rb +5 -0
- data/db/migrate/20170215123538_add_merge_queue_enabled_to_stacks.rb +5 -0
- data/db/migrate/20170220152410_improve_users_indexing.rb +6 -0
- data/db/migrate/20170221102128_improve_tasks_indexing.rb +8 -0
- data/db/migrate/20170221130336_add_last_revalidated_at_on_pull_requests.rb +10 -0
- data/lib/shipit.rb +2 -0
- data/lib/shipit/version.rb +1 -1
- data/lib/tasks/cron.rake +1 -0
- data/test/controllers/api/ccmenu_controller_test.rb +57 -0
- data/test/controllers/api/commits_controller_test.rb +1 -1
- data/test/controllers/api/pull_requests_controller_test.rb +59 -0
- data/test/controllers/ccmenu_controller_test.rb +33 -0
- data/test/controllers/pull_requests_controller_test.rb +31 -0
- data/test/controllers/webhooks_controller_test.rb +3 -4
- data/test/dummy/config/environments/development.rb +3 -1
- data/test/dummy/data/stacks/shopify/junk/production/git/README.md +8 -0
- data/test/dummy/data/stacks/shopify/junk/production/git/circle.yml +4 -0
- data/test/dummy/data/stacks/shopify/junk/production/git/shipit.yml +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +45 -11
- data/test/dummy/db/seeds.rb +33 -10
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/fixtures/shipit/commits.yml +14 -0
- data/test/fixtures/shipit/pull_requests.yml +56 -0
- data/test/fixtures/shipit/stacks.yml +5 -1
- data/test/fixtures/shipit/statuses.yml +8 -0
- data/test/helpers/json_helper.rb +16 -14
- data/test/jobs/merge_pull_requests_job_test.rb +59 -0
- data/test/models/commits_test.rb +104 -49
- data/test/{unit → models}/deploy_spec_test.rb +138 -12
- data/test/models/deploys_test.rb +10 -4
- data/test/models/pull_request_test.rb +197 -0
- data/test/models/stacks_test.rb +46 -53
- data/test/models/status/group_test.rb +44 -0
- data/test/models/status/missing_test.rb +23 -0
- data/test/models/status_test.rb +3 -6
- data/test/unit/csv_serializer_test.rb +10 -2
- metadata +57 -12
- data/app/models/shipit/missing_status.rb +0 -21
- data/app/models/shipit/status_group.rb +0 -35
- data/app/models/shipit/unknown_status.rb +0 -48
- data/app/views/shipit/commits/_commit_author.html.erb +0 -7
- data/test/models/missing_status_test.rb +0 -23
- data/test/models/status_group_test.rb +0 -26
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<% subscribe events_path(channels: ["stack.#{@stack.id}"]), '.pr-list', '.header' %>
|
|
2
|
+
|
|
3
|
+
<%= render partial: 'shipit/stacks/header', locals: { stack: @stack } %>
|
|
4
|
+
|
|
5
|
+
<div class="wrapper">
|
|
6
|
+
<section>
|
|
7
|
+
<header class="section-header">
|
|
8
|
+
<%= form_tag stack_pull_requests_path(@stack) do %>
|
|
9
|
+
<div class="field-wrapper inline">
|
|
10
|
+
<%= text_field_tag :number_or_url, '', placeholder: 'PR number or URL' %>
|
|
11
|
+
<%= submit_tag 'Request merge', class: 'btn' %>
|
|
12
|
+
</div>
|
|
13
|
+
<% end %>
|
|
14
|
+
</header>
|
|
15
|
+
|
|
16
|
+
<ul class="pr-list">
|
|
17
|
+
<%= render @pull_requests %>
|
|
18
|
+
</ul>
|
|
19
|
+
</section>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<a href="<%= github_user_url(author.login) %>" class="commit-author">
|
|
2
|
+
<%= github_avatar(author, size: 80, class: 'commit-author__avatar') %>
|
|
3
|
+
<div class="commit-author__name">
|
|
4
|
+
<span class="commit-author__name__real-name"><%= author.name %></span>
|
|
5
|
+
<span class="commit-author__name__username"><%= author.login %></span>
|
|
6
|
+
</div>
|
|
7
|
+
</a>
|
|
@@ -22,6 +22,11 @@
|
|
|
22
22
|
<li class="nav__list__item">
|
|
23
23
|
<%= link_to 'Timeline', index_stack_tasks_path(stack) %>
|
|
24
24
|
</li>
|
|
25
|
+
<% if stack.merge_queue_enabled? %>
|
|
26
|
+
<li class="nav__list__item">
|
|
27
|
+
<%= link_to "Pull Requests (#{stack.pull_requests.queued.count})", stack_pull_requests_path(stack) %>
|
|
28
|
+
</li>
|
|
29
|
+
<% end %>
|
|
25
30
|
</ul>
|
|
26
31
|
<ul class="nav__list nav__list--secondary">
|
|
27
32
|
<% if stack.links.present? %>
|
|
@@ -23,6 +23,11 @@
|
|
|
23
23
|
<%= f.label :continuous_deployment, 'Enable continuous deployment' %>
|
|
24
24
|
</div>
|
|
25
25
|
|
|
26
|
+
<div class="field-wrapper">
|
|
27
|
+
<%= f.check_box :merge_queue_enabled %>
|
|
28
|
+
<%= f.label :merge_queue_enabled, 'Enable merge queue' %>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
26
31
|
<div class="field-wrapper">
|
|
27
32
|
<%= f.check_box :ignore_ci %>
|
|
28
33
|
<%= f.label :ignore_ci, "Don't require CI to deploy" %>
|
|
@@ -66,6 +71,14 @@
|
|
|
66
71
|
</table>
|
|
67
72
|
</div>
|
|
68
73
|
|
|
74
|
+
<div class="setting-section setting-ccmenu">
|
|
75
|
+
<h5>Miscellaneous</h5>
|
|
76
|
+
<div class="field-wrapper">
|
|
77
|
+
<label>CCMenu URL</label>
|
|
78
|
+
<input id="ccmenu-url" class="hidden" type="text" disabled />
|
|
79
|
+
</div>
|
|
80
|
+
<%= button_to "Fetch URL", "", class: 'btn', data: {remote: ccmenu_url_url(stack_id: @stack.to_param)} %>
|
|
81
|
+
</div>
|
|
69
82
|
|
|
70
83
|
<div class="setting-section">
|
|
71
84
|
<h5>Delete this stack</h5>
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<% subscribe events_path(channels: ["stack.#{@stack.id}"]), '#layout-content' %>
|
|
2
|
+
|
|
1
3
|
<%= render partial: 'shipit/stacks/header', locals: { stack: @stack } %>
|
|
2
4
|
|
|
3
5
|
<% if !@stack.ignore_ci && !@stack.ci_enabled? %>
|
|
@@ -63,8 +65,7 @@
|
|
|
63
65
|
</div>
|
|
64
66
|
<% end %>
|
|
65
67
|
|
|
66
|
-
<div class="wrapper"
|
|
67
|
-
|
|
68
|
+
<div class="wrapper">
|
|
68
69
|
<section>
|
|
69
70
|
<header class="section-header">
|
|
70
71
|
<h2>Undeployed Commits</h2>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<strong class="status-item__service"><%= group.description %></strong>
|
|
8
8
|
</div>
|
|
9
9
|
<% group.statuses.each do |status| %>
|
|
10
|
-
<div class="status-item status-item--<%= status.state %> <%= :ignored if status.
|
|
10
|
+
<div class="status-item status-item--<%= status.state %> <%= :ignored if status.allowed_to_fail? %>">
|
|
11
11
|
<i class="status-item__icon"></i>
|
|
12
12
|
<a href="<%= status.target_url %>" target="_blank">
|
|
13
13
|
<strong class="status-item__service"><%= status.context %></strong>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<%- read_only ||= false -%>
|
|
2
2
|
|
|
3
3
|
<li class="task" id="task-<%= task.id %>" data-status="<%= task.status %>">
|
|
4
|
-
<%= render 'shipit/
|
|
4
|
+
<%= render 'shipit/shared/author', author: task.author %>
|
|
5
5
|
<a href="<%= stack_task_path(@stack, task) %>" class="status status--<%= task.status %>" data-tooltip="<%= task.status.capitalize %>">
|
|
6
6
|
<i class="status__icon"></i>
|
|
7
7
|
<span class="visually-hidden"><%= task.status %></span>
|
data/config/locales/en.yml
CHANGED
|
@@ -43,9 +43,7 @@ en:
|
|
|
43
43
|
rollback: Impossible to detect how to rollback this application. Please define `rollback.override` in your shipit.yml
|
|
44
44
|
fetch: Impossible to detect how to fetch the deployed revision for this application. Please define `fetch` in your shipit.yml
|
|
45
45
|
missing_status:
|
|
46
|
-
description:
|
|
47
|
-
one: "%{missing_statuses} is required for deploy but was not sent"
|
|
48
|
-
other: "%{missing_statuses} are required for deploy but were not sent"
|
|
46
|
+
description: "%{context} is required for deploy but was not sent yet."
|
|
49
47
|
deploys:
|
|
50
48
|
description: "deploy of %{sha}"
|
|
51
49
|
rollbacks:
|
data/config/routes.rb
CHANGED
|
@@ -30,12 +30,14 @@ Shipit::Engine.routes.draw do
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
scope '/stacks/*stack_id', stack_id: stack_id_format, as: :stack do
|
|
33
|
+
get '/ccmenu' => 'ccmenu#show', as: :ccmenu
|
|
33
34
|
resource :lock, only: %i(create update destroy)
|
|
34
35
|
resources :tasks, only: %i(index show) do
|
|
35
36
|
resource :output, only: :show
|
|
36
37
|
end
|
|
37
38
|
resources :deploys, only: %i(create)
|
|
38
39
|
resources :commits, only: %i(index)
|
|
40
|
+
resources :pull_requests, only: %i(index show update destroy)
|
|
39
41
|
post '/task/:task_name' => 'tasks#trigger', as: :trigger_task
|
|
40
42
|
resources :hooks, only: %i(index create show update destroy)
|
|
41
43
|
end
|
|
@@ -43,6 +45,10 @@ Shipit::Engine.routes.draw do
|
|
|
43
45
|
resources :hooks, only: %i(index create show update destroy)
|
|
44
46
|
end
|
|
45
47
|
|
|
48
|
+
scope '/ccmenu/*stack_id', stack_id: stack_id_format, as: :ccmenu_url do
|
|
49
|
+
get '/' => 'ccmenu_url#fetch'
|
|
50
|
+
end
|
|
51
|
+
|
|
46
52
|
# Humans
|
|
47
53
|
scope '/github/auth/github', as: :github_authentication, controller: :github_authentication do
|
|
48
54
|
get '/', action: :request
|
|
@@ -87,6 +93,8 @@ Shipit::Engine.routes.draw do
|
|
|
87
93
|
get :revert
|
|
88
94
|
end
|
|
89
95
|
end
|
|
96
|
+
|
|
97
|
+
resources :pull_requests, only: %i(index destroy create)
|
|
90
98
|
end
|
|
91
99
|
get '/stacks/:id' => 'stacks#lookup'
|
|
92
100
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class CreateShipitPullRequests < ActiveRecord::Migration[5.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :pull_requests do |t|
|
|
4
|
+
t.references :stack, foreign_key: true, null: false
|
|
5
|
+
t.integer :number, null: false
|
|
6
|
+
t.string :title, limit: 256
|
|
7
|
+
t.integer :github_id, limit: 8
|
|
8
|
+
t.string :api_url, limit: 1024
|
|
9
|
+
t.string :state
|
|
10
|
+
t.references :head, foreign_key: {to_table: :commits}
|
|
11
|
+
t.boolean :mergeable, null: true
|
|
12
|
+
t.integer :additions, null: false, default: 0
|
|
13
|
+
t.integer :deletions, null: false, default: 0
|
|
14
|
+
t.string :merge_status, null: false, limit: 30
|
|
15
|
+
t.string :rejection_reason, null: true
|
|
16
|
+
t.datetime :merge_requested_at, null: false
|
|
17
|
+
t.references :merge_requested_by, foreign_key: {to_table: :users}
|
|
18
|
+
t.timestamps
|
|
19
|
+
|
|
20
|
+
t.index [:stack_id, :number], unique: true
|
|
21
|
+
t.index [:stack_id, :github_id], unique: true
|
|
22
|
+
t.index [:stack_id, :merge_status]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
class AddPullRequestNumberAndTitleToCommits < ActiveRecord::Migration[5.0]
|
|
2
|
+
def change
|
|
3
|
+
add_column :commits, :pull_request_number, :integer, null: true
|
|
4
|
+
add_column :commits, :pull_request_title, :string, limit: 1024, null: true
|
|
5
|
+
add_column :commits, :pull_request_id, :integer, null: true, index: true
|
|
6
|
+
end
|
|
7
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class BackfillMergeCommits < ActiveRecord::Migration[5.0]
|
|
2
|
+
def change
|
|
3
|
+
ActiveRecord::Base.no_touching do
|
|
4
|
+
Shipit::Commit.find_in_batches do |commits|
|
|
5
|
+
commits.each do |commit|
|
|
6
|
+
commit.identify_pull_request
|
|
7
|
+
commit.save!
|
|
8
|
+
end
|
|
9
|
+
print '.'
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
class ImproveTasksIndexing < ActiveRecord::Migration[5.0]
|
|
2
|
+
def change
|
|
3
|
+
# index_active_tasks should superseed this, but for some reason
|
|
4
|
+
# MySQL tend to chose the wrong index. This one while wasting a bit of memory
|
|
5
|
+
# makes it do a better choice.
|
|
6
|
+
add_index :tasks, %i(stack_id allow_concurrency)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class AddLastRevalidatedAtOnPullRequests < ActiveRecord::Migration[5.0]
|
|
2
|
+
def up
|
|
3
|
+
add_column :pull_requests, :revalidated_at, :datetime
|
|
4
|
+
Shipit::PullRequest.update_all('revalidated_at = merge_requested_at')
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def down
|
|
8
|
+
remove_column :pull_requests, :revalidated_at
|
|
9
|
+
end
|
|
10
|
+
end
|
data/lib/shipit.rb
CHANGED
data/lib/shipit/version.rb
CHANGED
data/lib/tasks/cron.rake
CHANGED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Shipit
|
|
4
|
+
module Api
|
|
5
|
+
class CCMenuControllerTest < ActionController::TestCase
|
|
6
|
+
setup do
|
|
7
|
+
authenticate!
|
|
8
|
+
@stack = shipit_stacks(:shipit)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "a request with insufficient permissions will render a 403" do
|
|
12
|
+
@client.update!(permissions: [])
|
|
13
|
+
get :show, params: {stack_id: @stack.to_param}
|
|
14
|
+
assert_response :forbidden
|
|
15
|
+
assert_json 'message', 'This operation requires the `read:stack` permission'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
test "#show renders the xml" do
|
|
19
|
+
get :show, params: {stack_id: @stack.to_param}
|
|
20
|
+
assert_response :ok
|
|
21
|
+
assert_payload 'name', @stack.to_param
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "can authenticate with query string token" do
|
|
25
|
+
request.headers['Authorization'] = 'bleh'
|
|
26
|
+
get :show, params: {stack_id: @stack.to_param, token: @client.authentication_token}
|
|
27
|
+
assert_response :ok
|
|
28
|
+
assert_payload 'name', @stack.to_param
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test "xml contains required attributes" do
|
|
32
|
+
get :show, params: {stack_id: @stack.to_param}
|
|
33
|
+
project = get_project_from_xml(response.body)
|
|
34
|
+
%w(name activity lastBuildStatus lastBuildLabel lastBuildTime webUrl).each do |attribute|
|
|
35
|
+
assert_includes project, attribute, "Response missing required attribute: #{attribute}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
test "locked stacks show as failed" do
|
|
40
|
+
@stack.lock('test', @user)
|
|
41
|
+
get :show, params: {stack_id: @stack.to_param}
|
|
42
|
+
assert_payload 'lastBuildStatus', 'Failure'
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def get_project_from_xml(xml)
|
|
48
|
+
Hash.from_xml(xml)['Projects']['Project']
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def assert_payload(k, v)
|
|
52
|
+
@project ||= get_project_from_xml(response.body)
|
|
53
|
+
assert_equal v, @project[k]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Shipit
|
|
4
|
+
module Api
|
|
5
|
+
class PullRequestsControllerTest < ActionController::TestCase
|
|
6
|
+
setup do
|
|
7
|
+
@stack = shipit_stacks(:shipit)
|
|
8
|
+
@pull_request = shipit_pull_requests(:shipit_pending)
|
|
9
|
+
authenticate!
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
test "#index returns a list of pull requests" do
|
|
13
|
+
pull_request = @stack.pull_requests.last
|
|
14
|
+
|
|
15
|
+
get :index, params: {stack_id: @stack.to_param}
|
|
16
|
+
assert_response :ok
|
|
17
|
+
assert_json '0.id', pull_request.id
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "#show returns a single pull requests" do
|
|
21
|
+
get :show, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
|
22
|
+
assert_response :ok
|
|
23
|
+
assert_json 'id', @pull_request.id
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "#update responds with Accepted if the pull request was queued" do
|
|
27
|
+
assert_enqueued_with(job: RefreshPullRequestJob) do
|
|
28
|
+
put :update, params: {stack_id: @stack.to_param, id: '64'}
|
|
29
|
+
end
|
|
30
|
+
assert_response :accepted
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "#update responds with Accepted if the pull request was already queued" do
|
|
34
|
+
assert_enqueued_with(job: RefreshPullRequestJob) do
|
|
35
|
+
put :update, params: {stack_id: @stack.to_param, id: '65'}
|
|
36
|
+
end
|
|
37
|
+
assert_response :accepted
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "#update responds with method not allowed if the pull request was already merged" do
|
|
41
|
+
@pull_request.complete!
|
|
42
|
+
put :update, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
|
43
|
+
assert_response :method_not_allowed
|
|
44
|
+
assert_json 'message', 'This pull request was already merged.'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test "#destroy cancels the merge if the pull request was waiting" do
|
|
48
|
+
delete :destroy, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
|
49
|
+
assert_response :no_content
|
|
50
|
+
assert_predicate @pull_request.reload, :canceled?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test "#destroy silently fail if the pull request was unknown" do
|
|
54
|
+
delete :destroy, params: {stack_id: @stack.to_param, id: '83453489'}
|
|
55
|
+
assert_response :no_content
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
module Shipit
|
|
5
|
+
class CCMenuUrlControllerTest < ActionController::TestCase
|
|
6
|
+
setup do
|
|
7
|
+
@stack = shipit_stacks(:shipit)
|
|
8
|
+
@user = shipit_users(:walrus)
|
|
9
|
+
session[:user_id] = @user.id
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
test ":fetch returns ok with json" do
|
|
13
|
+
get :fetch, params: {stack_id: @stack.to_param}
|
|
14
|
+
assert_response :ok
|
|
15
|
+
data = JSON.parse(response.body)
|
|
16
|
+
assert_includes data, 'ccmenu_url'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test ":fetch creates a read only api client" do
|
|
20
|
+
assert_difference 'ApiClient.count' do
|
|
21
|
+
get :fetch, params: {stack_id: @stack.to_param}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test ":fetch url includes api token on query string" do
|
|
26
|
+
get :fetch, params: {stack_id: @stack.to_param}
|
|
27
|
+
data = JSON.parse(response.body)
|
|
28
|
+
client = ApiClient.last
|
|
29
|
+
query = Rack::Utils.parse_nested_query(URI(data['ccmenu_url']).query)
|
|
30
|
+
assert_equal client.authentication_token, query['token']
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module Shipit
|
|
4
|
+
class PullRequestsControllerTest < ActionController::TestCase
|
|
5
|
+
setup do
|
|
6
|
+
@stack = shipit_stacks(:shipit)
|
|
7
|
+
@pr = shipit_pull_requests(:shipit_pending)
|
|
8
|
+
session[:user_id] = shipit_users(:walrus).id
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "#index shows pending pull requests" do
|
|
12
|
+
get :index, params: {stack_id: @stack.to_param}
|
|
13
|
+
assert_response :success
|
|
14
|
+
assert_select '.pr-list .pr', @stack.pull_requests.pending.count
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test "#add can enqueue a pull request" do
|
|
18
|
+
assert_difference -> { PullRequest.count }, +1 do
|
|
19
|
+
post :create, params: {stack_id: @stack.to_param, number_or_url: '#5'}
|
|
20
|
+
end
|
|
21
|
+
assert_redirected_to stack_pull_requests_path(@stack)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "#destroy can cancel a pending pull request" do
|
|
25
|
+
assert_predicate @pr, :pending?
|
|
26
|
+
delete :destroy, params: {stack_id: @stack.to_param, id: @pr.id}
|
|
27
|
+
assert_redirected_to stack_pull_requests_path(@stack)
|
|
28
|
+
assert_predicate @pr.reload, :canceled?
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|