diff options
author | Lin Jen-Shin <godfat@godfat.org> | 2016-08-18 19:34:10 +0800 |
---|---|---|
committer | Lin Jen-Shin <godfat@godfat.org> | 2016-08-18 19:34:10 +0800 |
commit | 62127dc95a28d6e7018a72c1a643dbf828a806d4 (patch) | |
tree | 29af38b74b3baf28829a50ddc6aa3186cee94e94 /spec/models | |
parent | 17d0406546885bedf2196c61a5991092b3fbe7c0 (diff) | |
parent | 2c1062f81e3c39cf8a45185c203995a43b91bf65 (diff) | |
download | gitlab-ce-62127dc95a28d6e7018a72c1a643dbf828a806d4.tar.gz |
Merge remote-tracking branch 'upstream/master' into artifacts-from-ref-and-build-name
* upstream/master: (359 commits)
Add new image to show the 'Reset template' button
Refactor description templates documentation
Remove index from pipeline toggles
Hide `Create new list button` on Issues and MRs pages
Remove params from build; general refactor
Style build container box; add check mark to active build
Display jobs as scrolling list in sidebar
Move stages and jobs to build sidebar
Removed vue assets
Move skipped tests to end of array
Remove unused data attributes
Update changelog
Style build dropdowns
Populate dropdowns with current build on pageload
Selecting stage updates builds dropdown
Add data attributes to builds
Change active state of list items; style dropdown items
Hide dropdown if all tests fit on one line; add counter to dropdown
Add overflow tests to dropdown
Order by build status
...
Diffstat (limited to 'spec/models')
-rw-r--r-- | spec/models/board_spec.rb | 12 | ||||
-rw-r--r-- | spec/models/label_spec.rb | 2 | ||||
-rw-r--r-- | spec/models/list_spec.rb | 117 | ||||
-rw-r--r-- | spec/models/merge_request_spec.rb | 79 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 1 | ||||
-rw-r--r-- | spec/models/user_spec.rb | 47 |
6 files changed, 258 insertions, 0 deletions
diff --git a/spec/models/board_spec.rb b/spec/models/board_spec.rb new file mode 100644 index 00000000000..12d29540137 --- /dev/null +++ b/spec/models/board_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +describe Board do + describe 'relationships' do + it { is_expected.to belong_to(:project) } + it { is_expected.to have_many(:lists).order(list_type: :asc, position: :asc).dependent(:delete_all) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:project) } + end +end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb index 2a09063f857..5a5d1a5d60c 100644 --- a/spec/models/label_spec.rb +++ b/spec/models/label_spec.rb @@ -5,8 +5,10 @@ describe Label, models: true do describe 'associations' do it { is_expected.to belong_to(:project) } + it { is_expected.to have_many(:label_links).dependent(:destroy) } it { is_expected.to have_many(:issues).through(:label_links).source(:target) } + it { is_expected.to have_many(:lists).dependent(:destroy) } end describe 'modules' do diff --git a/spec/models/list_spec.rb b/spec/models/list_spec.rb new file mode 100644 index 00000000000..9e1a52011c3 --- /dev/null +++ b/spec/models/list_spec.rb @@ -0,0 +1,117 @@ +require 'rails_helper' + +describe List do + describe 'relationships' do + it { is_expected.to belong_to(:board) } + it { is_expected.to belong_to(:label) } + end + + describe 'validations' do + it { is_expected.to validate_presence_of(:board) } + it { is_expected.to validate_presence_of(:label) } + it { is_expected.to validate_presence_of(:list_type) } + it { is_expected.to validate_presence_of(:position) } + it { is_expected.to validate_numericality_of(:position).only_integer.is_greater_than_or_equal_to(0) } + + it 'validates uniqueness of label scoped to board_id' do + create(:list) + + expect(subject).to validate_uniqueness_of(:label_id).scoped_to(:board_id) + end + + context 'when list_type is set to backlog' do + subject { described_class.new(list_type: :backlog) } + + it { is_expected.not_to validate_presence_of(:label) } + it { is_expected.not_to validate_presence_of(:position) } + end + + context 'when list_type is set to done' do + subject { described_class.new(list_type: :done) } + + it { is_expected.not_to validate_presence_of(:label) } + it { is_expected.not_to validate_presence_of(:position) } + end + end + + describe '#destroy' do + it 'can be destroyed when when list_type is set to label' do + subject = create(:list) + + expect(subject.destroy).to be_truthy + end + + it 'can not be destroyed when list_type is set to backlog' do + subject = create(:backlog_list) + + expect(subject.destroy).to be_falsey + end + + it 'can not be destroyed when when list_type is set to done' do + subject = create(:done_list) + + expect(subject.destroy).to be_falsey + end + end + + describe '#destroyable?' do + it 'retruns true when list_type is set to label' do + subject.list_type = :label + + expect(subject).to be_destroyable + end + + it 'retruns false when list_type is set to backlog' do + subject.list_type = :backlog + + expect(subject).not_to be_destroyable + end + + it 'retruns false when list_type is set to done' do + subject.list_type = :done + + expect(subject).not_to be_destroyable + end + end + + describe '#movable?' do + it 'retruns true when list_type is set to label' do + subject.list_type = :label + + expect(subject).to be_movable + end + + it 'retruns false when list_type is set to backlog' do + subject.list_type = :backlog + + expect(subject).not_to be_movable + end + + it 'retruns false when list_type is set to done' do + subject.list_type = :done + + expect(subject).not_to be_movable + end + end + + describe '#title' do + it 'returns label name when list_type is set to label' do + subject.list_type = :label + subject.label = Label.new(name: 'Development') + + expect(subject.title).to eq 'Development' + end + + it 'returns Backlog when list_type is set to backlog' do + subject.list_type = :backlog + + expect(subject.title).to eq 'Backlog' + end + + it 'returns Done when list_type is set to done' do + subject.list_type = :done + + expect(subject.title).to eq 'Done' + end + end +end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 811e474226f..c57d754d5d0 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -456,6 +456,20 @@ describe MergeRequest, models: true do subject { create :merge_request, :simple } end + describe '#commits_sha' do + let(:commit0) { double('commit0', sha: 'sha1') } + let(:commit1) { double('commit1', sha: 'sha2') } + let(:commit2) { double('commit2', sha: 'sha3') } + + before do + allow(subject.merge_request_diff).to receive(:commits).and_return([commit0, commit1, commit2]) + end + + it 'returns sha of commits' do + expect(subject.commits_sha).to contain_exactly('sha1', 'sha2', 'sha3') + end + end + describe '#pipeline' do describe 'when the source project exists' do it 'returns the latest pipeline' do @@ -480,6 +494,19 @@ describe MergeRequest, models: true do end end + describe '#all_pipelines' do + let!(:pipelines) do + subject.merge_request_diff.commits.map do |commit| + create(:ci_empty_pipeline, project: subject.source_project, sha: commit.id, ref: subject.source_branch) + end + end + + it 'returns a pipelines from source projects with proper ordering' do + expect(subject.all_pipelines).not_to be_empty + expect(subject.all_pipelines).to eq(pipelines.reverse) + end + end + describe '#participants' do let(:project) { create(:project, :public) } @@ -756,4 +783,56 @@ describe MergeRequest, models: true do end end end + + describe '#conflicts_can_be_resolved_in_ui?' do + def create_merge_request(source_branch) + create(:merge_request, source_branch: source_branch, target_branch: 'conflict-start') do |mr| + mr.mark_as_unmergeable + end + end + + it 'returns a falsey value when the MR can be merged without conflicts' do + merge_request = create_merge_request('master') + merge_request.mark_as_mergeable + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a falsey value when the MR does not support new diff notes' do + merge_request = create_merge_request('conflict-resolvable') + merge_request.merge_request_diff.update_attributes(start_commit_sha: nil) + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a falsey value when the conflicts contain a large file' do + merge_request = create_merge_request('conflict-too-large') + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a falsey value when the conflicts contain a binary file' do + merge_request = create_merge_request('conflict-binary-file') + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a falsey value when the conflicts contain a file with ambiguous conflict markers' do + merge_request = create_merge_request('conflict-contains-conflict-markers') + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a falsey value when the conflicts contain a file edited in one branch and deleted in another' do + merge_request = create_merge_request('conflict-missing-side') + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_falsey + end + + it 'returns a truthy value when the conflicts are resolvable in the UI' do + merge_request = create_merge_request('conflict-resolvable') + + expect(merge_request.conflicts_can_be_resolved_in_ui?).to be_truthy + end + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 49418475cfb..3ca7c68d6b3 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -23,6 +23,7 @@ describe Project, models: true do it { is_expected.to have_one(:slack_service).dependent(:destroy) } it { is_expected.to have_one(:pushover_service).dependent(:destroy) } it { is_expected.to have_one(:asana_service).dependent(:destroy) } + it { is_expected.to have_one(:board).dependent(:destroy) } it { is_expected.to have_many(:commit_statuses) } it { is_expected.to have_many(:pipelines) } it { is_expected.to have_many(:builds) } diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 54505f6b822..51e4780e2b1 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -957,6 +957,53 @@ describe User, models: true do end end + describe '#projects_where_can_admin_issues' do + let(:user) { create(:user) } + + it 'includes projects for which the user access level is above or equal to reporter' do + create(:project) + reporter_project = create(:project) + developer_project = create(:project) + master_project = create(:project) + + reporter_project.team << [user, :reporter] + developer_project.team << [user, :developer] + master_project.team << [user, :master] + + expect(user.projects_where_can_admin_issues.to_a).to eq([master_project, developer_project, reporter_project]) + expect(user.can?(:admin_issue, master_project)).to eq(true) + expect(user.can?(:admin_issue, developer_project)).to eq(true) + expect(user.can?(:admin_issue, reporter_project)).to eq(true) + end + + it 'does not include for which the user access level is below reporter' do + project = create(:project) + guest_project = create(:project) + + guest_project.team << [user, :guest] + + expect(user.projects_where_can_admin_issues.to_a).to be_empty + expect(user.can?(:admin_issue, guest_project)).to eq(false) + expect(user.can?(:admin_issue, project)).to eq(false) + end + + it 'does not include archived projects' do + project = create(:project) + project.update_attributes(archived: true) + + expect(user.projects_where_can_admin_issues.to_a).to be_empty + expect(user.can?(:admin_issue, project)).to eq(false) + end + + it 'does not include projects for which issues are disabled' do + project = create(:project) + project.update_attributes(issues_enabled: false) + + expect(user.projects_where_can_admin_issues.to_a).to be_empty + expect(user.can?(:admin_issue, project)).to eq(false) + end + end + describe '#ci_authorized_runners' do let(:user) { create(:user) } let(:runner) { create(:ci_runner) } |