To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / 4c / 4c87209f1f933df211a435d5f5082b69a9cf19f5.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (10.2 KB)

1
# Redmine - project management software
2
# Copyright (C) 2006-2011  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

    
18
require File.expand_path('../../../test_helper', __FILE__)
19

    
20
class ApiTest::ProjectsTest < ActionController::IntegrationTest
21
  fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
22
           :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
23
           :attachments, :custom_fields, :custom_values, :time_entries, :issue_categories
24

    
25
  def setup
26
    Setting.rest_api_enabled = '1'
27
    set_tmp_attachments_directory
28
  end
29

    
30
  context "GET /projects" do
31
    context ".xml" do
32
      should "return projects" do
33
        get '/projects.xml'
34
        assert_response :success
35
        assert_equal 'application/xml', @response.content_type
36

    
37
        assert_tag :tag => 'projects',
38
          :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}}
39
      end
40
    end
41

    
42
    context ".json" do
43
      should "return projects" do
44
        get '/projects.json'
45
        assert_response :success
46
        assert_equal 'application/json', @response.content_type
47

    
48
        json = ActiveSupport::JSON.decode(response.body)
49
        assert_kind_of Hash, json
50
        assert_kind_of Array, json['projects']
51
        assert_kind_of Hash, json['projects'].first
52
        assert json['projects'].first.has_key?('id')
53
      end
54
    end
55
  end
56

    
57
  context "GET /projects/:id" do
58
    context ".xml" do
59
      # TODO: A private project is needed because should_allow_api_authentication
60
      # actually tests that authentication is *required*, not just allowed
61
      should_allow_api_authentication(:get, "/projects/2.xml")
62

    
63
      should "return requested project" do
64
        get '/projects/1.xml'
65
        assert_response :success
66
        assert_equal 'application/xml', @response.content_type
67

    
68
        assert_tag :tag => 'project',
69
          :child => {:tag => 'id', :content => '1'}
70
        assert_tag :tag => 'custom_field',
71
          :attributes => {:name => 'Development status'}, :content => 'Stable'
72

    
73
        assert_no_tag 'trackers'
74
        assert_no_tag 'issue_categories'
75
      end
76

    
77
      context "with hidden custom fields" do
78
        setup do
79
          ProjectCustomField.find_by_name('Development status').update_attribute :visible, false
80
        end
81

    
82
        should "not display hidden custom fields" do
83
          get '/projects/1.xml'
84
          assert_response :success
85
          assert_equal 'application/xml', @response.content_type
86

    
87
          assert_no_tag 'custom_field',
88
            :attributes => {:name => 'Development status'}
89
        end
90
      end
91

    
92
      should "return categories with include=issue_categories" do
93
        get '/projects/1.xml?include=issue_categories'
94
        assert_response :success
95
        assert_equal 'application/xml', @response.content_type
96

    
97
        assert_tag 'issue_categories',
98
          :attributes => {:type => 'array'},
99
          :child => {
100
            :tag => 'issue_category',
101
            :attributes => {
102
              :id => '2',
103
              :name => 'Recipes'
104
            }
105
          }
106
      end
107

    
108
      should "return trackers with include=trackers" do
109
        get '/projects/1.xml?include=trackers'
110
        assert_response :success
111
        assert_equal 'application/xml', @response.content_type
112

    
113
        assert_tag 'trackers',
114
          :attributes => {:type => 'array'},
115
          :child => {
116
            :tag => 'tracker',
117
            :attributes => {
118
              :id => '2',
119
              :name => 'Feature request'
120
            }
121
          }
122
      end
123
    end
124

    
125
    context ".json" do
126
      should_allow_api_authentication(:get, "/projects/2.json")
127

    
128
      should "return requested project" do
129
        get '/projects/1.json'
130

    
131
        json = ActiveSupport::JSON.decode(response.body)
132
        assert_kind_of Hash, json
133
        assert_kind_of Hash, json['project']
134
        assert_equal 1, json['project']['id']
135
      end
136
    end
137
  end
138

    
139
  context "POST /projects" do
140
    context "with valid parameters" do
141
      setup do
142
        Setting.default_projects_modules = ['issue_tracking', 'repository']
143
        @parameters = {:project => {:name => 'API test', :identifier => 'api-test'}}
144
      end
145

    
146
      context ".xml" do
147
        should_allow_api_authentication(:post,
148
                                        '/projects.xml',
149
                                        {:project => {:name => 'API test', :identifier => 'api-test'}},
150
                                        {:success_code => :created})
151

    
152

    
153
        should "create a project with the attributes" do
154
          assert_difference('Project.count') do
155
            post '/projects.xml', @parameters, :authorization => credentials('admin')
156
          end
157

    
158
          project = Project.first(:order => 'id DESC')
159
          assert_equal 'API test', project.name
160
          assert_equal 'api-test', project.identifier
161
          assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort
162
          assert_equal Tracker.all.size, project.trackers.size
163

    
164
          assert_response :created
165
          assert_equal 'application/xml', @response.content_type
166
          assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s}
167
        end
168

    
169
        should "accept enabled_module_names attribute" do
170
          @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
171

    
172
          assert_difference('Project.count') do
173
            post '/projects.xml', @parameters, :authorization => credentials('admin')
174
          end
175

    
176
          project = Project.first(:order => 'id DESC')
177
          assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
178
        end
179

    
180
        should "accept tracker_ids attribute" do
181
          @parameters[:project].merge!({:tracker_ids => [1, 3]})
182

    
183
          assert_difference('Project.count') do
184
            post '/projects.xml', @parameters, :authorization => credentials('admin')
185
          end
186

    
187
          project = Project.first(:order => 'id DESC')
188
          assert_equal [1, 3], project.trackers.map(&:id).sort
189
        end
190
      end
191
    end
192

    
193
    context "with invalid parameters" do
194
      setup do
195
        @parameters = {:project => {:name => 'API test'}}
196
      end
197

    
198
      context ".xml" do
199
        should "return errors" do
200
          assert_no_difference('Project.count') do
201
            post '/projects.xml', @parameters, :authorization => credentials('admin')
202
          end
203

    
204
          assert_response :unprocessable_entity
205
          assert_equal 'application/xml', @response.content_type
206
          assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"}
207
        end
208
      end
209
    end
210
  end
211

    
212
  context "PUT /projects/:id" do
213
    context "with valid parameters" do
214
      setup do
215
        @parameters = {:project => {:name => 'API update'}}
216
      end
217

    
218
      context ".xml" do
219
        should_allow_api_authentication(:put,
220
                                        '/projects/2.xml',
221
                                        {:project => {:name => 'API update'}},
222
                                        {:success_code => :ok})
223

    
224
        should "update the project" do
225
          assert_no_difference 'Project.count' do
226
            put '/projects/2.xml', @parameters, :authorization => credentials('jsmith')
227
          end
228
          assert_response :ok
229
          assert_equal 'application/xml', @response.content_type
230
          project = Project.find(2)
231
          assert_equal 'API update', project.name
232
        end
233

    
234
        should "accept enabled_module_names attribute" do
235
          @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']})
236

    
237
          assert_no_difference 'Project.count' do
238
            put '/projects/2.xml', @parameters, :authorization => credentials('admin')
239
          end
240
          assert_response :ok
241
          project = Project.find(2)
242
          assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort
243
        end
244

    
245
        should "accept tracker_ids attribute" do
246
          @parameters[:project].merge!({:tracker_ids => [1, 3]})
247

    
248
          assert_no_difference 'Project.count' do
249
            put '/projects/2.xml', @parameters, :authorization => credentials('admin')
250
          end
251
          assert_response :ok
252
          project = Project.find(2)
253
          assert_equal [1, 3], project.trackers.map(&:id).sort
254
        end
255
      end
256
    end
257

    
258
    context "with invalid parameters" do
259
      setup do
260
        @parameters = {:project => {:name => ''}}
261
      end
262

    
263
      context ".xml" do
264
        should "return errors" do
265
          assert_no_difference('Project.count') do
266
            put '/projects/2.xml', @parameters, :authorization => credentials('admin')
267
          end
268

    
269
          assert_response :unprocessable_entity
270
          assert_equal 'application/xml', @response.content_type
271
          assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"}
272
        end
273
      end
274
    end
275
  end
276

    
277
  context "DELETE /projects/:id" do
278
    context ".xml" do
279
      should_allow_api_authentication(:delete,
280
                                      '/projects/2.xml',
281
                                      {},
282
                                      {:success_code => :ok})
283

    
284
      should "delete the project" do
285
        assert_difference('Project.count',-1) do
286
          delete '/projects/2.xml', {}, :authorization => credentials('admin')
287
        end
288
        assert_response :ok
289
        assert_nil Project.find_by_id(2)
290
      end
291
    end
292
  end
293

    
294
  def credentials(user, password=nil)
295
    ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
296
  end
297
end