foreman_leapp 0.0.6 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -20
  3. data/app/controllers/api/v2/concerns/api_authorizer.rb +27 -0
  4. data/app/controllers/api/v2/preupgrade_reports_controller.rb +21 -2
  5. data/app/controllers/preupgrade_reports_controller.rb +11 -1
  6. data/app/lib/actions/preupgrade_job.rb +2 -1
  7. data/app/lib/helpers/job_helper.rb +3 -4
  8. data/app/models/preupgrade_report.rb +1 -0
  9. data/app/models/preupgrade_report_entry.rb +1 -0
  10. data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +1 -1
  11. data/app/views/api/v2/preupgrade_reports/job_invocation.json.rabl +3 -0
  12. data/app/views/foreman_leapp/job_templates/leapp_check.erb +15 -0
  13. data/app/views/foreman_leapp/job_templates/{preupgrade.erb → leapp_preupgrade.erb} +5 -2
  14. data/app/views/foreman_leapp/job_templates/leapp_remediation.erb +29 -0
  15. data/app/views/foreman_leapp/job_templates/{upgrade.erb → leapp_upgrade.erb} +9 -7
  16. data/config/routes.rb +2 -1
  17. data/db/migrate/20200429080939_report_entries_flags.rb +5 -0
  18. data/db/seeds.d/10_leapp_preupgrade.rb +1 -1
  19. data/lib/foreman_leapp/engine.rb +7 -6
  20. data/lib/foreman_leapp/version.rb +1 -1
  21. data/locale/action_names.rb +6 -0
  22. data/locale/en/foreman_leapp.po +104 -2
  23. data/locale/foreman_leapp.pot +164 -8
  24. data/package.json +3 -2
  25. data/test/functional/api/v2/preupgrade_reports_controller_test.rb +89 -6
  26. data/test/functional/preupgrade_reports_controller_test.rb +27 -4
  27. data/test/unit/actions/preupgrade_job_test.rb +1 -1
  28. data/test/unit/helpers/job_helper_test.rb +3 -10
  29. data/webpack/__mocks__/foremanReact/common/I18n.js +1 -1
  30. data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +1 -0
  31. data/webpack/components/PreupgradeReports/PreupgradeReports.js +104 -21
  32. data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +1 -1
  33. data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +132 -15
  34. data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +2 -0
  35. data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +10 -0
  36. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +45 -7
  37. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +17 -1
  38. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +43 -3
  39. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +82 -134
  40. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +409 -2
  41. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +21 -1
  42. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +17 -1
  43. data/webpack/components/PreupgradeReports/components/EntriesFilter.js +121 -0
  44. data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +3 -0
  45. data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +30 -0
  46. data/webpack/components/PreupgradeReports/components/{FixAllButton.js → FixSelectedButton.js} +6 -8
  47. data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +15 -0
  48. data/webpack/components/PreupgradeReports/components/NoReports.js +35 -0
  49. data/webpack/components/PreupgradeReports/components/NoReports.test.js +15 -0
  50. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +29 -0
  51. data/webpack/components/PreupgradeReports/components/{FixAllButton.test.js → UpgradeAllButton.test.js} +3 -4
  52. data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +330 -0
  53. data/webpack/components/PreupgradeReports/components/__snapshots__/{FixAllButton.test.js.snap → FixSelectedButton.test.js.snap} +9 -3
  54. data/webpack/components/PreupgradeReports/components/__snapshots__/NoReports.test.js.snap +19 -0
  55. data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +29 -0
  56. data/webpack/components/PreupgradeReports/index.js +22 -4
  57. data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +37 -0
  58. data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +16 -0
  59. data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +38 -0
  60. data/webpack/components/PreupgradeReportsList/components/InfoItem.js +1 -1
  61. data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +33 -0
  62. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +19 -9
  63. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +56 -0
  64. data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +50 -0
  65. data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +27 -0
  66. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +2 -0
  67. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +14 -0
  68. data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +29 -0
  69. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +32 -0
  70. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +23 -17
  71. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +113 -0
  72. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +36 -0
  73. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +4 -10
  74. data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -2
  75. data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +7 -1
  76. data/webpack/components/PreupgradeReportsList/components/helpers.js +47 -19
  77. data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +61 -0
  78. data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +61 -0
  79. data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +62 -0
  80. data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +62 -0
  81. data/webpack/components/PreupgradeReportsList/index.js +28 -3
  82. metadata +54 -18
  83. data/app/views/foreman_leapp/job_templates/remediation.erb +0 -17
@@ -1,19 +1,175 @@
1
- # foreman_leapp
2
- #
3
- # This file is distributed under the same license as foreman_leapp.
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the foreman_leapp package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4
5
  #
5
6
  #, fuzzy
6
7
  msgid ""
7
8
  msgstr ""
8
- "Project-Id-Version: version 0.0.1\n"
9
+ "Project-Id-Version: foreman_leapp 1.0.0\n"
9
10
  "Report-Msgid-Bugs-To: \n"
10
- "POT-Creation-Date: 2014-08-20 08:46+0100\n"
11
- "PO-Revision-Date: 2014-08-20 08:46+0100\n"
12
- "Last-Translator: Foreman Team <foreman-dev@googlegroups.com>\n"
13
- "Language-Team: Foreman Team <foreman-dev@googlegroups.com>\n"
11
+ "POT-Creation-Date: 2020-07-20 08:46+0200\n"
12
+ "PO-Revision-Date: 2020-07-20 08:46+0200\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
15
  "Language: \n"
15
16
  "MIME-Version: 1.0\n"
16
17
  "Content-Type: text/plain; charset=UTF-8\n"
17
18
  "Content-Transfer-Encoding: 8bit\n"
18
19
  "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
20
 
21
+ #: ../app/controllers/api/v2/concerns/api_authorizer.rb:16
22
+ msgid "Missing one of the required permissions: view_hosts"
23
+ msgstr ""
24
+
25
+ #: ../app/controllers/api/v2/preupgrade_reports_controller.rb:10
26
+ msgid "List Preupgrade reports"
27
+ msgstr ""
28
+
29
+ #: ../app/controllers/api/v2/preupgrade_reports_controller.rb:16
30
+ msgid "Show Preupgrade report"
31
+ msgstr ""
32
+
33
+ #: ../app/controllers/api/v2/preupgrade_reports_controller.rb:22
34
+ msgid "List Preupgrade reports for Job invocation"
35
+ msgstr ""
36
+
37
+ #: ../app/helpers/concerns/foreman_leapp/hosts_helper_extensions.rb:6
38
+ #: ../app/helpers/concerns/foreman_leapp/hosts_helper_extensions.rb:11
39
+ #: ../lib/foreman_leapp/engine.rb:53
40
+ msgid "Preupgrade check with Leapp"
41
+ msgstr ""
42
+
43
+ #: ../app/helpers/concerns/foreman_leapp/hosts_helper_extensions.rb:7
44
+ #: ../app/helpers/concerns/foreman_leapp/hosts_helper_extensions.rb:13
45
+ #: ../lib/foreman_leapp/engine.rb:60
46
+ msgid "Upgrade with Leapp"
47
+ msgstr ""
48
+
49
+ #: ../app/helpers/concerns/foreman_leapp/remote_execution_helper_extension.rb:8
50
+ msgid "Rerun preupgrade check"
51
+ msgstr ""
52
+
53
+ #:
54
+ #: ../app/helpers/concerns/foreman_leapp/remote_execution_helper_extension.rb:11
55
+ msgid "Run Leapp Preupgrade check again"
56
+ msgstr ""
57
+
58
+ #: ../lib/foreman_leapp/engine.rb:32
59
+ msgid "Leapp preupgrade report"
60
+ msgstr ""
61
+
62
+ #: ../lib/foreman_leapp/engine.rb:54
63
+ msgid "Upgradeability check for RHEL 7 host"
64
+ msgstr ""
65
+
66
+ #: ../lib/foreman_leapp/engine.rb:61
67
+ msgid "Run Leapp upgrade job for RHEL 7 host"
68
+ msgstr ""
69
+
70
+ #: ../lib/foreman_leapp/engine.rb:67
71
+ msgid "Remediation plan"
72
+ msgstr ""
73
+
74
+ #: ../lib/foreman_leapp/engine.rb:68
75
+ msgid "Run Remediation plan with Leapp"
76
+ msgstr ""
77
+
78
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:19
79
+ #: ../webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js:38
80
+ msgid "Title"
81
+ msgstr ""
82
+
83
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:20
84
+ #: ../webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js:13
85
+ msgid "Risk Factor"
86
+ msgstr ""
87
+
88
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:21
89
+ #: ../webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js:12
90
+ msgid "Host"
91
+ msgstr ""
92
+
93
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:22
94
+ msgid "Fix Type"
95
+ msgstr ""
96
+
97
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:23
98
+ #: ../webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js:21
99
+ msgid "Inhibitor"
100
+ msgstr ""
101
+
102
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:27
103
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:35
104
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:41
105
+ msgid "All"
106
+ msgstr ""
107
+
108
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:28
109
+ msgid "Low"
110
+ msgstr ""
111
+
112
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:29
113
+ msgid "Medium"
114
+ msgstr ""
115
+
116
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:30
117
+ msgid "High"
118
+ msgstr ""
119
+
120
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:31
121
+ msgid "Info"
122
+ msgstr ""
123
+
124
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:36
125
+ msgid "Hint"
126
+ msgstr ""
127
+
128
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:37
129
+ msgid "Command"
130
+ msgstr ""
131
+
132
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:42
133
+ msgid "Yes"
134
+ msgstr ""
135
+
136
+ #: ../webpack/components/PreupgradeReports/components/EntriesFilter.js:43
137
+ msgid "No"
138
+ msgstr ""
139
+
140
+ #: ../webpack/components/PreupgradeReports/components/FixSelectedButton.js:12
141
+ msgid "Fix Selected"
142
+ msgstr ""
143
+
144
+ #: ../webpack/components/PreupgradeReports/components/NoReports.js:17
145
+ msgid "The preupgrade report will be available after the job finishes"
146
+ msgstr ""
147
+
148
+ #: ../webpack/components/PreupgradeReports/components/NoReports.js:25
149
+ msgid "No Preupgrade Report Available"
150
+ msgstr ""
151
+
152
+ #: ../webpack/components/PreupgradeReports/components/UpgradeAllButton.js:13
153
+ msgid "Run Upgrade"
154
+ msgstr ""
155
+
156
+ #:
157
+ #: ../webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js:17
158
+ msgid "This issue inhibits the upgrade."
159
+ msgstr ""
160
+
161
+ #:
162
+ #: ../webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js:14
163
+ msgid "Has Remediation?"
164
+ msgstr ""
165
+
166
+ #:
167
+ #: ../webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js:15
168
+ msgid "Inhibitor?"
169
+ msgstr ""
170
+
171
+ #: gemspec.rb:4
172
+ msgid ""
173
+ "A foreman plugin to support inplace RHEL 7 -> RHEL 8 upgrades with Leapp utili"
174
+ "ty."
175
+ msgstr ""
@@ -6,7 +6,7 @@
6
6
  "scripts": {
7
7
  "lint": "tfm-lint --plugin -d /webpack",
8
8
  "link-leapp-js": "./script/link_leapp_js.sh",
9
- "test": "tfm-test --plugin",
9
+ "test": "tfm-test --plugin --config jest.config.js",
10
10
  "test:watch": "tfm-test --plugin --watchAll",
11
11
  "test:current": "tfm-test --plugin --watch",
12
12
  "publish-coverage": "tfm-publish-coverage",
@@ -32,10 +32,11 @@
32
32
  "@theforeman/builder": "^4.2.1",
33
33
  "@theforeman/eslint-plugin-foreman": "4.2.1",
34
34
  "@theforeman/stories": "^4.2.1",
35
- "@theforeman/vendor-dev": "^4.2.1",
36
35
  "@theforeman/test": "^4.2.1",
36
+ "@theforeman/vendor-dev": "^4.2.1",
37
37
  "babel-eslint": "^10.0.0",
38
38
  "eslint": "^6.8.0",
39
+ "jest-svg-transformer": "^1.0.0",
39
40
  "prettier": "^1.19.1"
40
41
  },
41
42
  "dependencies": {
@@ -7,24 +7,107 @@ module Api
7
7
  class PreupgradeReportsControllerTest < ActionController::TestCase
8
8
  setup do
9
9
  @host = FactoryBot.create(:host)
10
- @report = FactoryBot.create(:preupgrade_report, host: @host)
10
+ @job_invocation = FactoryBot.create(:job_invocation)
11
+ @report = FactoryBot.create(:preupgrade_report, host: @host, job_invocation: @job_invocation)
11
12
  @entry = FactoryBot.create(:preupgrade_report_entry, host: @host, preupgrade_report: @report)
12
13
  end
13
14
 
14
- test 'should get index' do
15
- get :index, session: set_session_user
15
+ test 'should get :index' do
16
+ get :index
16
17
  assert_response :success
17
- assert_not_empty ActiveSupport::JSON.decode(@response.body)['results']
18
+ assert_not_empty JSON.parse(@response.body)['results']
18
19
  end
19
20
 
20
- test 'should get detail of report and its entries' do
21
+ test 'should get :show' do
21
22
  get :show, params: { id: @report.id }
22
23
  assert_response :success
23
24
 
24
- response = ActiveSupport::JSON.decode(@response.body)
25
+ response = JSON.parse(@response.body)
25
26
  assert_equal response['id'], @report.id
26
27
  assert_not_empty response['preupgrade_report_entries']
27
28
  end
29
+
30
+ test 'should get :job_invocation' do
31
+ get :job_invocation, params: { id: @job_invocation.id }
32
+ assert_response :success
33
+ assert_not_empty JSON.parse(@response.body)['results']
34
+ end
35
+
36
+ context 'with permissions' do
37
+ setup do
38
+ @user = FactoryBot.create(:user, admin: false)
39
+ setup_user('view', 'job_invocations', nil, @user)
40
+ setup_user('view', 'hosts', nil, @user)
41
+ end
42
+
43
+ test 'should get :index' do
44
+ get :index, session: set_session_user(@user)
45
+ assert_response :success
46
+ assert_not_empty JSON.parse(@response.body)['results']
47
+ end
48
+
49
+ test 'should get :show' do
50
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
51
+ assert_response :success
52
+ assert_equal @report.id, JSON.parse(@response.body)['id']
53
+ end
54
+
55
+ test 'should get :job_invocation' do
56
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
57
+ assert_response :success
58
+ assert_not_empty JSON.parse(@response.body)['results']
59
+ end
60
+ end
61
+
62
+ context 'without :view_job_invocations' do
63
+ setup do
64
+ @user = FactoryBot.create(:user, admin: false)
65
+ setup_user('view', 'hosts', nil, @user)
66
+ end
67
+
68
+ test 'should not get :index' do
69
+ get :index, session: set_session_user(@user)
70
+ assert_response :forbidden
71
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
72
+ end
73
+
74
+ test 'should not get :show' do
75
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
76
+ assert_response :forbidden
77
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
78
+ end
79
+
80
+ test 'should not get :job_invocation' do
81
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
82
+ assert_response :forbidden
83
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
84
+ end
85
+ end
86
+
87
+ context 'without :view_hosts' do
88
+ setup do
89
+ @user = FactoryBot.create(:user, admin: false)
90
+ setup_user('view', 'job_invocations', nil, @user)
91
+ end
92
+
93
+ test 'should not get :index' do
94
+ get :index, session: set_session_user(@user)
95
+ assert_response :forbidden
96
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
97
+ end
98
+
99
+ test 'should not get :job_invocation' do
100
+ get :show, params: { id: @report.id }, session: set_session_user(@user)
101
+ assert_response :forbidden
102
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
103
+ end
104
+
105
+ test 'should not get :job_invocation' do
106
+ get :job_invocation, params: { id: @job_invocation.id }, session: set_session_user(@user)
107
+ assert_response :forbidden
108
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
109
+ end
110
+ end
28
111
  end
29
112
  end
30
113
  end
@@ -4,13 +4,36 @@ require 'test_plugin_helper'
4
4
 
5
5
  class PreupgradeReportsControllerTest < ActionController::TestCase
6
6
  setup do
7
+ @user = FactoryBot.create(:user, admin: false)
7
8
  @host = FactoryBot.create :host
8
9
  FactoryBot.create :preupgrade_report, host: @host
9
10
  end
10
11
 
11
- test 'should get index' do
12
- get :index, session: set_session_user
13
- response = ActiveSupport::JSON.decode(@response.body)
14
- assert_equal @host.id, response['results'].first['host_id']
12
+ test 'should get :index' do
13
+ get :index
14
+ assert_response :success
15
+ assert_not_empty JSON.parse(@response.body)['results']
16
+ end
17
+
18
+ test 'should get :index with :view_job_invocations & :view_hosts' do
19
+ setup_user 'view', 'job_invocations', nil, @user
20
+ setup_user 'view', 'hosts', nil, @user
21
+ get :index, session: set_session_user(@user)
22
+ assert_response :success
23
+ assert_not_empty JSON.parse(@response.body)['results']
24
+ end
25
+
26
+ test 'should not get :index without :view_job_invocations' do
27
+ setup_user 'view', 'hosts', nil, @user
28
+ get :index, session: set_session_user(@user)
29
+ assert_response :forbidden
30
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
31
+ end
32
+
33
+ test 'should not get :index without :view_hosts' do
34
+ setup_user 'view', 'job_invocations', nil, @user
35
+ get :index, session: set_session_user(@user)
36
+ assert_response :forbidden
37
+ assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
15
38
  end
16
39
  end
@@ -11,7 +11,7 @@ module ForemanLeapp
11
11
  FactoryBot.create(:job_template, template: 'echo "1"', job_category: 'leapp',
12
12
  provider_type: 'SSH', name: 'Leapp preupgrade')
13
13
  end
14
- let(:job_invocation) { FactoryBot.create(:job_invocation, job_category: ::ForemanLeapp::JOB_CATEGORY) }
14
+ let(:job_invocation) { FactoryBot.create(:job_invocation) }
15
15
  let(:template_invocation) do
16
16
  FactoryBot.create(:template_invocation, template: job_template, job_invocation: job_invocation)
17
17
  end
@@ -5,12 +5,12 @@ require 'test_plugin_helper'
5
5
  module Helpers
6
6
  class JobHelperTest < ActionView::TestCase
7
7
  let(:helper) { ::Helpers::JobHelper }
8
- # let(:host) { FactoryBot.create(:host) }
8
+
9
9
  let(:job_template) do
10
10
  FactoryBot.create(:job_template, template: 'echo "1"', job_category: 'leapp',
11
11
  provider_type: 'SSH', name: 'Leapp preupgrade')
12
12
  end
13
- let(:job_invocation) { FactoryBot.create(:job_invocation, job_category: ::ForemanLeapp::JOB_CATEGORY) }
13
+ let(:job_invocation) { FactoryBot.create(:job_invocation) }
14
14
 
15
15
  describe 'correct_feature?' do
16
16
  setup do
@@ -18,17 +18,10 @@ module Helpers
18
18
  FactoryBot.create(:template_invocation, template: job_template, job_invocation: job_invocation)
19
19
  end
20
20
 
21
- it 'correct category & feature' do
21
+ it 'correct feature' do
22
22
  assert helper.correct_feature?(job_invocation, 'leapp_preupgrade')
23
23
  end
24
24
 
25
- it 'wrong category' do
26
- job_invocation = FactoryBot.create(:job_invocation, job_category: 'NOPE')
27
- FactoryBot.create(:template_invocation, template: job_template, job_invocation: job_invocation)
28
-
29
- assert_not helper.correct_feature?(job_invocation, 'leapp_preupgrade')
30
- end
31
-
32
25
  it 'wrong feature' do
33
26
  assert_not helper.correct_feature?(job_invocation, 'leapp_preupgrade2')
34
27
  end
@@ -1 +1 @@
1
- export const translate = () => jest.fn();
1
+ export const translate = val => val;
@@ -0,0 +1 @@
1
+ export const EmptyStatePattern = () => jest.fn();
@@ -1,24 +1,118 @@
1
- import React from 'react';
1
+ import React, { useState } from 'react';
2
2
  import MessageBox from 'foremanReact/components/common/MessageBox';
3
3
  import { LoadingState, Row } from 'patternfly-react';
4
4
  import PropTypes from 'prop-types';
5
5
 
6
6
  import PreupgradeReportsList from '../PreupgradeReportsList';
7
- import FixAllButton from './components/FixAllButton';
7
+ import UpgradeAllButton from './components/UpgradeAllButton';
8
+ import EntriesFilter from './components/EntriesFilter';
9
+ import FixSelectedButton from './components/FixSelectedButton';
8
10
 
9
11
  import {
10
12
  flattenEntries,
11
13
  isEmpty,
12
14
  anyEntriesFixable,
15
+ filterEntries,
16
+ idsForInvocationFromEntries,
17
+ sortEntries,
18
+ fixableEntries,
13
19
  } from './PreupgradeReportsHelpers';
14
20
 
21
+ import NoReports from './components/NoReports';
22
+
15
23
  const PreupgradeReports = ({
16
24
  preupgradeReports,
17
- loading,
18
- error,
19
25
  csrfToken,
20
26
  newJobInvocationUrl,
21
27
  }) => {
28
+ const [filterType, setFilterType] = useState('title');
29
+ const [filterValue, setFilterValue] = useState('');
30
+ const [checked, setChecked] = useState([]);
31
+ const [sort, setSort] = useState({ attribute: '', order: 'desc' });
32
+
33
+ const onFilterValueChange = value => {
34
+ setFilterValue(value);
35
+ };
36
+
37
+ const onFilterValueClear = () => setFilterValue('');
38
+
39
+ const onFilterTypeChange = value => {
40
+ onFilterValueClear();
41
+ setFilterType(value);
42
+ };
43
+
44
+ const isSelected = entry => checked.some(item => item.id === entry.id);
45
+
46
+ const anySelected = checked.length > 0;
47
+
48
+ const toggleSelected = (entry, isEntrySelected) => {
49
+ if (isEntrySelected) {
50
+ setChecked(checked.filter(item => item.id !== entry.id));
51
+ } else {
52
+ setChecked([entry, ...checked]);
53
+ }
54
+ };
55
+
56
+ const toggleSelectAll = () => {
57
+ const allFixable = fixableEntries(preupgradeReports);
58
+
59
+ if (checked.length === allFixable.length) {
60
+ setChecked([]);
61
+ } else {
62
+ setChecked(allFixable);
63
+ }
64
+ };
65
+
66
+ const changeSort = value => {
67
+ setSort({ ...sort, ...value });
68
+ };
69
+
70
+ return (
71
+ <React.Fragment>
72
+ <Row>
73
+ <div className="col-md-8">
74
+ <EntriesFilter
75
+ filterType={filterType}
76
+ onFilterTypeChange={onFilterTypeChange}
77
+ filterValue={filterValue}
78
+ onFilterValueChange={onFilterValueChange}
79
+ />
80
+ </div>
81
+ <div className="col-md-4">
82
+ <div className="btn-toolbar pull-right">
83
+ <FixSelectedButton
84
+ postUrl={newJobInvocationUrl}
85
+ disabled={!anyEntriesFixable(preupgradeReports) || !anySelected}
86
+ csrfToken={csrfToken}
87
+ ids={idsForInvocationFromEntries(checked)}
88
+ />
89
+ <UpgradeAllButton
90
+ postUrl={newJobInvocationUrl}
91
+ csrfToken={csrfToken}
92
+ preupgradeReports={preupgradeReports}
93
+ />
94
+ </div>
95
+ </div>
96
+ </Row>
97
+ <PreupgradeReportsList
98
+ allEntries={filterEntries(
99
+ filterType,
100
+ filterValue,
101
+ sortEntries(flattenEntries(preupgradeReports), sort)
102
+ )}
103
+ isSelected={isSelected}
104
+ toggleSelected={toggleSelected}
105
+ sort={sort}
106
+ changeSort={changeSort}
107
+ toggleSelectAll={toggleSelectAll}
108
+ />
109
+ </React.Fragment>
110
+ );
111
+ };
112
+
113
+ const withLoadingState = Component => props => {
114
+ const { error, loading, preupgradeReports, reportsExpected } = props;
115
+
22
116
  if (!isEmpty(error)) {
23
117
  return (
24
118
  <MessageBox
@@ -31,30 +125,19 @@ const PreupgradeReports = ({
31
125
 
32
126
  return (
33
127
  <LoadingState loading={loading}>
34
- <Row>
35
- <div className="title-filter col-md-4">&nbsp;</div>
36
- <div id="title_action" className="col-md-8">
37
- <div className="btn-toolbar pull-right">
38
- <FixAllButton
39
- postUrl={newJobInvocationUrl}
40
- disabled={!anyEntriesFixable(preupgradeReports)}
41
- csrfToken={csrfToken}
42
- preupgradeReports={preupgradeReports}
43
- />
44
- </div>
45
- </div>
46
- </Row>
47
- <PreupgradeReportsList allEntries={flattenEntries(preupgradeReports)} />
128
+ {preupgradeReports.length > 0 ? (
129
+ <Component {...props} />
130
+ ) : (
131
+ <NoReports reportsExpected={reportsExpected} />
132
+ )}
48
133
  </LoadingState>
49
134
  );
50
135
  };
51
136
 
52
137
  PreupgradeReports.propTypes = {
53
138
  preupgradeReports: PropTypes.array.isRequired,
54
- loading: PropTypes.bool.isRequired,
55
- error: PropTypes.object.isRequired,
56
139
  csrfToken: PropTypes.string.isRequired,
57
140
  newJobInvocationUrl: PropTypes.string.isRequired,
58
141
  };
59
142
 
60
- export default PreupgradeReports;
143
+ export default withLoadingState(PreupgradeReports);