Merge branch 'master' into discussions
Conflicts: app/assets/stylesheets/main.scss app/models/project.rb app/views/notes/_common_form.html.haml app/views/notes/_per_line_form.html.haml lib/gitlab/markdown.rb spec/models/note_spec.rb
This commit is contained in:
commit
db2c15369c
276 changed files with 4466 additions and 2603 deletions
|
@ -59,7 +59,7 @@ describe Event do
|
|||
end
|
||||
|
||||
it { @event.push?.should be_true }
|
||||
it { @event.allowed?.should be_true }
|
||||
it { @event.proper?.should be_true }
|
||||
it { @event.new_branch?.should be_true }
|
||||
it { @event.tag?.should be_false }
|
||||
it { @event.branch_name.should == "master" }
|
||||
|
|
|
@ -42,7 +42,7 @@ describe MergeRequest do
|
|||
|
||||
before do
|
||||
merge_request.stub(:commits) { [merge_request.project.commit] }
|
||||
create(:note, noteable: merge_request.commits.first)
|
||||
create(:note, commit_id: merge_request.commits.first.id, noteable_type: 'Commit')
|
||||
create(:note, noteable: merge_request)
|
||||
end
|
||||
|
||||
|
|
|
@ -80,13 +80,13 @@ describe Note do
|
|||
let!(:commit) { note.noteable }
|
||||
|
||||
it "should be accessible through #noteable" do
|
||||
note.noteable_id.should == commit.id
|
||||
note.commit_id.should == commit.id
|
||||
note.noteable.should be_a(Commit)
|
||||
note.noteable.should == commit
|
||||
end
|
||||
|
||||
it "should save a valid note" do
|
||||
note.noteable_id.should == commit.id
|
||||
note.commit_id.should == commit.id
|
||||
note.noteable == commit
|
||||
end
|
||||
|
||||
|
@ -104,7 +104,7 @@ describe Note do
|
|||
let!(:commit) { note.noteable }
|
||||
|
||||
it "should save a valid note" do
|
||||
note.noteable_id.should == commit.id
|
||||
note.commit_id.should == commit.id
|
||||
note.noteable.id.should == commit.id
|
||||
end
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ describe Project, "Hooks" do
|
|||
it { should include(id: @commit.id) }
|
||||
it { should include(message: @commit.safe_message) }
|
||||
it { should include(timestamp: @commit.date.xmlschema) }
|
||||
it { should include(url: "#{Gitlab.config.url}/#{project.code}/commits/#{@commit.id}") }
|
||||
it { should include(url: "#{Gitlab.config.gitlab.url}/#{project.code}/commit/#{@commit.id}") }
|
||||
|
||||
context "with a author" do
|
||||
subject { @data[:commits].first[:author] }
|
||||
|
|
|
@ -4,38 +4,109 @@ describe Project do
|
|||
describe :authorization do
|
||||
before do
|
||||
@p1 = create(:project)
|
||||
|
||||
@u1 = create(:user)
|
||||
@u2 = create(:user)
|
||||
@u3 = create(:user)
|
||||
@u4 = @p1.chief
|
||||
|
||||
@abilities = Six.new
|
||||
@abilities << Ability
|
||||
end
|
||||
|
||||
describe "read access" do
|
||||
let(:guest_actions) { Ability.project_guest_rules }
|
||||
let(:report_actions) { Ability.project_report_rules }
|
||||
let(:dev_actions) { Ability.project_dev_rules }
|
||||
let(:master_actions) { Ability.project_master_rules }
|
||||
let(:admin_actions) { Ability.project_admin_rules }
|
||||
|
||||
describe "Non member rules" do
|
||||
it "should deny for non-project users any actions" do
|
||||
admin_actions.each do |action|
|
||||
@abilities.allowed?(@u1, action, @p1).should be_false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "Guest Rules" do
|
||||
before do
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::GUEST)
|
||||
end
|
||||
|
||||
it "should allow for project user any guest actions" do
|
||||
guest_actions.each do |action|
|
||||
@abilities.allowed?(@u2, action, @p1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "Report Rules" do
|
||||
before do
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::REPORTER)
|
||||
end
|
||||
|
||||
it { @abilities.allowed?(@u1, :read_project, @p1).should be_false }
|
||||
it { @abilities.allowed?(@u2, :read_project, @p1).should be_true }
|
||||
it "should allow for project user any report actions" do
|
||||
report_actions.each do |action|
|
||||
@abilities.allowed?(@u2, action, @p1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "write access" do
|
||||
describe "Developer Rules" do
|
||||
before do
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::REPORTER)
|
||||
@p1.users_projects.create(project: @p1, user: @u3, project_access: UsersProject::DEVELOPER)
|
||||
end
|
||||
|
||||
it "should deny for developer master-specific actions" do
|
||||
[dev_actions - report_actions].each do |action|
|
||||
@abilities.allowed?(@u2, action, @p1).should be_false
|
||||
end
|
||||
end
|
||||
|
||||
it "should allow for project user any dev actions" do
|
||||
dev_actions.each do |action|
|
||||
@abilities.allowed?(@u3, action, @p1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "Master Rules" do
|
||||
before do
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::DEVELOPER)
|
||||
@p1.users_projects.create(project: @p1, user: @u3, project_access: UsersProject::MASTER)
|
||||
end
|
||||
|
||||
it { @abilities.allowed?(@u1, :write_project, @p1).should be_false }
|
||||
it { @abilities.allowed?(@u2, :write_project, @p1).should be_true }
|
||||
it "should deny for developer master-specific actions" do
|
||||
[master_actions - dev_actions].each do |action|
|
||||
@abilities.allowed?(@u2, action, @p1).should be_false
|
||||
end
|
||||
end
|
||||
|
||||
it "should allow for project user any master actions" do
|
||||
master_actions.each do |action|
|
||||
@abilities.allowed?(@u3, action, @p1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "admin access" do
|
||||
describe "Admin Rules" do
|
||||
before do
|
||||
@p1.users_projects.create(project: @p1, user: @u1, project_access: UsersProject::DEVELOPER)
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::MASTER)
|
||||
@p1.users_projects.create(project: @p1, user: @u2, project_access: UsersProject::DEVELOPER)
|
||||
@p1.users_projects.create(project: @p1, user: @u3, project_access: UsersProject::MASTER)
|
||||
end
|
||||
|
||||
it { @abilities.allowed?(@u1, :admin_project, @p1).should be_false }
|
||||
it { @abilities.allowed?(@u2, :admin_project, @p1).should be_true }
|
||||
it "should deny for masters admin-specific actions" do
|
||||
[admin_actions - master_actions].each do |action|
|
||||
@abilities.allowed?(@u2, action, @p1).should be_false
|
||||
end
|
||||
end
|
||||
|
||||
it "should allow for project owner any admin actions" do
|
||||
admin_actions.each do |action|
|
||||
@abilities.allowed?(@u4, action, @p1).should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -129,6 +129,13 @@ describe Project do
|
|||
it { should respond_to(:execute_hooks) }
|
||||
it { should respond_to(:post_receive_data) }
|
||||
it { should respond_to(:trigger_post_receive) }
|
||||
|
||||
# Namespaced Project Role
|
||||
it { should respond_to(:transfer) }
|
||||
it { should respond_to(:name_with_namespace) }
|
||||
it { should respond_to(:namespace_owner) }
|
||||
it { should respond_to(:chief) }
|
||||
it { should respond_to(:path_with_namespace) }
|
||||
end
|
||||
|
||||
describe 'modules' do
|
||||
|
@ -136,11 +143,12 @@ describe Project do
|
|||
it { should include_module(PushObserver) }
|
||||
it { should include_module(Authority) }
|
||||
it { should include_module(Team) }
|
||||
it { should include_module(NamespacedProject) }
|
||||
end
|
||||
|
||||
it "should return valid url to repo" do
|
||||
project = Project.new(path: "somewhere")
|
||||
project.url_to_repo.should == Gitlab.config.ssh_path + "somewhere.git"
|
||||
project.url_to_repo.should == Gitlab.config.gitolite.ssh_path_prefix + "somewhere.git"
|
||||
end
|
||||
|
||||
it "should return path to repo" do
|
||||
|
@ -150,19 +158,7 @@ describe Project do
|
|||
|
||||
it "returns the full web URL for this repo" do
|
||||
project = Project.new(path: "somewhere")
|
||||
project.web_url.should == "#{Gitlab.config.url}/somewhere"
|
||||
end
|
||||
|
||||
describe :valid_repo? do
|
||||
it "should be valid repo" do
|
||||
project = create(:project)
|
||||
project.valid_repo?.should be_true
|
||||
end
|
||||
|
||||
it "should be invalid repo" do
|
||||
project = Project.new(name: "ok_name", path: "/INVALID_PATH/", path: "NEOK")
|
||||
project.valid_repo?.should be_false
|
||||
end
|
||||
project.web_url.should == "#{Gitlab.config.gitlab.url}/somewhere"
|
||||
end
|
||||
|
||||
describe "last_activity methods" do
|
||||
|
@ -188,85 +184,6 @@ describe Project do
|
|||
end
|
||||
end
|
||||
|
||||
describe "fresh commits" do
|
||||
let(:project) { create(:project) }
|
||||
|
||||
it { project.fresh_commits(3).count.should == 3 }
|
||||
it { project.fresh_commits.first.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a" }
|
||||
it { project.fresh_commits.last.id.should == "f403da73f5e62794a0447aca879360494b08f678" }
|
||||
end
|
||||
|
||||
describe "commits_between" do
|
||||
let(:project) { create(:project) }
|
||||
|
||||
subject do
|
||||
commits = project.commits_between("3a4b4fb4cde7809f033822a171b9feae19d41fff",
|
||||
"8470d70da67355c9c009e4401746b1d5410af2e3")
|
||||
commits.map { |c| c.id }
|
||||
end
|
||||
|
||||
it { should have(3).elements }
|
||||
it { should include("f0f14c8eaba69ebddd766498a9d0b0e79becd633") }
|
||||
it { should_not include("bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a") }
|
||||
end
|
||||
|
||||
describe "Git methods" do
|
||||
let(:project) { create(:project) }
|
||||
|
||||
describe :repo do
|
||||
it "should return valid repo" do
|
||||
project.repo.should be_kind_of(Grit::Repo)
|
||||
end
|
||||
|
||||
it "should return nil" do
|
||||
lambda { Project.new(path: "invalid").repo }.should raise_error(Grit::NoSuchPathError)
|
||||
end
|
||||
|
||||
it "should return nil" do
|
||||
lambda { Project.new.repo }.should raise_error(TypeError)
|
||||
end
|
||||
end
|
||||
|
||||
describe :commit do
|
||||
it "should return first head commit if without params" do
|
||||
project.commit.id.should == project.repo.commits.first.id
|
||||
end
|
||||
|
||||
it "should return valid commit" do
|
||||
project.commit(ValidCommit::ID).should be_valid_commit
|
||||
end
|
||||
|
||||
it "should return nil" do
|
||||
project.commit("+123_4532530XYZ").should be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe :tree do
|
||||
before do
|
||||
@commit = project.commit(ValidCommit::ID)
|
||||
end
|
||||
|
||||
it "should raise error w/o arguments" do
|
||||
lambda { project.tree }.should raise_error
|
||||
end
|
||||
|
||||
it "should return root tree for commit" do
|
||||
tree = project.tree(@commit)
|
||||
tree.contents.size.should == ValidCommit::FILES_COUNT
|
||||
tree.contents.map(&:name).should == ValidCommit::FILES
|
||||
end
|
||||
|
||||
it "should return root tree for commit with correct path" do
|
||||
tree = project.tree(@commit, ValidCommit::C_FILE_PATH)
|
||||
tree.contents.map(&:name).should == ValidCommit::C_FILES
|
||||
end
|
||||
|
||||
it "should return root tree for commit with incorrect path" do
|
||||
project.tree(@commit, "invalid_path").should be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe :update_merge_requests do
|
||||
let(:project) { create(:project) }
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ describe SystemHook do
|
|||
user = create(:user)
|
||||
project = create(:project)
|
||||
with_resque do
|
||||
project.users << user
|
||||
project.add_access(user, :admin)
|
||||
end
|
||||
WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once
|
||||
end
|
||||
|
@ -64,7 +64,7 @@ describe SystemHook do
|
|||
it "project_destroy hook" do
|
||||
user = create(:user)
|
||||
project = create(:project)
|
||||
project.users << user
|
||||
project.add_access(user, :admin)
|
||||
with_resque do
|
||||
project.users_projects.clear
|
||||
end
|
||||
|
|
|
@ -41,7 +41,6 @@ describe User do
|
|||
it { should have_many(:users_projects).dependent(:destroy) }
|
||||
it { should have_many(:projects) }
|
||||
it { should have_many(:groups) }
|
||||
it { should have_many(:my_own_projects).class_name('Project') }
|
||||
it { should have_many(:keys).dependent(:destroy) }
|
||||
it { should have_many(:events).class_name('Event').dependent(:destroy) }
|
||||
it { should have_many(:recent_events).class_name('Event') }
|
||||
|
@ -67,6 +66,10 @@ describe User do
|
|||
it { should ensure_length_of(:bio).is_within(0..255) }
|
||||
end
|
||||
|
||||
describe 'modules' do
|
||||
it { should include_module(Account) }
|
||||
end
|
||||
|
||||
describe "Respond to" do
|
||||
it { should respond_to(:is_admin?) }
|
||||
it { should respond_to(:identifier) }
|
||||
|
|
|
@ -29,6 +29,7 @@ describe UsersProject do
|
|||
it { should validate_uniqueness_of(:user_id).scoped_to(:project_id).with_message(/already exists/) }
|
||||
|
||||
it { should validate_presence_of(:project) }
|
||||
it { should ensure_inclusion_of(:project_access).in_array(UsersProject.access_roles.values) }
|
||||
end
|
||||
|
||||
describe "Delegate methods" do
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue