2019-04-18 17:03:06 +03:00
/ *
* Enzyme helpers for injecting top - level contexts
* derived from https : //lingui.js.org/guides/testing.html
* /
import React from 'react' ;
import { shape , object , string , arrayOf , func } from 'prop-types' ;
import { mount , shallow } from 'enzyme' ;
import { I18nProvider } from '@lingui/react' ;
import { ConfigProvider } from '../src/contexts/Config' ;
import { _NetworkProvider } from '../src/contexts/Network' ;
import { RootDialogProvider } from '../src/contexts/RootDialog' ;
const language = 'en-US' ;
const intlProvider = new I18nProvider (
{
language ,
catalogs : {
[ language ] : { }
}
} ,
{ }
) ;
const {
linguiPublisher : { i18n : originalI18n }
} = intlProvider . getChildContext ( ) ;
const defaultContexts = {
linguiPublisher : {
i18n : {
... originalI18n ,
_ : key => key . id , // provide _ macro, for just passing down the key
toJSON : ( ) => '/i18n/' ,
} ,
} ,
config : {
ansible _version : null ,
custom _virtualenvs : [ ] ,
version : null ,
custom _logo : null ,
custom _login _info : null ,
toJSON : ( ) => '/config/'
} ,
router : {
history : {
push : ( ) => { } ,
replace : ( ) => { } ,
createHref : ( ) => { } ,
2019-04-18 20:10:17 +03:00
location : {
hash : '' ,
pathname : '' ,
search : '' ,
state : '' ,
2019-04-29 17:08:50 +03:00
} ,
toJSON : ( ) => '/history/' ,
2019-04-18 17:03:06 +03:00
} ,
route : {
location : {
hash : '' ,
pathname : '' ,
search : '' ,
state : '' ,
} ,
match : {
params : { } ,
isExact : false ,
path : '' ,
url : '' ,
2019-04-18 20:10:17 +03:00
}
2019-04-18 17:03:06 +03:00
} ,
toJSON : ( ) => '/router/' ,
} ,
network : {
api : {
getConfig : ( ) => { } ,
2019-04-29 17:08:50 +03:00
toJSON : ( ) => '/api/' ,
2019-04-18 17:03:06 +03:00
} ,
handleHttpError : ( ) => { } ,
} ,
dialog : { }
} ;
function wrapContexts ( node , context ) {
2019-05-15 17:06:14 +03:00
const { config , network , dialog } = context ;
class Wrap extends React . Component {
render ( ) {
// eslint-disable-next-line react/no-this-in-sfc
const { children , ... props } = this . props ;
const component = React . cloneElement ( children , props ) ;
return (
< RootDialogProvider value = { dialog } >
< _NetworkProvider value = { network } >
< ConfigProvider
value = { config }
i18n = { defaultContexts . linguiPublisher . i18n }
>
{ component }
< / ConfigProvider >
< / _NetworkProvider >
< / RootDialogProvider >
2019-04-18 17:03:06 +03:00
) ;
}
2019-05-15 17:06:14 +03:00
}
return (
< Wrap > { node } < / Wrap >
) ;
2019-04-18 17:03:06 +03:00
}
function applyDefaultContexts ( context ) {
if ( ! context ) {
return defaultContexts ;
}
const newContext = { } ;
Object . keys ( defaultContexts ) . forEach ( key => {
newContext [ key ] = {
... defaultContexts [ key ] ,
... context [ key ] ,
} ;
} ) ;
return newContext ;
}
export function shallowWithContexts ( node , options = { } ) {
const context = applyDefaultContexts ( options . context ) ;
return shallow ( wrapContexts ( node , context ) ) ;
}
export function mountWithContexts ( node , options = { } ) {
const context = applyDefaultContexts ( options . context ) ;
const childContextTypes = {
linguiPublisher : shape ( {
i18n : object . isRequired
} ) . isRequired ,
config : shape ( {
ansible _version : string ,
custom _virtualenvs : arrayOf ( string ) ,
version : string ,
custom _logo : string ,
custom _login _info : string ,
} ) ,
router : shape ( {
route : shape ( {
location : shape ( { } ) ,
match : shape ( { } ) ,
} ) . isRequired ,
history : shape ( { } ) . isRequired ,
} ) ,
network : shape ( {
api : shape ( { } ) . isRequired ,
handleHttpError : func . isRequired ,
} ) ,
dialog : shape ( {
title : string ,
setRootDialogMessage : func ,
clearRootDialogMessage : func ,
} ) ,
... options . childContextTypes
} ;
return mount ( wrapContexts ( node , context ) , { context , childContextTypes } ) ;
}