Refactor and add tests for News #index API (#7072).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4505 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
aaee26ae22
commit
ac60fc9c1c
|
@ -26,15 +26,26 @@ class NewsController < ApplicationController
|
||||||
accept_key_auth :index
|
accept_key_auth :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@news_pages, @newss = paginate :news,
|
case params[:format]
|
||||||
:per_page => 10,
|
when 'xml', 'json'
|
||||||
:conditions => Project.allowed_to_condition(User.current, :view_news, :project => @project),
|
@offset, @limit = api_offset_and_limit
|
||||||
:include => [:author, :project],
|
else
|
||||||
:order => "#{News.table_name}.created_on DESC"
|
@limit = 10
|
||||||
|
end
|
||||||
|
|
||||||
|
scope = @project ? @project.news.visible : News.visible
|
||||||
|
|
||||||
|
@news_count = scope.count
|
||||||
|
@news_pages = Paginator.new self, @news_count, @limit, params['page']
|
||||||
|
@offset ||= @news_pages.current.offset
|
||||||
|
@newss = scope.all(:include => [:author, :project],
|
||||||
|
:order => "#{News.table_name}.created_on DESC",
|
||||||
|
:offset => @offset,
|
||||||
|
:limit => @limit)
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :layout => false if request.xhr? }
|
format.html { render :layout => false if request.xhr? }
|
||||||
format.xml { render :xml => @newss.to_xml }
|
format.api
|
||||||
format.json { render :json => @newss.to_json }
|
|
||||||
format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
|
format.atom { render_feed(@newss, :title => (@project ? @project.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,6 +29,11 @@ class News < ActiveRecord::Base
|
||||||
acts_as_activity_provider :find_options => {:include => [:project, :author]},
|
acts_as_activity_provider :find_options => {:include => [:project, :author]},
|
||||||
:author_key => :author_id
|
:author_key => :author_id
|
||||||
|
|
||||||
|
named_scope :visible, lambda {|*args| {
|
||||||
|
:include => :project,
|
||||||
|
:conditions => Project.allowed_to_condition(args.first || User.current, :view_news)
|
||||||
|
}}
|
||||||
|
|
||||||
def visible?(user=User.current)
|
def visible?(user=User.current)
|
||||||
!user.nil? && user.allowed_to?(:view_news, project)
|
!user.nil? && user.allowed_to?(:view_news, project)
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
api.array :news, api_meta(:total_count => @news_count, :offset => @offset, :limit => @limit) do
|
||||||
|
@newss.each do |news|
|
||||||
|
api.news do
|
||||||
|
api.id news.id
|
||||||
|
api.project(:id => news.project_id, :name => news.project.name) unless news.project.nil?
|
||||||
|
api.author(:id => news.author_id, :name => news.author.name) unless news.author.nil?
|
||||||
|
|
||||||
|
api.title news.title
|
||||||
|
api.summary news.summary
|
||||||
|
api.description news.description
|
||||||
|
api.created_on news.created_on
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -95,3 +95,7 @@ enabled_modules_024:
|
||||||
name: gantt
|
name: gantt
|
||||||
project_id: 5
|
project_id: 5
|
||||||
id: 24
|
id: 24
|
||||||
|
enabled_modules_025:
|
||||||
|
name: news
|
||||||
|
project_id: 2
|
||||||
|
id: 25
|
||||||
|
|
|
@ -20,3 +20,12 @@ news_002:
|
||||||
summary: eCookbook 1.0 have downloaded 100,000 times
|
summary: eCookbook 1.0 have downloaded 100,000 times
|
||||||
author_id: 2
|
author_id: 2
|
||||||
comments_count: 0
|
comments_count: 0
|
||||||
|
news_003:
|
||||||
|
created_on: 2006-07-19 22:42:58 +02:00
|
||||||
|
project_id: 2
|
||||||
|
title: News on a private project
|
||||||
|
id: 3
|
||||||
|
description: This is a private news
|
||||||
|
summary:
|
||||||
|
author_id: 2
|
||||||
|
comments_count: 0
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
# Redmine - project management software
|
||||||
|
# Copyright (C) 2006-2010 Jean-Philippe Lang
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or
|
||||||
|
# modify it under the terms of the GNU General Public License
|
||||||
|
# as published by the Free Software Foundation; either version 2
|
||||||
|
# of the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
require "#{File.dirname(__FILE__)}/../../test_helper"
|
||||||
|
require 'pp'
|
||||||
|
class ApiTest::NewsTest < ActionController::IntegrationTest
|
||||||
|
fixtures :all
|
||||||
|
|
||||||
|
def setup
|
||||||
|
Setting.rest_api_enabled = '1'
|
||||||
|
end
|
||||||
|
|
||||||
|
context "GET /news" do
|
||||||
|
context ".xml" do
|
||||||
|
should "return news" do
|
||||||
|
get '/news.xml'
|
||||||
|
|
||||||
|
assert_tag :tag => 'news',
|
||||||
|
:attributes => {:type => 'array'},
|
||||||
|
:child => {
|
||||||
|
:tag => 'news',
|
||||||
|
:child => {
|
||||||
|
:tag => 'id',
|
||||||
|
:content => '2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context ".json" do
|
||||||
|
should "return news" do
|
||||||
|
get '/news.json'
|
||||||
|
|
||||||
|
json = ActiveSupport::JSON.decode(response.body)
|
||||||
|
assert_kind_of Hash, json
|
||||||
|
assert_kind_of Array, json['news']
|
||||||
|
assert_kind_of Hash, json['news'].first
|
||||||
|
assert_equal 2, json['news'].first['id']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "GET /projects/:project_id/news" do
|
||||||
|
context ".xml" do
|
||||||
|
should_allow_api_authentication(:get, "/projects/onlinestore/news.xml")
|
||||||
|
|
||||||
|
should "return news" do
|
||||||
|
get '/projects/ecookbook/news.xml'
|
||||||
|
|
||||||
|
assert_tag :tag => 'news',
|
||||||
|
:attributes => {:type => 'array'},
|
||||||
|
:child => {
|
||||||
|
:tag => 'news',
|
||||||
|
:child => {
|
||||||
|
:tag => 'id',
|
||||||
|
:content => '2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context ".json" do
|
||||||
|
should_allow_api_authentication(:get, "/projects/onlinestore/news.json")
|
||||||
|
|
||||||
|
should "return news" do
|
||||||
|
get '/projects/ecookbook/news.json'
|
||||||
|
|
||||||
|
json = ActiveSupport::JSON.decode(response.body)
|
||||||
|
assert_kind_of Hash, json
|
||||||
|
assert_kind_of Array, json['news']
|
||||||
|
assert_kind_of Hash, json['news'].first
|
||||||
|
assert_equal 2, json['news'].first['id']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def credentials(user, password=nil)
|
||||||
|
ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue