Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def update
update_params = rule_params
update_params[:name] = update_params[:name].first if update_params[:name]

if @rule.filter.content_type == ContentViewPackageFilter::CONTENT_TYPE
if [ContentViewPackageFilter::CONTENT_TYPE, ContentViewDebFilter::CONTENT_TYPE].include?(@rule.filter.content_type)
update_params[:version] = "" unless rule_params[:version]
update_params[:min_version] = "" unless rule_params[:min_version]
update_params[:max_version] = "" unless rule_params[:max_version]
Expand Down
20 changes: 10 additions & 10 deletions app/controllers/katello/api/v2/debs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,23 @@ class Api::V2::DebsController < Api::V2::ApiController
def auto_complete(search)
page_size = Katello::Concerns::FilteredAutoCompleteSearch::PAGE_SIZE
debs = Deb.in_repositories(@repositories)
col = ''
case search
when 'name'
col = "#{Deb.table_name}.name"
when 'arch'
col = "#{Deb.table_name}.architecture"
end
debs = debs.where("#{col} ILIKE ?", "#{params[:term]}%").select(col).group(col).order(col).limit(page_size)
render :json => debs.pluck(col)
col = case search
when 'name' then "#{Deb.table_name}.name"
when 'arch' then "#{Deb.table_name}.architecture"
end
return render json: [] if col.blank?

scope = debs.select(col).group(col).order(col).limit(page_size)
scope = scope.where("#{col} ILIKE ?", "%#{params[:term]}%") if params[:term].present?
render json: scope.pluck(Arel.sql(col))
end

def auto_complete_name
auto_complete('name')
end

def auto_complete_arch
auto_complete('architecture')
auto_complete('arch')
end

api :GET, "/debs", N_("List deb packages")
Expand Down
5 changes: 5 additions & 0 deletions app/models/katello/content_view_deb_filter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ def query_debs_from_collection(collection, rule)
query_arch = rule.architecture.tr("*", "%")
query = query.where("#{Deb.table_name}.architecture ilike ?", query_arch)
end
if rule.version.present?
query = query.search_version_equal(rule.version)
elsif rule.min_version.present? || rule.max_version.present?
query = query.search_version_range(rule.min_version, rule.max_version)
end
query.default_sort
end
end
Expand Down
7 changes: 7 additions & 0 deletions app/models/katello/content_view_deb_filter_rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,17 @@ class ContentViewDebFilterRule < Katello::Model
validates :name, :presence => true
validate :ensure_unique_attributes
validates_with Validators::ContentViewFilterVersionValidator
scoped_search :on => :version, :complete_value => true
scoped_search :on => :min_version, :complete_value => true
scoped_search :on => :max_version, :complete_value => true
scoped_search :on => :architecture, :complete_value => true

def ensure_unique_attributes
other = self.class.where(:name => self.name,
:version => self.version,
:content_view_filter_id => self.content_view_filter_id,
:min_version => self.min_version,
:max_version => self.max_version,
:architecture => self.architecture)
other = other.where.not(:id => self.id) if self.id
if other.exists?
Expand Down
18 changes: 9 additions & 9 deletions app/models/katello/deb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ def self.content_facet_association_class
ContentFacetApplicableDeb
end

def self.search_version_range(min = nil, max = nil)
query = self.all
query = Katello::Util::PackageFilter.new(query, min, Katello::Util::PackageFilter::GREATER_THAN).results if min
query = Katello::Util::PackageFilter.new(query, max, Katello::Util::PackageFilter::LESS_THAN).results if max
scope :search_version_equal, ->(ver) {
where("deb_version_cmp(#{::Katello::Deb.table_name}.version, ?) = 0", ver)
}

scope :search_version_range, ->(min_ver, max_ver) {
query = all
query = query.where("deb_version_cmp(#{::Katello::Deb.table_name}.version, ?) >= 0", min_ver) if min_ver.present?
query = query.where("deb_version_cmp(#{::Katello::Deb.table_name}.version, ?) <= 0", max_ver) if max_ver.present?
query
end

def self.search_version_equal(version)
Katello::Util::PackageFilter.new(self, version, Katello::Util::PackageFilter::EQUAL).results
end
}

def self.total_for_repositories(repos)
self.in_repositories(repos).count
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
require 'katello_test_helper'

module Katello
class Api::V2::ContentViewDebFilterRulesControllerTest < ActionController::TestCase
fixtures :katello_content_view_filters,
:katello_content_view_deb_filter_rules,
:katello_debs

tests Katello::Api::V2::ContentViewFilterRulesController

def models
@filter = katello_content_view_filters(:simple_deb_filter)
@rule = katello_content_view_deb_filter_rules(:deb_test_package)
@rule_other_filter = katello_content_view_deb_filter_rules(:deb_other_filter_rule)
@arch_rule = katello_content_view_deb_filter_rules(:deb_arch_rule)
@deb_one = katello_debs(:one)
end

def permissions
@view_permission = :view_content_views
@create_permission = :create_content_views
@update_permission = :edit_content_views
@destroy_permission = :destroy_content_views
end

def setup
setup_controller_defaults_api
models
permissions
end

def test_index
get :index, params: { content_view_filter_id: @filter.id }
assert_response :success
assert_template 'api/v2/content_view_filter_rules/index'
end

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

assert_protected_action(:index, allowed_perms, denied_perms) do
get :index, params: { content_view_filter_id: @filter.id }
end
end

def test_create_single_name
post :create, params: { content_view_filter_id: @filter.id,
name: 'debtest', architecture: 'amd64',
version: '2.0' }
assert_response :success
assert_template layout: 'katello/api/v2/layouts/resource'
assert_includes @filter.reload.deb_rules.pluck(:name), 'debtest'
end

def test_create_name_array
post :create, params: { content_view_filter_id: @filter.id,
name: %w(debtest debtest2),
architecture: '',
min_version: '1.0' }
assert_response :success
assert_template layout: 'katello/api/v2/layouts/collection'
names = @filter.reload.deb_rules.map(&:name).uniq
assert_equal %w(archpkg debpkg debtest debtest2).sort, names.sort
end

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

assert_protected_action(:create, allowed_perms, denied_perms) do
post :create, params: { content_view_filter_id: @filter.id,
name: 'debtest', version: '1.0' }
end
end

def test_show
get :show, params: { content_view_filter_id: @filter.id, id: @arch_rule.id }
assert_response :success
assert_template 'api/v2/content_view_filter_rules/show'
end

def test_mismatched_filter_and_rule
get :show, params: { content_view_filter_id: @filter.id, id: @rule_other_filter.id }
assert_response 404
end

def test_update
put :update, params: { content_view_filter_id: @filter.id,
id: @arch_rule.id,
name: 'updatepkg',
architecture: 'arm64',
max_version: '3.0' }
assert_response :success
assert_equal 'updatepkg', @arch_rule.reload.name
assert_equal 'arm64', @arch_rule.reload.architecture
assert_equal '3.0', @arch_rule.max_version
end

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

assert_protected_action(:update, allowed_perms, denied_perms) do
put :update, params: { content_view_filter_id: @filter.id,
id: @arch_rule.id, name: 'oops' }
end
end

def test_destroy
delete :destroy, params: { content_view_filter_id: @filter.id, id: @arch_rule.id }
assert_response :success
assert_nil ContentViewDebFilterRule.find_by_id(@arch_rule.id)
end

def test_destroy_protected
allowed_perms = [@update_permission]
denied_perms = [@view_permission, @create_permission, @destroy_permission]

assert_protected_action(:destroy, allowed_perms, denied_perms) do
delete :destroy, params: { content_view_filter_id: @filter.id, id: @arch_rule.id }
end
end
end
end
21 changes: 21 additions & 0 deletions test/controllers/api/v2/debs_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,27 @@ def test_autocomplete_name
assert_includes JSON.parse(response.body), @deb.name
end

def test_autocomplete_name_blank_term
response = get :auto_complete_name, params: { :repoids => [@repo.id], :term => '' }

assert_response :success
assert_includes JSON.parse(response.body), @deb.name
end

def test_autocomplete_arch
response = get :auto_complete_arch, params: { :repoids => [@repo.id], :term => @deb.architecture.first }

assert_response :success
assert_includes JSON.parse(response.body), @deb.architecture
end

def test_autocomplete_arch_blank_term
response = get :auto_complete_arch, params: { :repoids => [@repo.id], :term => '' }

assert_response :success
assert_includes JSON.parse(response.body), @deb.architecture
end

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

Expand Down
24 changes: 24 additions & 0 deletions test/fixtures/models/katello_content_view_deb_filter_rules.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
_fixture:
model_class: Katello::ContentViewDebFilterRule

deb_test_package:
name: debpkg
version: 1.0
content_view_filter_id: <%= ActiveRecord::FixtureSet.identify(:simple_deb_filter) %>
created_at: <%= Time.now %>
updated_at: <%= Time.now %>

deb_arch_rule:
name: archpkg
architecture: amd64
min_version: 1.0
content_view_filter_id: <%= ActiveRecord::FixtureSet.identify(:simple_deb_filter) %>
created_at: <%= Time.now %>
updated_at: <%= Time.now %>

deb_other_filter_rule:
name: otherpkg
version: 2.0
content_view_filter_id: <%= ActiveRecord::FixtureSet.identify(:another_deb_filter) %>
created_at: <%= Time.now %>
updated_at: <%= Time.now %>
14 changes: 14 additions & 0 deletions test/fixtures/models/katello_content_view_filters.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,17 @@ extra_filter:
content_view_id: <%= ActiveRecord::FixtureSet.identify(:acme_default) %>
type: <%= Katello::ContentViewErratumFilter.name %>

simple_deb_filter:
name: Simple Deb Filter
content_view_id: <%= ActiveRecord::FixtureSet.identify(:library_view) %>
type: <%= Katello::ContentViewDebFilter.name %>

populated_deb_filter:
name: Populated Deb Filter
content_view_id: <%= ActiveRecord::FixtureSet.identify(:library_view) %>
type: <%= Katello::ContentViewDebFilter.name %>

another_deb_filter:
name: Another Deb Filter
content_view_id: <%= ActiveRecord::FixtureSet.identify(:library_view) %>
type: <%= Katello::ContentViewDebFilter.name %>
93 changes: 93 additions & 0 deletions test/models/deb_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
require 'katello_test_helper'

module Katello
class DebTestBase < ActiveSupport::TestCase
def setup
@repo = katello_repositories(:debian_10_amd64)
@deb_one = katello_debs(:one)
@deb_two = katello_debs(:two)
@deb_three = katello_debs(:three)
@deb_one_v2 = katello_debs(:one_new)

Deb.any_instance.stubs(:backend_data).returns({})
end
end

class DebTest < DebTestBase
def test_repositories
assert_includes @deb_one.repository_ids, @repo.id
end

def test_create
pulp_id = 'dummy-uuid-999'
assert Deb.create!(pulp_id: pulp_id, name: 'dummy')
assert Deb.find_by_pulp_id(pulp_id)
end

def test_with_identifiers
set = Deb.with_identifiers([@deb_one.id, @deb_two.pulp_id])
assert_equal 2, set.size
assert_includes set, @deb_one
assert_includes set, @deb_two
end
end

class DebVersionSearchTest < DebTestBase
def create_deb(name:, version:, arch: 'amd64')
Deb.create!(
name: name,
version: version,
architecture: arch,
pulp_id: SecureRandom.uuid,
filename: "#{name}_#{version}_#{arch}.deb",
repository_ids: [@repo.id]
)
end

def test_search_version_greater_or_equal
result = Deb.in_repositories(@repo).search_for('version >= 1.1')
assert_includes result, @deb_one_v2
refute_includes result, @deb_one
end

def test_search_version_less_than
result = Deb.in_repositories(@repo).search_for('version < 1.1')
assert_includes result, @deb_one
refute_includes result, @deb_one_v2
end

def test_search_version_equal
result = Deb.in_repositories(@repo).search_for('version = 1.0')
assert_includes result, @deb_one
refute_includes result, @deb_one_v2
end

def test_search_with_epoch_handling
deb_epoch_2 = create_deb(name: "epochpkg", version: "2:1.0")
deb_epoch_1 = create_deb(name: "epochpkg", version: "1:1.0")

greater = Deb.in_repositories(@repo).search_for('version > 1:1.0')
assert_includes greater, deb_epoch_2
refute_includes greater, deb_epoch_1

equal = Deb.in_repositories(@repo).search_for('version = 1:1.0')
assert_equal [deb_epoch_1], equal
end

def test_search_range
deb_0_9 = create_deb(name: 'rangepkg', version: '0.9')
deb_1_2 = create_deb(name: 'rangepkg', version: '1.2')

inside = Deb.in_repositories(@repo).search_for('version >= 1.0 AND version <= 1.1')
outside = Deb.in_repositories(@repo).search_for('version < 1.0 OR version > 1.1')

assert_includes inside, @deb_one
assert_includes inside, @deb_one_v2
refute_includes inside, deb_0_9
refute_includes inside, deb_1_2

assert_includes outside, deb_0_9
assert_includes outside, deb_1_2
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ const CVDebFilterContent = ({
filterId={filterId}
onClose={onClose}
selectedFilterRuleData={selectedFilterRuleData}
repositoryIds={details.repository_ids}
/>}
</>}
/>
Expand Down
Loading