Project

General

Profile

Download (23.5 KB) Statistics
| Branch: | Tag: | Revision:
# encoding: utf-8

require "katello_test_helper"

# rubocop:disable Metrics/MethodLength
module Katello
class Api::V2::ContentViewsControllerTest < ActionController::TestCase
include Support::ForemanTasks::Task

def models
@organization = get_organization
@library = KTEnvironment.find(katello_environments(:library).id)
@dev = KTEnvironment.find(katello_environments(:dev).id)
@staging = KTEnvironment.find(katello_environments(:staging).id)
@library_dev_staging_view = ContentView.find(katello_content_views(:library_dev_staging_view).id)
@library_dev_view = ContentView.find(katello_content_views(:library_dev_view).id)
end

def permissions
@view_permission = :view_content_views
@create_permission = :create_content_views
@update_permission = :edit_content_views
@publish_permission = :publish_content_views
end

def setup
setup_controller_defaults_api
ContentView.any_instance.stubs(:reindex_on_association_change).returns(true)
ContentViewVersion.any_instance.stubs(:package_count).returns(0)
ContentViewVersion.any_instance.stubs(:errata_count).returns(0)
ContentViewVersion.any_instance.stubs(:puppet_module_count).returns(0)

models
permissions
[:package_group_count, :package_count, :puppet_module_count].each do |content_type_count|
Repository.any_instance.stubs(content_type_count).returns(0)
end
end

def test_index
get :index, params: { :organization_id => @organization.id }

assert_response :success
assert_template 'api/v2/content_views/index'
end

def test_index_in_environment
get :index, params: { :organization_id => @organization.id, :environment_id => @dev.id }

assert_response :success
assert_template 'api/v2/content_views/index'
end

def test_index_with_composite_filter
get :index, params: { :organization_id => @organization.id, :composite => true }

assert_response :success
assert_template 'api/v2/content_views/index'
views = JSON.parse(response.body)['results']
assert views.length > 0
assert views.all? { |view| view["composite"] }
end

def test_index_fail_without_organization_id
get :index

assert_response :success
assert_template 'api/v2/content_views/index'
end

def test_index_protected
allowed_perms = [@view_permission]
denied_perms = [@create_permission, @update_permission, :destroy_content_views]

assert_protected_action(:index, allowed_perms, denied_perms, [@organization]) do
get :index, params: { :organization_id => @organization.id }
end
end

def test_create
post :create, params: { :name => "My View", :label => "My_View", :description => "Cool", :organization_id => @organization.id }

assert_response :success
assert_template :layout => 'katello/api/v2/layouts/resource'
assert_template 'katello/api/v2/common/create'
end

def test_create_fail_without_organization_id
post :create, params: { :name => "My View", :label => "My_View", :description => "Cool" }

assert_response :not_found
end

def test_create_protected
allowed_perms = [@create_permission]
denied_perms = [@view_permission, @update_permission, :destroy_content_views]

assert_protected_action(:create, allowed_perms, denied_perms, [@organization]) do
post :create, params: { :name => "Test", :organization_id => @organization.id }
end
end

def test_create_with_non_json_request
@request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
post :create, params: { :name => "My View", :description => "Cool", :organization_id => @organization.id }

assert_response 415
end

def test_show
get :show, params: { :id => @library_dev_staging_view.id }

assert_response :success
assert_template 'api/v2/content_views/show'
end

def test_show_protected
allowed_perms = [@view_permission]
denied_perms = [@create_permission, @update_permission, :destroy_content_views]

assert_protected_action(:show, allowed_perms, denied_perms) do
get :show, params: { :id => @library_dev_staging_view.id }
end
end

def test_update
params = { :name => "My View", :description => "New description" }
assert_sync_task(::Actions::Katello::ContentView::Update) do |_content_view, content_view_params|
content_view_params.key?(:name).must_equal true
content_view_params[:name].must_equal params[:name]
content_view_params.key?(:description).must_equal true
content_view_params[:description].must_equal params[:description]
end
put :update, params: { :id => @library_dev_staging_view.id, :content_view => params }

assert_response :success
assert_template layout: 'katello/api/v2/layouts/resource'
assert_template 'katello/api/v2/common/update'
end

def test_update_repositories
repository = katello_repositories(:fedora_17_unpublished)

params = { :repository_ids => [repository.id.to_s] }
assert_sync_task(::Actions::Katello::ContentView::Update) do |_content_view, content_view_params|
content_view_params.key?(:repository_ids).must_equal true
content_view_params[:repository_ids].must_equal params[:repository_ids]
end
put :update, params: { :id => @library_dev_staging_view.id, :content_view => params }

assert_response :success
assert_template layout: 'katello/api/v2/layouts/resource'
assert_template 'katello/api/v2/common/update'
end

def test_update_components
version = @library_dev_staging_view.versions.first
composite = ContentView.find(katello_content_views(:composite_view).id)

params = { :component_ids => [version.id.to_s] }
assert_sync_task(::Actions::Katello::ContentView::Update) do |_content_view, content_view_params|
content_view_params.key?(:component_ids).must_equal true
content_view_params[:component_ids].must_equal params[:component_ids]
content_view_params[:repository_ids].must_be_nil
end
put :update, params: { :id => composite.id, :content_view => params }

assert_response :success
assert_template layout: 'katello/api/v2/layouts/resource'
assert_template 'katello/api/v2/common/update'
end

def test_update_protected
allowed_perms = [@update_permission]
denied_perms = [@view_permission, @create_permission, :destroy_content_views]

assert_protected_action(:update, allowed_perms, denied_perms) do
put :update, params: { :id => @library_dev_staging_view.id, :name => "new name" }
end
end

def test_available_puppet_modules
get :available_puppet_modules, params: { :id => @library_dev_staging_view.id }

assert_response :success
assert_template 'katello/api/v2/content_views/puppet_modules'
end

def test_available_puppet_modules_filtered_order
# the UI relies on these being ordered by author/name/version
create(:puppet_module, :version => "1.12.0")
create(:puppet_module, :version => "1.3.0")
PuppetModule.stubs(:in_repositories).returns(PuppetModule.all)

get :available_puppet_modules, params: { :id => @library_dev_staging_view.id, :name => "trystero" }

results = JSON.parse(response.body)['results']
assert_equal '1.12.0', results.first['version']
end

def test_available_puppet_modules_with_use_latest
create(:puppet_module, :version => "1.2.0")
create(:puppet_module, :version => "1.3.0")
PuppetModule.stubs(:in_repositories).returns(PuppetModule.all)

get :available_puppet_modules, params: { :id => @library_dev_staging_view.id, :name => "trystero" }
results = JSON.parse(response.body)['results']

assert_equal '1.3.0', results.first['version']
use_latest_rec = results.last
assert_equal 'Always Use Latest (currently 1.3.0)', use_latest_rec['version']
assert_nil use_latest_rec['uuid']
end

def test_available_puppet_modules_when_latest_module_already_selected
content_view = katello_content_views(:library_view)
create(:puppet_module, :name => 'm1', :author => 'kavy', :version => "1.2.0")
puppet_module2 = create(:puppet_module, :name => 'm1', :author => 'kavy', :version => "1.3.0")
cv_puppet_module = ContentViewPuppetModule.find(katello_content_view_puppet_modules(:library_view_m1_module).id)
cv_puppet_module.uuid = puppet_module2.uuid
cv_puppet_module.save
PuppetModule.stubs(:in_repositories).returns(PuppetModule.all)
get :available_puppet_modules, params: { :id => content_view.id, :name => 'm1' }
results = JSON.parse(response.body)['results']
assert_equal '1.2.0', results.first['version']
assert_equal 2, results.count
assert_match(/\(currently 1\.3\.0\)/, results.last['version'])
end

def test_available_puppet_modules_protected
allowed_perms = [@view_permission]
denied_perms = [@create_permission, @update_permission, :destroy_content_views]

assert_protected_action(:available_puppet_modules, allowed_perms, denied_perms) do
get :available_puppet_modules, params: { :id => @library_dev_staging_view.id }
end
end

def test_available_puppet_module_names
get :available_puppet_module_names, params: { :id => @library_dev_staging_view.id }

assert_response :success
assert_template 'katello/api/v2/content_views/../puppet_modules/names'
end

def test_available_puppet_module_names_protected
allowed_perms = [@view_permission]
denied_perms = [@create_permission, @update_permission, :destroy_content_views]

assert_protected_action(:available_puppet_module_names, allowed_perms, denied_perms) do
get :available_puppet_module_names, params: { :id => @library_dev_staging_view.id }
end
end

def test_publish_default_view
view = ContentView.find(katello_content_views(:acme_default).id)
version_count = view.versions.count
post :publish, params: { :id => view.id }
assert_response 400
assert_equal version_count, view.versions.reload.count
end

def test_destroy
view = ContentView.create!(:name => "Cat",
:organization => @organization
)
delete :destroy, params: { :id => view.id }
assert_response :success
end

def test_destroy_protected
diff_view = ContentView.find(katello_content_views(:candlepin_default_cv).id)
diff_view_destroy_permission = {:name => :destroy_content_views, :search => "name=\"#{diff_view.name}\"" }

allowed_perms = [:destroy_content_views]
denied_perms = [@view_permission, @create_permission, @update_permission, diff_view_destroy_permission]

assert_protected_action(:destroy, allowed_perms, denied_perms) do
delete :destroy, params: { :id => @library_dev_staging_view.id }
end
end

def test_copy
post :copy, params: { :id => @library_dev_staging_view.id, :name => "My New View" }

assert_response :success
assert_template "katello/api/v2/content_views/copy"
end

def test_copy_protected
allowed_perms = [@create_permission]
denied_perms = [@view_permission, @update_permission, :destroy_content_views]

assert_protected_action(:create, allowed_perms, denied_perms) do
post :copy, params: { :id => @library_dev_staging_view.id, :name => "Test" }
end
end

def test_remove_from_environment
refute @library_dev_view.environments.include?(@staging)
delete :remove_from_environment, params: { id: @library_dev_view.id, environment_id: @staging.id }
assert_response 400
end

def test_remove_from_environment_protected
dev_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments, :search => "name=\"#{@dev.name}\"" }
library_dev_staging_view_remove_permission = {:name => :promote_or_remove_content_views, :search => "name=\"#{@library_dev_staging_view.name}\"" }

diff_view = ContentView.find(katello_content_views(:candlepin_default_cv).id)
diff_env = @staging
diff_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments, :search => "name=\"#{diff_env.name}\"" }
diff_view_remove_permission = {:name => :promote_or_remove_content_views, :search => "name=\"#{diff_view.name}\"" }

allowed_perms = [[:promote_or_remove_content_views_to_environments, :promote_or_remove_content_views],
[dev_env_remove_permission, library_dev_staging_view_remove_permission],
[dev_env_remove_permission, :promote_or_remove_content_views],
[:promote_or_remove_content_views_to_environments, library_dev_staging_view_remove_permission]
]
denied_perms = [@view_permission,
@create_permission,
@update_permission,
:destroy_content_views,
:promote_or_remove_content_views_to_environments,
:promote_or_remove_content_views,
[diff_env_remove_permission, :promote_or_remove_content_views],
[:promote_or_remove_content_views_to_environments, diff_view_remove_permission]
]

assert_protected_action(:remove_from_environment, allowed_perms, denied_perms) do
delete :remove_from_environment, params: { :id => @library_dev_staging_view.id, :environment_id => @dev.id }
end
end

def test_remove_protected
input_envs_remove_permission = {:name => :promote_or_remove_content_views_to_environments, :search => "name=\"#{@dev.name}\" or name=\"#{@staging.name}\"" }
single_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments, :search => "name=\"#{@dev.name}\"" }

library_dev_staging_view_remove_permission = {:name => :promote_or_remove_content_views, :search => "name=\"#{@library_dev_staging_view.name}\"" }

library_dev_staging_view_destroy_permission = {:name => :destroy_content_views, :search => "name=\"#{@library_dev_staging_view.name}\"" }

diff_view = ContentView.find(katello_content_views(:candlepin_default_cv).id)
diff_env = KTEnvironment.find(katello_environments(:dev_path1).id)

diff_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments, :search => "name=\"#{diff_env.name}\"" }
diff_view_remove_permission = {:name => :promote_or_remove_content_views, :search => "name=\"#{diff_view.name}\"" }

allowed_perms = [[:promote_or_remove_content_views_to_environments, :promote_or_remove_content_views],
[:promote_or_remove_content_views_to_environments, :promote_or_remove_content_views, :destroy_content_views],
[input_envs_remove_permission, library_dev_staging_view_remove_permission],
[input_envs_remove_permission, library_dev_staging_view_remove_permission, library_dev_staging_view_destroy_permission],
[input_envs_remove_permission, :promote_or_remove_content_views],
[:promote_or_remove_content_views_to_environments, library_dev_staging_view_remove_permission]
]
denied_perms = [@view_permission,
@create_permission,
@update_permission,
:destroy_content_views,
:promote_or_remove_content_views_to_environments,
:promote_or_remove_content_views,
[diff_env_remove_permission, :promote_or_remove_content_views],
[single_env_remove_permission, :promote_or_remove_content_views],
[:promote_or_remove_content_views_to_environments, diff_view_remove_permission]
]

env_ids = [@dev.id.to_s, @staging.id.to_s]
::Katello::Host::ContentFacet.expects(:where).at_least_once.returns([]).with do |args|
args[:content_view_id].id == @library_dev_staging_view.id && args[:lifecycle_environment_id] == env_ids
end

Katello::ActivationKey.expects(:where).at_least_once.returns([]).with do |args|
args[:content_view_id].id == @library_dev_staging_view.id && args[:environment_id] == env_ids
end

assert_protected_action(:remove, allowed_perms, denied_perms) do
put :remove, params: { :id => @library_dev_staging_view.id, :environment_ids => env_ids }
end
end

def test_remove_protected_with_no_environment_ids
library_dev_staging_view_destroy_permission = {:name => :destroy_content_views, :search => "name=\"#{@library_dev_staging_view.name}\"" }

diff_view = ContentView.find(katello_content_views(:candlepin_default_cv).id)
diff_view_destroy_permission = {:name => :destroy_content_views, :search => "name=\"#{diff_view.name}\"" }

allowed_perms = [:destroy_content_views, library_dev_staging_view_destroy_permission]

denied_perms = [@view_permission,
@create_permission,
@update_permission,
diff_view_destroy_permission,
[:promote_or_remove_content_views_to_environments, :promote_or_remove_content_views]
]

assert_protected_action(:remove, allowed_perms, denied_perms) do
put :remove, params: { :id => @library_dev_staging_view.id, :content_view_version_ids => [@library_dev_staging_view.version(@dev).id,
@library_dev_staging_view.version(@staging).id] }
end
end

def test_remove_protected_envs_with_host
content_view = katello_content_views(:library_dev_view)
environment = katello_environments(:library)

host = FactoryBot.create(:host, :with_content, :with_subscription, :content_view => content_view,
:lifecycle_environment => environment)

host_edit_permission = {:name => :edit_hosts, :search => "name=\"#{host.name}\"" }

host_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments,
:search => "name=\"#{environment.name}\"" }

host_cv_remove_permission = {:name => :promote_or_remove_content_views,
:search => "name=\"#{content_view.name}\"" }

alternate_env = @staging
alternate_env_read_permission = {:name => :view_lifecycle_environments,
:search => "name=\"#{alternate_env.name}\"" }

alternate_cv = @library_dev_staging_view
alternate_cv_read_permission = {:name => :view_content_views,
:search => "name=\"#{alternate_cv.name}\"" }

bad_cv = ContentView.find(katello_content_views(:candlepin_default_cv).id)
bad_cv_read_permission = {:name => :view_content_views,
:search => "name=\"#{bad_cv.name}\"" }

bad_env = KTEnvironment.find(katello_environments(:dev_path1).id)
bad_env_read_permission = {:name => :view_lifecycle_environments,
:search => "name=\"#{bad_env.name}\"" }

allowed_perms = [[:edit_hosts, :promote_or_remove_content_views, :view_content_views,
:promote_or_remove_content_views_to_environments, :view_lifecycle_environments],
[host_edit_permission, host_cv_remove_permission, host_env_remove_permission,
alternate_env_read_permission, alternate_cv_read_permission]
]

denied_perms = [[:edit_hosts, :promote_or_remove_content_views,
:promote_or_remove_content_views_to_environments, :view_lifecycle_environments],
[host_edit_permission, host_cv_remove_permission, host_env_remove_permission,
bad_env_read_permission, alternate_cv_read_permission],
[host_edit_permission, host_cv_remove_permission, host_env_remove_permission,
alternate_env_read_permission, bad_cv_read_permission]
]

env_ids = [environment.id.to_s]

Katello::ActivationKey.expects(:where).at_least_once.returns([]).with do |args|
args[:content_view_id].id == content_view.id && args[:environment_id] == env_ids
end

assert_protected_action(:remove, allowed_perms, denied_perms) do
User.current.update_attribute(:organizations, [host.organization])
User.current.update_attribute(:locations, [host.location])
put :remove, params: { :id => content_view.id, :environment_ids => env_ids, :system_content_view_id => alternate_cv.id, :system_environment_id => alternate_env.id }
end
end

def test_remove_protected_envs_with_activation_keys
ak = ActivationKey.find(katello_activation_keys(:library_dev_staging_view_key).id)
ak_edit_permission = {:name => :edit_activation_keys, :search => "name=\"#{ak.name}\"" }

ak_env_remove_permission = {:name => :promote_or_remove_content_views_to_environments,
:search => "name=\"#{ak.environment.name}\"" }

ak_cv_remove_permission = {:name => :promote_or_remove_content_views,
:search => "name=\"#{ak.content_view.name}\"" }

alternate_env = @staging
alternate_env_read_permission = {:name => :view_lifecycle_environments,
:search => "name=\"#{alternate_env.name}\"" }

alternate_cv = @library_dev_staging_view
alternate_cv_read_permission = {:name => :view_content_views,
:search => "name=\"#{alternate_cv.name}\"" }

bad_cv = ContentView.find(katello_content_views(:candlepin_default_cv).id)
bad_cv_read_permission = {:name => :view_content_views,
:search => "name=\"#{bad_cv.name}\"" }

bad_env = KTEnvironment.find(katello_environments(:dev_path1).id)
bad_env_read_permission = {:name => :view_lifecycle_environments,
:search => "name=\"#{bad_env.name}\"" }

allowed_perms = [[:edit_activation_keys, :promote_or_remove_content_views, :view_content_views,
:promote_or_remove_content_views_to_environments, :view_lifecycle_environments],
[ak_edit_permission, ak_cv_remove_permission, ak_env_remove_permission,
alternate_env_read_permission, alternate_cv_read_permission]
]

denied_perms = [[:edit_activation_keys, :promote_or_remove_content_views,
:promote_or_remove_content_views_to_environments, :view_lifecycle_environments],
[ak_edit_permission, ak_cv_remove_permission, ak_env_remove_permission,
bad_env_read_permission, alternate_cv_read_permission],
[ak_edit_permission, ak_cv_remove_permission, ak_env_remove_permission,
alternate_env_read_permission, bad_cv_read_permission]
]

env_ids = [ak.environment.id.to_i]

::Katello::Host::ContentFacet.expects(:where).at_least_once.returns([]).with do |args|
args[:content_view_id].id == ak.content_view.id && args[:lifecycle_environment_id].map(&:to_i) == env_ids
end

assert_protected_action(:remove, allowed_perms, denied_perms) do
put :remove, params: { :id => ak.content_view.id, :environment_ids => [ak.environment.id], :key_content_view_id => alternate_cv.id, :key_environment_id => alternate_env.id }
end
end
end
end
(12-12/44)