Commit 7c0a1068bf337cd169d11cca764af6b0ceb986b2

Authored by Dmitriy Zaporozhets
2 parents 687dc0dc 9b9dd3f9

Merge pull request #1363 from AlexDenisov/api_create_project_fixes

API create project fixes
doc/api/projects.md
@@ -102,6 +102,12 @@ Parameters: @@ -102,6 +102,12 @@ Parameters:
102 + `name` (required) - new project name 102 + `name` (required) - new project name
103 + `code` (optional) - new project code, uses project name if not set 103 + `code` (optional) - new project code, uses project name if not set
104 + `path` (optional) - new project path, uses project name if not set 104 + `path` (optional) - new project path, uses project name if not set
  105 ++ `description (optional) - short project description
  106 ++ `default_branch` (optional) - 'master' by default
  107 ++ `issues_enabled` (optional) - enabled by default
  108 ++ `wall_enabled` (optional) - enabled by default
  109 ++ `merge_requests_enabled` (optional) - enabled by default
  110 ++ `wiki_enabled` (optional) - enabled by default
105 111
106 Will return created project with status `201 Created` on success, or `404 Not 112 Will return created project with status `201 Created` on success, or `404 Not
107 found` on fail. 113 found` on fail.
lib/api/projects.rb
@@ -29,14 +29,24 @@ module Gitlab @@ -29,14 +29,24 @@ module Gitlab
29 # name (required) - name for new project 29 # name (required) - name for new project
30 # code (optional) - code for new project, uses project name if not set 30 # code (optional) - code for new project, uses project name if not set
31 # path (optional) - path for new project, uses project name if not set 31 # path (optional) - path for new project, uses project name if not set
  32 + # description (optional) - short project description
  33 + # default_branch (optional) - 'master' by default
  34 + # issues_enabled (optional) - enabled by default
  35 + # wall_enabled (optional) - enabled by default
  36 + # merge_requests_enabled (optional) - enabled by default
  37 + # wiki_enabled (optional) - enabled by default
32 # Example Request 38 # Example Request
33 # POST /projects 39 # POST /projects
34 post do 40 post do
35 - project = {}  
36 - project[:name] = params[:name]  
37 - project[:code] = params[:code] || project[:name]  
38 - project[:path] = params[:path] || project[:name]  
39 - @project = Project.create_by_user(project, current_user) 41 + params[:code] ||= params[:name]
  42 + params[:path] ||= params[:name]
  43 + project_attrs = {}
  44 + params.each_pair do |k ,v|
  45 + if Project.attribute_names.include? k
  46 + project_attrs[k] = v
  47 + end
  48 + end
  49 + @project = Project.create_by_user(project_attrs, current_user)
40 if @project.saved? 50 if @project.saved?
41 present @project, with: Entities::Project 51 present @project, with: Entities::Project
42 else 52 else
spec/factories.rb
@@ -11,6 +11,9 @@ module Factory @@ -11,6 +11,9 @@ module Factory
11 def self.new(type, *args) 11 def self.new(type, *args)
12 FactoryGirl.build(type, *args) 12 FactoryGirl.build(type, *args)
13 end 13 end
  14 + def self.attributes(type, *args)
  15 + FactoryGirl.attributes_for(type, *args)
  16 + end
14 end 17 end
15 18
16 FactoryGirl.define do 19 FactoryGirl.define do
spec/requests/api/projects_spec.rb
@@ -27,38 +27,40 @@ describe Gitlab::API do @@ -27,38 +27,40 @@ describe Gitlab::API do
27 27
28 describe "POST /projects" do 28 describe "POST /projects" do
29 it "should create new project without code and path" do 29 it "should create new project without code and path" do
30 - lambda {  
31 - name = "foo"  
32 - post api("/projects", user), {  
33 - name: name  
34 - }  
35 - response.status.should == 201  
36 - json_response["name"].should == name  
37 - json_response["code"].should == name  
38 - json_response["path"].should == name  
39 - }.should change{Project.count}.by(1)  
40 - end  
41 - it "should create new project" do  
42 - lambda {  
43 - name = "foo"  
44 - path = "bar"  
45 - code = "bazz"  
46 - post api("/projects", user), {  
47 - code: code,  
48 - path: path,  
49 - name: name  
50 - }  
51 - response.status.should == 201  
52 - json_response["name"].should == name  
53 - json_response["path"].should == path  
54 - json_response["code"].should == code  
55 - }.should change{Project.count}.by(1)  
56 - end  
57 - it "should not create project without name" do  
58 - lambda {  
59 - post api("/projects", user)  
60 - response.status.should == 404  
61 - }.should_not change{Project.count} 30 + expect { post api("/projects", user), name: 'foo' }.to change {Project.count}.by(1)
  31 + end
  32 +
  33 + it "should not create new project without name" do
  34 + expect { post api("/projects", user) }.to_not change {Project.count}
  35 + end
  36 +
  37 + it "should respond with 201 on success" do
  38 + post api("/projects", user), name: 'foo'
  39 + response.status.should == 201
  40 + end
  41 +
  42 + it "should repsond with 404 on failure" do
  43 + post api("/projects", user)
  44 + response.status.should == 404
  45 + end
  46 +
  47 + it "should assign attributes to project" do
  48 + project = Factory.attributes(:project, {
  49 + path: 'path',
  50 + code: 'code',
  51 + description: Faker::Lorem.sentence,
  52 + default_branch: 'stable',
  53 + issues_enabled: false,
  54 + wall_enabled: false,
  55 + merge_requests_enabled: false,
  56 + wiki_enabled: false
  57 + })
  58 +
  59 + post api("/projects", user), project
  60 +
  61 + project.each_pair do |k,v|
  62 + json_response[k.to_s].should == v
  63 + end
62 end 64 end
63 end 65 end
64 66