Skip to content

Commit

Permalink
Adding propTypes for Components props. Expanded and adding tests for …
Browse files Browse the repository at this point in the history
…props now

part of issue #211.

Fixes #175

Continued refinement for implementing and testing props in current
Sinopia Editor. Will need to be refactored when final Profile JSON
structure is decided.

Added invalid props test for PropertyTemplate, fixed tests and props for other components

Removed props tests in favor of a follow-up ticket #211
  • Loading branch information
jermnelson committed Nov 29, 2018
1 parent 0e0e870 commit 834612e
Show file tree
Hide file tree
Showing 18 changed files with 105 additions and 7 deletions.
1 change: 1 addition & 0 deletions __tests__/components/CanvasMenu.test.js
Expand Up @@ -23,4 +23,5 @@ describe('<CanvasMenu />', () => {
expect(node.prop('rel')).toEqual("noopener noreferrer")
})
})

})
1 change: 1 addition & 0 deletions __tests__/components/Header.test.js
Expand Up @@ -33,4 +33,5 @@ describe('<Header />', () => {
it('links to Sinopia Profile Editor', () => {
expect(wrapper.find('a[href="https://profile-editor.sinopia.io/"]').text()).toBe('Profile Editor')
})

})
2 changes: 2 additions & 0 deletions __tests__/components/HomePage.test.js
Expand Up @@ -7,6 +7,7 @@ import Header from '../../src/components/Header'
import NewsPanel from '../../src/components/NewsPanel'
import DescPanel from '../../src/components/DescPanel'


describe('<HomePage />', () =>{
it('selectable by id "home-page"', () => {
expect(shallow(<HomePage />).is('#home-page')).toBe(true)
Expand All @@ -18,4 +19,5 @@ describe('<HomePage />', () =>{
expect(wrapper.find(NewsPanel).length).toBe(1)
expect(wrapper.find(DescPanel).length).toBe(1)
})

})
1 change: 1 addition & 0 deletions __tests__/components/editor/Editor.test.js
Expand Up @@ -19,4 +19,5 @@ describe('<Editor />', () => {
it('renders <Header />', () => {
expect(wrapper.find(Header).length).toBe(1)
})

})
5 changes: 4 additions & 1 deletion __tests__/components/editor/FormWrapper.test.js
Expand Up @@ -33,12 +33,15 @@ describe('<FormWrapper />', () => {
]))
})
})

it('renders FormWrapper nested component', () => {
expect(wrapper
.find('div.FormWrapper > div > InputLiteral').length)
.toEqual(1)
})

it('<form> does not contain redundant form attribute', () => {
expect(wrapper.find('form[role="form"]').length).toEqual(0)
})
})

})
2 changes: 2 additions & 0 deletions __tests__/components/editor/Header.test.js
Expand Up @@ -6,7 +6,9 @@ import Header from '../../../src/components/editor/Header'

describe('<Header />', () => {
const wrapper = shallow(<Header />)

it ('displays the Sinopia text', () => {
expect(wrapper.find("h1.editor-logo").text()).toBe("SINOPIA")
})

})
2 changes: 1 addition & 1 deletion __tests__/components/editor/ResourceTemplate.test.js
Expand Up @@ -30,7 +30,6 @@ const rtProps = {

describe('<ResourceTemplate />', () => {
const wrapper = shallow(<ResourceTemplate {...rtProps} />)

it('has div with class "ResourceTemplate"', () => {
expect(wrapper.find('div.ResourceTemplate').length).toEqual(1)
})
Expand All @@ -39,4 +38,5 @@ describe('<ResourceTemplate />', () => {
it('contains <div> with id resourceTemplate', () => {
expect(wrapper.find('div#resourceTemplate').length).toEqual(1)
})

})
3 changes: 2 additions & 1 deletion __tests__/components/editor/ValueConstraints.test.js
Expand Up @@ -174,6 +174,7 @@ describe('when values are not present', () => {
})

describe('cleanup', () => {

it('unmounts the wrapper', () => {
expect(wrapper.debug().length).toBeGreaterThanOrEqual(1)
wrapper.unmount();
Expand All @@ -198,4 +199,4 @@ function copyProps(src, target) {
.filter(prop => typeof target[prop] === 'undefined')
.map(prop => Object.getOwnPropertyDescriptor(src, prop));
Object.defineProperties(target, props);
}
}
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -69,7 +69,7 @@
"dev-build": "webpack --progress --mode development",
"dev-build-test": "npm run dev-build && npm run test",
"dev-start": "webpack-dev-server --config ./webpack.config.js --mode development",
"eslint": "eslint --max-warnings 60 --color -c .eslintrc.js --ext js,jsx ./src",
"eslint": "eslint --max-warnings 32 --color -c .eslintrc.js --ext js,jsx ./src",
"jest-cov": "jest --coverage --colors",
"jest-ci": "jest --ci --runInBand --coverage --reporters=default --reporters=jest-junit --colors && cat ./coverage/lcov.info | coveralls",
"test": "jest --colors"
Expand Down
9 changes: 7 additions & 2 deletions src/components/CanvasMenu.jsx
@@ -1,12 +1,13 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, { Component } from 'react';
import React, { Component } from 'react'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faTimes } from '@fortawesome/free-solid-svg-icons'
import { faArrowAltCircleRight } from '@fortawesome/free-solid-svg-icons'

import PropTypes from 'prop-types'

class CanvasMenu extends Component {

render() {
return(
<div>
Expand Down Expand Up @@ -68,4 +69,8 @@ class CanvasMenu extends Component {
};
};

CanvasMenu.propTypes = {
closeHandleMenu: PropTypes.func
}

export default CanvasMenu;
5 changes: 5 additions & 0 deletions src/components/Header.jsx
@@ -1,6 +1,7 @@
// Copyright 2018 Leland Stanford Junior University see Apache2.txt for license

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import SinopiaLogo from '../styles/sinopia-logo.png'
import { Link } from 'react-router-dom'

Expand Down Expand Up @@ -29,4 +30,8 @@ class Header extends Component {
}
}

Header.propTypes = {
triggerHomePageMenu: PropTypes.func
}

export default Header
7 changes: 7 additions & 0 deletions src/components/HomePage.jsx
@@ -1,6 +1,7 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import Header from './Header'
import NewsPanel from './NewsPanel'
import DescPanel from './DescPanel'
Expand All @@ -17,4 +18,10 @@ class HomePage extends Component {
}
}

HomePage.propTypes = {
// Passed through ...Props
children: PropTypes.array,
triggerHandleOffsetMenu: PropTypes.func
}

export default HomePage
6 changes: 6 additions & 0 deletions src/components/editor/Editor.jsx
@@ -1,6 +1,7 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, {Component} from 'react'
import PropTypes from 'prop-types'
import ResourceTemplate from './ResourceTemplate'
import Header from './Header'
import StartingPoints from './StartingPoints'
Expand Down Expand Up @@ -29,4 +30,9 @@ class Editor extends Component {
}
}

Editor.propTypes = {
children: PropTypes.array,
triggerHandleOffsetMenu: PropTypes.func
}

export default Editor
8 changes: 7 additions & 1 deletion src/components/editor/FormWrapper.jsx
Expand Up @@ -2,14 +2,15 @@

import React, { Component } from 'react'
import InputLiteral from './InputLiteral'
import PropTypes from 'prop-types'

class FormWrapper extends Component{
render () {
let dashedBorder = {
border: '1px dashed',
padding: '10px',
}
if (this.props.propertyTemplates.length == 0 || this.props.propertyTemplates[0] == {}) {
if (this.props.propertyTemplates.length === 0 || this.props.propertyTemplates[0] === {}) {
return <h1>There are no propertyTemplates - probably an error.</h1>
} else {
return (
Expand Down Expand Up @@ -42,4 +43,9 @@ class FormWrapper extends Component{
}
}

FormWrapper.propTypes= {
propertyTemplates: PropTypes.array,

}

export default FormWrapper;
5 changes: 5 additions & 0 deletions src/components/editor/Header.jsx
@@ -1,6 +1,7 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, { Component } from 'react'
import PropTypes from 'prop-types'

class Header extends Component {
render() {
Expand All @@ -24,4 +25,8 @@ class Header extends Component {
}
}

Header.propTypes = {
triggerEditorMenu: PropTypes.func
}

export default Header
10 changes: 10 additions & 0 deletions src/components/editor/PropertyTemplate.jsx
@@ -1,6 +1,7 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import ValueConstraints from './ValueConstraints'

class PropertyTemplate extends Component {
Expand Down Expand Up @@ -35,5 +36,14 @@ class PropertyTemplate extends Component {
}
}

PropertyTemplate.propTypes = {
propertyLabel: PropTypes.string,
propertyURI: PropTypes.string,
remark: PropTypes.string,
mandatory: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
repeatable: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
type: PropTypes.string,
resourceTemplates: PropTypes.array
}

export default PropertyTemplate
6 changes: 6 additions & 0 deletions src/components/editor/ResourceTemplate.jsx
Expand Up @@ -3,6 +3,7 @@
import React, { Component } from 'react'
import FormWrapper from './FormWrapper'
const { getResourceTemplate } = require('../../sinopiaServerSpoof.js')
import PropTypes from 'prop-types'

class ResourceTemplate extends Component {

Expand Down Expand Up @@ -36,4 +37,9 @@ class ResourceTemplate extends Component {
}
}

ResourceTemplate.propTypes = {
resourceTemplates: PropTypes.array,
resourceTemplateId: PropTypes.string
}

export default ResourceTemplate;
37 changes: 37 additions & 0 deletions src/components/editor/ValueConstraints.jsx
@@ -1,8 +1,10 @@
// Copyright 2018 Stanford University see Apache2.txt for license

import React, { Component } from 'react'
import PropTypes from 'prop-types'

class ValueConstraints extends Component {

render() {
let dashedBorder = {
border: '1px dashed',
Expand Down Expand Up @@ -42,6 +44,25 @@ class ValueConstraints extends Component {
}
}

ValueConstraints.propTypes = {
defaults: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
editable: PropTypes.oneOfType([ PropTypes.string, PropTypes.bool]),
languageLabel: PropTypes.string,
// TODO: Use URL PropType see https://www.npmjs.com/package/url-prop-type
languageURI: PropTypes.string,
mandatory: PropTypes.oneOfType([ PropTypes.string, PropTypes.bool]),
remark: PropTypes.string,
repeatable: PropTypes.oneOfType([ PropTypes.string, PropTypes.bool]),
useValuesFrom: PropTypes.oneOfType([ PropTypes.string, PropTypes.array ]),
// Inconsistency in use of valueDataType in props
valueDataType: PropTypes.any,
valueDataTypes: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
// TODO: Use a custom validator to check controlled vocab for languages?
valueLanguage: PropTypes.string,
validatePattern: PropTypes.string,
valueTemplateRefs: PropTypes.oneOfType([ PropTypes.array, PropTypes.string])
}

class ValueDataTypes extends Component {
render() {
const obj = this.props.valueDataTypes
Expand All @@ -68,6 +89,10 @@ class ValueDataTypes extends Component {
}
}

ValueDataTypes.propTypes = {
valueDataTypes: PropTypes.array
}

class Defaults extends Component {
render() {
const obj = this.props.defaults[0]
Expand All @@ -88,6 +113,10 @@ class Defaults extends Component {
}
}

Defaults.propTypes = {
defaults: PropTypes.array
}

class UseValuesFrom extends Component {
render() {
const obj = this.props.useValuesFrom
Expand All @@ -111,6 +140,10 @@ class UseValuesFrom extends Component {
}
}

UseValuesFrom.propTypes = {
useValuesFrom: PropTypes.array
}

class ValueTemplateRefs extends Component {
render() {
const obj = this.props.valueTemplateRefs
Expand All @@ -134,6 +167,10 @@ class ValueTemplateRefs extends Component {
}
}

ValueTemplateRefs.propTypes = {
valueTemplateRefs: PropTypes.array
}

function hasValues(obj) {
for(var key in obj) {
if(obj.hasOwnProperty(key) && obj[key].length > 0)
Expand Down

0 comments on commit 834612e

Please sign in to comment.