mirror of
https://github.com/ansible/awx.git
synced 2026-05-23 16:47:45 -02:30
Lift config context one level higher.
- Refactor About component to use config context. - Update About component unit tests.
This commit is contained in:
@@ -31,26 +31,4 @@ describe('<About />', () => {
|
|||||||
expect(onAboutModalClose).toBeCalled();
|
expect(onAboutModalClose).toBeCalled();
|
||||||
aboutWrapper.unmount();
|
aboutWrapper.unmount();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets error on api request failure', async () => {
|
|
||||||
api.get = jest.fn().mockImplementation(() => {
|
|
||||||
const err = new Error('404 error');
|
|
||||||
err.response = { status: 404, message: 'problem' };
|
|
||||||
return Promise.reject(err);
|
|
||||||
});
|
|
||||||
aboutWrapper = mount(
|
|
||||||
<I18nProvider>
|
|
||||||
<About isOpen />
|
|
||||||
</I18nProvider>
|
|
||||||
);
|
|
||||||
|
|
||||||
const aboutComponentInstance = aboutWrapper.find(About).instance();
|
|
||||||
await aboutComponentInstance.componentDidMount();
|
|
||||||
expect(aboutComponentInstance.state.error.response.status).toBe(404);
|
|
||||||
aboutWrapper.unmount();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('API Config endpoint is valid', () => {
|
|
||||||
expect(API_CONFIG).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -137,6 +137,7 @@ class App extends React.Component {
|
|||||||
[BackgroundImageSrc.filter]: '/assets/images/background-filter.svg'
|
[BackgroundImageSrc.filter]: '/assets/images/background-filter.svg'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<ConfigContext.Provider value={config}>
|
||||||
<Switch>
|
<Switch>
|
||||||
<ConditionalRedirect
|
<ConditionalRedirect
|
||||||
shouldRedirect={() => api.isAuthenticated()}
|
shouldRedirect={() => api.isAuthenticated()}
|
||||||
@@ -233,9 +234,7 @@ class App extends React.Component {
|
|||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/projects" component={Projects} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/projects" component={Projects} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/inventories" component={Inventories} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/inventories" component={Inventories} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/inventory_scripts" component={InventoryScripts} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/inventory_scripts" component={InventoryScripts} />
|
||||||
<ConfigContext.Provider value={config}>
|
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/organizations" component={Organizations} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/organizations" component={Organizations} />
|
||||||
</ConfigContext.Provider>
|
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/users" component={Users} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/users" component={Users} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/teams" component={Teams} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/teams" component={Teams} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/credential_types" component={CredentialTypes} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/credential_types" component={CredentialTypes} />
|
||||||
@@ -248,9 +247,11 @@ class App extends React.Component {
|
|||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/system_settings" component={SystemSettings} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/system_settings" component={SystemSettings} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/ui_settings" component={UISettings} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/ui_settings" component={UISettings} />
|
||||||
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/license" component={License} />
|
<ConditionalRedirect shouldRedirect={() => !api.isAuthenticated()} redirectPath="/login" path="/license" component={License} />
|
||||||
|
|
||||||
</Page>
|
</Page>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
</Switch>
|
</Switch>
|
||||||
|
</ConfigContext.Provider>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
</I18nProvider>
|
</I18nProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -5,42 +5,21 @@ import {
|
|||||||
AboutModal,
|
AboutModal,
|
||||||
TextContent,
|
TextContent,
|
||||||
TextList,
|
TextList,
|
||||||
TextListItem } from '@patternfly/react-core';
|
TextListItem
|
||||||
|
} from '@patternfly/react-core';
|
||||||
|
|
||||||
import heroImg from '@patternfly/patternfly-next/assets/images/pfbg_992.jpg';
|
import heroImg from '@patternfly/patternfly-next/assets/images/pfbg_992.jpg';
|
||||||
import brandImg from '../../images/tower-logo-white.svg';
|
import brandImg from '../../images/tower-logo-white.svg';
|
||||||
import logoImg from '../../images/tower-logo-login.svg';
|
import logoImg from '../../images/tower-logo-login.svg';
|
||||||
|
|
||||||
import api from '../api';
|
import { ConfigContext } from '../context';
|
||||||
import { API_CONFIG } from '../endpoints';
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
class About extends React.Component {
|
class About extends React.Component {
|
||||||
unmounting = false;
|
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
this.state = {
|
|
||||||
config: {},
|
|
||||||
error: false
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async componentDidMount () {
|
|
||||||
try {
|
|
||||||
const { data } = await api.get(API_CONFIG);
|
|
||||||
this.safeSetState({ config: data });
|
|
||||||
} catch (error) {
|
|
||||||
this.safeSetState({ error });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount () {
|
|
||||||
this.unmounting = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
safeSetState = obj => !this.unmounting && this.setState(obj);
|
|
||||||
|
|
||||||
createSpeechBubble = (version) => {
|
createSpeechBubble = (version) => {
|
||||||
let text = `Tower ${version}`;
|
let text = `Tower ${version}`;
|
||||||
let top = '';
|
let top = '';
|
||||||
@@ -65,12 +44,11 @@ class About extends React.Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { isOpen } = this.props;
|
const { isOpen } = this.props;
|
||||||
const { config = {}, error } = this.state;
|
|
||||||
const { ansible_version = 'loading', version = 'loading' } = config;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<I18n>
|
<I18n>
|
||||||
{({ i18n }) => (
|
{({ i18n }) => (
|
||||||
|
<ConfigContext.Consumer>
|
||||||
|
{({ ansible_version, version }) =>
|
||||||
<AboutModal
|
<AboutModal
|
||||||
isOpen={isOpen}
|
isOpen={isOpen}
|
||||||
onClose={this.handleModalToggle}
|
onClose={this.handleModalToggle}
|
||||||
@@ -102,12 +80,18 @@ class About extends React.Component {
|
|||||||
<TextListItem component="dd">{ansible_version}</TextListItem>
|
<TextListItem component="dd">{ansible_version}</TextListItem>
|
||||||
</TextList>
|
</TextList>
|
||||||
</TextContent>
|
</TextContent>
|
||||||
{ error ? <div>error</div> : ''}
|
|
||||||
</AboutModal>
|
</AboutModal>
|
||||||
|
}
|
||||||
|
</ConfigContext.Consumer>
|
||||||
)}
|
)}
|
||||||
</I18n>
|
</I18n>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
About.contextTypes = {
|
||||||
|
ansible_version: PropTypes.string,
|
||||||
|
version: PropTypes.string,
|
||||||
|
};
|
||||||
|
|
||||||
export default About;
|
export default About;
|
||||||
|
|||||||
Reference in New Issue
Block a user