foreman_webhooks 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +30 -0
  4. data/Rakefile +49 -0
  5. data/app/controllers/api/v2/webhook_templates_controller.rb +110 -0
  6. data/app/controllers/api/v2/webhooks_controller.rb +61 -0
  7. data/app/controllers/concerns/foreman_webhooks/controller/parameters/webhook.rb +34 -0
  8. data/app/controllers/concerns/foreman_webhooks/controller/parameters/webhook_template.rb +34 -0
  9. data/app/controllers/webhook_templates_controller.rb +5 -0
  10. data/app/controllers/webhooks_controller.rb +39 -0
  11. data/app/jobs/foreman_webhooks/deliver_webhook_job.rb +27 -0
  12. data/app/lib/foreman_webhooks/renderer/scope/webhook_template.rb +36 -0
  13. data/app/models/webhook.rb +141 -0
  14. data/app/models/webhook_template.rb +59 -0
  15. data/app/services/foreman_webhooks/webhook_service.rb +111 -0
  16. data/app/subscribers/foreman_webhooks/event_subscriber.rb +9 -0
  17. data/app/views/api/v2/webhook_templates/base.json.rabl +5 -0
  18. data/app/views/api/v2/webhook_templates/create.json.rabl +5 -0
  19. data/app/views/api/v2/webhook_templates/index.json.rabl +5 -0
  20. data/app/views/api/v2/webhook_templates/main.json.rabl +7 -0
  21. data/app/views/api/v2/webhook_templates/show.json.rabl +11 -0
  22. data/app/views/api/v2/webhook_templates/update.json.rabl +5 -0
  23. data/app/views/api/v2/webhooks/base.json.rabl +5 -0
  24. data/app/views/api/v2/webhooks/create.json.rabl +5 -0
  25. data/app/views/api/v2/webhooks/index.json.rabl +5 -0
  26. data/app/views/api/v2/webhooks/main.json.rabl +8 -0
  27. data/app/views/api/v2/webhooks/show.json.rabl +17 -0
  28. data/app/views/api/v2/webhooks/update.json.rabl +5 -0
  29. data/app/views/foreman_webhooks/webhook_templates/ansible_tower_-_host_in_inventory.erb +20 -0
  30. data/app/views/foreman_webhooks/webhook_templates/empty_payload.erb +6 -0
  31. data/app/views/foreman_webhooks/webhook_templates/webhook_template_-_payload_default.erb +11 -0
  32. data/app/views/webhook_templates/_alerts.html.erb +3 -0
  33. data/app/views/webhook_templates/_custom_tab_headers.html.erb +1 -0
  34. data/app/views/webhook_templates/_custom_tabs.html.erb +5 -0
  35. data/app/views/webhook_templates/edit.html.erb +3 -0
  36. data/app/views/webhook_templates/index.html.erb +29 -0
  37. data/app/views/webhook_templates/new.html.erb +3 -0
  38. data/app/views/webhooks/_form.html.erb +37 -0
  39. data/app/views/webhooks/_templates.html.erb +5 -0
  40. data/app/views/webhooks/edit.html.erb +3 -0
  41. data/app/views/webhooks/new.html.erb +3 -0
  42. data/config/routes.rb +45 -0
  43. data/db/migrate/20191016100128_create_webhook_targets.rb +13 -0
  44. data/db/migrate/20200831194208_rename_webhook_targets_to_webhooks.rb +7 -0
  45. data/db/migrate/20200831194514_add_template_to_webhooks.rb +7 -0
  46. data/db/migrate/20200907232758_rename_webhook_permissions.rb +22 -0
  47. data/db/migrate/20200908004234_add_columns_to_webhooks.rb +13 -0
  48. data/db/migrate/20201014115147_rename_ca_file_column.rb +7 -0
  49. data/db/migrate/20201109135301_add_http_headers.rb +8 -0
  50. data/db/seeds.d/95_webhook_templates.rb +7 -0
  51. data/lib/foreman_webhooks.rb +6 -0
  52. data/lib/foreman_webhooks/engine.rb +80 -0
  53. data/lib/foreman_webhooks/version.rb +5 -0
  54. data/lib/tasks/foreman_webhooks_tasks.rake +47 -0
  55. data/package.json +45 -0
  56. data/test/controllers/api/v2/webhook_templates_controller_test.rb +200 -0
  57. data/test/controllers/api/v2/webhooks_controller_test.rb +108 -0
  58. data/test/factories/webhook.rb +20 -0
  59. data/test/factories/webhook_target.rb +9 -0
  60. data/test/factories/webhook_template.rb +16 -0
  61. data/test/jobs/foreman_webhooks/deliver_webhook_job_test.rb +17 -0
  62. data/test/models/webhook_test.rb +38 -0
  63. data/test/test_plugin_helper.rb +8 -0
  64. data/test/unit/foreman_webhooks/webhook_service_test.rb +53 -0
  65. data/webpack/ForemanWebhooks/Routes/ForemanWebhooksRoutes.js +12 -0
  66. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/EmptyWebhooksTable/index.js +29 -0
  67. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhookDeleteModal.js +43 -0
  68. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/EnabledCell.js +16 -0
  69. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/Formatters/__tests__/__snapshots__/enabledCellFormatter.test.js.snap +7 -0
  70. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/Formatters/__tests__/enabledCellFormatter.test.js +7 -0
  71. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/Formatters/enabledCellFormatter.js +6 -0
  72. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/Formatters/index.js +1 -0
  73. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/__tests__/EnabledCell.test.js +14 -0
  74. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/__tests__/__snapshots__/EnabledCell.test.js.snap +17 -0
  75. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/WebhooksTable.js +75 -0
  76. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/WebhooksTableSchema.js +41 -0
  77. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/__tests__/WebhooksTable.test.js +57 -0
  78. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/__tests__/__snapshots__/WebhooksTable.test.js.snap +115 -0
  79. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/index.js +25 -0
  80. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/WebhooksIndexPage.js +87 -0
  81. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/__tests__/WebhooksIndexPage.fixtures.js +74 -0
  82. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/__tests__/WebhooksIndexPage.test.js +21 -0
  83. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/__tests__/__snapshots__/WebhooksIndexPage.test.js.snap +68 -0
  84. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/index.js +51 -0
  85. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksPageActions.js +51 -0
  86. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksPageHelpers.js +29 -0
  87. data/webpack/ForemanWebhooks/Routes/Webhooks/WebhooksPageSelectors.js +85 -0
  88. data/webpack/ForemanWebhooks/Routes/Webhooks/__tests__/WebhooksPageHelpers.test.js +20 -0
  89. data/webpack/ForemanWebhooks/Routes/Webhooks/__tests__/WebhooksPageSelectors.test.js +45 -0
  90. data/webpack/ForemanWebhooks/Routes/Webhooks/__tests__/__snapshots__/WebhooksPageSelectors.test.js.snap +50 -0
  91. data/webpack/ForemanWebhooks/Routes/Webhooks/constants.js +13 -0
  92. data/webpack/__mocks__/foremanReact/common/HOC.js +2 -0
  93. data/webpack/__mocks__/foremanReact/common/I18n.js +7 -0
  94. data/webpack/__mocks__/foremanReact/common/helpers.js +7 -0
  95. data/webpack/__mocks__/foremanReact/common/urlHelpers.js +1 -0
  96. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalActions.js +2 -0
  97. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +10 -0
  98. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +18 -0
  99. data/webpack/__mocks__/foremanReact/components/Layout/LayoutActions.js +2 -0
  100. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
  101. data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +5 -0
  102. data/webpack/__mocks__/foremanReact/components/common/table.js +5 -0
  103. data/webpack/__mocks__/foremanReact/constants.js +24 -0
  104. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +6 -0
  105. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  106. data/webpack/__mocks__/foremanReact/redux/actions/toasts.js +8 -0
  107. data/webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js +10 -0
  108. data/webpack/index.js +0 -0
  109. data/webpack/routes_index.js +4 -0
  110. metadata +195 -0
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ class Api::V2::WebhooksControllerTest < ActionController::TestCase
6
+ valid_attrs = { name: 'webhook_test', event: 'host_created.event.foreman',
7
+ target_url: 'https://app.example.com' }
8
+
9
+ def setup
10
+ @webhook = FactoryBot.create(:webhook)
11
+ @webhook_template = FactoryBot.create(:webhook_template)
12
+ end
13
+
14
+ let(:webhook) { FactoryBot.create(:webhook) }
15
+
16
+ test 'should get index' do
17
+ get :index
18
+ assert_response :success
19
+ assert_not_nil assigns(:webhooks)
20
+ webhooks = ActiveSupport::JSON.decode(@response.body)
21
+ assert !webhooks.empty?
22
+ webhook = webhooks['results'].find { |h| h['id'] == @webhook.id }
23
+ assert_equal @webhook.name, webhook['name']
24
+ end
25
+
26
+ test 'should show individual record' do
27
+ get :show, params: { id: @webhook.to_param }
28
+ assert_response :success
29
+ show_response = ActiveSupport::JSON.decode(@response.body)
30
+ assert !show_response.empty?
31
+ assert_equal @webhook.event, show_response['event']
32
+ end
33
+
34
+ test 'should create webhook' do
35
+ assert_difference('Webhook.unscoped.count') do
36
+ post :create, params: { webhook: valid_attrs.merge(webhook_template_id: @webhook_template.id) }
37
+ end
38
+ assert_response :created
39
+ response = JSON.parse(@response.body)
40
+ assert response.key?('name')
41
+ assert response.key?('event')
42
+ assert_equal response['name'], valid_attrs[:name]
43
+ assert_equal response['event'], valid_attrs[:event]
44
+ end
45
+
46
+ test 'should update name' do
47
+ new_name = 'new webhook name'
48
+ put :update, params: { id: @webhook.id, webhook: { name: new_name } }
49
+ assert_response :success
50
+ response = JSON.parse(@response.body)
51
+ assert response.key?('name')
52
+ assert_equal response['name'], new_name
53
+ end
54
+
55
+ test 'should update event' do
56
+ new_event = 'subnet_created.event.foreman'
57
+ put :update, params: { id: @webhook.id, webhook: { event: new_event } }
58
+ assert_response :success
59
+ response = JSON.parse(@response.body)
60
+ assert response.key?('event')
61
+ assert_equal response['event'], new_event
62
+ end
63
+
64
+ test 'should not create with invalid name' do
65
+ assert_difference('Webhook.unscoped.count', 0) do
66
+ post :create, params: { webhook: valid_attrs.merge(name: '') }
67
+ end
68
+ assert_response :unprocessable_entity
69
+ end
70
+
71
+ test 'should not create with invalid event' do
72
+ assert_difference('Webhook.unscoped.count', 0) do
73
+ post :create, params: { webhook: valid_attrs.merge(event: '') }
74
+ end
75
+ assert_response :unprocessable_entity
76
+ end
77
+
78
+ test 'should not update with invalid name' do
79
+ put :update, params: { id: @webhook.id, webhook: { name: '' } }
80
+ assert_response :unprocessable_entity
81
+ end
82
+
83
+ test 'should not update with invalid event' do
84
+ put :update, params: { id: @webhook.id, webhook: { event: '' } }
85
+ assert_response :unprocessable_entity
86
+ end
87
+
88
+ test 'search webhook' do
89
+ get :index, params: { search: @webhook.name, format: 'json' }
90
+ assert_response :success, "search webhook name: '#{@webhook.name}'" \
91
+ " failed with code: #{@response.code}"
92
+ response = JSON.parse(@response.body)
93
+ assert_equal response['results'].length, 1
94
+ assert_equal response['results'][0]['id'], @webhook.id
95
+ end
96
+
97
+ test 'should update webhook' do
98
+ put :update, params: { id: @webhook.to_param, webhook: valid_attrs }
99
+ assert_response :success
100
+ end
101
+
102
+ test 'should destroy webhook' do
103
+ assert_difference('Webhook.unscoped.count', -1) do
104
+ delete :destroy, params: { id: @webhook.to_param }
105
+ end
106
+ assert_response :success
107
+ end
108
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :webhook do
5
+ sequence(:name) { |n| "Webhook #{n}" }
6
+ target_url { 'https://hook.example.com/api/callback' }
7
+ event { 'subnet_created.event.foreman' }
8
+ enabled { true }
9
+ webhook_template
10
+
11
+ trait :with_template do
12
+ transient do
13
+ template { 'template content' }
14
+ end
15
+ after(:build) do |webhook, evaluator|
16
+ webhook.webhook_template = FactoryBot.create(:webhook_template, template: evaluator.template)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :webhook_target do
5
+ sequence(:name) { |n| "Webhook Target #{n}" }
6
+ target_url { 'https://hook.example.com/api/callback' }
7
+ events { ['subnet_created.event.foreman'] }
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :webhook_template do
5
+ sequence(:name) { |n| "webhook_template#{n}" }
6
+ sequence(:template) { |n| "template content #{n}" }
7
+
8
+ trait :snippet do
9
+ snippet { true }
10
+ end
11
+
12
+ trait :locked do
13
+ locked { true }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ module ForemanWebhooks
6
+ class DeliverWebhookJobTest < ActiveJob::TestCase
7
+ let(:webhook) { FactoryBot.create(:webhook) }
8
+ let(:job) do
9
+ ::ForemanWebhooks::DeliverWebhookJob.new(event_name: 'subnet_created', payload: { id: 2 }, webhook_id: webhook.id)
10
+ end
11
+
12
+ it 'executes the webhook service' do
13
+ ::ForemanWebhooks::WebhookService.any_instance.expects(:execute).once
14
+ job.perform_now
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ module ForemanWebhooks
6
+ class WebhookServiceTest < ActiveSupport::TestCase
7
+ def setup
8
+ User.current = users(:admin)
9
+ end
10
+
11
+ let(:webhook) { FactoryBot.create(:webhook) }
12
+ let(:webhook_template) { FactoryBot.create(:webhook_template) }
13
+
14
+ test 'password is saved encrypted when created' do
15
+ Webhook.any_instance.expects(:encryption_key).at_least_once.returns('25d224dd383e92a7e0c82b8bf7c985e815f34cf5')
16
+ webhook = Webhook.new(
17
+ name: 'new12345', target_url: 'https://app.example.com',
18
+ user: 'username', password: 'abcdef', events: 'host_created.event.foreman',
19
+ webhook_template_id: webhook_template.id
20
+ )
21
+ as_admin do
22
+ assert webhook.save!
23
+ end
24
+ assert_equal webhook.password, 'abcdef'
25
+ refute_equal webhook.password_in_db, 'abcdef'
26
+ end
27
+
28
+ test 'password is saved encrypted when updated' do
29
+ webhook.expects(:encryption_key).at_least_once.returns('25d224dd383e92a7e0c82b8bf7c985e815f34cf5')
30
+ webhook.password = '123456'
31
+ as_admin do
32
+ assert webhook.save
33
+ end
34
+ assert_equal webhook.password, '123456'
35
+ refute_equal webhook.password_in_db, '123456'
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This calls the main test_helper in Foreman-core
4
+ require 'test_helper'
5
+
6
+ # Add plugin to FactoryBot's paths
7
+ FactoryBot.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
8
+ FactoryBot.reload
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_plugin_helper'
4
+
5
+ module ForemanWebhooks
6
+ class WebhookServiceTest < ActiveSupport::TestCase
7
+ let(:event_name) { 'subnet_created' }
8
+ let(:payload) { { id: 2 } }
9
+ let(:payload_json) { payload.to_json }
10
+ let(:webhook) do
11
+ FactoryBot.build(:webhook, :with_template, template: '<%= payload({id: @payload[:id]}, with_defaults: false) %>')
12
+ end
13
+ let(:webhook_service) do
14
+ WebhookService.new(
15
+ webhook: webhook,
16
+ event_name: event_name,
17
+ payload: payload_json,
18
+ headers: {},
19
+ url: webhook.target_url
20
+ )
21
+ end
22
+
23
+ it 'executes a request to the configured webhook' do
24
+ expected = { status: :success, message: '', http_status: 200 }
25
+
26
+ stub_request(:post, 'https://hook.example.com/api/callback')
27
+ .with(
28
+ body: payload_json,
29
+ headers: {
30
+ 'Content-Type' => 'application/json'
31
+ }
32
+ )
33
+ .to_return(status: 200, body: '', headers: {})
34
+
35
+ assert_equal expected, webhook_service.execute
36
+ end
37
+
38
+ it 'handles a failed request' do
39
+ expected = { status: :error, message: '', http_status: 404 }
40
+
41
+ stub_request(:post, 'https://hook.example.com/api/callback')
42
+ .with(
43
+ body: payload_json,
44
+ headers: {
45
+ 'Content-Type' => 'application/json'
46
+ }
47
+ )
48
+ .to_return(status: 404, body: '', headers: {})
49
+
50
+ assert_equal expected, webhook_service.execute
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import WebhooksIndexPage from './Webhooks/WebhooksIndexPage';
3
+
4
+ const ForemanWebhooksRoutes = [
5
+ {
6
+ path: '/webhooks',
7
+ exact: true,
8
+ render: props => <WebhooksIndexPage {...props} />,
9
+ },
10
+ ];
11
+
12
+ export default ForemanWebhooksRoutes;
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import DefaultEmptyState from 'foremanReact/components/common/EmptyState';
5
+
6
+ const EmptyWebhooksTable = ({ message: { type, text } }) => (
7
+ <DefaultEmptyState
8
+ icon={type === 'error' ? 'error-circle-o' : 'add-circle-o'}
9
+ header={type === 'error' ? __('Error') : __('No Results')}
10
+ description={text}
11
+ documentation={null}
12
+ />
13
+ );
14
+
15
+ EmptyWebhooksTable.propTypes = {
16
+ message: PropTypes.shape({
17
+ type: PropTypes.oneOf(['empty', 'error']),
18
+ text: PropTypes.string,
19
+ }),
20
+ };
21
+
22
+ EmptyWebhooksTable.defaultProps = {
23
+ message: PropTypes.shape({
24
+ type: 'empty',
25
+ text: 'No Results',
26
+ }),
27
+ };
28
+
29
+ export default EmptyWebhooksTable;
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ import { sprintf, translate as __ } from 'foremanReact/common/I18n';
5
+ import ForemanModal from 'foremanReact/components/ForemanModal';
6
+ import { foremanUrl } from 'foremanReact/common/helpers';
7
+
8
+ import { WEBHOOK_DELETE_MODAL_ID } from '../../constants';
9
+
10
+ const WebhookDeleteModal = ({ toDelete, onSuccess }) => {
11
+ const { id, name } = toDelete;
12
+
13
+ return (
14
+ <ForemanModal
15
+ id={WEBHOOK_DELETE_MODAL_ID}
16
+ title={__('Confirm Webhook Deletion')}
17
+ enforceFocus
18
+ submitProps={{
19
+ url: foremanUrl(`/api/v2/webhooks/${id}`),
20
+ message: sprintf(__('Webhook %s was successfully deleted'), name),
21
+ onSuccess,
22
+ submitBtnProps: {
23
+ bsStyle: 'danger',
24
+ btnText: __('Delete'),
25
+ },
26
+ }}
27
+ >
28
+ {sprintf(__('You are about to delete %s. Are you sure?'), name)}
29
+ <ForemanModal.Footer />
30
+ </ForemanModal>
31
+ );
32
+ };
33
+
34
+ WebhookDeleteModal.propTypes = {
35
+ toDelete: PropTypes.object,
36
+ onSuccess: PropTypes.func.isRequired,
37
+ };
38
+
39
+ WebhookDeleteModal.defaultProps = {
40
+ toDelete: {},
41
+ };
42
+
43
+ export default WebhookDeleteModal;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { CheckIcon, BanIcon } from '@patternfly/react-icons';
4
+
5
+ const EnabledCell = ({ condition }) =>
6
+ condition ? <CheckIcon /> : <BanIcon />;
7
+
8
+ EnabledCell.propTypes = {
9
+ condition: PropTypes.bool,
10
+ };
11
+
12
+ EnabledCell.defaultProps = {
13
+ condition: false,
14
+ };
15
+
16
+ export default EnabledCell;
@@ -0,0 +1,7 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`enabledCellFormatter render 1`] = `
4
+ <EnabledCell
5
+ condition={true}
6
+ />
7
+ `;
@@ -0,0 +1,7 @@
1
+ import { enabledCellFormatter } from '../index';
2
+
3
+ describe('enabledCellFormatter', () => {
4
+ it('render', () => {
5
+ expect(enabledCellFormatter()(true)).toMatchSnapshot();
6
+ });
7
+ });
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import EnabledCell from '../EnabledCell';
3
+
4
+ const enabledCellFormatter = () => value => <EnabledCell condition={value} />;
5
+
6
+ export default enabledCellFormatter;
@@ -0,0 +1 @@
1
+ export { default as enabledCellFormatter } from './enabledCellFormatter';
@@ -0,0 +1,14 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+ import EnabledCell from '../EnabledCell';
3
+
4
+ const fixtures = {
5
+ 'should render blank cell': {
6
+ condition: false,
7
+ },
8
+ 'should render marked cell': {
9
+ condition: true,
10
+ },
11
+ };
12
+
13
+ describe('EnabledCell', () =>
14
+ testComponentSnapshotsWithFixtures(EnabledCell, fixtures));
@@ -0,0 +1,17 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`EnabledCell should render blank cell 1`] = `
4
+ <BanIcon
5
+ color="currentColor"
6
+ noVerticalAlign={false}
7
+ size="sm"
8
+ />
9
+ `;
10
+
11
+ exports[`EnabledCell should render marked cell 1`] = `
12
+ <CheckIcon
13
+ color="currentColor"
14
+ noVerticalAlign={false}
15
+ size="sm"
16
+ />
17
+ `;