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 102 + `name` (required) - new project name
103 103 + `code` (optional) - new project code, uses project name if not set
104 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 112 Will return created project with status `201 Created` on success, or `404 Not
107 113 found` on fail.
... ...
lib/api/projects.rb
... ... @@ -29,14 +29,24 @@ module Gitlab
29 29 # name (required) - name for new project
30 30 # code (optional) - code for new project, uses project name if not set
31 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 38 # Example Request
33 39 # POST /projects
34 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 50 if @project.saved?
41 51 present @project, with: Entities::Project
42 52 else
... ...
spec/factories.rb
... ... @@ -11,6 +11,9 @@ module Factory
11 11 def self.new(type, *args)
12 12 FactoryGirl.build(type, *args)
13 13 end
  14 + def self.attributes(type, *args)
  15 + FactoryGirl.attributes_for(type, *args)
  16 + end
14 17 end
15 18  
16 19 FactoryGirl.define do
... ...
spec/requests/api/projects_spec.rb
... ... @@ -27,38 +27,40 @@ describe Gitlab::API do
27 27  
28 28 describe "POST /projects" do
29 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 64 end
63 65 end
64 66  
... ...