[refs #374] Api v1 base functional and specs

This commit is contained in:
konstantin.grabar 2012-07-31 11:35:27 +04:00
parent f674735c8c
commit f3db00832a
9 changed files with 640 additions and 95 deletions

View File

@ -0,0 +1,3 @@
# -*- encoding : utf-8 -*-
class Api::V1::BaseController < ApplicationController
end

View File

@ -0,0 +1,70 @@
# -*- encoding : utf-8 -*-
class Api::V1::BuildListsController < Api::V1::BaseController
before_filter :authenticate_user!
skip_before_filter :authenticate_user!, :only => [:show, :index] if APP_CONFIG['anonymous_access']
load_and_authorize_resource :project, :only => :index
load_and_authorize_resource :build_list, :only => [:create, :cancel, :publish, :reject_publish]#, :shallow => true
def index
filter = BuildList::Filter.new(nil, current_user, params[:filter] || {})
@build_lists = filter.find.scoped(:include => [:save_to_platform, :project, :user, :arch])
@build_lists = @build_lists.recent.paginate :page => params[:page], :per_page => params[:per_page]
end
def create
notices, errors = [], []
json_report = {:build_lists => []}
project = Project.find(params[:build_list][:project_id])
platform = Platform.find params[:build_list][:save_to_platform_id]
params[:build_list][:auto_publish] = false if platform.released
Arch.where(:id => params[:arches]).each do |arch|
Platform.main.where(:id => params[:build_for_platforms]).each do |build_for_platform|
build_list = project.build_lists.build(params[:build_list])
build_list.commit_hash = project.repo.commits(build_list.project_version.match(/^latest_(.+)/).to_a.last ||
build_list.project_version).first.id if build_list.project_version
build_list.build_for_platform = build_for_platform; build_list.arch = arch; build_list.user = current_user
build_list.include_repos = build_list.include_repos.select {|ir| build_list.build_for_platform.repository_ids.include? ir.to_i}
build_list.priority = current_user.build_priority # User builds more priority than mass rebuild with zero priority
flash_options = {:project_version => build_list.project_version, :arch => arch.name, :build_for_platform => build_for_platform.name}
if build_list.save
msg = t("flash.build_list.saved", flash_options)
notices << msg
else
msg = t("flash.build_list.save_error", flash_options)
errors << msg
end
json_report[:build_lists] << {"id" => build_list.id, "message" => msg}
end
end
errors << t("flash.build_list.no_arch_or_platform_selected") if errors.blank? and notices.blank?
render :json => json_report.to_json
end
def cancel
if @build_list.cancel
render :json => {:is_canceled => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.cancel_success')}
else
render :json => {:is_canceled => false, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.cancel_fail')}
end
end
def publish
if @build_list.publish
render :json => {:is_published => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.publish_success')}
else
render :json => {:is_published => false, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.publish_fail')}
end
end
def reject_publish
if @build_list.reject_publish
render :json => {:is_reject_published => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.reject_publish_success')}
else
render :json => {:is_reject_published => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => t('layout.build_lists.reject_publish_fail')}
end
end
end

View File

@ -21,25 +21,25 @@ class ApplicationController < ActionController::Base
end end
end end
rescue_from Exception do |exception| #rescue_from Exception do |exception|
respond_to do |format| # respond_to do |format|
format.json { render :json => {:message => t("flash.500_message")}.to_json } # format.json { render :json => {:message => t("flash.500_message")}.to_json }
format.html { redirect_to '/500.html', :alert => t("flash.500_message") } # format.html { redirect_to '/500.html', :alert => t("flash.500_message") }
end # end
end #end
rescue_from Grit::NoSuchPathError, :with => :not_found rescue_from Grit::NoSuchPathError, :with => :not_found
[ActiveRecord::RecordNotFound, #[ActiveRecord::RecordNotFound,
ActionController::RoutingError, # ActionController::RoutingError,
ActionController::UnknownController, # ActionController::UnknownController,
ActionController::UnknownAction].each do |ext| # ActionController::UnknownAction].each do |ext|
rescue_from ext do |exception| # rescue_from ext do |exception|
respond_to do |format| # respond_to do |format|
format.json { render :json => {:message => t("flash.404_message")}.to_json } # format.json { render :json => {:message => t("flash.404_message")}.to_json }
format.html { redirect_to '/404.html', :alert => t("flash.404_message") } # format.html { redirect_to '/404.html', :alert => t("flash.404_message") }
end # end
end # end
end # end
protected protected

View File

@ -41,10 +41,8 @@ class Projects::BuildListsController < Projects::BaseController
def create def create
notices, errors = [], [] notices, errors = [], []
json_report = {:build_lists => []}
@platform = Platform.find params[:build_list][:save_to_platform_id] @platform = Platform.find params[:build_list][:save_to_platform_id]
params[:build_list][:auto_publish] = false if @platform.released params[:build_list][:auto_publish] = false if @platform.released
Arch.where(:id => params[:arches]).each do |arch| Arch.where(:id => params[:arches]).each do |arch|
Platform.main.where(:id => params[:build_for_platforms]).each do |build_for_platform| Platform.main.where(:id => params[:build_for_platforms]).each do |build_for_platform|
@build_list = @project.build_lists.build(params[:build_list]) @build_list = @project.build_lists.build(params[:build_list])
@ -55,29 +53,20 @@ class Projects::BuildListsController < Projects::BaseController
@build_list.priority = current_user.build_priority # User builds more priority than mass rebuild with zero priority @build_list.priority = current_user.build_priority # User builds more priority than mass rebuild with zero priority
flash_options = {:project_version => @build_list.project_version, :arch => arch.name, :build_for_platform => build_for_platform.name} flash_options = {:project_version => @build_list.project_version, :arch => arch.name, :build_for_platform => build_for_platform.name}
if @build_list.save if @build_list.save
msg = t("flash.build_list.saved", flash_options) notices << t("flash.build_list.saved", flash_options)
notices << msg
else else
msg = t("flash.build_list.save_error", flash_options) errors << t("flash.build_list.save_error", flash_options)
errors << msg
end end
json_report[:build_lists] << {"id" => @build_list.id, "message" => msg}
end end
end end
errors << t("flash.build_list.no_arch_or_platform_selected") if errors.blank? and notices.blank? errors << t("flash.build_list.no_arch_or_platform_selected") if errors.blank? and notices.blank?
respond_to do |format| if errors.present?
format.html { @build_list ||= BuildList.new
if errors.present? flash[:error] = errors.join('<br>').html_safe
@build_list ||= BuildList.new render :action => :new
flash[:error] = errors.join('<br>').html_safe else
render :action => :new flash[:notice] = notices.join('<br>').html_safe
else redirect_to project_build_lists_path(@project)
flash[:notice] = notices.join('<br>').html_safe
redirect_to project_build_lists_path(@project)
end
}
format.json { render :json => json_report.to_json }
end end
end end
@ -97,29 +86,20 @@ class Projects::BuildListsController < Projects::BaseController
end end
def cancel def cancel
respond_to do |format| if @build_list.cancel
if @build_list.cancel redirect_to :back, :notice => t('layout.build_lists.cancel_success')
format.html { redirect_to :back, :notice => t('layout.build_lists.cancel_success') } else
format.json { render :json => {:is_canceled => true, :message => t('layout.build_lists.cancel_success')} } redirect_to :back, :notice => t('layout.build_lists.cancel_fail')
else
format.html { redirect_to :back, :notice => t('layout.build_lists.cancel_fail') }
format.json { render :json => {:is_canceled => false, :message => t('layout.build_lists.cancel_fail')} }
end
end end
end end
def publish_build def publish_build
respond_to do |format| if params[:status].to_i == 0 # ok
if params[:status].to_i == 0 # ok @build_list.published
@build_list.published else
format.json { render :json => {:is_published => true, :message => t('layout.build_lists.publish_success')} } @build_list.fail_publish
else
@build_list.fail_publish
format.json { render :json => {:is_published => false, :message => t('layout.build_lists.publish_fail')} }
end
format.html { render :nothing => true, :status => 200 }
end end
render :nothing => true, :status => 200
end end
def status_build def status_build

View File

@ -5,8 +5,10 @@
"id": <%=build_list.id%>, "id": <%=build_list.id%>,
"bs_id": <%=build_list.bs_id.to_json%>, "bs_id": <%=build_list.bs_id.to_json%>,
"name": <%=build_list.name%>, "name": <%=build_list.name%>,
"status": <%=build_list.status%> "status": <%=build_list.status%>,
"url": <%=api_v1_build_list_path(build_list, :format => :json)%>
} }
<% end %> <% end %>
] ],
"url": <%=api_v1_build_lists_path(:format => :json)%>
} }

View File

@ -0,0 +1,42 @@
<%# TODO: May be will be better use .to_json(:only => ...) method for @build_list object %>
{
"build_list": {
"id": <%=@build_list.id%>,
"bs_id": <%=@build_list.bs_id.to_json%>,
"name": "<%=@build_list.name%>",
"container_path": "<%=@build_list.container_path.to_json%>",
"status": <%=@build_list.status%>,
"project_version": "<%=@build_list.project_version%>",
"project_name": "<%=@build_list.project.name%>",
"project_id": <%=@build_list.project_id%>,
"build_for_platform_id": <%=@build_list.build_for_platform_id%>,
"build_for_platform_name": "<%=@build_list.build_for_platform.name%>",
"save_to_platform_id": <%=@build_list.save_to_platform_id%>,
"save_to_platform_name": "<%=@build_list.save_to_platform.name%>",
"arch_name": "<%=@build_list.arch.name%>",
"notified_at": "<%=@build_list.notified_at.to_json%>",
"is_circle": <%=@build_list.is_circle%>,
"update_type": "<%=@build_list.update_type%>",
"build_requires": <%=@build_list.build_requires%>,
"auto_publish": <%=@build_list.auto_publish%>,
"package_version": <%=@build_list.package_version%>,
"commit_hash": <%=@build_list.commit_hash.to_json%>,
"duration": <%=@build_list.duration.to_json%>,
"mass_build_id": <%=@build_list.mass_build_id.to_json%>,
"advisory_id": <%=@build_list.advisory_id.to_json%>,
"user": {
"id": <%=@build_list.user_id%>,
"name": "<%=@build_list.user.name%>",
"url": "<%=user_path(@build_list.user)%>"
},
"additional_repos": [
<% @build_list.additional_repos.each do |repo| %>
{
"id": <%=repo.id%>,
"name": "<%=repo.name%>"
}
<% end if @build_list.additional_repos %>
],
"url": <%=api_v1_build_list_path(@build_list, :format => :json)%>
}
}

View File

@ -1,38 +0,0 @@
<%# TODO: May be will be better use .to_json(:only => ...) method for @build_list object %>
{
"id": <%=@build_list.id%>,
"bs_id": <%=@build_list.bs_id.to_json%>,
"name": "<%=@build_list.name%>",
"container_path": "<%=@build_list.container_path.to_json%>",
"status": <%=@build_list.status%>,
"project_version": "<%=@build_list.project_version%>",
"project_name": "<%=@build_list.project.name%>",
"project_id": <%=@build_list.project_id%>,
"build_for_platform_id": <%=@build_list.build_for_platform_id%>,
"build_for_platform_name": "<%=@build_list.build_for_platform.name%>",
"save_to_platform_id": <%=@build_list.save_to_platform_id%>,
"save_to_platform_name": "<%=@build_list.save_to_platform.name%>",
"arch_name": "<%=@build_list.arch.name%>",
"notified_at": "<%=@build_list.notified_at.to_json%>",
"is_circle": <%=@build_list.is_circle%>,
"update_type": "<%=@build_list.update_type%>",
"build_requires": <%=@build_list.build_requires%>,
"auto_publish": <%=@build_list.auto_publish%>,
"package_version": <%=@build_list.package_version%>,
"commit_hash": <%=@build_list.commit_hash.to_json%>,
"duration": <%=@build_list.duration.to_json%>,
"mass_build_id": <%=@build_list.mass_build_id.to_json%>,
"advisory_id": <%=@build_list.advisory_id.to_json%>,
"user": {
"id": <%=@build_list.user_id%>,
"name": "<%=@build_list.user.name%>"
},
"additional_repos": [
<% @build_list.additional_repos.each do |repo| %>
{
"id": <%=repo.id%>,
"name": "<%=repo.name%>"
}
<% end if @build_list.additional_repos %>
]
}

View File

@ -5,6 +5,18 @@ Rosa::Application.routes.draw do
end end
devise_for :users, :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'} devise_for :users, :controllers => {:omniauth_callbacks => 'users/omniauth_callbacks'}
namespace :api do
namespace :v1 do
resources :build_lists, :only => [:index, :create, :show] do
member {
get :publish
get :reject_publish
get :cancel
}
end
end
end
resources :search, :only => [:index] resources :search, :only => [:index]
get '/forbidden' => 'pages#forbidden', :as => 'forbidden' get '/forbidden' => 'pages#forbidden', :as => 'forbidden'

View File

@ -0,0 +1,474 @@
# -*- encoding : utf-8 -*-
require 'spec_helper'
shared_examples_for 'show build list' do
it 'should be able to perform show action' do
get :show, @show_params
response.should render_template("api/v1/build_lists/show")
end
it 'should be able to perform index action in project scope' do
get :index, :format => :json
response.should render_template("api/v1/build_lists/index")
end
end
shared_examples_for 'not show build list' do
it 'should not be able to perform show action' do
get :show, @show_params
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
it 'should not be able to perform index action in project scope' do
get :index, :format => :json
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
end
shared_examples_for 'create build list' do
before {test_git_commit(@project)}
it 'should create one more build list' do
lambda { post :create, @create_params.deep_merge(:build_list => {:project_version => "latest_master"}) }.should change{ BuildList.count }.by(1)
end
it 'should save correct commit_hash for branch based build' do
post :create, @create_params.deep_merge(:build_list => {:project_version => "latest_master"})
@project.build_lists.last.commit_hash.should == @project.repo.commits('master').last.id
end
it 'should save correct commit_hash for tag based build' do
system("cd #{@project.repo.path} && git tag 4.7.5.3") # TODO REDO through grit
post :create, @create_params.deep_merge(:build_list => {:project_version => "4.7.5.3"})
@project.build_lists.last.commit_hash.should == @project.repo.commits('4.7.5.3').last.id
end
end
shared_examples_for 'not create build list' do
it 'should not be able to perform create action' do
post :create, @create_params
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
it 'should not create one more build list' do
lambda { post :create, @create_params }.should change{ BuildList.count }.by(0)
end
end
describe Api::V1::BuildListsController do
before(:each) do
stub_symlink_methods
# TODO: What a fuck?! Arches doesn't clear after tests finish O_o
Arch.destroy_all
@build_list = FactoryGirl.create(:build_list_core)
@project = @build_list.project
end
context 'crud' do
before(:each) do
platform = FactoryGirl.create(:platform_with_repos)
@create_params = {
:build_list => {
:project_id => @project.id,
:save_to_platform_id => platform.id,
:update_type => 'security',
:include_repos => [platform.repositories.first.id]
},
:arches => [FactoryGirl.create(:arch).id],
:build_for_platforms => [platform.id],
:project_id => @project.id,
:format => :json
}
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
end
context 'for guest' do
if APP_CONFIG['anonymous_access']
it 'should be able to perform index action' do
get :index, :format => :json
response.should be_success
end
else
it 'should not be able to perform index action' do
get :index, :format => :json
response.status.should == 401
end
end
end
context 'for user' do
before(:each) do
@owner_user = @project.owner
@member_user = FactoryGirl.create(:user)
rel = @project.relations.build(:role => 'reader')
rel.actor = @member_user
rel.save
@user = FactoryGirl.create(:user)
set_session_for(@user)
@show_params = {:id => @build_list.id, :format => :json}
end
context "do cancel" do
def do_cancel
get :cancel, :id => @build_list, :format => :json
end
context 'if user is project owner' do
before(:each) {set_session_for(@owner_user)}
context "if it has :build_pending status" do
it "should return correct json message" do
@build_list.update_attribute(:status, BuildList::BUILD_PENDING)
do_cancel
response.body.should == {:is_canceled => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.cancel_success')}.to_json
end
it "should cancel build list" do
@build_list.update_attribute(:status, BuildList::BUILD_PENDING)
do_cancel
@build_list.reload.status.should == BuildList::BUILD_CANCELED
end
end
context "if it has another status" do
it "should return correct json error message" do
@build_list.update_attribute(:status, BuildServer::PROJECT_NOT_FOUND)
do_cancel
# TODO: May be it sends access violation msg!!!
# If we not remove can_cancel? from ability.rb it will be only access violation!
response.body.should == {:is_canceled => false, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.cancel_fail')}.to_json
end
it "should not cancel build list" do
@build_list.update_attribute(:status, BuildServer::PROJECT_NOT_FOUND)
do_cancel
@build_list.reload.status.should == BuildServer::PROJECT_NOT_FOUND
end
end
end
context 'if user is not project owner' do
before(:each) do
@build_list.update_attribute(:status, BuildList::BUILD_PENDING)
do_cancel
end
it "should return access violation message" do
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
it "should not cancel build list" do
@build_list.reload.status.should == BuildList::BUILD_PENDING
end
end
end
context "do publish" do
def do_publish
get :publish, :id => @build_list, :format => :json
end
context 'if user is project owner' do
before(:each) do
set_session_for(@owner_user)
@build_list.update_attribute(:status, BuildList::FAILED_PUBLISH)
do_publish
end
context "if it has :failed_publish status" do
it "should return correct json message" do
response.body.should == {:is_published => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.publish_success')}.to_json
end
it "should cancel build list" do
@build_list.reload.status.should == BuildList::BUILD_PUBLISH
end
end
context "if it has another status" do
before(:each) do
@build_list.update_attribute(:status, BuildServer::PROJECT_NOT_FOUND)
do_publish
end
it "should return correct json error message" do
# TODO: May be it sends access violation msg!!!
# If we not remove can_cancel? from ability.rb it will be only access violation!
response.body.should == {:is_published => false, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.publish_fail')}.to_json
end
it "should not cancel build list" do
@build_list.reload.status.should == BuildServer::PROJECT_NOT_FOUND
end
end
end
context 'if user is not project owner' do
before(:each) do
@build_list.update_attribute(:status, BuildList::FAILED_PUBLISH)
do_publish
end
it "should return access violation message" do
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
it "should not cancel build list" do
@build_list.reload.status.should == BuildList::FAILED_PUBLISH
end
end
end
context "do reject_publish" do
before(:each) do
any_instance_of(BuildList, :current_duration => 100)
end
def do_reject_publish
get :reject_publish, :id => @build_list, :format => :json
end
context 'if user is project owner' do
before(:each) do
set_session_for(@owner_user)
@build_list.update_attribute(:status, BuildServer::SUCCESS)
@build_list.save_to_platform.update_attribute(:released, true)
do_reject_publish
end
context "if it has :failed_publish status" do
it "should return correct json message" do
response.body.should == {:is_reject_published => true, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.reject_publish_success')}.to_json
end
it "should cancel build list" do
@build_list.reload.status.should == BuildList::BUILD_PUBLISH
end
end
context "if it has another status" do
before(:each) do
@build_list.update_attribute(:status, BuildServer::PROJECT_NOT_FOUND)
do_reject_publish
end
it "should return correct json error message" do
# TODO: May be it sends access violation msg!!!
# If we not remove can_cancel? from ability.rb it will be only access violation!
response.body.should == {:is_reject_published => false, :url => api_v1_build_list_path(@build_list, :format => :json), :message => I18n.t('layout.build_lists.reject_publish_fail')}.to_json
end
it "should not cancel build list" do
@build_list.reload.status.should == BuildServer::PROJECT_NOT_FOUND
end
end
end
context 'if user is not project owner' do
before(:each) do
@build_list.update_attribute(:status, BuildServer::SUCCESS)
@build_list.save_to_platform.update_attribute(:released, true)
do_reject_publish
end
it "should return access violation message" do
response.body.should == {"message" => "Access violation to this page!"}.to_json
end
it "should not cancel build list" do
do_reject_publish
@build_list.reload.status.should == BuildServer::SUCCESS
end
end
end
context 'for all build lists' do
before(:each) do
@build_list1 = FactoryGirl.create(:build_list_core)
@build_list2 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :visibility => 'hidden'))
@build_list3 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :owner => @user, :visibility => 'hidden'))
@build_list4 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :visibility => 'hidden'))
@build_list4.project.relations.create :role => 'reader', :actor_id => @user.id, :actor_type => 'User'
end
it 'should be able to perform index action' do
get :index, :format => :json
response.should be_success
end
it 'should show only accessible build_lists' do
get :index, :filter => {:ownership => 'index'}, :format => :json
assigns(:build_lists).should include(@build_list1)
assigns(:build_lists).should_not include(@build_list2)
assigns(:build_lists).should include(@build_list3)
assigns(:build_lists).should include(@build_list4)
end
end
context 'for open project' do
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
context 'if user is project owner' do
before(:each) {set_session_for(@owner_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'create build list'
end
context 'if user is project read member' do
before(:each) {set_session_for(@member_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
end
end
context 'for hidden project' do
before(:each) do
@project.visibility = 'hidden'
@project.save!
end
it_should_behave_like 'not show build list'
it_should_behave_like 'not create build list'
context 'if user is project owner' do
before(:each) {set_session_for(@owner_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'create build list'
end
context 'if user is project read member' do
before(:each) {set_session_for(@member_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
end
end
end
context 'for group' do
before(:each) do
@owner_group = FactoryGirl.create(:group)
@owner_user = FactoryGirl.create(:user)
@owner_group.actors.create :role => 'admin', :actor_id => @owner_user.id, :actor_type => 'User'
@member_group = FactoryGirl.create(:group)
@member_user = FactoryGirl.create(:user)
@member_group.actors.create :role => 'reader', :actor_id => @member_user.id, :actor_type => 'User'
@group = FactoryGirl.create(:group)
@user = FactoryGirl.create(:user)
@group.actors.create :role => 'reader', :actor_id => @user.id, :actor_type => 'User'
@project = FactoryGirl.create(:project, :owner => @owner_group)
@project.relations.create :role => 'reader', :actor_id => @member_group.id, :actor_type => 'Group'
@build_list = FactoryGirl.create(:build_list_core, :project => @project)
set_session_for(@user)
@show_params = {:id => @build_list.id, :format => :json}
end
context 'for all build lists' do
before(:each) do
@build_list1 = FactoryGirl.create(:build_list_core)
@build_list2 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :visibility => 'hidden'))
@build_list3 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :owner => @group, :visibility => 'hidden'))
@build_list4 = FactoryGirl.create(:build_list_core, :project => FactoryGirl.create(:project, :visibility => 'hidden'))
@build_list4.project.relations.create :role => 'reader', :actor_id => @group.id, :actor_type => 'Group'
end
it 'should be able to perform index action' do
get :index, :format => :json
response.should be_success
end
it 'should show only accessible build_lists' do
get :index, :filter => {:ownership => 'index'}, :format => :json
assigns(:build_lists).should include(@build_list1)
assigns(:build_lists).should_not include(@build_list2)
assigns(:build_lists).should include(@build_list3)
assigns(:build_lists).should include(@build_list4)
end
end
context 'for open project' do
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
context 'if user is group owner' do
before(:each) {set_session_for(@owner_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'create build list'
end
context 'if user is group read member' do
before(:each) {set_session_for(@member_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
end
end
context 'for hidden project' do
before(:each) do
#@project.visibility = 'hidden'
#@project.save
@build_list.project.update_attribute(:visibility, 'hidden')
end
it_should_behave_like 'not show build list'
it_should_behave_like 'not create build list'
context 'if user is group owner' do
before(:each) {set_session_for(@owner_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'create build list'
end
context 'if user is group read member' do
before(:each) {set_session_for(@member_user)}
it_should_behave_like 'show build list'
it_should_behave_like 'not create build list'
end
end
end
end
context 'filter' do
before(:each) do
set_session_for FactoryGirl.create(:admin)
@build_list1 = FactoryGirl.create(:build_list_core)
@build_list2 = FactoryGirl.create(:build_list_core)
@build_list3 = FactoryGirl.create(:build_list_core)
@build_list4 = FactoryGirl.create(:build_list_core, :updated_at => (Time.now - 1.day),
:project => @build_list3.project, :save_to_platform => @build_list3.save_to_platform,
:arch => @build_list3.arch)
end
it 'should filter by bs_id' do
get :index, :filter => {:bs_id => @build_list1.bs_id, :project_name => 'fdsfdf', :any_other_field => 'do not matter'}, :format => :json
assigns[:build_lists].should include(@build_list1)
assigns[:build_lists].should_not include(@build_list2)
assigns[:build_lists].should_not include(@build_list3)
end
it 'should filter by project_name' do
get :index, :filter => {:project_name => @build_list2.project.name, :ownership => 'index'}, :format => :json
assigns[:build_lists].should_not include(@build_list1)
assigns[:build_lists].should include(@build_list2)
assigns[:build_lists].should_not include(@build_list3)
end
it 'should filter by project_name and start_date' do
get :index, :filter => {:project_name => @build_list3.project.name, :ownership => 'index',
:"updated_at_start(1i)" => @build_list3.updated_at.year.to_s,
:"updated_at_start(2i)" => @build_list3.updated_at.month.to_s,
:"updated_at_start(3i)" => @build_list3.updated_at.day.to_s}, :format => :json
assigns[:build_lists].should_not include(@build_list1)
assigns[:build_lists].should_not include(@build_list2)
assigns[:build_lists].should include(@build_list3)
assigns[:build_lists].should_not include(@build_list4)
end
end
end