foreman_templates 7.0.1 → 7.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.babelrc +16 -0
  3. data/lib/foreman_templates/version.rb +1 -1
  4. data/package.json +68 -0
  5. data/webpack/ForemanTemplates.js +29 -0
  6. data/webpack/Routes.js +33 -0
  7. data/webpack/__mocks__/foremanReact/common/helpers.js +27 -0
  8. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +2 -0
  9. data/webpack/__mocks__/foremanReact/components/common/forms/CommonForm.js +2 -0
  10. data/webpack/__mocks__/foremanReact/components/common/forms/Form.js +2 -0
  11. data/webpack/__mocks__/foremanReact/components/common/forms/TextField.js +2 -0
  12. data/webpack/__mocks__/foremanReact/redux/actions/common/forms.js +1 -0
  13. data/webpack/__mocks__/foremanReact/routes/common/PageLayout/PageLayout.js +2 -0
  14. data/webpack/__tests__/__snapshots__/helpers.test.js.snap +5 -0
  15. data/webpack/__tests__/helpers.test.js +17 -0
  16. data/webpack/components/NewTemplateSync/NewTemplateSync.js +60 -0
  17. data/webpack/components/NewTemplateSync/NewTemplateSync.scss +19 -0
  18. data/webpack/components/NewTemplateSync/NewTemplateSyncActions.js +39 -0
  19. data/webpack/components/NewTemplateSync/NewTemplateSyncReducer.js +34 -0
  20. data/webpack/components/NewTemplateSync/NewTemplateSyncSelectors.js +7 -0
  21. data/webpack/components/NewTemplateSync/__fixtures__/templateSyncSettings.fixtures.js +71 -0
  22. data/webpack/components/NewTemplateSync/__tests__/NewTemplateSync.test.js +31 -0
  23. data/webpack/components/NewTemplateSync/__tests__/NewTemplateSyncReducer.test.js +55 -0
  24. data/webpack/components/NewTemplateSync/__tests__/NewTemplateSyncSelectors.test.js +28 -0
  25. data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSync.test.js.snap +53 -0
  26. data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSyncReducer.test.js.snap +74 -0
  27. data/webpack/components/NewTemplateSync/__tests__/__snapshots__/NewTemplateSyncSelectors.test.js.snap +59 -0
  28. data/webpack/components/NewTemplateSync/components/ButtonTooltip.js +23 -0
  29. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncForm.js +145 -0
  30. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormConstants.js +1 -0
  31. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/NewTemplateSyncFormSelectors.js +24 -0
  32. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncForm.test.js +42 -0
  33. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/NewTemplateSyncFormSelectors.test.js +37 -0
  34. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncForm.test.js.snap +176 -0
  35. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/__tests__/__snapshots__/NewTemplateSyncFormSelectors.test.js.snap +42 -0
  36. data/webpack/components/NewTemplateSync/components/NewTemplateSyncForm/index.js +44 -0
  37. data/webpack/components/NewTemplateSync/components/SyncSettingField.js +54 -0
  38. data/webpack/components/NewTemplateSync/components/SyncSettingFields.js +69 -0
  39. data/webpack/components/NewTemplateSync/components/SyncTypeRadios.js +52 -0
  40. data/webpack/components/NewTemplateSync/components/TextButtonField/BlankOption.js +19 -0
  41. data/webpack/components/NewTemplateSync/components/TextButtonField/CheckboxField.js +15 -0
  42. data/webpack/components/NewTemplateSync/components/TextButtonField/FieldType.js +46 -0
  43. data/webpack/components/NewTemplateSync/components/TextButtonField/InputField.js +14 -0
  44. data/webpack/components/NewTemplateSync/components/TextButtonField/RenderField.js +74 -0
  45. data/webpack/components/NewTemplateSync/components/TextButtonField/SelectField.js +24 -0
  46. data/webpack/components/NewTemplateSync/components/TextButtonField/index.js +69 -0
  47. data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingField.test.js +34 -0
  48. data/webpack/components/NewTemplateSync/components/__tests__/SyncSettingFields.test.js +33 -0
  49. data/webpack/components/NewTemplateSync/components/__tests__/SyncTypeRadios.test.js +20 -0
  50. data/webpack/components/NewTemplateSync/components/__tests__/TextButtonField.test.js +65 -0
  51. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingField.test.js.snap +131 -0
  52. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncSettingFields.test.js.snap +94 -0
  53. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/SyncTypeRadios.test.js.snap +46 -0
  54. data/webpack/components/NewTemplateSync/components/__tests__/__snapshots__/TextButtonField.test.js.snap +112 -0
  55. data/webpack/components/NewTemplateSync/index.js +32 -0
  56. data/webpack/components/PageNotFound.js +13 -0
  57. data/webpack/components/PermissionDenied.js +33 -0
  58. data/webpack/components/TemplateSyncResult/TemplateSyncResult.js +61 -0
  59. data/webpack/components/TemplateSyncResult/TemplateSyncResult.scss +39 -0
  60. data/webpack/components/TemplateSyncResult/TemplateSyncResultActions.js +4 -0
  61. data/webpack/components/TemplateSyncResult/TemplateSyncResultHelpers.js +6 -0
  62. data/webpack/components/TemplateSyncResult/TemplateSyncResultReducer.js +33 -0
  63. data/webpack/components/TemplateSyncResult/TemplateSyncResultSelectors.js +1 -0
  64. data/webpack/components/TemplateSyncResult/__fixtures__/templateSyncResult.fixtures.js +86 -0
  65. data/webpack/components/TemplateSyncResult/__tests__/TemplateSyncResult.test.js +37 -0
  66. data/webpack/components/TemplateSyncResult/__tests__/TemplateSyncResultReducer.test.js +48 -0
  67. data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResult.test.js.snap +112 -0
  68. data/webpack/components/TemplateSyncResult/__tests__/__snapshots__/TemplateSyncResultReducer.test.js.snap +88 -0
  69. data/webpack/components/TemplateSyncResult/components/EmptySyncResult.js +25 -0
  70. data/webpack/components/TemplateSyncResult/components/FinishedSyncResult.js +77 -0
  71. data/webpack/components/TemplateSyncResult/components/ListViewHeader.js +38 -0
  72. data/webpack/components/TemplateSyncResult/components/SyncResultList.js +41 -0
  73. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/EmptyInfoItem.js +16 -0
  74. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/IconInfoItem.js +21 -0
  75. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/InfoItem.js +34 -0
  76. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/LinkInfoItem.js +37 -0
  77. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/StringInfoItem.js +50 -0
  78. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/helpers.js +128 -0
  79. data/webpack/components/TemplateSyncResult/components/SyncedTemplate/index.js +33 -0
  80. data/webpack/components/TemplateSyncResult/components/__tests__/SyncResultList.test.js +27 -0
  81. data/webpack/components/TemplateSyncResult/components/__tests__/SyncedTemplate.test.js +30 -0
  82. data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncResultList.test.js.snap +102 -0
  83. data/webpack/components/TemplateSyncResult/components/__tests__/__snapshots__/SyncedTemplate.test.js.snap +548 -0
  84. data/webpack/components/TemplateSyncResult/index.js +13 -0
  85. data/webpack/consts.js +6 -0
  86. data/webpack/index.js +11 -0
  87. data/webpack/reducer.js +6 -0
  88. data/webpack/testSetup.js +11 -0
  89. data/webpack/withProtectedView.js +16 -0
  90. metadata +89 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3d99a3a9b934e72af1a294ed64800987d0d4913
4
- data.tar.gz: 5607d7eb373e637899574268fcf523a77f2dc513
3
+ metadata.gz: 799e5dc7d9045fbb1bcb6571584f705e3965c324
4
+ data.tar.gz: 71e4088ec73d0f103ee812952acbe2333264eebc
5
5
  SHA512:
6
- metadata.gz: 441f75e022ec3e8c82dabbd4dc11c2edb7af7e2d881b633f7b57419b7b8406acde65de22e873d40af8f72e5d6953756aec7493cc1d87cab1296279c57f9eaa4d
7
- data.tar.gz: e7b27d7302206e2924560f2c0a56a3a4d1b32cbaee79146e98c9370947c74fa8d2d751cd0043990ca5a2a5b012aaa675023ee9d81abb264c7b2f690961d70c81
6
+ metadata.gz: 89b63e0f1f73daed9c3cdfd1d78092d6733656169370cf976590099c4263972ed274c1c9a5dddf7eb629b0b9e61207434f7bfb94664b5e62171e1e4f219c1295
7
+ data.tar.gz: 0ce7b7cd05ecbd305a16444d80e57ecc85251eff82d0eec8d36f29f49f311203308171831fb807461bed587f64635fc5c088dfa14abafbd7458cd2e5f9557236
data/.babelrc ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "presets": ["env", "react"],
3
+ "plugins": [
4
+ "transform-class-properties",
5
+ "transform-object-rest-spread",
6
+ "transform-object-assign"
7
+ ],
8
+ "env": {
9
+ "test": {
10
+ "presets": ["@theforeman/vendor-dev/babel.preset.js"]
11
+ },
12
+ "storybook": {
13
+ "presets": ["@theforeman/vendor-dev/babel.preset.js"]
14
+ }
15
+ }
16
+ }
@@ -1,3 +1,3 @@
1
1
  module ForemanTemplates
2
- VERSION = '7.0.1'.freeze
2
+ VERSION = '7.0.2'.freeze
3
3
  end
data/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "foreman_templates",
3
+ "version": "0.0.1",
4
+ "description": "This plugin will sync the contents of the Foreman Community Templates [repository](https://github.com/theforeman/community-templates/) (or a git repo of your choice) to your local Foreman instance",
5
+ "main": "index.js",
6
+ "directories": {
7
+ "test": "test"
8
+ },
9
+ "scripts": {
10
+ "test": "node node_modules/.bin/jest webpack",
11
+ "lint": "./node_modules/.bin/eslint -c .eslintrc webpack/"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/theforeman/foreman_templates.git"
16
+ },
17
+ "author": "The Foreman team",
18
+ "license": "GPL-3.0",
19
+ "bugs": {
20
+ "url": "https://projects.theforeman.org"
21
+ },
22
+ "homepage": "https://github.com/theforeman/foreman_templates",
23
+ "dependencies": {
24
+ "@theforeman/vendor": "^1.7.0"
25
+ },
26
+ "devDependencies": {
27
+ "@theforeman/vendor-dev": "^1.7.0",
28
+ "babel-eslint": "^8.2.1",
29
+ "babel-plugin-transform-class-properties": "^6.24.1",
30
+ "babel-plugin-transform-object-assign": "^6.22.0",
31
+ "babel-plugin-transform-object-rest-spread": "^6.26.0",
32
+ "babel-preset-env": "^1.6.0",
33
+ "babel-preset-react": "^6.24.1",
34
+ "enzyme": "^3.7.0",
35
+ "enzyme-adapter-react-16": "^1.7.0",
36
+ "enzyme-to-json": "^3.3.5",
37
+ "eslint": "^4.18.1",
38
+ "eslint-config-airbnb": "^16.0.0",
39
+ "eslint-plugin-import": "^2.8.0",
40
+ "eslint-plugin-jest": "^21.2.0",
41
+ "eslint-plugin-jsx-a11y": "^6.0.2",
42
+ "eslint-plugin-patternfly-react": "^0.2.1",
43
+ "eslint-plugin-react": "^7.4.0",
44
+ "identity-obj-proxy": "^3.0.0",
45
+ "jest": "^23.6.0",
46
+ "prettier": "^1.16.4",
47
+ "react-redux-test-utils": "^0.1.1"
48
+ },
49
+ "jest": {
50
+ "verbose": true,
51
+ "moduleDirectories": [
52
+ "node_modules/@theforeman/vendor-core/node_modules",
53
+ "node_modules",
54
+ "webpack"
55
+ ],
56
+ "setupFiles": [
57
+ "raf/polyfill",
58
+ "./webpack/testSetup.js"
59
+ ],
60
+ "testPathIgnorePatterns": [
61
+ "/node_modules/",
62
+ "<rootDir>/foreman/"
63
+ ],
64
+ "moduleNameMapper": {
65
+ "^.+\\.(css|scss)$": "identity-obj-proxy"
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { BrowserRouter as Router } from 'react-router-dom';
3
+ import PropTypes from 'prop-types';
4
+
5
+ import Routes from './Routes';
6
+
7
+ const ForemanTemplates = ({ data }) => (
8
+ <Router>
9
+ <Routes
10
+ apiUrls={data.apiUrls}
11
+ validationData={data.validationData}
12
+ editPaths={data.editPaths}
13
+ fileRepoStartWith={data.fileRepoStartWith}
14
+ userPermissions={data.userPermissions}
15
+ />
16
+ </Router>
17
+ );
18
+
19
+ ForemanTemplates.propTypes = {
20
+ data: PropTypes.shape({
21
+ apiUrls: PropTypes.object,
22
+ validationData: PropTypes.object,
23
+ editPaths: PropTypes.object,
24
+ userPermissions: PropTypes.object,
25
+ fileRepoStartWith: PropTypes.array,
26
+ }).isRequired,
27
+ };
28
+
29
+ export default ForemanTemplates;
data/webpack/Routes.js ADDED
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { Route, Switch } from 'react-router-dom';
3
+
4
+ import NewTemplateSync from './components/NewTemplateSync';
5
+ import TemplateSyncResult from './components/TemplateSyncResult';
6
+ import PageNotFound from './components/PageNotFound';
7
+
8
+ const links = [
9
+ {
10
+ title: 'New Template Sync',
11
+ path: 'template_syncs',
12
+ Component: NewTemplateSync,
13
+ },
14
+ {
15
+ title: 'Template Sync Result',
16
+ path: 'template_syncs/result',
17
+ Component: TemplateSyncResult,
18
+ },
19
+ ];
20
+
21
+ export default data => (
22
+ <Switch>
23
+ {links.map(({ path, Component }) => (
24
+ <Route
25
+ exact
26
+ key={path}
27
+ path={`/${path}`}
28
+ render={props => <Component {...props} {...data} />}
29
+ />
30
+ ))}
31
+ <Route component={PageNotFound} />
32
+ </Switch>
33
+ );
@@ -0,0 +1,27 @@
1
+ import { camelCase } from 'lodash';
2
+
3
+ export const propsToCamelCase = ob =>
4
+ propsToCase(camelCase, 'propsToCamelCase only takes objects', ob);
5
+
6
+ export const deepPropsToCamelCase = obj => {
7
+ if (typeof obj !== 'object' || obj === null) {
8
+ return obj;
9
+ }
10
+ if (Array.isArray(obj)) {
11
+ return obj.map(deepPropsToCamelCase);
12
+ }
13
+ const transformed = propsToCamelCase(obj);
14
+ return Object.keys(transformed).reduce((memo, key) => {
15
+ memo[key] = deepPropsToCamelCase(transformed[key]);
16
+ return memo;
17
+ }, {});
18
+ };
19
+
20
+ const propsToCase = (casingFn, errorMsg, ob) => {
21
+ if (typeof ob !== 'object') throw Error(errorMsg);
22
+
23
+ return Object.keys(ob).reduce((memo, key) => {
24
+ memo[casingFn(key)] = ob[key];
25
+ return memo;
26
+ }, {});
27
+ };
@@ -0,0 +1,2 @@
1
+ const PaginationWrapper = () => jest.fn();
2
+ export default PaginationWrapper;
@@ -0,0 +1,2 @@
1
+ const CommonForm = () => jest.fn();
2
+ export default CommonForm;
@@ -0,0 +1,2 @@
1
+ const Form = () => jest.fn();
2
+ export default Form;
@@ -0,0 +1,2 @@
1
+ const TextField = () => jest.fn();
2
+ export default TextField;
@@ -0,0 +1 @@
1
+ export default {};
@@ -0,0 +1,2 @@
1
+ const PageLayout = () => jest.fn();
2
+ export default PageLayout;
@@ -0,0 +1,5 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`withProtectedView should return protected component 1`] = `<ProtectedComponent />`;
4
+
5
+ exports[`withProtectedView should return protection component 1`] = `<ProtectionComponent />`;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { testSelectorsSnapshotWithFixtures } from 'react-redux-test-utils';
3
+ import withProtectedView from '../withProtectedView';
4
+
5
+ const ProtectedComponent = () => <div>Protected component</div>;
6
+
7
+ const ProtectionComponent = () => <div>Protection component</div>;
8
+
9
+ const fixtures = {
10
+ 'should return protected component': () =>
11
+ withProtectedView(ProtectedComponent, ProtectionComponent, () => true)(),
12
+ 'should return protection component': () =>
13
+ withProtectedView(ProtectedComponent, ProtectionComponent, () => false)(),
14
+ };
15
+
16
+ describe('withProtectedView', () =>
17
+ testSelectorsSnapshotWithFixtures(fixtures));
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import { LoadingState } from 'patternfly-react';
3
+ import PageLayout from 'foremanReact/routes/common/PageLayout/PageLayout';
4
+ import PropTypes from 'prop-types';
5
+
6
+ import NewTemplateSyncForm from './components/NewTemplateSyncForm';
7
+ import './NewTemplateSync.scss';
8
+
9
+ class NewTemplateSync extends React.Component {
10
+ componentDidMount() {
11
+ const {
12
+ apiUrls: { syncSettingsUrl },
13
+ getSyncSettings,
14
+ } = this.props;
15
+ getSyncSettings(syncSettingsUrl);
16
+ }
17
+
18
+ render() {
19
+ const {
20
+ apiUrls: { importUrl, exportUrl },
21
+ loadingSettings,
22
+ history,
23
+ validationData,
24
+ userPermissions,
25
+ } = this.props;
26
+
27
+ return (
28
+ <LoadingState loading={loadingSettings}>
29
+ <PageLayout
30
+ header={__('Import or Export Templates')}
31
+ searchable={false}
32
+ >
33
+ <NewTemplateSyncForm
34
+ validationData={validationData}
35
+ importUrl={importUrl}
36
+ exportUrl={exportUrl}
37
+ history={history}
38
+ userPermissions={userPermissions}
39
+ />
40
+ </PageLayout>
41
+ </LoadingState>
42
+ );
43
+ }
44
+ }
45
+
46
+ NewTemplateSync.propTypes = {
47
+ getSyncSettings: PropTypes.func.isRequired,
48
+ apiUrls: PropTypes.object.isRequired,
49
+ userPermissions: PropTypes.object.isRequired,
50
+ history: PropTypes.object,
51
+ validationData: PropTypes.object,
52
+ loadingSettings: PropTypes.bool.isRequired,
53
+ };
54
+
55
+ NewTemplateSync.defaultProps = {
56
+ validationData: {},
57
+ history: {},
58
+ };
59
+
60
+ export default NewTemplateSync;
@@ -0,0 +1,19 @@
1
+ @import '~@theforeman/vendor/scss/variables';
2
+
3
+ .left-padded {
4
+ padding-left: 3%;
5
+ }
6
+
7
+ #foreman-templates {
8
+ .loading-state-pf.loading-state-pf-lg {
9
+ padding-top: 5%;
10
+ }
11
+ // No need to hide content, see #26122
12
+ #main > #content {
13
+ display: block;
14
+ }
15
+
16
+ .blank-slate-pf {
17
+ padding-top: 5%;
18
+ }
19
+ }
@@ -0,0 +1,39 @@
1
+ import api from 'foremanReact/API';
2
+ import { deepPropsToCamelCase } from 'foremanReact/common/helpers';
3
+
4
+ import {
5
+ SYNC_SETTINGS_REQUEST,
6
+ SYNC_SETTINGS_SUCCESS,
7
+ SYNC_SETTINGS_FAILURE,
8
+ SYNC_RESULT_PAGINATION_CHANGE,
9
+ } from '../../consts';
10
+
11
+ import { initialState } from '../TemplateSyncResult/TemplateSyncResultReducer';
12
+
13
+ export const getSyncSettings = url => async dispatch => {
14
+ dispatch({ type: SYNC_SETTINGS_REQUEST });
15
+
16
+ try {
17
+ const { data } = await api.get(url);
18
+ dispatch({
19
+ type: SYNC_RESULT_PAGINATION_CHANGE,
20
+ payload: { pagination: initialState.pagination },
21
+ });
22
+ return dispatch({
23
+ type: SYNC_SETTINGS_SUCCESS,
24
+ payload: {
25
+ ...deepPropsToCamelCase(data),
26
+ },
27
+ });
28
+ } catch (error) {
29
+ return dispatch(errorHandler(SYNC_SETTINGS_FAILURE, error));
30
+ }
31
+ };
32
+
33
+ const errorHandler = (msg, err) => {
34
+ const error = {
35
+ errorMsg: 'Failed to fetch Settings for template sync from server.',
36
+ statusText: err.response.statusText,
37
+ };
38
+ return { type: msg, payload: { error } };
39
+ };
@@ -0,0 +1,34 @@
1
+ import Immutable from 'seamless-immutable';
2
+
3
+ import {
4
+ SYNC_SETTINGS_REQUEST,
5
+ SYNC_SETTINGS_SUCCESS,
6
+ SYNC_SETTINGS_FAILURE,
7
+ } from '../../consts';
8
+
9
+ export const initialState = Immutable({
10
+ loadingSettings: false,
11
+ importSettings: [],
12
+ exportSettings: [],
13
+ error: '',
14
+ });
15
+
16
+ const syncSettings = (state = initialState, action) => {
17
+ const { payload } = action;
18
+ switch (action.type) {
19
+ case SYNC_SETTINGS_REQUEST:
20
+ return state.set('loadingSettings', true);
21
+ case SYNC_SETTINGS_SUCCESS:
22
+ return state.merge({
23
+ loadingSettings: false,
24
+ importSettings: payload.results.import,
25
+ exportSettings: payload.results.export,
26
+ });
27
+ case SYNC_SETTINGS_FAILURE:
28
+ return state.merge({ error: payload.error, loadingSettings: false });
29
+ default:
30
+ return state;
31
+ }
32
+ };
33
+
34
+ export default syncSettings;
@@ -0,0 +1,7 @@
1
+ export const newSyncState = state => state.foremanTemplates.syncSettings;
2
+
3
+ export const selectImportSettings = state => newSyncState(state).importSettings;
4
+ export const selectExportSettings = state => newSyncState(state).exportSettings;
5
+ export const selectLoadingSettings = state =>
6
+ newSyncState(state).loadingSettings;
7
+ export const selectError = state => newSyncState(state).error;
@@ -0,0 +1,71 @@
1
+ import Immutable from 'seamless-immutable';
2
+
3
+ export const associateSetting = Immutable({
4
+ id: 45,
5
+ value: 'new',
6
+ settingsType: 'string',
7
+ name: 'associate',
8
+ selection: [
9
+ { value: 'new', label: 'New' },
10
+ { value: 'never', label: 'Never' },
11
+ { value: 'always', label: 'Always' },
12
+ ],
13
+ });
14
+
15
+ export const forceSetting = Immutable({
16
+ id: 46,
17
+ value: false,
18
+ settingsType: 'bool',
19
+ name: 'force',
20
+ });
21
+
22
+ export const importSettings = [associateSetting, forceSetting];
23
+
24
+ export const filterSetting = Immutable({
25
+ id: 47,
26
+ value: '',
27
+ settingsType: 'string',
28
+ name: 'filter',
29
+ });
30
+
31
+ export const negateSetting = Immutable({
32
+ id: 48,
33
+ value: false,
34
+ settingsType: 'bool',
35
+ name: 'negate',
36
+ });
37
+
38
+ export const repoSetting = Immutable({
39
+ id: 49,
40
+ value: 'https://github.com/theforeman/community-templates.git',
41
+ settingsType: 'string',
42
+ name: 'repo',
43
+ });
44
+
45
+ export const exportSettings = [filterSetting, negateSetting, repoSetting];
46
+
47
+ const registeredSettings = settings =>
48
+ settings.reduce((memo, item) => {
49
+ memo[item.name] = item;
50
+ return memo;
51
+ }, {});
52
+
53
+ export const registeredImportSettings = {
54
+ registeredFields: registeredSettings(importSettings),
55
+ };
56
+ export const registeredExportSettings = {
57
+ registeredFields: registeredSettings(exportSettings),
58
+ };
59
+
60
+ export const initialValues = {
61
+ initial: importSettings.concat(exportSettings).reduce((memo, item) => {
62
+ memo[item.name] = item.value;
63
+ return memo;
64
+ }, {}),
65
+ };
66
+
67
+ export const stateFactory = obj => ({
68
+ foremanTemplates: {
69
+ syncSettings: obj,
70
+ },
71
+ });
@@ -0,0 +1,31 @@
1
+ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
+
3
+ import NewTemplateSync from '../NewTemplateSync';
4
+
5
+ jest.mock('foremanReact/routes/common/PageLayout/PageLayout');
6
+
7
+ const noop = () => {};
8
+
9
+ const commonFixture = {
10
+ apiUrls: {},
11
+ getSyncSettings: noop,
12
+ validationData: {},
13
+ userPermissions: {
14
+ import: true,
15
+ export: true,
16
+ },
17
+ };
18
+
19
+ const fixtures = {
20
+ 'should render when loaded': {
21
+ loadingSettings: false,
22
+ ...commonFixture,
23
+ },
24
+ 'should render when loading': {
25
+ loadingSettings: true,
26
+ ...commonFixture,
27
+ },
28
+ };
29
+
30
+ describe('NewTemplateSync', () =>
31
+ testComponentSnapshotsWithFixtures(NewTemplateSync, fixtures));
@@ -0,0 +1,55 @@
1
+ import { testReducerSnapshotWithFixtures } from 'react-redux-test-utils';
2
+
3
+ import reducer, { initialState } from '../NewTemplateSyncReducer';
4
+
5
+ import {
6
+ importSettings,
7
+ exportSettings,
8
+ } from '../__fixtures__/templateSyncSettings.fixtures';
9
+ import {
10
+ SYNC_SETTINGS_REQUEST,
11
+ SYNC_SETTINGS_SUCCESS,
12
+ SYNC_SETTINGS_FAILURE,
13
+ } from '../../../consts';
14
+
15
+ const successPayload = {
16
+ results: {
17
+ import: importSettings,
18
+ export: exportSettings,
19
+ },
20
+ };
21
+
22
+ const fixtures = {
23
+ 'should return initial state': {
24
+ state: initialState,
25
+ action: {
26
+ type: undefined,
27
+ payload: {},
28
+ },
29
+ },
30
+ 'should start loading on setting values request': {
31
+ state: initialState,
32
+ action: {
33
+ type: SYNC_SETTINGS_REQUEST,
34
+ },
35
+ },
36
+ 'should stop loading on setting values success': {
37
+ state: initialState.set('loadingSettings', true),
38
+ action: {
39
+ type: SYNC_SETTINGS_SUCCESS,
40
+ payload: successPayload,
41
+ },
42
+ 'should stop loading on setting values error': {
43
+ state: initialState.set('loadingSettings', true),
44
+ action: {
45
+ type: SYNC_SETTINGS_FAILURE,
46
+ payload: {
47
+ error: 'Failed to fetch setting values',
48
+ },
49
+ },
50
+ },
51
+ },
52
+ };
53
+
54
+ describe('NewTemplateSyncReducer', () =>
55
+ testReducerSnapshotWithFixtures(reducer, fixtures));
@@ -0,0 +1,28 @@
1
+ import { testSelectorsSnapshotWithFixtures } from 'react-redux-test-utils';
2
+
3
+ import {
4
+ importSettings,
5
+ exportSettings,
6
+ stateFactory,
7
+ } from '../__fixtures__/templateSyncSettings.fixtures';
8
+
9
+ import {
10
+ selectImportSettings,
11
+ selectExportSettings,
12
+ selectLoadingSettings,
13
+ selectError,
14
+ } from '../NewTemplateSyncSelectors';
15
+
16
+ const fixtures = {
17
+ 'should return import settings': () =>
18
+ selectImportSettings(stateFactory({ importSettings })),
19
+ 'should return export settings': () =>
20
+ selectExportSettings(stateFactory({ exportSettings })),
21
+ 'should return loading settings': () =>
22
+ selectLoadingSettings(stateFactory({ loadingSettings: true })),
23
+ 'should return loading error': () =>
24
+ selectError(stateFactory({ error: 'Error' })),
25
+ };
26
+
27
+ describe('NewTemplateSyncSelectors', () =>
28
+ testSelectorsSnapshotWithFixtures(fixtures));
@@ -0,0 +1,53 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`NewTemplateSync should render when loaded 1`] = `
4
+ <LoadingState
5
+ additionalClasses=""
6
+ loading={false}
7
+ loadingText="Loading"
8
+ size="lg"
9
+ timeout={300}
10
+ >
11
+ <PageLayout
12
+ header="Import or Export Templates"
13
+ searchable={false}
14
+ >
15
+ <Connect(ReduxForm)
16
+ history={Object {}}
17
+ userPermissions={
18
+ Object {
19
+ "export": true,
20
+ "import": true,
21
+ }
22
+ }
23
+ validationData={Object {}}
24
+ />
25
+ </PageLayout>
26
+ </LoadingState>
27
+ `;
28
+
29
+ exports[`NewTemplateSync should render when loading 1`] = `
30
+ <LoadingState
31
+ additionalClasses=""
32
+ loading={true}
33
+ loadingText="Loading"
34
+ size="lg"
35
+ timeout={300}
36
+ >
37
+ <PageLayout
38
+ header="Import or Export Templates"
39
+ searchable={false}
40
+ >
41
+ <Connect(ReduxForm)
42
+ history={Object {}}
43
+ userPermissions={
44
+ Object {
45
+ "export": true,
46
+ "import": true,
47
+ }
48
+ }
49
+ validationData={Object {}}
50
+ />
51
+ </PageLayout>
52
+ </LoadingState>
53
+ `;