Commit d4543eb5a71bd3aa5bfc24f9fadf07e4fe3d461d
1 parent
611ac727
Exists in
master
and in
4 other branches
Tests fixed
Showing
7 changed files
with
49 additions
and
14 deletions
Show diff stats
app/controllers/projects/snippets_controller.rb
| ... | ... | @@ -23,11 +23,11 @@ class Projects::SnippetsController < Projects::ApplicationController |
| 23 | 23 | end |
| 24 | 24 | |
| 25 | 25 | def new |
| 26 | - @snippet = @project.snippets.new | |
| 26 | + @snippet = @project.snippets.build | |
| 27 | 27 | end |
| 28 | 28 | |
| 29 | 29 | def create |
| 30 | - @snippet = @project.snippets.new(params[:project_snippet]) | |
| 30 | + @snippet = @project.snippets.build(params[:project_snippet]) | |
| 31 | 31 | @snippet.author = current_user |
| 32 | 32 | @snippet.save |
| 33 | 33 | ... | ... |
app/models/ability.rb
| ... | ... | @@ -55,7 +55,7 @@ class Ability |
| 55 | 55 | :read_wiki, |
| 56 | 56 | :read_issue, |
| 57 | 57 | :read_milestone, |
| 58 | - :read_snippet, | |
| 58 | + :read_project_snippet, | |
| 59 | 59 | :read_team_member, |
| 60 | 60 | :read_merge_request, |
| 61 | 61 | :read_note, |
| ... | ... | @@ -68,7 +68,7 @@ class Ability |
| 68 | 68 | def project_report_rules |
| 69 | 69 | project_guest_rules + [ |
| 70 | 70 | :download_code, |
| 71 | - :write_snippet | |
| 71 | + :write_project_snippet | |
| 72 | 72 | ] |
| 73 | 73 | end |
| 74 | 74 | |
| ... | ... | @@ -84,11 +84,11 @@ class Ability |
| 84 | 84 | project_dev_rules + [ |
| 85 | 85 | :push_code_to_protected_branches, |
| 86 | 86 | :modify_issue, |
| 87 | - :modify_snippet, | |
| 87 | + :modify_project_snippet, | |
| 88 | 88 | :modify_merge_request, |
| 89 | 89 | :admin_issue, |
| 90 | 90 | :admin_milestone, |
| 91 | - :admin_snippet, | |
| 91 | + :admin_project_snippet, | |
| 92 | 92 | :admin_team_member, |
| 93 | 93 | :admin_merge_request, |
| 94 | 94 | :admin_note, | ... | ... |
lib/api/projects.rb
| ... | ... | @@ -408,7 +408,7 @@ module Gitlab |
| 408 | 408 | # Example Request: |
| 409 | 409 | # POST /projects/:id/snippets |
| 410 | 410 | post ":id/snippets" do |
| 411 | - authorize! :write_snippet, user_project | |
| 411 | + authorize! :write_project_snippet, user_project | |
| 412 | 412 | required_attributes! [:title, :file_name, :code] |
| 413 | 413 | |
| 414 | 414 | attrs = attributes_for_keys [:title, :file_name] |
| ... | ... | @@ -437,7 +437,7 @@ module Gitlab |
| 437 | 437 | # PUT /projects/:id/snippets/:snippet_id |
| 438 | 438 | put ":id/snippets/:snippet_id" do |
| 439 | 439 | @snippet = user_project.snippets.find(params[:snippet_id]) |
| 440 | - authorize! :modify_snippet, @snippet | |
| 440 | + authorize! :modify_project_snippet, @snippet | |
| 441 | 441 | |
| 442 | 442 | attrs = attributes_for_keys [:title, :file_name] |
| 443 | 443 | attrs[:expires_at] = params[:lifetime] if params[:lifetime].present? |
| ... | ... | @@ -460,7 +460,7 @@ module Gitlab |
| 460 | 460 | delete ":id/snippets/:snippet_id" do |
| 461 | 461 | begin |
| 462 | 462 | @snippet = user_project.snippets.find(params[:snippet_id]) |
| 463 | - authorize! :modify_snippet, user_project | |
| 463 | + authorize! :modify_project_snippet, @snippet | |
| 464 | 464 | @snippet.destroy |
| 465 | 465 | rescue |
| 466 | 466 | end | ... | ... |
spec/helpers/gitlab_markdown_helper_spec.rb
| ... | ... | @@ -10,7 +10,7 @@ describe GitlabMarkdownHelper do |
| 10 | 10 | let(:commit) { CommitDecorator.decorate(project.repository.commit) } |
| 11 | 11 | let(:issue) { create(:issue, project: project) } |
| 12 | 12 | let(:merge_request) { create(:merge_request, project: project) } |
| 13 | - let(:snippet) { create(:snippet, project: project) } | |
| 13 | + let(:snippet) { create(:project_snippet, project: project) } | |
| 14 | 14 | let(:member) { project.users_projects.where(user_id: user).first } |
| 15 | 15 | |
| 16 | 16 | before do |
| ... | ... | @@ -190,8 +190,43 @@ describe GitlabMarkdownHelper do |
| 190 | 190 | describe "referencing a snippet" do |
| 191 | 191 | let(:object) { snippet } |
| 192 | 192 | let(:reference) { "$#{snippet.id}" } |
| 193 | + let(:actual) { "Reference to #{reference}" } | |
| 194 | + let(:expected) { project_snippet_path(project, object) } | |
| 195 | + | |
| 196 | + it "should link using a valid id" do | |
| 197 | + gfm(actual).should match(expected) | |
| 198 | + end | |
| 199 | + | |
| 200 | + it "should link with adjacent text" do | |
| 201 | + # Wrap the reference in parenthesis | |
| 202 | + gfm(actual.gsub(reference, "(#{reference})")).should match(expected) | |
| 203 | + | |
| 204 | + # Append some text to the end of the reference | |
| 205 | + gfm(actual.gsub(reference, "#{reference}, right?")).should match(expected) | |
| 206 | + end | |
| 207 | + | |
| 208 | + it "should keep whitespace intact" do | |
| 209 | + actual = "Referenced #{reference} already." | |
| 210 | + expected = /Referenced <a.+>[^\s]+<\/a> already/ | |
| 211 | + gfm(actual).should match(expected) | |
| 212 | + end | |
| 213 | + | |
| 214 | + it "should not link with an invalid id" do | |
| 215 | + # Modify the reference string so it's still parsed, but is invalid | |
| 216 | + reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2)) | |
| 217 | + gfm(actual).should == actual | |
| 218 | + end | |
| 219 | + | |
| 220 | + it "should include a title attribute" do | |
| 221 | + title = "Snippet: #{object.title}" | |
| 222 | + gfm(actual).should match(/title="#{title}"/) | |
| 223 | + end | |
| 224 | + | |
| 225 | + it "should include standard gfm classes" do | |
| 226 | + css = object.class.to_s.underscore | |
| 227 | + gfm(actual).should match(/class="\s?gfm gfm-snippet\s?"/) | |
| 228 | + end | |
| 193 | 229 | |
| 194 | - include_examples 'referenced object' | |
| 195 | 230 | end |
| 196 | 231 | |
| 197 | 232 | describe "referencing multiple objects" do | ... | ... |
spec/models/project_spec.rb
| ... | ... | @@ -34,7 +34,7 @@ describe Project do |
| 34 | 34 | it { should have_many(:milestones).dependent(:destroy) } |
| 35 | 35 | it { should have_many(:users_projects).dependent(:destroy) } |
| 36 | 36 | it { should have_many(:notes).dependent(:destroy) } |
| 37 | - it { should have_many(:snippets).dependent(:destroy) } | |
| 37 | + it { should have_many(:project_snippets).class_name('ProjectSnippet').dependent(:destroy) } | |
| 38 | 38 | it { should have_many(:deploy_keys).dependent(:destroy) } |
| 39 | 39 | it { should have_many(:hooks).dependent(:destroy) } |
| 40 | 40 | it { should have_many(:wikis).dependent(:destroy) } | ... | ... |
spec/requests/api/notes_spec.rb
| ... | ... | @@ -7,7 +7,7 @@ describe Gitlab::API do |
| 7 | 7 | let!(:project) { create(:project, namespace: user.namespace ) } |
| 8 | 8 | let!(:issue) { create(:issue, project: project, author: user) } |
| 9 | 9 | let!(:merge_request) { create(:merge_request, project: project, author: user) } |
| 10 | - let!(:snippet) { create(:snippet, project: project, author: user) } | |
| 10 | + let!(:snippet) { create(:project_snippet, project: project, author: user) } | |
| 11 | 11 | let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) } |
| 12 | 12 | let!(:merge_request_note) { create(:note, noteable: merge_request, project: project, author: user) } |
| 13 | 13 | let!(:snippet_note) { create(:note, noteable: snippet, project: project, author: user) } | ... | ... |
spec/requests/api/projects_spec.rb
| ... | ... | @@ -9,7 +9,7 @@ describe Gitlab::API do |
| 9 | 9 | let(:admin) { create(:admin) } |
| 10 | 10 | let!(:project) { create(:project, namespace: user.namespace ) } |
| 11 | 11 | let!(:hook) { create(:project_hook, project: project, url: "http://example.com") } |
| 12 | - let!(:snippet) { create(:snippet, author: user, project: project, title: 'example') } | |
| 12 | + let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') } | |
| 13 | 13 | let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) } |
| 14 | 14 | let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) } |
| 15 | 15 | let(:key) { create(:key, project: project) } | ... | ... |