foreman_scc_manager 1.8.5 → 1.8.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4d297d61cfdedf0fb329cba44d7925c052c1c8e80f8f0ec58b1435b90b229fe
4
- data.tar.gz: 3b434307e158ce5b45ad3e719a7538895a8bcf8d01c98f449561c8d18d4ba87f
3
+ metadata.gz: 7a0b1fc3df2a088cefb4344e848995955fb81a5478cf4500268c68f32ccf0bec
4
+ data.tar.gz: ae3c19f91491ba06228c59f6314e28d5c8525d8936e89c5a82af092a71dd4e85
5
5
  SHA512:
6
- metadata.gz: b31980bb5ef8302a4015ddc5338a7cbb217e666c271ae03781ba530d3823a8608e8afd9d686f80113280ed9033a033b9988fcf8a7a376e791ed2e4a30d7bf159
7
- data.tar.gz: 8ebaf1d499fbe65e28c61177ddfbbc6efdf6d1438dc854493686b3842d41ae8a0d9f3bb6ef66bede4ecb2c5c0c82a40da50221e376d96974e0bca18a684a6eb5
6
+ metadata.gz: 57f473572bfc7342b44765343b168e94bb55ba479bb17d7a9236703bcb5cb7f2cad615b16d76934790a739037eb5b724e70ff637c17e7d95aaaa6dc993eb3bd2
7
+ data.tar.gz: 6569d327e0ccb6c251a823ae3af6a3bd1a40d44edc9878fd4b538303ec242a8f594dffd0e8fb951ae371c8b22ae13f16a0120ac78a6f9cb4a5bf2dabd33781fb
@@ -18,7 +18,7 @@ module Api
18
18
  def index
19
19
  scope = resource_scope
20
20
  scope = scope.where(:organization => params[:organization_id]) if params[:organization_id].present?
21
- @scc_accounts = scope.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page])
21
+ @scc_accounts = scope.search_for(params[:search], :order => params[:order]).paginate(:page => params[:page], :per_page => params[:per_page])
22
22
  end
23
23
 
24
24
  api :GET, '/scc_accounts/:id/', N_('Show scc_account')
@@ -34,7 +34,8 @@ module Api
34
34
  param :password, String, :required => true, :desc => N_('Password of scc_account')
35
35
  param :base_url, String, :required => false, :desc => N_('URL of SUSE for scc_account')
36
36
  param :interval, ['never', 'daily', 'weekly', 'monthy'], :desc => N_('Interval for syncing scc_account')
37
- param :sync_date, String, :desc => N_('Last Sync time of scc_account')
37
+ param :sync_date, String, :desc => N_('Date and time relative to which the sync interval is run')
38
+ param :katello_gpg_key_id, :identifier, :required => false, :desc => N_('Associated gpg key of scc_account')
38
39
  end
39
40
  end
40
41
 
@@ -79,9 +80,9 @@ module Api
79
80
  end
80
81
  respond_to do |format|
81
82
  if @scc_account.test_connection
82
- format.json { render json: 'Success'.to_json, status: :ok }
83
+ format.json { render json: { 'success' => true }.to_json, status: :ok }
83
84
  else
84
- format.json { render json: 'Failed'.to_json, status: :not_found }
85
+ format.json { render json: { 'success' => false, 'error' => 'Test failed. Check your credentials.' }.to_json, status: :not_found }
85
86
  end
86
87
  end
87
88
  end
@@ -102,7 +103,7 @@ module Api
102
103
 
103
104
  api :PUT, '/scc_accounts/:id/bulk_subscribe/', N_('Bulk subscription of scc_products for scc_account')
104
105
  param :id, :identifier_dottable, :required => true
105
- param :scc_subscribe_product_ids, Array
106
+ param :scc_subscribe_product_ids, Array, :required => true
106
107
  def bulk_subscribe
107
108
  scc_products_to_subscribe = @scc_account.scc_products.where(:id => params[:scc_subscribe_product_ids])
108
109
  respond_to do |format|
@@ -112,7 +113,7 @@ module Api
112
113
  scc_products_to_subscribe)
113
114
  format.json { render json: subscribe_task.to_json, status: :ok }
114
115
  else
115
- format.json { render json: 'No Product selected'.to_json, status: :expectation_failed }
116
+ format.json { render json: { error: 'No Product selected' }, status: :expectation_failed }
116
117
  end
117
118
  end
118
119
  rescue ::Foreman::Exception => e
@@ -132,7 +133,8 @@ module Api
132
133
  :base_url,
133
134
  :interval,
134
135
  :sync_date,
135
- :organization_id
136
+ :organization_id,
137
+ :katello_gpg_key_id
136
138
  )
137
139
  end
138
140
 
@@ -2,13 +2,14 @@ class SccAccountsController < ApplicationController
2
2
  helper_method :scc_filtered_products
3
3
  before_action :find_organization
4
4
  before_action :find_resource, only: %i[show edit update destroy sync bulk_subscribe]
5
+ before_action :find_available_gpg_keys, only: %i[new edit]
5
6
  include Foreman::Controller::AutoCompleteSearch
6
7
 
7
8
  # GET /scc_accounts
8
9
  def index
9
- @scc_accounts = resource_base.search_for(params[:search], order: params[:order])
10
- .paginate(page: params[:page])
11
-
10
+ @scc_accounts = resource_base.where(organization: @organization)
11
+ .search_for(params[:search], order: params[:order])
12
+ .paginate(:page => params[:page], :per_page => params[:per_page])
12
13
  # overwrite the product list with filtered products that do not include products with empty repositories
13
14
  @scc_accounts.each do |scc_account|
14
15
  scc_account.scc_products_with_repos_count = scc_account.scc_products.only_products_with_repos.count
@@ -98,6 +99,11 @@ class SccAccountsController < ApplicationController
98
99
 
99
100
  private
100
101
 
102
+ def find_available_gpg_keys
103
+ @scc_account ? org = @scc_account.organization : org = @organization
104
+ @selectable_gpg_keys = ::Katello::GpgKey.where(organization: org).collect { |p| [p.name, p.id] }.unshift ['None', nil]
105
+ end
106
+
101
107
  def find_organization
102
108
  @organization = Organization.current
103
109
  redirect_to '/select_organization?toState=' + request.path unless @organization
@@ -114,7 +120,8 @@ class SccAccountsController < ApplicationController
114
120
  :base_url,
115
121
  :interval,
116
122
  :sync_date,
117
- :organization_id
123
+ :organization_id,
124
+ :katello_gpg_key_id
118
125
  )
119
126
  end
120
127
 
@@ -8,15 +8,16 @@ module Actions
8
8
  .info("Initiating subscription for SccProduct '#{scc_product.friendly_name}'.")
9
9
  sequence do
10
10
  product_create_action = plan_action(CreateProduct,
11
- product_name: scc_product.uniq_name,
12
- product_description: scc_product.description,
13
- organization_id: scc_product.organization.id)
11
+ :product_name => scc_product.pretty_name,
12
+ :product_description => scc_product.pretty_description,
13
+ :organization_id => scc_product.organization.id,
14
+ :gpg_key => scc_product.scc_account.katello_gpg_key_id)
14
15
  scc_product.scc_repositories.each do |repo|
15
- uniq_name = scc_product.uniq_name + ' ' + repo.description
16
16
  arch = scc_product.arch || 'noarch'
17
17
  plan_action(CreateRepository,
18
18
  :product_id => product_create_action.output[:product_id],
19
- :uniq_name => uniq_name,
19
+ :uniq_name => repo.uniq_name(scc_product),
20
+ :pretty_repo_name => repo.pretty_name,
20
21
  :url => repo.full_url,
21
22
  :arch => arch)
22
23
  end
@@ -43,6 +44,7 @@ module Actions
43
44
  def create_sub_plans
44
45
  product = ::Katello::Product.new
45
46
  product.name = input[:product_name]
47
+ product.gpg_key = ::Katello::GpgKey.find_by(id: input[:gpg_key], organization: input[:organization_id])
46
48
  product.description = input[:product_description]
47
49
  trigger(::Actions::Katello::Product::Create,
48
50
  product,
@@ -58,12 +60,11 @@ module Actions
58
60
 
59
61
  def create_sub_plans
60
62
  product = ::Katello::Product.find(input[:product_id])
61
- uniq_name = input[:uniq_name]
62
- label = ::Katello::Util::Model.labelize(uniq_name)
63
+ label = ::Katello::Util::Model.labelize(input[:uniq_name])
63
64
  unprotected = true
64
65
  gpg_key = product.gpg_key
65
66
  repo_param = { :label => label,
66
- :name => uniq_name,
67
+ :name => input[:pretty_repo_name],
67
68
  :url => input[:url],
68
69
  :content_type => 'yum',
69
70
  :unprotected => unprotected,
@@ -179,13 +179,14 @@ class SccAccount < ApplicationRecord
179
179
  # import repositories
180
180
  upstream_repositories.each do |ur|
181
181
  cached_repository = scc_repositories.find_or_initialize_by(scc_id: ur['id'])
182
- cached_repository.name = ur['name']
183
182
  cached_repository.distro_target = ur['distro_target']
184
183
  cached_repository.description = ur['description']
185
184
  cached_repository.url, cached_repository.token = ur['url'].split('?')
186
185
  cached_repository.enabled = ur['enabled']
187
186
  cached_repository.autorefresh = ur['autorefresh']
188
187
  cached_repository.installer_updates = ur['installer_updates']
188
+ # should be called after all attributes are set in case of dependencies (currently: description)
189
+ cached_repository.name = cached_repository.pretty_name
189
190
  cached_repository.save!
190
191
  upstream_repo_ids << ur['id']
191
192
  end
@@ -201,7 +202,6 @@ class SccAccount < ApplicationRecord
201
202
  # import products
202
203
  upstream_products.each do |up|
203
204
  cached_product = scc_products.find_or_initialize_by(scc_id: up['id'])
204
- cached_product.name = up['name']
205
205
  cached_product.version = up['version']
206
206
  cached_product.arch = up['arch']
207
207
  cached_product.description = up['description']
@@ -209,6 +209,9 @@ class SccAccount < ApplicationRecord
209
209
  cached_product.product_type = up['product_type']
210
210
  cached_product.scc_repositories =
211
211
  scc_repositories.where(scc_id: up['repositories'].map { |repo| repo['id'] })
212
+ # name should be set after friendly_name because it depends on friendly_name
213
+ cached_product.name = cached_product.pretty_name
214
+ cached_product.description = cached_product.pretty_description
212
215
  cached_product.save!
213
216
  upstream_product_ids << up['id']
214
217
  end
@@ -27,12 +27,28 @@ class SccProduct < ApplicationRecord
27
27
  "#{scc_id} " + friendly_name
28
28
  end
29
29
 
30
+ def pretty_name
31
+ friendly_name + " (id: #{scc_id})"
32
+ end
33
+
34
+ # Remove HTML tags (currently assumed that there are only paragraph tags)
35
+ # Remove second HTML paragraph if available
36
+ def pretty_description
37
+ new_description = Nokogiri::XML(description).xpath('//p')
38
+ # No tags to remove
39
+ if new_description.count == 0
40
+ description
41
+ else
42
+ new_description.first.children.first.text.strip
43
+ end
44
+ end
45
+
30
46
  def subscribe
31
47
  raise 'Product already subscribed!' if product
32
48
 
33
49
  new_product = Katello::Product.new
34
- new_product.name = uniq_name
35
- new_product.description = description
50
+ new_product.name = pretty_name
51
+ new_product.description = pretty_description
36
52
  ForemanTasks.sync_task(::Actions::Katello::Product::Create, new_product, scc_account.organization)
37
53
  new_product.reload
38
54
  scc_repositories.each do |repo|
@@ -15,6 +15,10 @@ class SccRepository < ApplicationRecord
15
15
  scc_product.uniq_name + ' ' + description
16
16
  end
17
17
 
18
+ def pretty_name
19
+ description
20
+ end
21
+
18
22
  def token_changed_callback
19
23
  User.current ||= User.anonymous_admin
20
24
  scc_products.where.not(product: nil).find_each do |sp|
@@ -1,3 +1,4 @@
1
+ <!-- see foreman/app/helper/form_helper.rb -->
1
2
  <% javascript 'foreman_scc_manager/scc_accounts' %>
2
3
 
3
4
  <%= form_for(@scc_account) do |f| %>
@@ -18,6 +19,11 @@
18
19
  <%= field f, :sync_date, label: _('Sync Date') do
19
20
  f.datetime_field :sync_date, placeholder: Time.now
20
21
  end %>
22
+ <%= selectable_f f, :katello_gpg_key_id, @selectable_gpg_keys, {},
23
+ { :include_blank => _("None"),
24
+ :label => _('Use GPG key for SUSE products'),
25
+ :selected => @scc_account.katello_gpg_key_id,
26
+ :help_block => _("Use this setting if you want to automatically add a GPG key to your SUSE products upon subscription. You can change this setting in the 'Content' > 'Products' menu, later.") } %>
21
27
  <div class='clearfix'>
22
28
  <div class='form-group'>
23
29
  <div class='col-md-2'></div>
@@ -1,3 +1,5 @@
1
+ <% title (_("Product Selection for Account %s") % @scc_account) %>
2
+
1
3
  <% javascript 'foreman_scc_manager/scc_accounts' %>
2
4
  <%= form_for([:bulk_subscribe, @scc_account], method: :put) do |f| %>
3
5
  <% def render_list_node(f, scc_product, parent_id = "") %>
@@ -5,11 +7,12 @@
5
7
  <span class="scc_product_checkbox" id="<%= "scc_product_span_#{parent_id + "_" + scc_product.id.to_s}" %>" <%= "data-parent=scc_product_span_#{parent_id}" if parent_id != "" %>>
6
8
  <% if scc_product.product %>
7
9
  <%= check_box_tag("scc_account[scc_unsubscribe_product_ids][]", scc_product.id, true, disabled: true) %>
10
+ <%= link_to(scc_product.pretty_name, "/products/#{scc_product.product_id}") %>
8
11
  <% else %>
9
12
  <%= check_box_tag("scc_account[scc_subscribe_product_ids][]", scc_product.id, false) %>
13
+ <%= scc_product.pretty_name %>
10
14
  <% end %>
11
15
  </span>
12
- <%= scc_product.friendly_name %>
13
16
  <% if scc_product.scc_extensions.any? %>
14
17
  <ul style='padding-left: 20px;'>
15
18
  <% scc_filtered_products(scc_product.scc_extensions, 'extension').each do |scc_extension| %>
@@ -41,3 +44,4 @@
41
44
  <%= submit_or_cancel f, false, {disabled: submit_disabled || false} %>
42
45
  </div>
43
46
  <% end %>
47
+
@@ -0,0 +1,6 @@
1
+ class AddGpgKeyToSccAccount < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :scc_accounts, :katello_gpg_key_id, :integer, null: true
4
+ add_foreign_key :scc_accounts, :katello_gpg_keys, column: :katello_gpg_key_id, on_delete: :nullify
5
+ end
6
+ end
@@ -1,3 +1,3 @@
1
1
  module ForemanSccManager
2
- VERSION = '1.8.5'.freeze
2
+ VERSION = '1.8.6'.freeze
3
3
  end
@@ -192,6 +192,14 @@ msgid ""
192
192
  " of any imported products."
193
193
  msgstr ""
194
194
 
195
+ #: ../app/views/scc_accounts/_form.html.erb:22
196
+ msgid "Use GPG key for SUSE products"
197
+ msgstr ""
198
+
199
+ #: ../app/views/scc_accounts/_form.html.erb:22
200
+ msgid "Use this setting if you want to automatically add a GPG key to your SUSE products upon subscription. You can change this setting in the 'Content' > 'Products' menu, later."
201
+ msgstr ""
202
+
195
203
  #: ../app/views/scc_accounts/_form.html.erb:18
196
204
  msgid "Sync Date"
197
205
  msgstr ""
@@ -236,7 +236,9 @@ class Api::V2::SccAccountsControllerTest < ActionController::TestCase
236
236
  assert account
237
237
  post :test_connection, params: { :scc_account => { :login => account.login, :password => account.password, :base_url => account.base_url } }
238
238
  assert_response :not_found
239
- assert_match response.body, '"Failed"'
239
+ body = ActiveSupport::JSON.decode(@response.body)
240
+ assert body.key? 'error'
241
+ assert_equal body['success'], false
240
242
  end
241
243
 
242
244
  test 'existing account SCC server connection-test' do
@@ -260,7 +262,9 @@ class Api::V2::SccAccountsControllerTest < ActionController::TestCase
260
262
  assert account
261
263
  post :test_connection, params: { :id => account.id }
262
264
  assert_response :not_found
263
- assert_match response.body, '"Failed"'
265
+ body = ActiveSupport::JSON.decode(@response.body)
266
+ assert body.key? 'error'
267
+ assert_equal body['success'], false
264
268
  end
265
269
 
266
270
  test 'SCC server sync products' do
@@ -289,7 +293,9 @@ class Api::V2::SccAccountsControllerTest < ActionController::TestCase
289
293
  account.scc_products = [product1, product2]
290
294
  put :bulk_subscribe, params: { :id => account.id, :scc_subscribe_product_ids => [] }
291
295
  assert_response :expectation_failed
292
- assert_match response.body, '"No Product selected"'
296
+ body = ActiveSupport::JSON.decode(@response.body)
297
+ assert body.key? 'error'
298
+ assert_match body['error'], 'No Product selected'
293
299
  end
294
300
 
295
301
  test 'should delete scc_account' do
@@ -0,0 +1,104 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class SccAccountsControllerTest < ActionController::TestCase
4
+ def setup
5
+ @scc_account = scc_accounts(:one)
6
+ end
7
+
8
+ def stub_custom_request(url, host = 'scc.example.com', auth = 'Basic b25ldXNlcjpvbmVwYXNz')
9
+ stub_request(:get, url)
10
+ .with(
11
+ headers: {
12
+ 'Accept' => 'application/vnd.scc.suse.com.v4+json',
13
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
14
+ 'Authorization' => auth,
15
+ 'Host' => host,
16
+ 'User-Agent' => "rest-client/2.1.0 (linux-gnu x86_64) ruby/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
17
+ }
18
+ )
19
+ .to_return(status: 200, body: '', headers: {})
20
+ end
21
+
22
+ test 'should get new' do
23
+ get :new, session: set_session_user
24
+ assert_response :success
25
+ assert_select 'title', 'Add SUSE Customer Center Account'
26
+ end
27
+
28
+ test 'should get edit' do
29
+ get :edit, params: { :id => @scc_account.id }, session: set_session_user
30
+ assert_response :success
31
+ assert_select 'title', "Edit #{@scc_account.name}"
32
+ end
33
+
34
+ test 'should get index' do
35
+ get :index, session: set_session_user
36
+ assert_response :success
37
+ assert_not_nil assigns(:scc_accounts)
38
+ body = @response.body
39
+ assert_not_empty body
40
+ assert_select 'title', 'SUSE subscriptions'
41
+ end
42
+
43
+ test 'should show scc_account' do
44
+ get :show, params: { :id => @scc_account.id }, session: set_session_user
45
+
46
+ assert_not_nil assigns(:scc_account)
47
+ assert_response :success
48
+ assert_select 'title', "Product Selection for Account #{@scc_account.name}"
49
+ end
50
+
51
+ test 'should 404 for unknown scc_account' do
52
+ get :show, params: { :id => 'does-not-exist' }, session: set_session_user
53
+
54
+ assert_response :not_found
55
+ end
56
+
57
+ test 'should create scc_account' do
58
+ account = scc_accounts(:two)
59
+ organization = get_organization
60
+ assert organization
61
+ assert account
62
+ assert_difference('SccAccount.count') do
63
+ post :create, params:
64
+ { :scc_account => { :name => account.name, :login => account.login, :password => account.password, :organization_id => organization.id } },
65
+ session: set_session_user
66
+ end
67
+ end
68
+
69
+ test 'should update scc_account' do
70
+ account = scc_accounts(:two)
71
+ put :update, params: { id: account.id, :scc_account => { :sync_date => Time.now, :interval => 'weekly' } }, session: set_session_user
72
+
73
+ assert_equal 'weekly', assigns(:scc_account).interval
74
+ end
75
+
76
+ test 'SCC server sync products' do
77
+ stub_custom_request('https://scc.example.com/connect/organizations/products')
78
+ stub_custom_request('https://scc.example.com/connect/organizations/repositories')
79
+
80
+ account = scc_accounts(:one)
81
+ assert account
82
+ put :sync, params: { :id => account.id }, session: set_session_user
83
+ assert_redirected_to '/scc_accounts'
84
+ end
85
+
86
+ test 'SCC server bulk subscribe products' do
87
+ stub_custom_request('https://scc.example.com/connect/organizations/repositories')
88
+
89
+ account = scc_accounts(:one)
90
+ product1 = scc_products(:one)
91
+ product2 = scc_products(:two)
92
+ account.scc_products = [product1, product2]
93
+ put :bulk_subscribe, params: { :id => account.id, :scc_account => { :scc_subscribe_product_ids => [product1.id, product2.id] } }, session: set_session_user
94
+
95
+ assert_redirected_to '/scc_accounts'
96
+ end
97
+
98
+ test 'should delete scc_account' do
99
+ account = scc_accounts(:two)
100
+ assert_difference 'SccAccount.count', -1 do
101
+ delete :destroy, params: { :id => account.id }, session: set_session_user
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,51 @@
1
+ require 'test_plugin_helper'
2
+
3
+ class SccAccountsControllerTest2 < ActionDispatch::IntegrationTest
4
+ setup do
5
+ @scc_account = scc_accounts(:one)
6
+ end
7
+
8
+ test 'should get index' do
9
+ get scc_accounts_url, session: set_session_user
10
+ # post path, params: { :id => "#{taxonomies(:empty_organization).id}-#{taxonomies(:empty_organization).name}" }
11
+ # post path, params: {:toState => scc_accounts_url, :bastion_page => "select_organization"}
12
+ # follow_redirect!
13
+ assert_response :success
14
+ end
15
+
16
+ test 'should get new' do
17
+ get new_scc_account_url
18
+ assert_response :success
19
+ end
20
+
21
+ test 'should create scc_account' do
22
+ assert_difference('SccAccount.count') do
23
+ post scc_accounts_url, params: { scc_account: {} }
24
+ end
25
+
26
+ assert_redirected_to scc_account_url(SccAccount.last)
27
+ end
28
+
29
+ test 'should show scc_account' do
30
+ get scc_account_url(@scc_account)
31
+ assert_response :success
32
+ end
33
+
34
+ test 'should get edit' do
35
+ get edit_scc_account_url(@scc_account)
36
+ assert_response :success
37
+ end
38
+
39
+ test 'should update scc_account' do
40
+ patch scc_account_url(@scc_account), params: { scc_account: {} }
41
+ assert_redirected_to scc_account_url(@scc_account)
42
+ end
43
+
44
+ test 'should destroy scc_account' do
45
+ assert_difference('SccAccount.count', -1) do
46
+ delete scc_account_url(@scc_account)
47
+ end
48
+
49
+ assert_redirected_to scc_accounts_url
50
+ end
51
+ end
@@ -0,0 +1,6 @@
1
+ # create a couple of products as scc_extensions
2
+ <% 1.upto(10) do |i| %>
3
+ p_extending_<%= i %>:
4
+ scc_product_id: 4
5
+ scc_extension_id: <%= 4 + i %>
6
+ <% end %>
@@ -7,7 +7,7 @@ one:
7
7
  version: 1
8
8
  arch: x86_128
9
9
  friendly_name: number one
10
- description: lorem ipsum dolor sit amet
10
+ description: "<p> lorem ipsum dolor sit amet </p>"
11
11
  product_type: base
12
12
 
13
13
  two:
@@ -17,7 +17,7 @@ two:
17
17
  version: 2
18
18
  arch: x86_128
19
19
  friendly_name: number two
20
- description: lorem ipsum dolor sit amet
20
+ description: "<p> lorem ipsum dolor sit amet </p><p> lorem lorem lorem </p>"
21
21
  product_type: extras
22
22
 
23
23
  three:
@@ -13,3 +13,17 @@ repo_<%= i %>:
13
13
  installer_updates: false
14
14
  <% end %>
15
15
 
16
+ repo_9:
17
+ id: 9
18
+ scc_account_id: 1
19
+ scc_id: 63
20
+ name: SLE10-Debuginfo-Updates_9
21
+ distro_target: sles_9
22
+ description: SLE10-Debuginfo-Updates for sles-10-ppc_9
23
+ url: https://updates.suse.com/repo/example_9
24
+ token: token_9
25
+ autorefresh: true
26
+ installer_updates: false
27
+
28
+
29
+
@@ -71,4 +71,68 @@ class SccAccountSearchTest < ActiveSupport::TestCase
71
71
  end
72
72
  end
73
73
 
74
+ class SccAccountUpdateProductsTest < ActiveSupport::TestCase
75
+ def setup
76
+ @account = scc_accounts(:one)
77
+ one = scc_products(:one)
78
+ @account.scc_products = SccProduct.where(name: 'one')
79
+ # generate test data, beware that hash names are not equal to SccProduct instance names
80
+ @product_data = { 'name' => one.name,
81
+ 'id' => one.scc_id,
82
+ 'version' => one.version,
83
+ 'arch' => one.arch,
84
+ 'repositories' => one.scc_repositories,
85
+ 'extensions' => one.scc_extensions,
86
+ 'product_type' => one.product_type,
87
+ 'description' => '<p> new unpretty description </p>',
88
+ 'friendly_name' => 'updated name' }
89
+ @product_array = []
90
+ @product_array.push @product_data
91
+
92
+ @test_product = SccProduct.new
93
+ @test_product.scc_id = @product_data['id']
94
+ @test_product.friendly_name = @product_data['friendly_name']
95
+ @test_product.description = @product_data['description']
96
+ end
97
+
98
+ test 'update scc product' do
99
+ @account.update_scc_products(@product_array)
100
+ @updated_product = @account.scc_products.where(friendly_name: 'updated name').first
101
+ assert_equal @test_product.pretty_name, @updated_product.name
102
+ assert_equal @test_product.pretty_name, @updated_product.pretty_name
103
+ assert_equal @test_product.pretty_description, @updated_product.description
104
+ assert_equal @test_product.pretty_description, @updated_product.pretty_description
105
+ end
106
+ end
107
+
108
+ class SccAccountUpdateReposTest < ActiveSupport::TestCase
109
+ def setup
110
+ @account = scc_accounts(:one)
111
+ test_repo = scc_repositories(:repo_9)
112
+ @account.scc_repositories = SccProduct.where(name: 'repo_9')
113
+ # generate test data
114
+ @repo_data = { 'name' => test_repo.name,
115
+ 'id' => test_repo.scc_id,
116
+ 'distro_target' => test_repo.distro_target,
117
+ 'url' => test_repo.url,
118
+ 'enabled' => test_repo.enabled,
119
+ 'autorefresh' => test_repo.autorefresh,
120
+ 'installer_updates' => test_repo.installer_updates,
121
+ 'description' => '<p> new unpretty repo description </p>' }
122
+ @repo_array = []
123
+ @repo_array.push @repo_data
124
+
125
+ @test_repo = SccRepository.new
126
+ @test_repo.description = @repo_data['description']
127
+ @test_repo.name = @repo_data['name']
128
+ end
129
+
130
+ test 'update scc repository' do
131
+ @account.update_scc_repositories(@repo_array)
132
+ @updated_repo = @account.scc_repositories.where(name: @test_repo.pretty_name).first
133
+ assert_equal @test_repo.pretty_name, @updated_repo.name
134
+ assert_equal @test_repo.pretty_name, @updated_repo.pretty_name
135
+ end
136
+ end
137
+
74
138
  # FIXME: test cascaded delete
@@ -3,6 +3,8 @@ require 'test_plugin_helper'
3
3
  class SccProductCreateTest < ActiveSupport::TestCase
4
4
  def setup
5
5
  @product = scc_products(:one)
6
+ @product_with_ugly_description = scc_products(:two)
7
+ @product_with_normal_description = scc_products(:three)
6
8
  end
7
9
 
8
10
  test 'create' do
@@ -13,6 +15,17 @@ class SccProductCreateTest < ActiveSupport::TestCase
13
15
  test 'uniq_name' do
14
16
  assert_equal @product.uniq_name, '111 number one'
15
17
  end
18
+
19
+ test 'pretty_name' do
20
+ assert_equal @product.pretty_name, 'number one (id: 111)'
21
+ end
22
+
23
+ test 'pretty_description' do
24
+ assert_equal @product_with_normal_description.description,
25
+ @product_with_normal_description.pretty_description
26
+ assert_equal @product.pretty_description, 'lorem ipsum dolor sit amet'
27
+ assert_equal @product_with_ugly_description.pretty_description, 'lorem ipsum dolor sit amet'
28
+ end
16
29
  end
17
30
 
18
31
  class SccProductSearchTest < ActiveSupport::TestCase
@@ -0,0 +1,15 @@
1
+ # This calls the main test_helper in Foreman-core
2
+ require 'test_helper'
3
+ # require "#{Katello::Engine.root}/test/katello_test_helper"
4
+
5
+ require 'foreman_tasks/test_helpers'
6
+
7
+ module SignInHelper
8
+ def sign_in_as(user)
9
+ post sign_in_url(username: user.login, password: user.password)
10
+ end
11
+ end
12
+
13
+ class ActionDispatch::IntegrationTest
14
+ include SignInHelper
15
+ end
@@ -22,6 +22,7 @@ module FixtureTestCase
22
22
  Dir.mkdir(self.fixture_path)
23
23
  FileUtils.cp(Dir.glob("#{ForemanSccManager::Engine.root}/test/fixtures/models/*"), self.fixture_path)
24
24
  FileUtils.cp(Dir.glob("#{ForemanSccManager::Engine.root}/test/fixtures/files/*"), self.fixture_path)
25
+ FileUtils.cp(Dir.glob("#{ForemanSccManager::Engine.root}/test/fixtures/controllers/*"), self.fixture_path)
25
26
  FileUtils.cp(Dir.glob("#{Rails.root}/test/fixtures/*"), self.fixture_path)
26
27
  fixtures(:all)
27
28
  FIXTURES = load_fixtures(ActiveRecord::Base)
@@ -56,3 +57,11 @@ class ActiveSupport::TestCase
56
57
  organization
57
58
  end
58
59
  end
60
+
61
+ class ActionController::TestCase
62
+ def set_session_user(user = :admin, org = :empty_organization)
63
+ user = user.is_a?(User) ? user : users(user)
64
+ org = org.is_a?(Organization) ? org : taxonomies(org)
65
+ { :user => user.id, :expires_at => 5.minutes.from_now, :organization_id => org.id }
66
+ end
67
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_scc_manager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.5
4
+ version: 1.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - ATIX AG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-04 00:00:00.000000000 Z
11
+ date: 2020-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -154,6 +154,7 @@ files:
154
154
  - db/migrate/20180321000000_change_sync_status_to_sync_task.rb
155
155
  - db/migrate/20190417202427_add_recurring_sync.foreman_scc_manager.rb
156
156
  - db/migrate/20200520281300_fix_scc_permissions.rb
157
+ - db/migrate/20201119084201_add_gpg_key_to_scc_account.rb
157
158
  - lib/foreman_scc_manager.rb
158
159
  - lib/foreman_scc_manager/engine.rb
159
160
  - lib/foreman_scc_manager/version.rb
@@ -169,6 +170,8 @@ files:
169
170
  - locale/gemspec.rb
170
171
  - test/controllers/api/v2/scc_accounts_test.rb
171
172
  - test/controllers/api/v2/scc_products_test.rb
173
+ - test/controllers/scc_accounts_controller_test.rb
174
+ - test/controllers/scc_accounts_controller_test2.rb
172
175
  - test/factories/foreman_scc_manager_factories.rb
173
176
  - test/features/sync_test.rb
174
177
  - test/fixtures/files/data_products_page1.json
@@ -176,11 +179,13 @@ files:
176
179
  - test/fixtures/files/data_repositories.json
177
180
  - test/fixtures/files/data_subscriptions.json
178
181
  - test/fixtures/models/scc_accounts.yml
182
+ - test/fixtures/models/scc_extendings.yml
179
183
  - test/fixtures/models/scc_products.yml
180
184
  - test/fixtures/models/scc_repositories.yml
181
185
  - test/models/scc_account_test.rb
182
186
  - test/models/scc_product_test.rb
183
187
  - test/support/fixtures_support.rb
188
+ - test/test_controller_helper.rb
184
189
  - test/test_plugin_helper.rb
185
190
  - test/unit/foreman_scc_manager_test.rb
186
191
  homepage: https://www.orcharhino.com/
@@ -207,19 +212,23 @@ signing_key:
207
212
  specification_version: 4
208
213
  summary: Suse Customer Center plugin for Foreman
209
214
  test_files:
215
+ - test/unit/foreman_scc_manager_test.rb
216
+ - test/test_controller_helper.rb
217
+ - test/features/sync_test.rb
218
+ - test/models/scc_product_test.rb
219
+ - test/models/scc_account_test.rb
220
+ - test/factories/foreman_scc_manager_factories.rb
210
221
  - test/controllers/api/v2/scc_accounts_test.rb
211
222
  - test/controllers/api/v2/scc_products_test.rb
212
- - test/test_plugin_helper.rb
213
- - test/features/sync_test.rb
223
+ - test/controllers/scc_accounts_controller_test2.rb
224
+ - test/controllers/scc_accounts_controller_test.rb
214
225
  - test/support/fixtures_support.rb
226
+ - test/fixtures/models/scc_accounts.yml
215
227
  - test/fixtures/models/scc_repositories.yml
216
228
  - test/fixtures/models/scc_products.yml
217
- - test/fixtures/models/scc_accounts.yml
218
- - test/fixtures/files/data_subscriptions.json
229
+ - test/fixtures/models/scc_extendings.yml
230
+ - test/fixtures/files/data_products_page2.json
219
231
  - test/fixtures/files/data_products_page1.json
232
+ - test/fixtures/files/data_subscriptions.json
220
233
  - test/fixtures/files/data_repositories.json
221
- - test/fixtures/files/data_products_page2.json
222
- - test/models/scc_product_test.rb
223
- - test/models/scc_account_test.rb
224
- - test/unit/foreman_scc_manager_test.rb
225
- - test/factories/foreman_scc_manager_factories.rb
234
+ - test/test_plugin_helper.rb