Skip to content

Commit

Permalink
Merge pull request #1670 from mdeniz/project_controller_spec
Browse files Browse the repository at this point in the history
Project controller spec (part 1)
  • Loading branch information
mdeniz committed Apr 5, 2016
2 parents fa6a3a6 + a5609d5 commit 70c1c94
Show file tree
Hide file tree
Showing 5 changed files with 179 additions and 13 deletions.
8 changes: 2 additions & 6 deletions src/api/app/controllers/webui/project_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,11 @@ def autocomplete_incidents
end

def autocomplete_packages
packages = []
packages = @project.packages.autocomplete(params[:term]).pluck(:name) if @project
render json: packages
render json: @project.packages.autocomplete(params[:term]).pluck(:name)
end

def autocomplete_repositories
repositories = []
repositories = @project.repositories.pluck(:name) if @project
render json: repositories
render json: @project.repositories.pluck(:name)
end

def users
Expand Down
2 changes: 2 additions & 0 deletions src/api/app/controllers/webui/webui_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ def instantiate_controller_and_action_names
@current_controller = controller_name
end

# Needed to hide/render some views to well known spider bots
# FIXME: We should get rid of it
def check_spiders
@spider_bot = request.env.has_key?('HTTP_OBS_SPIDER')
end
Expand Down
170 changes: 167 additions & 3 deletions src/api/spec/controllers/webui/project_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,185 @@
require 'rails_helper'

RSpec.describe Webui::ProjectController do
let(:user_moi) { create(:confirmed_user, login: "moi") }
let(:user_tom) { create(:confirmed_user, login: "tom") }

describe 'CSRF protection' do
before do
# Needed because Rails disables it in test mode by default
ActionController::Base.allow_forgery_protection = true

login(create(:confirmed_user, login: 'tom'))
create(:confirmed_user, login: 'moi')
login(user_tom)
user_moi
end

after do
ActionController::Base.allow_forgery_protection = false
end

it 'will protect forms without authenticity token' do
expect { post :save_person, project: "home:tom" }.to raise_error ActionController::InvalidAuthenticityToken
expect { post :save_person, project: 'home:tom' }.to raise_error ActionController::InvalidAuthenticityToken
end
end

describe 'GET #index' do
context 'showing all projects' do
before do
create(:project, name: 'home:moi')
create(:project, name: 'AnotherProject')
get :index, { show_all: true}
end

it { expect(assigns(:projects).length).to eq(2) }
it { expect(Project.count).to eq(2) }
it { is_expected.to render_template("webui/project/list") }
end

context 'showing not home projects' do
before do
create(:project, name: 'home:moi')
create(:project, name: 'AnotherProject')
get :index, { show_all: false}
end

it { expect(assigns(:projects).length).to eq(1) }
it { expect(Project.count).to eq(2) }
it { is_expected.to render_template("webui/project/list") }
end

context 'showing projects being a spider bot' do
before do
request.env['HTTP_OBS_SPIDER'] = true
get :index
end

it { is_expected.to render_template("webui/project/list_simple") }
end
end

describe 'GET #autocomplete_projects' do
before do
create(:project, name: 'Apache')
create(:project, name: 'Apache2')
create(:project, name: 'openSUSE')
create(:maintenance_incident_project, name: 'ApacheMI')
end

context 'without search term' do
before do
get :autocomplete_projects
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to contain_exactly('Apache', 'Apache2', 'openSUSE') }
it { expect(@json_response).not_to include('ApacheMI') }
end

context 'with search term' do
before do
get :autocomplete_projects, term: 'Apache'
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to contain_exactly('Apache', 'Apache2') }
it { expect(@json_response).not_to include('ApacheMI') }
it { expect(@json_response).not_to include('openSUSE') }
end
end

describe 'GET #autocomplete_incidents' do
before do
create(:project, name: 'Apache')
create(:maintenance_incident_project, name: 'ApacheMI')
get :autocomplete_incidents, term: 'Apache'
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to contain_exactly('ApacheMI') }
it { expect(@json_response).not_to include('Apache') }
end

describe 'GET #autocomplete_packages' do
before do
apache_project = create(:project, name: 'Apache')
create(:package, name: 'Apache_Package', project: apache_project)
create(:package, name: 'Apache2_Package', project: apache_project)
another_project = create(:project, name: 'Another_Project')
create(:package, name: 'Apache_Package_Another_Project', project: another_project)
end

context 'without search term' do
before do
get :autocomplete_packages, project: 'Apache'
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to contain_exactly('Apache_Package', 'Apache2_Package') }
it { expect(@json_response).not_to include('Apache_Package_Another_Project') }
end

context 'with search term' do
before do
get :autocomplete_packages, { project: 'Apache', term: 'Apache2' }
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to contain_exactly('Apache2_Package') }
it { expect(@json_response).not_to include('Apache_Package') }
it { expect(@json_response).not_to include('Apache_Package_Another_Project') }
end
end

describe 'GET #autocomplete_repositories' do
before do
apache_project = create(:project, name: 'Apache')
@repositories = create_list(:repository, 5, { project: apache_project })
get :autocomplete_repositories, project: 'Apache'
@json_response = JSON.parse(response.body)
end

it { expect(@json_response).to match_array(@repositories.map {|r| r.name }) }
end

describe 'GET #users' do
before do
@project = create(:project)
create(:relationship_project_user, project: @project, user: create(:confirmed_user))
create(:relationship_project_user, project: @project, user: create(:confirmed_user))
create(:relationship_project_group, project: @project, group: create(:group))

another_project = create(:project)
create(:relationship_project_user, project: another_project, user: create(:confirmed_user))
create(:relationship_project_group, project: another_project, group: create(:group))
get :users, project: @project
end

it { expect(assigns(:users)).to match_array(@project.users) }
it { expect(assigns(:groups)).to match_array(@project.groups) }
it { expect(assigns(:roles)).to match_array(Role.local_roles) }
end

describe 'GET #subprojects' do
before do
create(:project, name: 'Apache')
@project = create(:project, name: 'Apache:Apache2')
create(:project, name: 'Apache:Apache2:TestSubproject')
create(:project, name: 'Apache:Apache2:TestSubproject2')
create(:project, name: 'Another_Project')
get :subprojects, project: @project
end

it { expect(assigns(:subprojects)).to match_array(@project.subprojects) }
it { expect(assigns(:parentprojects)).to match_array(@project.ancestors) }
end

describe 'GET #new' do
before do
login(user_moi)
get :new, name: 'ProjectName'
end

it { expect(assigns(:project)).to be_a(Project) }
it { expect(assigns(:project).name).to eq('ProjectName') }
end
end
10 changes: 7 additions & 3 deletions src/api/spec/factories/project.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
FactoryGirl.define do
factory :project do
sequence(:name){|n| "#{Faker::Internet.domain_word}#{n}" }
title Faker::Book.title
title { Faker::Book.title }

# remote projects validate additional the description and remoteurl
factory :remote_project do
description Faker::Lorem.sentence
remoteurl Faker::Internet.url
description { Faker::Lorem.sentence }
remoteurl { Faker::Internet.url }
end

factory :project_with_package do
Expand All @@ -26,5 +26,9 @@
create(:lock_flag, status: 'enable', project: project)
end
end

factory :maintenance_incident_project do
kind 'maintenance_incident'
end
end
end
2 changes: 1 addition & 1 deletion src/api/spec/factories/repository.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FactoryGirl.define do
factory :repository do
project
name Faker::Lorem.word
name { Faker::Internet.domain_word }
end
end

0 comments on commit 70c1c94

Please sign in to comment.