mirror of
https://github.com/vale981/Vulcan
synced 2025-03-06 18:11:40 -05:00
281 lines
No EOL
10 KiB
JavaScript
281 lines
No EOL
10 KiB
JavaScript
// setup JSDOM server side for testing (necessary for Enzyme to mount)
|
|
import 'jsdom-global/register'
|
|
import React from 'react'
|
|
// TODO: should be loaded from Components instead?
|
|
import Form from '../lib/components/Form'
|
|
import FormGroup from "../lib/components/FormGroup"
|
|
import FormComponent from "../lib/components/FormComponent"
|
|
import '../lib/components/FormNestedArray'
|
|
import expect from 'expect'
|
|
import Enzyme, { mount, shallow } from 'enzyme'
|
|
import Adapter from 'enzyme-adapter-react-16';
|
|
import { Components } from "meteor/vulcan:core"
|
|
|
|
// setup enzyme
|
|
// TODO: write a reusable helper and move this to the tests setup
|
|
Enzyme.configure({ adapter: new Adapter() })
|
|
|
|
// we must import all the other components, so that "registerComponent" is called
|
|
import "../lib/modules/components"
|
|
// and then load them in the app so that <Component.Whatever /> is defined
|
|
import { populateComponentsApp, initializeFragments } from "meteor/vulcan:lib"
|
|
// we need registered fragments to be initialized because populateComponentsApp will run
|
|
// hocs, like withUpdate, that rely on fragments
|
|
initializeFragments()
|
|
// actually fills the Components object
|
|
populateComponentsApp()
|
|
|
|
|
|
|
|
// fixtures
|
|
import SimpleSchema from "simpl-schema";
|
|
const addressGroup = {
|
|
name: "addresses",
|
|
label: "Addresses",
|
|
order: 10
|
|
};
|
|
const addressSchema = {
|
|
street: {
|
|
type: String,
|
|
optional: true,
|
|
viewableBy: ["guests"],
|
|
editableBy: ["quests"],
|
|
insertableBy: ["quests"],
|
|
max: 100 // limit street address to 100 characters
|
|
},
|
|
};
|
|
const arraySchema = {
|
|
addresses: {
|
|
type: Array,
|
|
viewableBy: ["guests"],
|
|
editableBy: ["quests"],
|
|
insertableBy: ["quests"],
|
|
group: addressGroup
|
|
},
|
|
"addresses.$": {
|
|
type: new SimpleSchema(addressSchema)
|
|
}
|
|
};
|
|
const objectSchema = {
|
|
addresses: {
|
|
type: new SimpleSchema(addressSchema),
|
|
viewableBy: ["guests"],
|
|
editableBy: ["quests"],
|
|
insertableBy: ["quests"],
|
|
},
|
|
};
|
|
|
|
// stub collection
|
|
import { createCollection, getDefaultResolvers, getDefaultMutations } from 'meteor/vulcan:core'
|
|
const WithArrays = createCollection({
|
|
collectionName: 'WithArrays',
|
|
typeName: 'WithArray',
|
|
schema: arraySchema,
|
|
resolvers: getDefaultResolvers('WithArrays'),
|
|
mutations: getDefaultMutations('WithArrays'),
|
|
});
|
|
const WithObjects = createCollection({
|
|
collectionName: 'WithObjects',
|
|
typeName: 'WithObject',
|
|
schema: objectSchema,
|
|
resolvers: getDefaultResolvers('WithObjects'),
|
|
mutations: getDefaultMutations('WithObjects'),
|
|
});
|
|
|
|
const Addresses = createCollection({
|
|
collectionName: 'Addresses',
|
|
typeName: 'Address',
|
|
schema: addressSchema,
|
|
resolvers: getDefaultResolvers('Addresses'),
|
|
mutations: getDefaultMutations('Addresses'),
|
|
})
|
|
|
|
// tests
|
|
describe('vulcan-forms/components', function () {
|
|
describe('Form', function () {
|
|
const context = {
|
|
intl: {
|
|
formatMessage: () => "",
|
|
formatDate: () => "",
|
|
formatTime: () => "",
|
|
formatRelative: () => "",
|
|
formatNumber: () => "",
|
|
formatPlural: () => "",
|
|
formatHTMLMessage: () => ""
|
|
}
|
|
|
|
}
|
|
const mountWithContext = C => mount(C, {
|
|
context
|
|
})
|
|
const shallowWithContext = C => shallow(C, {
|
|
context
|
|
})
|
|
describe('basic', function () {
|
|
it('shallow render', function () {
|
|
const wrapper = shallowWithContext(<Form collection={Addresses} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
})
|
|
describe('nested array', function () {
|
|
it('shallow render', () => {
|
|
const wrapper = shallowWithContext(<Form collection={WithArrays} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
it('render a FormGroup for addresses', function () {
|
|
const wrapper = shallowWithContext(<Form collection={WithArrays} />)
|
|
const formGroup = wrapper.find('FormGroup').find({ name: 'addresses' })
|
|
expect(formGroup).toBeDefined()
|
|
expect(formGroup).toHaveLength(1)
|
|
})
|
|
})
|
|
describe('nested object', function () {
|
|
it('shallow render', () => {
|
|
const wrapper = shallowWithContext(<Form collection={WithObjects} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
it('define one field', () => {
|
|
const wrapper = shallowWithContext(<Form collection={WithObjects} />)
|
|
const defaultGroup = wrapper.find('FormGroup').first()
|
|
const fields = defaultGroup.prop('fields')
|
|
expect(fields).toHaveLength(1) // addresses field
|
|
})
|
|
|
|
const getFormFields = (wrapper) => {
|
|
const defaultGroup = wrapper.find('FormGroup').first()
|
|
const fields = defaultGroup.prop('fields')
|
|
return fields
|
|
}
|
|
const getFirstField = () => {
|
|
const wrapper = shallowWithContext(<Form collection={WithObjects} />)
|
|
const fields = getFormFields(wrapper)
|
|
return fields[0]
|
|
}
|
|
it('define the nestedSchema', () => {
|
|
const addressField = getFirstField()
|
|
expect(addressField.nestedSchema.street).toBeDefined()
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('FormComponent', function () {
|
|
const shallowWithContext = C => shallow(C, {
|
|
context: {
|
|
getDocument: () => { }
|
|
}
|
|
})
|
|
const defaultProps = {
|
|
"disabled": false,
|
|
"optional": true,
|
|
"document": {},
|
|
"name": "meetingPlace",
|
|
"path": "meetingPlace",
|
|
"datatype": [{ type: Object }],
|
|
"layout": "horizontal",
|
|
"label": "Meeting place",
|
|
"currentValues": {},
|
|
"formType": "new",
|
|
deletedValues: [],
|
|
throwError: () => { },
|
|
updateCurrentValues: () => { },
|
|
errors: [],
|
|
clearFieldErrors: () => { },
|
|
}
|
|
it('shallow render', function () {
|
|
const wrapper = shallowWithContext(<FormComponent {...defaultProps} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
describe('nested array', function () {
|
|
const props = {
|
|
...defaultProps,
|
|
"datatype": [{ type: Array }],
|
|
"nestedSchema": {
|
|
"street": {},
|
|
"country": {},
|
|
"zipCode": {}
|
|
},
|
|
"nestedInput": true,
|
|
"nestedFields": [
|
|
{},
|
|
{},
|
|
{}
|
|
],
|
|
"currentValues": {},
|
|
}
|
|
it('render a FormNestedArray', function () {
|
|
const wrapper = shallowWithContext(<FormComponent {...props} />)
|
|
const formNested = wrapper.find('FormNestedArray')
|
|
expect(formNested).toHaveLength(1)
|
|
})
|
|
})
|
|
describe('nested object', function () {
|
|
const props = {
|
|
...defaultProps,
|
|
"datatype": [{ type: new SimpleSchema({}) }],
|
|
"nestedSchema": {
|
|
"street": {},
|
|
"country": {},
|
|
"zipCode": {}
|
|
},
|
|
"nestedInput": true,
|
|
"nestedFields": [
|
|
{},
|
|
{},
|
|
{}
|
|
],
|
|
"currentValues": {},
|
|
}
|
|
it('shallow render', function () {
|
|
const wrapper = shallowWithContext(<FormComponent {...props} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
it('render a FormNestedObject', function () {
|
|
const wrapper = shallowWithContext(<FormComponent {...props} />)
|
|
const formNested = wrapper.find('FormNestedObject')
|
|
expect(formNested).toHaveLength(1)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('FormNestedArray', function () {
|
|
it('shallow render', function () {
|
|
const wrapper = shallow(<Components.FormNestedArray path="foobar" currentValues={{}} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
it('shows a button', function () {
|
|
const wrapper = shallow(<Components.FormNestedArray path="foobar" currentValues={{}} />)
|
|
const button = wrapper.find('BootstrapButton')
|
|
expect(button).toHaveLength(1)
|
|
})
|
|
it('shows an add button', function () {
|
|
const wrapper = shallow(<Components.FormNestedArray path="foobar" currentValues={{}} />)
|
|
const addButton = wrapper.find('IconAdd')
|
|
expect(addButton).toHaveLength(1)
|
|
})
|
|
})
|
|
describe('FormNestedObject', function () {
|
|
it('shallow render', function () {
|
|
const wrapper = shallow(<Components.FormNestedObject path="foobar" currentValues={{}} />)
|
|
expect(wrapper).toBeDefined()
|
|
})
|
|
it.skip('render a form for the object', function () {
|
|
const wrapper = shallow(<Components.FormNestedObject path="foobar" currentValues={{}} />)
|
|
expect(false).toBe(true)
|
|
})
|
|
it('does not show any button', function () {
|
|
const wrapper = shallow(<Components.FormNestedObject path="foobar" currentValues={{}} />)
|
|
const button = wrapper.find('BootstrapButton')
|
|
expect(button).toHaveLength(0)
|
|
})
|
|
it('does not show add button', function () {
|
|
const wrapper = shallow(<Components.FormNestedObject path="foobar" currentValues={{}} />)
|
|
const addButton = wrapper.find('IconAdd')
|
|
expect(addButton).toHaveLength(0)
|
|
})
|
|
it('does not show remove button', function () {
|
|
const wrapper = shallow(<Components.FormNestedObject path="foobar" currentValues={{}} />)
|
|
const removeButton = wrapper.find('IconRemove')
|
|
expect(removeButton).toHaveLength(0)
|
|
})
|
|
})
|
|
}) |