Merge branch 'improve/mr_diff'
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> Conflicts: features/steps/project/project_fork.rb features/steps/project/project_forked_merge_requests.rb features/steps/project/project_issue_tracker.rb features/steps/project/project_markdown_render.rb features/steps/shared/project.rb
This commit is contained in:
commit
28e13634dc
61 changed files with 492 additions and 386 deletions
|
@ -89,16 +89,3 @@
|
||||||
.merge-request-form-info {
|
.merge-request-form-info {
|
||||||
padding-top: 15px;
|
padding-top: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge-request-branches {
|
|
||||||
.commit-row-message {
|
|
||||||
font-weight: normal !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.select2-container .select2-single {
|
|
||||||
span {
|
|
||||||
font-weight: bold;
|
|
||||||
color: #555;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -76,7 +76,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
||||||
@merge_request.author = current_user
|
@merge_request.author = current_user
|
||||||
@target_branches ||= []
|
@target_branches ||= []
|
||||||
if @merge_request.save
|
if @merge_request.save
|
||||||
@merge_request.reload_code
|
|
||||||
redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
|
redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
|
||||||
else
|
else
|
||||||
@source_project = @merge_request.source_project
|
@source_project = @merge_request.source_project
|
||||||
|
@ -217,6 +216,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
||||||
# or from cache if already merged
|
# or from cache if already merged
|
||||||
@commits = @merge_request.commits
|
@commits = @merge_request.commits
|
||||||
|
|
||||||
|
@merge_request_diff = @merge_request.merge_request_diff
|
||||||
@allowed_to_merge = allowed_to_merge?
|
@allowed_to_merge = allowed_to_merge?
|
||||||
@show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge
|
@show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,6 +31,11 @@ class MergeRequest < ActiveRecord::Base
|
||||||
belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
|
belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
|
||||||
belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project"
|
belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project"
|
||||||
|
|
||||||
|
has_one :merge_request_diff, dependent: :destroy
|
||||||
|
after_create :create_merge_request_diff
|
||||||
|
|
||||||
|
delegate :commits, :diffs, :last_commit, :last_commit_short_sha, to: :merge_request_diff, prefix: nil
|
||||||
|
|
||||||
attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description
|
attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description
|
||||||
|
|
||||||
attr_accessor :should_remove_source_branch
|
attr_accessor :should_remove_source_branch
|
||||||
|
@ -53,11 +58,8 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
state :opened
|
state :opened
|
||||||
|
|
||||||
state :reopened
|
state :reopened
|
||||||
|
|
||||||
state :closed
|
state :closed
|
||||||
|
|
||||||
state :merged
|
state :merged
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -75,15 +77,10 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
state :unchecked
|
state :unchecked
|
||||||
|
|
||||||
state :can_be_merged
|
state :can_be_merged
|
||||||
|
|
||||||
state :cannot_be_merged
|
state :cannot_be_merged
|
||||||
end
|
end
|
||||||
|
|
||||||
serialize :st_commits
|
|
||||||
serialize :st_diffs
|
|
||||||
|
|
||||||
validates :source_project, presence: true, unless: :allow_broken
|
validates :source_project, presence: true, unless: :allow_broken
|
||||||
validates :source_branch, presence: true
|
validates :source_branch, presence: true
|
||||||
validates :target_project, presence: true
|
validates :target_project, presence: true
|
||||||
|
@ -105,7 +102,7 @@ class MergeRequest < ActiveRecord::Base
|
||||||
scope :closed, -> { with_states(:closed, :merged) }
|
scope :closed, -> { with_states(:closed, :merged) }
|
||||||
|
|
||||||
def validate_branches
|
def validate_branches
|
||||||
if target_project==source_project && target_branch == source_branch
|
if target_project == source_project && target_branch == source_branch
|
||||||
errors.add :branch_conflict, "You can not use same project/branch for source and target"
|
errors.add :branch_conflict, "You can not use same project/branch for source and target"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -120,8 +117,7 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def reload_code
|
def reload_code
|
||||||
self.reloaded_commits
|
merge_request_diff.reload_content if opened?
|
||||||
self.reloaded_diffs
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_if_can_be_merged
|
def check_if_can_be_merged
|
||||||
|
@ -132,42 +128,6 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def diffs
|
|
||||||
@diffs ||= (load_diffs(st_diffs) || [])
|
|
||||||
end
|
|
||||||
|
|
||||||
def reloaded_diffs
|
|
||||||
if opened? && unmerged_diffs.any?
|
|
||||||
self.st_diffs = dump_diffs(unmerged_diffs)
|
|
||||||
self.save
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def broken_diffs?
|
|
||||||
diffs == broken_diffs
|
|
||||||
rescue
|
|
||||||
true
|
|
||||||
end
|
|
||||||
|
|
||||||
def valid_diffs?
|
|
||||||
!broken_diffs?
|
|
||||||
end
|
|
||||||
|
|
||||||
def unmerged_diffs
|
|
||||||
diffs = if for_fork?
|
|
||||||
Gitlab::Satellite::MergeAction.new(author, self).diffs_between_satellite
|
|
||||||
else
|
|
||||||
Gitlab::Git::Diff.between(target_project.repository, source_branch, target_branch)
|
|
||||||
end
|
|
||||||
|
|
||||||
diffs ||= []
|
|
||||||
diffs
|
|
||||||
end
|
|
||||||
|
|
||||||
def last_commit
|
|
||||||
commits.first
|
|
||||||
end
|
|
||||||
|
|
||||||
def merge_event
|
def merge_event
|
||||||
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
|
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
|
||||||
end
|
end
|
||||||
|
@ -176,46 +136,13 @@ class MergeRequest < ActiveRecord::Base
|
||||||
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
|
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
|
||||||
end
|
end
|
||||||
|
|
||||||
def commits
|
|
||||||
load_commits(st_commits || [])
|
|
||||||
end
|
|
||||||
|
|
||||||
def probably_merged?
|
|
||||||
unmerged_commits.empty? &&
|
|
||||||
commits.any? && opened?
|
|
||||||
end
|
|
||||||
|
|
||||||
def reloaded_commits
|
|
||||||
if opened? && unmerged_commits.any?
|
|
||||||
self.st_commits = dump_commits(unmerged_commits)
|
|
||||||
save
|
|
||||||
|
|
||||||
end
|
|
||||||
commits
|
|
||||||
end
|
|
||||||
|
|
||||||
def unmerged_commits
|
|
||||||
if for_fork?
|
|
||||||
commits = Gitlab::Satellite::MergeAction.new(self.author, self).commits_between
|
|
||||||
else
|
|
||||||
commits = target_project.repository.commits_between(self.target_branch, self.source_branch)
|
|
||||||
end
|
|
||||||
|
|
||||||
if commits.present?
|
|
||||||
commits = Commit.decorate(commits).
|
|
||||||
sort_by(&:created_at).
|
|
||||||
reverse
|
|
||||||
end
|
|
||||||
commits
|
|
||||||
end
|
|
||||||
|
|
||||||
def merge!(user_id)
|
def merge!(user_id)
|
||||||
self.author_id_of_changes = user_id
|
self.author_id_of_changes = user_id
|
||||||
self.merge
|
self.merge
|
||||||
end
|
end
|
||||||
|
|
||||||
def automerge!(current_user, commit_message = nil)
|
def automerge!(current_user, commit_message = nil)
|
||||||
if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message) && self.unmerged_commits.empty?
|
if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message)
|
||||||
self.merge!(current_user.id)
|
self.merge!(current_user.id)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
@ -225,7 +152,10 @@ class MergeRequest < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def mr_and_commit_notes
|
def mr_and_commit_notes
|
||||||
commit_ids = commits.map(&:id)
|
# Fetch comments only from last 100 commits
|
||||||
|
commits_for_notes_limit = 100
|
||||||
|
commit_ids = commits.last(commits_for_notes_limit).map(&:id)
|
||||||
|
|
||||||
project.notes.where(
|
project.notes.where(
|
||||||
"(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))",
|
"(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))",
|
||||||
mr_id: id,
|
mr_id: id,
|
||||||
|
@ -247,10 +177,6 @@ class MergeRequest < ActiveRecord::Base
|
||||||
Gitlab::Satellite::MergeAction.new(current_user, self).format_patch
|
Gitlab::Satellite::MergeAction.new(current_user, self).format_patch
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_commit_short_sha
|
|
||||||
@last_commit_short_sha ||= last_commit.sha[0..10]
|
|
||||||
end
|
|
||||||
|
|
||||||
def for_fork?
|
def for_fork?
|
||||||
target_project != source_project
|
target_project != source_project
|
||||||
end
|
end
|
||||||
|
@ -327,34 +253,4 @@ class MergeRequest < ActiveRecord::Base
|
||||||
message << description.to_s
|
message << description.to_s
|
||||||
message
|
message
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def dump_commits(commits)
|
|
||||||
commits.map(&:to_hash)
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_commits(array)
|
|
||||||
array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }
|
|
||||||
end
|
|
||||||
|
|
||||||
def dump_diffs(diffs)
|
|
||||||
if diffs == broken_diffs
|
|
||||||
broken_diffs
|
|
||||||
elsif diffs.respond_to?(:map)
|
|
||||||
diffs.map(&:to_hash)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_diffs(raw)
|
|
||||||
if raw == broken_diffs
|
|
||||||
broken_diffs
|
|
||||||
elsif raw.respond_to?(:map)
|
|
||||||
raw.map { |hash| Gitlab::Git::Diff.new(hash) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def broken_diffs
|
|
||||||
[Gitlab::Git::Diff::BROKEN_DIFF]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
163
app/models/merge_request_diff.rb
Normal file
163
app/models/merge_request_diff.rb
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
require Rails.root.join("app/models/commit")
|
||||||
|
|
||||||
|
class MergeRequestDiff < ActiveRecord::Base
|
||||||
|
# Prevent store of diff
|
||||||
|
# if commits amount more then 200
|
||||||
|
COMMITS_SAFE_SIZE = 200
|
||||||
|
|
||||||
|
attr_reader :commits, :diffs
|
||||||
|
|
||||||
|
belongs_to :merge_request
|
||||||
|
|
||||||
|
attr_accessible :state, :st_commits, :st_diffs
|
||||||
|
|
||||||
|
delegate :target_branch, :source_branch, to: :merge_request, prefix: nil
|
||||||
|
|
||||||
|
state_machine :state, initial: :empty do
|
||||||
|
state :collected
|
||||||
|
state :timeout
|
||||||
|
state :overflow_commits_safe_size
|
||||||
|
state :overflow_diff_files_limit
|
||||||
|
state :overflow_diff_lines_limit
|
||||||
|
end
|
||||||
|
|
||||||
|
serialize :st_commits
|
||||||
|
serialize :st_diffs
|
||||||
|
|
||||||
|
after_create :reload_content
|
||||||
|
|
||||||
|
def reload_content
|
||||||
|
reload_commits
|
||||||
|
reload_diffs
|
||||||
|
end
|
||||||
|
|
||||||
|
def diffs
|
||||||
|
@diffs ||= (load_diffs(st_diffs) || [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def commits
|
||||||
|
@commits ||= load_commits(st_commits || [])
|
||||||
|
end
|
||||||
|
|
||||||
|
def last_commit
|
||||||
|
commits.first
|
||||||
|
end
|
||||||
|
|
||||||
|
def last_commit_short_sha
|
||||||
|
@last_commit_short_sha ||= last_commit.sha[0..10]
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def dump_commits(commits)
|
||||||
|
commits.map(&:to_hash)
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_commits(array)
|
||||||
|
array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def dump_diffs(diffs)
|
||||||
|
if diffs.respond_to?(:map)
|
||||||
|
diffs.map(&:to_hash)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_diffs(raw)
|
||||||
|
if raw.respond_to?(:map)
|
||||||
|
raw.map { |hash| Gitlab::Git::Diff.new(hash) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# When Git::Diff is not able to get diff
|
||||||
|
# because of git timeout it return this value
|
||||||
|
def broken_diffs
|
||||||
|
[Gitlab::Git::Diff::BROKEN_DIFF]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Collect array of Git::Commit objects
|
||||||
|
# between target and source branches
|
||||||
|
def unmerged_commits
|
||||||
|
commits = if merge_request.for_fork?
|
||||||
|
Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between
|
||||||
|
else
|
||||||
|
repository.commits_between(target_branch, source_branch)
|
||||||
|
end
|
||||||
|
|
||||||
|
if commits.present?
|
||||||
|
commits = Commit.decorate(commits).
|
||||||
|
sort_by(&:created_at).
|
||||||
|
reverse
|
||||||
|
end
|
||||||
|
|
||||||
|
commits
|
||||||
|
end
|
||||||
|
|
||||||
|
# Reload all commits related to current merge request from repo
|
||||||
|
# and save it as array of hashes in st_commits db field
|
||||||
|
def reload_commits
|
||||||
|
commit_objects = unmerged_commits
|
||||||
|
|
||||||
|
if commit_objects.present?
|
||||||
|
self.st_commits = dump_commits(commit_objects)
|
||||||
|
end
|
||||||
|
|
||||||
|
save
|
||||||
|
end
|
||||||
|
|
||||||
|
# Reload diffs between branches related to current merge request from repo
|
||||||
|
# and save it as array of hashes in st_diffs db field
|
||||||
|
def reload_diffs
|
||||||
|
new_diffs = []
|
||||||
|
|
||||||
|
if commits.size.zero?
|
||||||
|
self.state = :empty
|
||||||
|
elsif commits.size > COMMITS_SAFE_SIZE
|
||||||
|
self.state = :overflow_commits_safe_size
|
||||||
|
else
|
||||||
|
new_diffs = unmerged_diffs
|
||||||
|
end
|
||||||
|
|
||||||
|
if new_diffs.any?
|
||||||
|
if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES
|
||||||
|
self.state = :overflow_diff_files_limit
|
||||||
|
new_diffs = []
|
||||||
|
end
|
||||||
|
|
||||||
|
if new_diffs.sum { |diff| diff.diff.lines.count } > Commit::DIFF_HARD_LIMIT_LINES
|
||||||
|
self.state = :overflow_diff_lines_limit
|
||||||
|
new_diffs = []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if new_diffs.present?
|
||||||
|
new_diffs = dump_commits(new_diffs)
|
||||||
|
self.state = :collected
|
||||||
|
end
|
||||||
|
|
||||||
|
self.st_diffs = new_diffs
|
||||||
|
self.save
|
||||||
|
end
|
||||||
|
|
||||||
|
# Collect array of Git::Diff objects
|
||||||
|
# between target and source branches
|
||||||
|
def unmerged_diffs
|
||||||
|
diffs = if merge_request.for_fork?
|
||||||
|
Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
|
||||||
|
else
|
||||||
|
Gitlab::Git::Diff.between(repository, source_branch, target_branch)
|
||||||
|
end
|
||||||
|
|
||||||
|
if diffs == broken_diffs
|
||||||
|
self.state = :timeout
|
||||||
|
diffs = []
|
||||||
|
end
|
||||||
|
|
||||||
|
diffs ||= []
|
||||||
|
diffs
|
||||||
|
end
|
||||||
|
|
||||||
|
def repository
|
||||||
|
merge_request.target_project.repository
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,5 +2,7 @@
|
||||||
.commit-row-title
|
.commit-row-title
|
||||||
= link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
|
= link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
|
||||||
|
|
||||||
= link_to_gfm truncate(commit.title, length: 40), project_commit_path(project, commit.id), class: "commit-row-message"
|
%span.str-truncated
|
||||||
#{time_ago_with_tooltip(commit.committed_date)}
|
= link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message"
|
||||||
|
.pull-right
|
||||||
|
#{time_ago_with_tooltip(commit.committed_date)}
|
||||||
|
|
|
@ -12,9 +12,16 @@
|
||||||
8 of #{@commits.count} commits displayed.
|
8 of #{@commits.count} commits displayed.
|
||||||
%strong
|
%strong
|
||||||
%a.show-all-commits Click here to show all
|
%a.show-all-commits Click here to show all
|
||||||
%ul.all-commits.hide.well-list
|
- if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE
|
||||||
- @commits.each do |commit|
|
%ul.all-commits.hide.well-list
|
||||||
= render "projects/commits/commit", commit: commit, project: @merge_request.source_project
|
- @commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE).each do |commit|
|
||||||
|
= render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
|
||||||
|
%li
|
||||||
|
other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden top prevent performance issues.
|
||||||
|
- else
|
||||||
|
%ul.all-commits.hide.well-list
|
||||||
|
- @commits.each do |commit|
|
||||||
|
= render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
|
||||||
|
|
||||||
- else
|
- else
|
||||||
%ul.well-list
|
%ul.well-list
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
- if @merge_request.valid_diffs?
|
- if @merge_request_diff.collected?
|
||||||
= render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project
|
= render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project
|
||||||
- elsif @merge_request.broken_diffs?
|
- elsif @merge_request_diff.empty?
|
||||||
|
%h4.nothing_here_message Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch}
|
||||||
|
- else
|
||||||
%h4.nothing_here_message
|
%h4.nothing_here_message
|
||||||
Can't load diff.
|
Can't load diff.
|
||||||
You can
|
You can
|
||||||
= link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
|
= link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
|
||||||
instead.
|
instead.
|
||||||
- else
|
|
||||||
%h4.nothing_here_message Nothing to merge
|
|
||||||
|
|
12
db/migrate/20140122112253_create_merge_request_diffs.rb
Normal file
12
db/migrate/20140122112253_create_merge_request_diffs.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
class CreateMergeRequestDiffs < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :merge_request_diffs do |t|
|
||||||
|
t.string :state, null: false, default: 'collected'
|
||||||
|
t.text :st_commits, null: true, limit: 2147483647
|
||||||
|
t.text :st_diffs, null: true, limit: 2147483647
|
||||||
|
t.integer :merge_request_id, null: false
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
11
db/migrate/20140122114406_migrate_mr_diffs.rb
Normal file
11
db/migrate/20140122114406_migrate_mr_diffs.rb
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
class MigrateMrDiffs < ActiveRecord::Migration
|
||||||
|
def self.up
|
||||||
|
execute "INSERT INTO merge_request_diffs ( merge_request_id ) SELECT id FROM merge_requests"
|
||||||
|
execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_commits = mr.st_commits WHERE md.merge_request_id = mr.id"
|
||||||
|
execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_diffs = mr.st_diffs WHERE md.merge_request_id = mr.id"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.down
|
||||||
|
MergeRequestDiff.delete_all
|
||||||
|
end
|
||||||
|
end
|
13
db/migrate/20140122122549_remove_m_rdiff_fields.rb
Normal file
13
db/migrate/20140122122549_remove_m_rdiff_fields.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
class RemoveMRdiffFields < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
remove_column :merge_requests, :st_commits
|
||||||
|
remove_column :merge_requests, :st_diffs
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
add_column :merge_requests, :st_commits, :text, null: true, limit: 2147483647
|
||||||
|
add_column :merge_requests, :st_diffs, :text, null: true, limit: 2147483647
|
||||||
|
execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_commits = md.st_commits WHERE md.merge_request_id = mr.id"
|
||||||
|
execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_diffs = md.st_diffs WHERE md.merge_request_id = mr.id"
|
||||||
|
end
|
||||||
|
end
|
93
db/schema.rb
93
db/schema.rb
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20140116231608) do
|
ActiveRecord::Schema.define(version: 20140122122549) do
|
||||||
|
|
||||||
create_table "broadcast_messages", force: true do |t|
|
create_table "broadcast_messages", force: true do |t|
|
||||||
t.text "message", null: false
|
t.text "message", null: false
|
||||||
|
@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.integer "assignee_id"
|
t.integer "assignee_id"
|
||||||
t.integer "author_id"
|
t.integer "author_id"
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.integer "position", default: 0
|
t.integer "position", default: 0
|
||||||
t.string "branch_name"
|
t.string "branch_name"
|
||||||
t.text "description"
|
t.text "description"
|
||||||
|
@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
|
|
||||||
create_table "keys", force: true do |t|
|
create_table "keys", force: true do |t|
|
||||||
t.integer "user_id"
|
t.integer "user_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.text "key"
|
t.text "key"
|
||||||
t.string "title"
|
t.string "title"
|
||||||
t.string "type"
|
t.string "type"
|
||||||
|
@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
|
|
||||||
add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree
|
add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree
|
||||||
|
|
||||||
|
create_table "merge_request_diffs", force: true do |t|
|
||||||
|
t.string "state", default: "collected", null: false
|
||||||
|
t.text "st_commits", limit: 2147483647
|
||||||
|
t.text "st_diffs", limit: 2147483647
|
||||||
|
t.integer "merge_request_id", null: false
|
||||||
|
t.datetime "created_at"
|
||||||
|
t.datetime "updated_at"
|
||||||
|
end
|
||||||
|
|
||||||
create_table "merge_requests", force: true do |t|
|
create_table "merge_requests", force: true do |t|
|
||||||
t.string "target_branch", null: false
|
t.string "target_branch", null: false
|
||||||
t.string "source_branch", null: false
|
t.string "source_branch", null: false
|
||||||
t.integer "source_project_id", null: false
|
t.integer "source_project_id", null: false
|
||||||
t.integer "author_id"
|
t.integer "author_id"
|
||||||
t.integer "assignee_id"
|
t.integer "assignee_id"
|
||||||
t.string "title"
|
t.string "title"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.text "st_commits", limit: 2147483647
|
|
||||||
t.text "st_diffs", limit: 2147483647
|
|
||||||
t.integer "milestone_id"
|
t.integer "milestone_id"
|
||||||
t.string "state"
|
t.string "state"
|
||||||
t.string "merge_status"
|
t.string "merge_status"
|
||||||
t.integer "target_project_id", null: false
|
t.integer "target_project_id", null: false
|
||||||
t.integer "iid"
|
t.integer "iid"
|
||||||
t.text "description"
|
t.text "description"
|
||||||
end
|
end
|
||||||
|
@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.text "note"
|
t.text "note"
|
||||||
t.string "noteable_type"
|
t.string "noteable_type"
|
||||||
t.integer "author_id"
|
t.integer "author_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.string "attachment"
|
t.string "attachment"
|
||||||
t.string "line_code"
|
t.string "line_code"
|
||||||
|
@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.string "path"
|
t.string "path"
|
||||||
t.text "description"
|
t.text "description"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.integer "creator_id"
|
t.integer "creator_id"
|
||||||
t.boolean "issues_enabled", default: true, null: false
|
t.boolean "issues_enabled", default: true, null: false
|
||||||
t.boolean "wall_enabled", default: true, null: false
|
t.boolean "wall_enabled", default: true, null: false
|
||||||
|
@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.text "content", limit: 2147483647
|
t.text "content", limit: 2147483647
|
||||||
t.integer "author_id", null: false
|
t.integer "author_id", null: false
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.string "file_name"
|
t.string "file_name"
|
||||||
t.datetime "expires_at"
|
t.datetime "expires_at"
|
||||||
t.boolean "private", default: true, null: false
|
t.boolean "private", default: true, null: false
|
||||||
|
@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
|
|
||||||
add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
|
|
||||||
|
|
||||||
create_table "tags", force: true do |t|
|
create_table "tags", force: true do |t|
|
||||||
t.string "name"
|
t.string "name"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", force: true do |t|
|
create_table "users", force: true do |t|
|
||||||
t.string "email", default: "", null: false
|
t.string "email", default: "", null: false
|
||||||
t.string "encrypted_password", default: "", null: false
|
t.string "encrypted_password", limit: 128, default: "", null: false
|
||||||
t.string "reset_password_token"
|
t.string "reset_password_token"
|
||||||
t.datetime "reset_password_sent_at"
|
t.datetime "reset_password_sent_at"
|
||||||
t.datetime "remember_created_at"
|
t.datetime "remember_created_at"
|
||||||
t.integer "sign_in_count", default: 0
|
t.integer "sign_in_count", default: 0
|
||||||
t.datetime "current_sign_in_at"
|
t.datetime "current_sign_in_at"
|
||||||
t.datetime "last_sign_in_at"
|
t.datetime "last_sign_in_at"
|
||||||
t.string "current_sign_in_ip"
|
t.string "current_sign_in_ip"
|
||||||
t.string "last_sign_in_ip"
|
t.string "last_sign_in_ip"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.boolean "admin", default: false, null: false
|
t.boolean "admin", default: false, null: false
|
||||||
t.integer "projects_limit", default: 10
|
t.integer "projects_limit", default: 10
|
||||||
t.string "skype", default: "", null: false
|
t.string "skype", default: "", null: false
|
||||||
t.string "linkedin", default: "", null: false
|
t.string "linkedin", default: "", null: false
|
||||||
t.string "twitter", default: "", null: false
|
t.string "twitter", default: "", null: false
|
||||||
t.string "authentication_token"
|
t.string "authentication_token"
|
||||||
t.integer "theme_id", default: 1, null: false
|
t.integer "theme_id", default: 1, null: false
|
||||||
t.string "bio"
|
t.string "bio"
|
||||||
t.integer "failed_attempts", default: 0
|
t.integer "failed_attempts", default: 0
|
||||||
t.datetime "locked_at"
|
t.datetime "locked_at"
|
||||||
t.string "extern_uid"
|
t.string "extern_uid"
|
||||||
t.string "provider"
|
t.string "provider"
|
||||||
t.string "username"
|
t.string "username"
|
||||||
t.boolean "can_create_group", default: true, null: false
|
t.boolean "can_create_group", default: true, null: false
|
||||||
t.boolean "can_create_team", default: true, null: false
|
t.boolean "can_create_team", default: true, null: false
|
||||||
t.string "state"
|
t.string "state"
|
||||||
t.integer "color_scheme_id", default: 1, null: false
|
t.integer "color_scheme_id", default: 1, null: false
|
||||||
t.integer "notification_level", default: 1, null: false
|
t.integer "notification_level", default: 1, null: false
|
||||||
t.datetime "password_expires_at"
|
t.datetime "password_expires_at"
|
||||||
t.integer "created_by_id"
|
t.integer "created_by_id"
|
||||||
t.string "avatar"
|
t.string "avatar"
|
||||||
|
@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
t.datetime "confirmed_at"
|
t.datetime "confirmed_at"
|
||||||
t.datetime "confirmation_sent_at"
|
t.datetime "confirmation_sent_at"
|
||||||
t.string "unconfirmed_email"
|
t.string "unconfirmed_email"
|
||||||
t.boolean "hide_no_ssh_key", default: false
|
t.boolean "hide_no_ssh_key", default: false
|
||||||
t.string "website_url", default: "", null: false
|
t.string "website_url", default: "", null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
|
add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
|
||||||
add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
|
add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
|
||||||
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
|
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
|
||||||
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
|
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
|
||||||
add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree
|
|
||||||
add_index "users", ["name"], name: "index_users_on_name", using: :btree
|
add_index "users", ["name"], name: "index_users_on_name", using: :btree
|
||||||
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
|
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
|
||||||
add_index "users", ["username"], name: "index_users_on_username", using: :btree
|
add_index "users", ["username"], name: "index_users_on_username", using: :btree
|
||||||
|
@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
create_table "users_projects", force: true do |t|
|
create_table "users_projects", force: true do |t|
|
||||||
t.integer "user_id", null: false
|
t.integer "user_id", null: false
|
||||||
t.integer "project_id", null: false
|
t.integer "project_id", null: false
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.integer "project_access", default: 0, null: false
|
t.integer "project_access", default: 0, null: false
|
||||||
t.integer "notification_level", default: 3, null: false
|
t.integer "notification_level", default: 3, null: false
|
||||||
end
|
end
|
||||||
|
@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
|
||||||
create_table "web_hooks", force: true do |t|
|
create_table "web_hooks", force: true do |t|
|
||||||
t.string "url"
|
t.string "url"
|
||||||
t.integer "project_id"
|
t.integer "project_id"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at"
|
||||||
t.string "type", default: "ProjectHook"
|
t.string "type", default: "ProjectHook"
|
||||||
t.integer "service_id"
|
t.integer "service_id"
|
||||||
t.boolean "push_events", default: true, null: false
|
t.boolean "push_events", default: true, null: false
|
||||||
|
|
|
@ -55,18 +55,18 @@ Feature: Project Merge Requests
|
||||||
Given project "Shop" have "Bug NS-05" open merge request with diffs inside
|
Given project "Shop" have "Bug NS-05" open merge request with diffs inside
|
||||||
And I visit merge request page "Bug NS-05"
|
And I visit merge request page "Bug NS-05"
|
||||||
And I click on the first commit in the merge request
|
And I click on the first commit in the merge request
|
||||||
And I leave a comment like "Line is wrong" on line 185 of the first file
|
And I leave a comment like "Line is wrong" on line 185 of the first file in commit
|
||||||
And I switch to the merge request's comments tab
|
And I switch to the merge request's comments tab
|
||||||
Then I should see a discussion has started on commit bcf03b5de6c:L185
|
Then I should see a discussion has started on commit b1e6a9dbf1:L185
|
||||||
|
|
||||||
@javascript
|
@javascript
|
||||||
Scenario: I comment on a commit in merge request
|
Scenario: I comment on a commit in merge request
|
||||||
Given project "Shop" have "Bug NS-05" open merge request with diffs inside
|
Given project "Shop" have "Bug NS-05" open merge request with diffs inside
|
||||||
And I visit merge request page "Bug NS-05"
|
And I visit merge request page "Bug NS-05"
|
||||||
And I click on the first commit in the merge request
|
And I click on the first commit in the merge request
|
||||||
And I leave a comment on the diff page
|
And I leave a comment on the diff page in commit
|
||||||
And I switch to the merge request's comments tab
|
And I switch to the merge request's comments tab
|
||||||
Then I should see a discussion has started on commit bcf03b5de6c
|
Then I should see a discussion has started on commit b1e6a9dbf1
|
||||||
|
|
||||||
@javascript
|
@javascript
|
||||||
Scenario: I accept merge request with custom commit message
|
Scenario: I accept merge request with custom commit message
|
||||||
|
|
|
@ -66,7 +66,7 @@ class DashboardIssues < Spinach::FeatureSteps
|
||||||
|
|
||||||
def project
|
def project
|
||||||
@project ||= begin
|
@project ||= begin
|
||||||
project =create :project_with_code
|
project =create :project
|
||||||
project.team << [current_user, :master]
|
project.team << [current_user, :master]
|
||||||
project
|
project
|
||||||
end
|
end
|
||||||
|
|
|
@ -66,7 +66,7 @@ class DashboardMergeRequests < Spinach::FeatureSteps
|
||||||
|
|
||||||
def project
|
def project
|
||||||
@project ||= begin
|
@project ||= begin
|
||||||
project =create :project_with_code
|
project =create :project
|
||||||
project.team << [current_user, :master]
|
project.team << [current_user, :master]
|
||||||
project
|
project
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'other project has deploy key' do
|
step 'other project has deploy key' do
|
||||||
@second_project = create :project, namespace: current_user.namespace
|
@second_project = create :project, namespace: create(:group)
|
||||||
@second_project.team << [current_user, :master]
|
@second_project.team << [current_user, :master]
|
||||||
create(:deploy_keys_project, project: @second_project)
|
create(:deploy_keys_project, project: @second_project)
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,7 +12,7 @@ class ForkProject < Spinach::FeatureSteps
|
||||||
|
|
||||||
step 'I am a member of project "Shop"' do
|
step 'I am a member of project "Shop"' do
|
||||||
@project = Project.find_by(name: "Shop")
|
@project = Project.find_by(name: "Shop")
|
||||||
@project ||= create(:project_with_code, name: "Shop", group: create(:group))
|
@project ||= create(:project, name: "Shop", group: create(:group))
|
||||||
@project.team << [@user, :reporter]
|
@project.team << [@user, :reporter]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ class ForkProject < Spinach::FeatureSteps
|
||||||
current_user.namespace ||= create(:namespace)
|
current_user.namespace ||= create(:namespace)
|
||||||
current_user.namespace.should_not be_nil
|
current_user.namespace.should_not be_nil
|
||||||
current_user.namespace.path.should_not be_nil
|
current_user.namespace.path.should_not be_nil
|
||||||
@my_project = create(:project_with_code, name: "Shop", namespace: current_user.namespace)
|
@my_project = create(:project, name: "Shop", namespace: current_user.namespace)
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I should see a "Name has already been taken" warning' do
|
step 'I should see a "Name has already been taken" warning' do
|
||||||
|
|
|
@ -7,7 +7,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
|
||||||
|
|
||||||
step 'I am a member of project "Shop"' do
|
step 'I am a member of project "Shop"' do
|
||||||
@project = Project.find_by(name: "Shop")
|
@project = Project.find_by(name: "Shop")
|
||||||
@project ||= create(:project_with_code, name: "Shop")
|
@project ||= create(:project, name: "Shop")
|
||||||
@project.team << [@user, :reporter]
|
@project.team << [@user, :reporter]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
|
||||||
@forking_user = @user
|
@forking_user = @user
|
||||||
forked_project_link = build(:forked_project_link)
|
forked_project_link = build(:forked_project_link)
|
||||||
@forked_project = Project.find_by(name: "Forked Shop")
|
@forked_project = Project.find_by(name: "Forked Shop")
|
||||||
@forked_project ||= create(:source_project_with_code, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id , namespace: @forking_user.namespace)
|
@forked_project ||= create(:project, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id , namespace: @forking_user.namespace)
|
||||||
|
|
||||||
forked_project_link.forked_from_project = @project
|
forked_project_link.forked_from_project = @project
|
||||||
forked_project_link.forked_to_project = @forked_project
|
forked_project_link.forked_to_project = @forked_project
|
||||||
|
|
|
@ -5,7 +5,7 @@ class ProjectIssueTracker < Spinach::FeatureSteps
|
||||||
|
|
||||||
step 'project "Shop" has issues enabled' do
|
step 'project "Shop" has issues enabled' do
|
||||||
@project = Project.find_by(name: "Shop")
|
@project = Project.find_by(name: "Shop")
|
||||||
@project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace)
|
@project ||= create(:project, name: "Shop", namespace: @user.namespace)
|
||||||
@project.issues_enabled = true
|
@project.issues_enabled = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender < Spinach::FeatureSteps
|
||||||
|
|
||||||
And 'I own project "Delta"' do
|
And 'I own project "Delta"' do
|
||||||
@project = Project.find_by(name: "Delta")
|
@project = Project.find_by(name: "Delta")
|
||||||
@project ||= create(:project_with_code, name: "Delta", namespace: @user.namespace)
|
@project ||= create(:project, name: "Delta", namespace: @user.namespace)
|
||||||
@project.team << [@user, :master]
|
@project.team << [@user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,8 @@ class ProjectMergeRequests < Spinach::FeatureSteps
|
||||||
title: "Bug NS-04",
|
title: "Bug NS-04",
|
||||||
source_project: project,
|
source_project: project,
|
||||||
target_project: project,
|
target_project: project,
|
||||||
|
source_branch: 'stable',
|
||||||
|
target_branch: 'master',
|
||||||
author: project.users.first)
|
author: project.users.first)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -109,33 +111,29 @@ class ProjectMergeRequests < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I click on the first commit in the merge request' do
|
step 'I click on the first commit in the merge request' do
|
||||||
click_link merge_request.commits.first.short_id(8)
|
within '.first-commits' do
|
||||||
|
click_link merge_request.commits.first.short_id(8)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I leave a comment on the diff page' do
|
step 'I leave a comment on the diff page' do
|
||||||
init_diff_note
|
init_diff_note
|
||||||
|
leave_comment "One comment to rule them all"
|
||||||
|
end
|
||||||
|
|
||||||
within('.js-discussion-note-form') do
|
step 'I leave a comment on the diff page in commit' do
|
||||||
fill_in "note_note", with: "One comment to rule them all"
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
||||||
click_button "Add Comment"
|
leave_comment "One comment to rule them all"
|
||||||
end
|
|
||||||
|
|
||||||
within ".note-text" do
|
|
||||||
page.should have_content "One comment to rule them all"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
|
step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
|
||||||
init_diff_note
|
init_diff_note
|
||||||
|
leave_comment "Line is wrong"
|
||||||
|
end
|
||||||
|
|
||||||
within(".js-discussion-note-form") do
|
step 'I leave a comment like "Line is wrong" on line 185 of the first file in commit' do
|
||||||
fill_in "note_note", with: "Line is wrong"
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
||||||
click_button "Add Comment"
|
leave_comment "Line is wrong"
|
||||||
end
|
|
||||||
|
|
||||||
within ".note-text" do
|
|
||||||
page.should have_content "Line is wrong"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I should see a discussion has started on line 185' do
|
step 'I should see a discussion has started on line 185' do
|
||||||
|
@ -144,14 +142,14 @@ class ProjectMergeRequests < Spinach::FeatureSteps
|
||||||
page.should have_content "Line is wrong"
|
page.should have_content "Line is wrong"
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I should see a discussion has started on commit bcf03b5de6c:L185' do
|
step 'I should see a discussion has started on commit b1e6a9dbf1:L185' do
|
||||||
page.should have_content "#{current_user.name} started a discussion on commit"
|
page.should have_content "#{current_user.name} started a discussion on commit"
|
||||||
page.should have_content "app/assets/stylesheets/tree.scss:L185"
|
page.should have_content "app/assets/stylesheets/tree.scss:L185"
|
||||||
page.should have_content "Line is wrong"
|
page.should have_content "Line is wrong"
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I should see a discussion has started on commit bcf03b5de6c' do
|
step 'I should see a discussion has started on commit b1e6a9dbf1' do
|
||||||
page.should have_content "#{current_user.name} started a discussion on commit bcf03b5de6c"
|
page.should have_content "#{current_user.name} started a discussion on commit"
|
||||||
page.should have_content "One comment to rule them all"
|
page.should have_content "One comment to rule them all"
|
||||||
page.should have_content "app/assets/stylesheets/tree.scss:L185"
|
page.should have_content "app/assets/stylesheets/tree.scss:L185"
|
||||||
end
|
end
|
||||||
|
@ -188,6 +186,17 @@ class ProjectMergeRequests < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_diff_note
|
def init_diff_note
|
||||||
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
|
||||||
|
end
|
||||||
|
|
||||||
|
def leave_comment(message)
|
||||||
|
within(".js-discussion-note-form") do
|
||||||
|
fill_in "note_note", with: message
|
||||||
|
click_button "Add Comment"
|
||||||
|
end
|
||||||
|
|
||||||
|
within ".note-text" do
|
||||||
|
page.should have_content message
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -79,7 +79,7 @@ class ProjectTeamManagement < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
Given 'I own project "Website"' do
|
Given 'I own project "Website"' do
|
||||||
@project = create(:project, name: "Website", namespace: @user.namespace)
|
@project = create(:empty_project, name: "Website", namespace: @user.namespace)
|
||||||
@project.team << [@user, :master]
|
@project.team << [@user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
|
||||||
include SharedProject
|
include SharedProject
|
||||||
|
|
||||||
step 'public project "Community"' do
|
step 'public project "Community"' do
|
||||||
create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'private project "Enterprise"' do
|
step 'private project "Enterprise"' do
|
||||||
|
|
|
@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'public project "Community"' do
|
step 'public project "Community"' do
|
||||||
create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'public empty project "Empty Public Project"' do
|
step 'public empty project "Empty Public Project"' do
|
||||||
create :project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
create :empty_project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I visit empty project page' do
|
step 'I visit empty project page' do
|
||||||
|
@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'internal project "Internal"' do
|
step 'internal project "Internal"' do
|
||||||
create :project_with_code, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL
|
create :project, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I should see project "Internal"' do
|
step 'I should see project "Internal"' do
|
||||||
|
|
|
@ -3,21 +3,21 @@ module SharedProject
|
||||||
|
|
||||||
# Create a project without caring about what it's called
|
# Create a project without caring about what it's called
|
||||||
And "I own a project" do
|
And "I own a project" do
|
||||||
@project = create(:project_with_code, namespace: @user.namespace)
|
@project = create(:project, namespace: @user.namespace)
|
||||||
@project.team << [@user, :master]
|
@project.team << [@user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Create a specific project called "Shop"
|
# Create a specific project called "Shop"
|
||||||
And 'I own project "Shop"' do
|
And 'I own project "Shop"' do
|
||||||
@project = Project.find_by(name: "Shop")
|
@project = Project.find_by(name: "Shop")
|
||||||
@project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace)
|
@project ||= create(:project, name: "Shop", namespace: @user.namespace)
|
||||||
@project.team << [@user, :master]
|
@project.team << [@user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Create another specific project called "Forum"
|
# Create another specific project called "Forum"
|
||||||
And 'I own project "Forum"' do
|
And 'I own project "Forum"' do
|
||||||
@project = Project.find_by(name: "Forum")
|
@project = Project.find_by(name: "Forum")
|
||||||
@project ||= create(:project_with_code, name: "Forum", namespace: @user.namespace, path: 'forum_project')
|
@project ||= create(:project, name: "Forum", namespace: @user.namespace, path: 'forum_project')
|
||||||
@project.team << [@user, :master]
|
@project.team << [@user, :master]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,6 @@ module API
|
||||||
end
|
end
|
||||||
|
|
||||||
if merge_request.save
|
if merge_request.save
|
||||||
merge_request.reload_code
|
|
||||||
present merge_request, with: Entities::MergeRequest
|
present merge_request, with: Entities::MergeRequest
|
||||||
else
|
else
|
||||||
handle_merge_request_errors! merge_request.errors
|
handle_merge_request_errors! merge_request.errors
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::BlobController do
|
describe Projects::BlobController do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::CommitController do
|
describe Projects::CommitController do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:commit) { project.repository.commit("master") }
|
let(:commit) { project.repository.commit("master") }
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::CommitsController do
|
describe Projects::CommitsController do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::MergeRequestsController do
|
describe Projects::MergeRequestsController do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") }
|
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") }
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Projects::TreeController do
|
describe Projects::TreeController do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -27,43 +27,16 @@ FactoryGirl.define do
|
||||||
factory :admin, traits: [:admin]
|
factory :admin, traits: [:admin]
|
||||||
end
|
end
|
||||||
|
|
||||||
factory :project do
|
factory :empty_project, class: 'Project' do
|
||||||
sequence(:name) { |n| "project#{n}" }
|
sequence(:name) { |n| "project#{n}" }
|
||||||
path { name.downcase.gsub(/\s/, '_') }
|
path { name.downcase.gsub(/\s/, '_') }
|
||||||
namespace
|
namespace
|
||||||
creator
|
creator
|
||||||
|
|
||||||
trait :source do
|
|
||||||
sequence(:name) { |n| "source project#{n}" }
|
|
||||||
end
|
|
||||||
trait :target do
|
|
||||||
sequence(:name) { |n| "target project#{n}" }
|
|
||||||
end
|
|
||||||
|
|
||||||
factory :source_project, traits: [:source]
|
|
||||||
factory :target_project, traits: [:target]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
factory :project, parent: :empty_project do
|
||||||
factory :redmine_project, parent: :project do
|
|
||||||
issues_tracker { "redmine" }
|
|
||||||
issues_tracker_id { "project_name_in_redmine" }
|
|
||||||
end
|
|
||||||
|
|
||||||
factory :project_with_code, parent: :project do
|
|
||||||
path { 'gitlabhq' }
|
path { 'gitlabhq' }
|
||||||
|
|
||||||
trait :source_path do
|
|
||||||
path { 'source_gitlabhq' }
|
|
||||||
end
|
|
||||||
|
|
||||||
trait :target_path do
|
|
||||||
path { 'target_gitlabhq' }
|
|
||||||
end
|
|
||||||
|
|
||||||
factory :source_project_with_code, traits: [:source, :source_path]
|
|
||||||
factory :target_project_with_code, traits: [:target, :target_path]
|
|
||||||
|
|
||||||
after :create do |project|
|
after :create do |project|
|
||||||
TestEnv.clear_repo_dir(project.namespace, project.path)
|
TestEnv.clear_repo_dir(project.namespace, project.path)
|
||||||
TestEnv.reset_satellite_dir
|
TestEnv.reset_satellite_dir
|
||||||
|
@ -71,6 +44,11 @@ FactoryGirl.define do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
factory :redmine_project, parent: :project do
|
||||||
|
issues_tracker { "redmine" }
|
||||||
|
issues_tracker_id { "project_name_in_redmine" }
|
||||||
|
end
|
||||||
|
|
||||||
factory :group do
|
factory :group do
|
||||||
sequence(:name) { |n| "group#{n}" }
|
sequence(:name) { |n| "group#{n}" }
|
||||||
path { name.downcase.gsub(/\s/, '_') }
|
path { name.downcase.gsub(/\s/, '_') }
|
||||||
|
@ -109,25 +87,45 @@ FactoryGirl.define do
|
||||||
factory :merge_request do
|
factory :merge_request do
|
||||||
title
|
title
|
||||||
author
|
author
|
||||||
source_project factory: :source_project_with_code
|
source_project factory: :project
|
||||||
target_project factory: :target_project_with_code
|
target_project { source_project }
|
||||||
|
|
||||||
|
# → git log stable..master --pretty=oneline
|
||||||
|
# b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828 tree css fixes
|
||||||
|
# 8716fc78f3c65bbf7bcf7b574febd583bc5d2812 Added loading animation for notes
|
||||||
|
# cd5c4bac5042c5469dcdf7e7b2f768d3c6fd7088 notes count for wall
|
||||||
|
# 8470d70da67355c9c009e4401746b1d5410af2e3 notes controller refactored
|
||||||
|
# 1e689bfba39525ead225eaf611948cfbe8ac34cf fixed notes logic
|
||||||
|
# f0f14c8eaba69ebddd766498a9d0b0e79becd633 finished scss refactoring
|
||||||
|
# 3a4b4fb4cde7809f033822a171b9feae19d41fff Moving ui styles to one scss file, Added ui class to body
|
||||||
|
# 065c200c33f68c2bb781e35a43f9dc8138a893b5 removed unnecessary hr tags & titles
|
||||||
|
# 1e8b111be85df0db6c8000ef9a710bc0221eae83 Merge branch 'master' of github.com:gitlabhq/gitlabhq
|
||||||
|
# f403da73f5e62794a0447aca879360494b08f678 Fixed ajax loading image. Fixed wrong wording
|
||||||
|
# e6ea73c77600d413d370249b8e392734f7d1dbee Merge pull request #468 from bencevans/patch-1
|
||||||
|
# 4a3c05b69355deee25767a74d0512ec4b510d4ef Merge pull request #470 from bgondy/patch-1
|
||||||
|
# 0347fe2412eb51d3efeccc35210e9268bc765ac5 Update app/views/projects/team.html.haml
|
||||||
|
# 2b5c61bdece1f7eb2b901ceea7d364065cdf76ac Title for a link fixed
|
||||||
|
# 460eeb13b7560b40104044973ff933b1a6dbbcaa Increased count of notes loaded when visit wall page
|
||||||
|
# 21c141afb1c53a9180a99d2cca29ffa613eb7e3a Merge branch 'notes_refactoring'
|
||||||
|
# 292a41cbe295f16f7148913b31eb0fb91f3251c3 Fixed comments for snippets. Tests fixed
|
||||||
|
# d41d8ffb02fa74fd4571603548bd7e401ec99e0c Reply button, Comments for Merge Request diff
|
||||||
|
# b1a36b552be2a7a6bc57fbed6c52dc6ed82111f8 Merge pull request #466 from skroutz/no-rbenv
|
||||||
|
# db75dae913e8365453ca231f101b067314a7ea71 Merge pull request #465 from skroutz/branches_commit_link
|
||||||
|
# 75f040fbfe4b5af23ff004ad3207c3976df097a8 Don't enforce rbenv version
|
||||||
|
# e42fb4fda475370dcb0d8f8f1268bfdc7a0cc437 Fix broken commit link in branches page
|
||||||
|
# 215a01f63ccdc085f75a48f6f7ab6f2b15b5852c move notes login to one controller
|
||||||
|
# 81092c01984a481e312de10a28e3f1a6dda182a3 Status codes for errors, New error pages
|
||||||
|
# 7d279f9302151e3c8f4c5df9c5200a72799409b9 better error handling for not found resource, gitolite error
|
||||||
|
# 9e6d0710e927aa8ea834b8a9ae9f277be617ac7d Merge pull request #443 from CedricGatay/fix/incorrectLineNumberingInDiff
|
||||||
|
# 6ea87c47f0f8a24ae031c3fff17bc913889ecd00 Incorrect line numbering in diff
|
||||||
|
#
|
||||||
|
# → git log master..stable --pretty=oneline
|
||||||
|
# empty
|
||||||
|
|
||||||
source_branch "master"
|
source_branch "master"
|
||||||
target_branch "stable"
|
target_branch "stable"
|
||||||
|
|
||||||
# pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)
|
|
||||||
trait :with_diffs do
|
trait :with_diffs do
|
||||||
target_branch "master" # pretend bcf03b5d~3
|
|
||||||
source_branch "stable" # pretend bcf03b5d
|
|
||||||
st_commits do
|
|
||||||
[
|
|
||||||
source_project.repository.commit('bcf03b5d').to_hash,
|
|
||||||
source_project.repository.commit('bcf03b5d~1').to_hash,
|
|
||||||
source_project.repository.commit('bcf03b5d~2').to_hash
|
|
||||||
]
|
|
||||||
end
|
|
||||||
st_diffs do
|
|
||||||
source_project.repo.diff("bcf03b5d~3", "bcf03b5d")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
trait :closed do
|
trait :closed do
|
||||||
|
@ -156,7 +154,7 @@ FactoryGirl.define do
|
||||||
factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment]
|
factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment]
|
||||||
|
|
||||||
trait :on_commit do
|
trait :on_commit do
|
||||||
project factory: :project_with_code
|
project factory: :project
|
||||||
commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
|
commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
|
||||||
noteable_type "Commit"
|
noteable_type "Commit"
|
||||||
end
|
end
|
||||||
|
@ -166,7 +164,7 @@ FactoryGirl.define do
|
||||||
end
|
end
|
||||||
|
|
||||||
trait :on_merge_request do
|
trait :on_merge_request do
|
||||||
project factory: :project_with_code
|
project factory: :project
|
||||||
noteable_id 1
|
noteable_id 1
|
||||||
noteable_type "MergeRequest"
|
noteable_type "MergeRequest"
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe "GitLab Flavored Markdown" do
|
describe "GitLab Flavored Markdown" do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:issue) { create(:issue, project: project) }
|
let(:issue) { create(:issue, project: project) }
|
||||||
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
||||||
let(:fred) do
|
let(:fred) do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe "On a merge request", js: true do
|
describe "On a merge request", js: true do
|
||||||
let!(:project) { create(:project_with_code) }
|
let!(:project) { create(:project) }
|
||||||
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
||||||
let!(:note) { create(:note_on_merge_request_with_attachment, project: project) }
|
let!(:note) { create(:note_on_merge_request_with_attachment, project: project) }
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ describe "On a merge request", js: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "On a merge request diff", js: true, focus: true do
|
describe "On a merge request diff", js: true, focus: true do
|
||||||
let!(:project) { create(:source_project_with_code) }
|
let!(:project) { create(:project) }
|
||||||
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
|
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -149,7 +149,7 @@ describe "On a merge request diff", js: true, focus: true do
|
||||||
|
|
||||||
describe "when adding a note" do
|
describe "when adding a note" do
|
||||||
before do
|
before do
|
||||||
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "the notes holder" do
|
describe "the notes holder" do
|
||||||
|
@ -159,23 +159,14 @@ describe "On a merge request diff", js: true, focus: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "the note form" do
|
describe "the note form" do
|
||||||
# FIXME
|
|
||||||
#it 'should be valid' do
|
|
||||||
#within(".js-temp-notes-holder") { find("#note_noteable_type").value.should == "MergeRequest" }
|
|
||||||
#within(".js-temp-notes-holder") { find("#note_noteable_id").value.should == merge_request.id.to_s }
|
|
||||||
#within(".js-temp-notes-holder") { find("#note_commit_id").value.should == "" }
|
|
||||||
#within(".js-temp-notes-holder") { find("#note_line_code").value.should == "4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185" }
|
|
||||||
#should have_css(".js-close-discussion-note-form", text: "Cancel")
|
|
||||||
#end
|
|
||||||
|
|
||||||
it "shouldn't add a second form for same row" do
|
it "shouldn't add a second form for same row" do
|
||||||
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
|
||||||
|
|
||||||
should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder form", count: 1)
|
should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder form", count: 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should be removed when canceled" do
|
it "should be removed when canceled" do
|
||||||
within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185']") do
|
within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185']") do
|
||||||
find(".js-close-discussion-note-form").trigger("click")
|
find(".js-close-discussion-note-form").trigger("click")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -185,11 +176,11 @@ describe "On a merge request diff", js: true, focus: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "with muliple note forms" do
|
describe "with muliple note forms" do
|
||||||
let!(:project) { create(:source_project_with_code) }
|
let!(:project) { create(:project) }
|
||||||
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
|
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
|
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
|
||||||
find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
|
find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -198,7 +189,7 @@ describe "On a merge request diff", js: true, focus: true do
|
||||||
describe "previewing them separately" do
|
describe "previewing them separately" do
|
||||||
before do
|
before do
|
||||||
# add two separate texts and trigger previews on both
|
# add two separate texts and trigger previews on both
|
||||||
within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder") do
|
within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder") do
|
||||||
fill_in "note[note]", with: "One comment on line 185"
|
fill_in "note[note]", with: "One comment on line 185"
|
||||||
find(".js-note-preview-button").trigger("click")
|
find(".js-note-preview-button").trigger("click")
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe "Internal Project Access" do
|
describe "Internal Project Access" do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
let(:master) { create(:user) }
|
let(:master) { create(:user) }
|
||||||
let(:guest) { create(:user) }
|
let(:guest) { create(:user) }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe "Private Project Access" do
|
describe "Private Project Access" do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
let(:master) { create(:user) }
|
let(:master) { create(:user) }
|
||||||
let(:guest) { create(:user) }
|
let(:guest) { create(:user) }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe "Public Project Access" do
|
describe "Public Project Access" do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
let(:master) { create(:user) }
|
let(:master) { create(:user) }
|
||||||
let(:guest) { create(:user) }
|
let(:guest) { create(:user) }
|
||||||
|
|
|
@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
include IssuesHelper
|
include IssuesHelper
|
||||||
|
|
||||||
let!(:project) { create(:project_with_code) }
|
let!(:project) { create(:project) }
|
||||||
|
|
||||||
let(:user) { create(:user, username: 'gfm') }
|
let(:user) { create(:user, username: 'gfm') }
|
||||||
let(:commit) { project.repository.commit }
|
let(:commit) { project.repository.commit }
|
||||||
|
|
|
@ -43,7 +43,7 @@ describe SearchHelper do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "with a current project" do
|
context "with a current project" do
|
||||||
before { @project = create(:project_with_code) }
|
before { @project = create(:project) }
|
||||||
|
|
||||||
it "includes project-specific sections" do
|
it "includes project-specific sections" do
|
||||||
search_autocomplete_opts("Files").size.should == 1
|
search_autocomplete_opts("Files").size.should == 1
|
||||||
|
|
|
@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a project' do
|
context 'with a project' do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
it 'accesses valid user objects on the project team' do
|
it 'accesses valid user objects on the project team' do
|
||||||
@u_foo = create(:user, username: 'foo')
|
@u_foo = create(:user, username: 'foo')
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe 'Gitlab::Satellite::Action' do
|
describe 'Gitlab::Satellite::Action' do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
||||||
describe '#prepare_satellite!' do
|
describe '#prepare_satellite!' do
|
||||||
|
|
|
@ -12,9 +12,10 @@ describe 'Gitlab::Satellite::MergeAction' do
|
||||||
@close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
|
@close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project, namespace: create(:group)) }
|
||||||
|
let(:fork_project) { create(:project, namespace: create(:group)) }
|
||||||
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
|
||||||
let(:merge_request_fork) { create(:merge_request) }
|
let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
|
||||||
|
|
||||||
describe '#commits_between' do
|
describe '#commits_between' do
|
||||||
def verify_commits(commits, first_commit_sha, last_commit_sha)
|
def verify_commits(commits, first_commit_sha, last_commit_sha)
|
||||||
|
|
|
@ -5,7 +5,7 @@ describe Notify do
|
||||||
include EmailSpec::Matchers
|
include EmailSpec::Matchers
|
||||||
|
|
||||||
let(:recipient) { create(:user, email: 'recipient@example.com') }
|
let(:recipient) { create(:user, email: 'recipient@example.com') }
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
shared_examples 'a multiple recipients email' do
|
shared_examples 'a multiple recipients email' do
|
||||||
it 'is sent to the given recipient' do
|
it 'is sent to the given recipient' do
|
||||||
|
|
|
@ -25,7 +25,7 @@ describe AssemblaService do
|
||||||
|
|
||||||
describe "Execute" do
|
describe "Execute" do
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@assembla_service = AssemblaService.new
|
@assembla_service = AssemblaService.new
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Commit do
|
describe Commit do
|
||||||
let(:project) { create :project_with_code }
|
let(:project) { create :project }
|
||||||
let(:commit) { project.repository.commit }
|
let(:commit) { project.repository.commit }
|
||||||
|
|
||||||
describe '#title' do
|
describe '#title' do
|
||||||
|
|
|
@ -25,7 +25,7 @@ describe FlowdockService do
|
||||||
|
|
||||||
describe "Execute" do
|
describe "Execute" do
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@flowdock_service = FlowdockService.new
|
@flowdock_service = FlowdockService.new
|
||||||
|
|
|
@ -73,14 +73,13 @@ describe MergeRequest do
|
||||||
|
|
||||||
describe '#for_fork?' do
|
describe '#for_fork?' do
|
||||||
it 'returns true if the merge request is for a fork' do
|
it 'returns true if the merge request is for a fork' do
|
||||||
subject.source_project = create(:source_project)
|
subject.source_project = create(:project, namespace: create(:group))
|
||||||
subject.target_project = create(:target_project)
|
subject.target_project = create(:project, namespace: create(:group))
|
||||||
|
|
||||||
subject.for_fork?.should be_true
|
subject.for_fork?.should be_true
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns false if is not for a fork' do
|
it 'returns false if is not for a fork' do
|
||||||
subject.source_project = create(:source_project)
|
|
||||||
subject.target_project = subject.source_project
|
|
||||||
subject.for_fork?.should be_false
|
subject.for_fork?.should be_false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -206,7 +206,7 @@ describe Note do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#create_cross_reference_note' do
|
describe '#create_cross_reference_note' do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:author) { create(:user) }
|
let(:author) { create(:user) }
|
||||||
let(:issue) { create(:issue, project: project) }
|
let(:issue) { create(:issue, project: project) }
|
||||||
let(:mergereq) { create(:merge_request, target_project: project) }
|
let(:mergereq) { create(:merge_request, target_project: project) }
|
||||||
|
|
|
@ -128,7 +128,7 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :update_merge_requests do
|
describe :update_merge_requests do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@merge_request = create(:merge_request, source_project: project, target_project: project)
|
@merge_request = create(:merge_request, source_project: project, target_project: project)
|
||||||
|
@ -136,7 +136,7 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should close merge request if last commit from source branch was pushed to target branch" do
|
it "should close merge request if last commit from source branch was pushed to target branch" do
|
||||||
@merge_request.reloaded_commits
|
@merge_request.reload_code
|
||||||
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
|
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
|
||||||
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user)
|
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user)
|
||||||
@merge_request.reload
|
@merge_request.reload
|
||||||
|
@ -144,7 +144,6 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should update merge request commits with new one if pushed to source branch" do
|
it "should update merge request commits with new one if pushed to source branch" do
|
||||||
@merge_request.last_commit.should == nil
|
|
||||||
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
|
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
|
||||||
@merge_request.reload
|
@merge_request.reload
|
||||||
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
|
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
|
||||||
|
@ -156,10 +155,10 @@ describe Project do
|
||||||
context 'with namespace' do
|
context 'with namespace' do
|
||||||
before do
|
before do
|
||||||
@group = create :group, name: 'gitlab'
|
@group = create :group, name: 'gitlab'
|
||||||
@project = create(:project, name: 'gitlab-ci', namespace: @group)
|
@project = create(:project, name: 'gitlabhq', namespace: @group)
|
||||||
end
|
end
|
||||||
|
|
||||||
it { Project.find_with_namespace('gitlab/gitlab-ci').should == @project }
|
it { Project.find_with_namespace('gitlab/gitlabhq').should == @project }
|
||||||
it { Project.find_with_namespace('gitlab-ci').should be_nil }
|
it { Project.find_with_namespace('gitlab-ci').should be_nil }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -168,10 +167,10 @@ describe Project do
|
||||||
context 'with namespace' do
|
context 'with namespace' do
|
||||||
before do
|
before do
|
||||||
@group = create :group, name: 'gitlab'
|
@group = create :group, name: 'gitlab'
|
||||||
@project = create(:project, name: 'gitlab-ci', namespace: @group)
|
@project = create(:project, name: 'gitlabhq', namespace: @group)
|
||||||
end
|
end
|
||||||
|
|
||||||
it { @project.to_param.should == "gitlab/gitlab-ci" }
|
it { @project.to_param.should == "gitlab/gitlabhq" }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -237,7 +236,7 @@ describe Project do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :open_branches do
|
describe :open_branches do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
project.protected_branches.create(name: 'master')
|
project.protected_branches.create(name: 'master')
|
||||||
|
|
|
@ -44,12 +44,12 @@ describe Service do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :can_test do
|
describe :can_test do
|
||||||
it { @testable.should == false }
|
it { @testable.should == true }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "With commits" do
|
describe "With commits" do
|
||||||
let (:project) { create :project_with_code }
|
let (:project) { create :project }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
@service.stub(
|
@service.stub(
|
||||||
|
|
|
@ -4,16 +4,17 @@ describe MergeRequestObserver do
|
||||||
let(:some_user) { create :user }
|
let(:some_user) { create :user }
|
||||||
let(:assignee) { create :user }
|
let(:assignee) { create :user }
|
||||||
let(:author) { create :user }
|
let(:author) { create :user }
|
||||||
|
let(:project) { create :project }
|
||||||
let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object }
|
let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object }
|
||||||
let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, target_project: create(:project)) }
|
let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, source_project: project) }
|
||||||
let(:unassigned_mr) { create(:merge_request, author: author, target_project: create(:project)) }
|
let(:unassigned_mr) { create(:merge_request, author: author, source_project: project) }
|
||||||
let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, target_project: create(:project)) }
|
let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, source_project: project) }
|
||||||
let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, target_project: create(:project)) }
|
let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, source_project: project) }
|
||||||
|
|
||||||
before { subject.stub(:current_user).and_return(some_user) }
|
before { subject.stub(:current_user).and_return(some_user) }
|
||||||
before { subject.stub(notification: double('NotificationService').as_null_object) }
|
before { subject.stub(notification: double('NotificationService').as_null_object) }
|
||||||
before { mr_mock.stub(:author_id) }
|
before { mr_mock.stub(:author_id) }
|
||||||
before { mr_mock.stub(:target_project) }
|
before { mr_mock.stub(:source_project) }
|
||||||
before { mr_mock.stub(:source_project) }
|
before { mr_mock.stub(:source_project) }
|
||||||
before { mr_mock.stub(:project) }
|
before { mr_mock.stub(:project) }
|
||||||
before { mr_mock.stub(:create_cross_references!).and_return(true) }
|
before { mr_mock.stub(:create_cross_references!).and_return(true) }
|
||||||
|
@ -46,7 +47,7 @@ describe MergeRequestObserver do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'is called when a merge request is changed' do
|
it 'is called when a merge request is changed' do
|
||||||
changed = create(:merge_request, source_project: create(:project))
|
changed = create(:merge_request, source_project: project)
|
||||||
subject.should_receive(:after_update)
|
subject.should_receive(:after_update)
|
||||||
|
|
||||||
MergeRequest.observers.enable :merge_request_observer do
|
MergeRequest.observers.enable :merge_request_observer do
|
||||||
|
@ -81,13 +82,13 @@ describe MergeRequestObserver do
|
||||||
context '#after_close' do
|
context '#after_close' do
|
||||||
context 'a status "closed"' do
|
context 'a status "closed"' do
|
||||||
it 'note is created if the merge request is being closed' do
|
it 'note is created if the merge request is being closed' do
|
||||||
Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.target_project, some_user, 'closed', nil)
|
Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.source_project, some_user, 'closed', nil)
|
||||||
|
|
||||||
assigned_mr.close
|
assigned_mr.close
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'notification is delivered only to author if the merge request is being closed' do
|
it 'notification is delivered only to author if the merge request is being closed' do
|
||||||
Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.target_project, some_user, 'closed', nil)
|
Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.source_project, some_user, 'closed', nil)
|
||||||
|
|
||||||
unassigned_mr.close
|
unassigned_mr.close
|
||||||
end
|
end
|
||||||
|
@ -97,13 +98,13 @@ describe MergeRequestObserver do
|
||||||
context '#after_reopen' do
|
context '#after_reopen' do
|
||||||
context 'a status "reopened"' do
|
context 'a status "reopened"' do
|
||||||
it 'note is created if the merge request is being reopened' do
|
it 'note is created if the merge request is being reopened' do
|
||||||
Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.target_project, some_user, 'reopened', nil)
|
Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.source_project, some_user, 'reopened', nil)
|
||||||
|
|
||||||
closed_assigned_mr.reopen
|
closed_assigned_mr.reopen
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'notification is delivered only to author if the merge request is being reopened' do
|
it 'notification is delivered only to author if the merge request is being reopened' do
|
||||||
Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.target_project, some_user, 'reopened', nil)
|
Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.source_project, some_user, 'reopened', nil)
|
||||||
|
|
||||||
closed_unassigned_mr.reopen
|
closed_unassigned_mr.reopen
|
||||||
end
|
end
|
||||||
|
@ -118,20 +119,13 @@ describe MergeRequestObserver do
|
||||||
it { @event.project.should == project }
|
it { @event.project.should == project }
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:project) { create(:project) }
|
|
||||||
before do
|
before do
|
||||||
TestEnv.enable_observers
|
@merge_request = create(:merge_request, source_project: project, source_project: project)
|
||||||
@merge_request = create(:merge_request, source_project: project, target_project: project)
|
|
||||||
@event = Event.last
|
@event = Event.last
|
||||||
end
|
end
|
||||||
|
|
||||||
after do
|
|
||||||
TestEnv.disable_observers
|
|
||||||
end
|
|
||||||
|
|
||||||
it_should_be_valid_event
|
it_should_be_valid_event
|
||||||
it { @event.action.should == Event::CREATED }
|
it { @event.action.should == Event::CREATED }
|
||||||
it { @event.target.should == @merge_request }
|
it { @event.target.should == @merge_request }
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe API::API do
|
||||||
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let!(:project) { create(:project_with_code, namespace: user.namespace ) }
|
let!(:project) { create(:project, namespace: user.namespace ) }
|
||||||
before { project.team << [user, :developer] }
|
before { project.team << [user, :developer] }
|
||||||
|
|
||||||
describe "POST /projects/:id/repository/files" do
|
describe "POST /projects/:id/repository/files" do
|
||||||
|
|
|
@ -5,7 +5,7 @@ describe API::API do
|
||||||
before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
|
before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
|
||||||
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let!(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
|
let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
|
let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
|
||||||
before {
|
before {
|
||||||
project.team << [user, :reporters]
|
project.team << [user, :reporters]
|
||||||
|
@ -47,32 +47,32 @@ describe API::API do
|
||||||
context 'between branches projects' do
|
context 'between branches projects' do
|
||||||
it "should return merge_request" do
|
it "should return merge_request" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
|
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
|
||||||
response.status.should == 201
|
response.status.should == 201
|
||||||
json_response['title'].should == 'Test merge_request'
|
json_response['title'].should == 'Test merge_request'
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 422 when source_branch equals target_branch" do
|
it "should return 422 when source_branch equals target_branch" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
|
title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
|
||||||
response.status.should == 422
|
response.status.should == 422
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when source_branch is missing" do
|
it "should return 400 when source_branch is missing" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
title: "Test merge_request", target_branch: "master", author: user
|
title: "Test merge_request", target_branch: "master", author: user
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when target_branch is missing" do
|
it "should return 400 when target_branch is missing" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
title: "Test merge_request", source_branch: "stable", author: user
|
title: "Test merge_request", source_branch: "stable", author: user
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when title is missing" do
|
it "should return 400 when title is missing" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
target_branch: 'master', source_branch: 'stable'
|
target_branch: 'master', source_branch: 'stable'
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -80,8 +80,8 @@ describe API::API do
|
||||||
context 'forked projects' do
|
context 'forked projects' do
|
||||||
let!(:user2) {create(:user)}
|
let!(:user2) {create(:user)}
|
||||||
let!(:forked_project_link) { build(:forked_project_link) }
|
let!(:forked_project_link) { build(:forked_project_link) }
|
||||||
let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
|
let!(:fork_project) { create(:project, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
|
||||||
let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) }
|
let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
|
||||||
|
|
||||||
before :each do |each|
|
before :each do |each|
|
||||||
fork_project.team << [user2, :reporters]
|
fork_project.team << [user2, :reporters]
|
||||||
|
@ -92,7 +92,7 @@ describe API::API do
|
||||||
|
|
||||||
it "should return merge_request" do
|
it "should return merge_request" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
|
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
|
||||||
response.status.should == 201
|
response.status.should == 201
|
||||||
json_response['title'].should == 'Test merge_request'
|
json_response['title'].should == 'Test merge_request'
|
||||||
end
|
end
|
||||||
|
@ -102,44 +102,44 @@ describe API::API do
|
||||||
fork_project.forked?.should be_true
|
fork_project.forked?.should be_true
|
||||||
fork_project.forked_from_project.should == project
|
fork_project.forked_from_project.should == project
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
|
title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
|
||||||
response.status.should == 201
|
response.status.should == 201
|
||||||
json_response['title'].should == 'Test merge_request'
|
json_response['title'].should == 'Test merge_request'
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when source_branch is missing" do
|
it "should return 400 when source_branch is missing" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
|
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when target_branch is missing" do
|
it "should return 400 when target_branch is missing" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
|
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when title is missing" do
|
it "should return 400 when title is missing" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
|
target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when target_branch is specified and not a forked project" do
|
it "should return 400 when target_branch is specified and not a forked project" do
|
||||||
post api("/projects/#{project.id}/merge_requests", user),
|
post api("/projects/#{project.id}/merge_requests", user),
|
||||||
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
|
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 when target_branch is specified and for a different fork" do
|
it "should return 400 when target_branch is specified and for a different fork" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
|
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
|
||||||
response.status.should == 400
|
response.status.should == 400
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 201 when target_branch is specified and for the same project" do
|
it "should return 201 when target_branch is specified and for the same project" do
|
||||||
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
post api("/projects/#{fork_project.id}/merge_requests", user2),
|
||||||
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
|
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
|
||||||
response.status.should == 201
|
response.status.should == 201
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -170,7 +170,7 @@ describe API::API do
|
||||||
|
|
||||||
it "should return 422 when source_branch and target_branch are renamed the same" do
|
it "should return 422 when source_branch and target_branch are renamed the same" do
|
||||||
put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
|
put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
|
||||||
source_branch: "master", target_branch: "master"
|
source_branch: "master", target_branch: "master"
|
||||||
response.status.should == 422
|
response.status.should == 422
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -198,5 +198,4 @@ describe API::API do
|
||||||
response.status.should == 404
|
response.status.should == 404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,7 @@ describe API::API, 'ProjectHooks' do
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:user3) { create(:user) }
|
let(:user3) { create(:user) }
|
||||||
let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
|
let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
|
let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -9,14 +9,14 @@ describe API::API do
|
||||||
let(:user2) { create(:user) }
|
let(:user2) { create(:user) }
|
||||||
let(:user3) { create(:user) }
|
let(:user3) { create(:user) }
|
||||||
let(:admin) { create(:admin) }
|
let(:admin) { create(:admin) }
|
||||||
let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
|
let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
|
let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
|
||||||
let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
|
let(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
|
||||||
let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
|
let(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
|
||||||
|
|
||||||
before { project.team << [user, :reporter] }
|
|
||||||
|
|
||||||
describe "GET /projects" do
|
describe "GET /projects" do
|
||||||
|
before { project }
|
||||||
|
|
||||||
context "when unauthenticated" do
|
context "when unauthenticated" do
|
||||||
it "should return authentication error" do
|
it "should return authentication error" do
|
||||||
get api("/projects")
|
get api("/projects")
|
||||||
|
@ -36,6 +36,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/all" do
|
describe "GET /projects/all" do
|
||||||
|
before { project }
|
||||||
|
|
||||||
context "when unauthenticated" do
|
context "when unauthenticated" do
|
||||||
it "should return authentication error" do
|
it "should return authentication error" do
|
||||||
get api("/projects/all")
|
get api("/projects/all")
|
||||||
|
@ -174,6 +176,7 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "POST /projects/user/:id" do
|
describe "POST /projects/user/:id" do
|
||||||
|
before { project }
|
||||||
before { admin }
|
before { admin }
|
||||||
|
|
||||||
it "should create new project without path" do
|
it "should create new project without path" do
|
||||||
|
@ -255,6 +258,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/:id" do
|
describe "GET /projects/:id" do
|
||||||
|
before { project }
|
||||||
|
|
||||||
it "should return a project by id" do
|
it "should return a project by id" do
|
||||||
get api("/projects/#{project.id}", user)
|
get api("/projects/#{project.id}", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -282,6 +287,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/:id/events" do
|
describe "GET /projects/:id/events" do
|
||||||
|
before { users_project }
|
||||||
|
|
||||||
it "should return a project events" do
|
it "should return a project events" do
|
||||||
get api("/projects/#{project.id}/events", user)
|
get api("/projects/#{project.id}/events", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -305,6 +312,9 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/:id/members" do
|
describe "GET /projects/:id/members" do
|
||||||
|
before { users_project }
|
||||||
|
before { users_project2 }
|
||||||
|
|
||||||
it "should return project team members" do
|
it "should return project team members" do
|
||||||
get api("/projects/#{project.id}/members", user)
|
get api("/projects/#{project.id}/members", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -328,6 +338,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/:id/members/:user_id" do
|
describe "GET /projects/:id/members/:user_id" do
|
||||||
|
before { users_project }
|
||||||
|
|
||||||
it "should return project team member" do
|
it "should return project team member" do
|
||||||
get api("/projects/#{project.id}/members/#{user.id}", user)
|
get api("/projects/#{project.id}/members/#{user.id}", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -383,6 +395,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "PUT /projects/:id/members/:user_id" do
|
describe "PUT /projects/:id/members/:user_id" do
|
||||||
|
before { users_project2 }
|
||||||
|
|
||||||
it "should update project team member" do
|
it "should update project team member" do
|
||||||
put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
|
put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -407,6 +421,9 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "DELETE /projects/:id/members/:user_id" do
|
describe "DELETE /projects/:id/members/:user_id" do
|
||||||
|
before { users_project }
|
||||||
|
before { users_project2 }
|
||||||
|
|
||||||
it "should remove user from project team" do
|
it "should remove user from project team" do
|
||||||
expect {
|
expect {
|
||||||
delete api("/projects/#{project.id}/members/#{user3.id}", user)
|
delete api("/projects/#{project.id}/members/#{user3.id}", user)
|
||||||
|
@ -425,9 +442,7 @@ describe API::API do
|
||||||
delete api("/projects/#{project.id}/members/#{user3.id}", user)
|
delete api("/projects/#{project.id}/members/#{user3.id}", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
describe "DELETE /projects/:id/members/:user_id" do
|
|
||||||
it "should return 200 OK when the user was not member" do
|
it "should return 200 OK when the user was not member" do
|
||||||
expect {
|
expect {
|
||||||
delete api("/projects/#{project.id}/members/1000000", user)
|
delete api("/projects/#{project.id}/members/1000000", user)
|
||||||
|
@ -439,6 +454,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /projects/:id/snippets" do
|
describe "GET /projects/:id/snippets" do
|
||||||
|
before { snippet }
|
||||||
|
|
||||||
it "should return an array of project snippets" do
|
it "should return an array of project snippets" do
|
||||||
get api("/projects/#{project.id}/snippets", user)
|
get api("/projects/#{project.id}/snippets", user)
|
||||||
response.status.should == 200
|
response.status.should == 200
|
||||||
|
@ -505,6 +522,8 @@ describe API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "DELETE /projects/:id/snippets/:snippet_id" do
|
describe "DELETE /projects/:id/snippets/:snippet_id" do
|
||||||
|
before { snippet }
|
||||||
|
|
||||||
it "should delete existing project snippet" do
|
it "should delete existing project snippet" do
|
||||||
expect {
|
expect {
|
||||||
delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
|
delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
|
||||||
|
@ -657,15 +676,15 @@ describe API::API do
|
||||||
|
|
||||||
describe "GET /projects/search/:query" do
|
describe "GET /projects/search/:query" do
|
||||||
let!(:query) { 'query'}
|
let!(:query) { 'query'}
|
||||||
let!(:search) { create(:project, name: query, creator_id: user.id, namespace: user.namespace) }
|
let!(:search) { create(:empty_project, name: query, creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:pre) { create(:project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
|
let!(:pre) { create(:empty_project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:post) { create(:project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
|
let!(:post) { create(:empty_project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:pre_post) { create(:project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
|
let!(:pre_post) { create(:empty_project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:unfound) { create(:project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
|
let!(:unfound) { create(:empty_project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
|
||||||
let!(:internal) { create(:project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
|
let!(:internal) { create(:empty_project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
|
||||||
let!(:unfound_internal) { create(:project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
|
let!(:unfound_internal) { create(:empty_project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
|
||||||
let!(:public) { create(:project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
let!(:public) { create(:empty_project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
||||||
let!(:unfound_public) { create(:project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
let!(:unfound_public) { create(:empty_project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
|
||||||
|
|
||||||
context "when unauthenticated" do
|
context "when unauthenticated" do
|
||||||
it "should return authentication error" do
|
it "should return authentication error" do
|
||||||
|
|
|
@ -8,7 +8,7 @@ describe API::API do
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:user2) { create(:user) }
|
let(:user2) { create(:user) }
|
||||||
let!(:project) { create(:project_with_code, creator_id: user.id) }
|
let!(:project) { create(:project, creator_id: user.id) }
|
||||||
let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
|
let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
|
||||||
let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) }
|
let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) }
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe API::API do
|
||||||
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
|
let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
|
||||||
|
|
||||||
describe "POST /projects/:id/services/gitlab-ci" do
|
describe "POST /projects/:id/services/gitlab-ci" do
|
||||||
it "should update gitlab-ci settings" do
|
it "should update gitlab-ci settings" do
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe GitPushService do
|
describe GitPushService do
|
||||||
let (:user) { create :user }
|
let (:user) { create :user }
|
||||||
let (:project) { create :project_with_code }
|
let (:project) { create :project }
|
||||||
let (:service) { GitPushService.new }
|
let (:service) { GitPushService.new }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
|
|
@ -2,7 +2,7 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe TestHookService do
|
describe TestHookService do
|
||||||
let (:user) { create :user }
|
let (:user) { create :user }
|
||||||
let (:project) { create :project_with_code }
|
let (:project) { create :project }
|
||||||
let (:hook) { create :project_hook, project: project }
|
let (:hook) { create :project_hook, project: project }
|
||||||
|
|
||||||
describe :execute do
|
describe :execute do
|
||||||
|
|
|
@ -11,7 +11,7 @@ def common_mentionable_setup
|
||||||
|
|
||||||
let(:mentioned_issue) { create :issue, project: mproject }
|
let(:mentioned_issue) { create :issue, project: mproject }
|
||||||
let(:other_issue) { create :issue, project: mproject }
|
let(:other_issue) { create :issue, project: mproject }
|
||||||
let(:mentioned_mr) { create :merge_request, target_project: mproject, source_branch: 'different' }
|
let(:mentioned_mr) { create :merge_request, source_project: mproject, source_branch: 'different' }
|
||||||
let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
|
let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
|
||||||
|
|
||||||
# Override to add known commits to the repository stub.
|
# Override to add known commits to the repository stub.
|
||||||
|
|
|
@ -73,6 +73,10 @@ module TestEnv
|
||||||
version: '6.3.0'
|
version: '6.3.0'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Gitlab::Satellite::MergeAction.any_instance.stub(
|
||||||
|
merge!: true,
|
||||||
|
)
|
||||||
|
|
||||||
Gitlab::Satellite::Satellite.any_instance.stub(
|
Gitlab::Satellite::Satellite.any_instance.stub(
|
||||||
exists?: true,
|
exists?: true,
|
||||||
destroy: true,
|
destroy: true,
|
||||||
|
|
|
@ -9,7 +9,7 @@ describe PostReceive do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "web hook" do
|
context "web hook" do
|
||||||
let(:project) { create(:project_with_code) }
|
let(:project) { create(:project) }
|
||||||
let(:key) { create(:key, user: project.owner) }
|
let(:key) { create(:key, user: project.owner) }
|
||||||
let(:key_id) { key.shell_id }
|
let(:key_id) { key.shell_id }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue