Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
const React = require('react');
const _ = require('lodash');
const OptionSelector = require('./option-selector');
const semver = require('semver');

// const debug = require('debug')('mongodb-compass:validation');
// const debug = require('debug')('mongodb-compass:bson-type-selector');

const BSON_TYPES = [
{name: 'Double', number: 1, alias: 'double'},
Expand All @@ -28,11 +29,23 @@ const BSON_TYPES = [
{name: 'Max key', number: 127, alias: 'maxKey'}
];


class BSONTypeSelector extends React.Component {

constructor(props) {
super(props);
// try catch block in case semver typeerrors while remove decimal128
// if server is < 3.4.x
let canRemoveDecimal = false;
try {
canRemoveDecimal = semver.gt('3.4.0-rc0', this.props.serverVersion);
} catch (e) {
canRemoveDecimal = true;
}

if (canRemoveDecimal) {
_.remove(BSON_TYPES, (type) => type.number === 19);
}

this.state = {
type: null
};
Expand Down Expand Up @@ -81,13 +94,7 @@ class BSONTypeSelector extends React.Component {
*/
render() {
const selectedTypeName = _.get(this.state.type, 'alias', '');
// TODO: make recentServer true if server is 3.4 <
const recentServer = true;
// remove the decimal version if not recentServer
const typeOptions = _.zipObject(_.map(_.filter(BSON_TYPES, (t) => {
// filter out decimal if server < 3.4
return !(t.alias === 'decimal128' && !recentServer);
}), (type) => {
const typeOptions = _.zipObject(_.map(BSON_TYPES, (type) => {
return [type.alias, type.name];
}));

Expand All @@ -107,7 +114,8 @@ BSONTypeSelector.propTypes = {
typeNumber: React.PropTypes.number,
typeAlias: React.PropTypes.string,
typeName: React.PropTypes.string,
onTypeClicked: React.PropTypes.func.isRequired
onTypeClicked: React.PropTypes.func,
serverVersion: React.PropTypes.string
};

BSONTypeSelector.displayName = 'BSONTypeSelector';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class RuleBuilder extends React.Component {

renderRules() {
return _.map(this.props.validationRules, (rule) => {
return <Rule ref={rule.id} key={rule.id} {...rule} />;
return <Rule ref={rule.id} key={rule.id} serverVersion={this.props.serverVersion} {...rule} />;
});
}
/**
Expand Down Expand Up @@ -174,7 +174,8 @@ RuleBuilder.propTypes = {
editState: React.PropTypes.oneOf(['unmodified', 'modified', 'updating', 'error', 'success']).isRequired,
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
validationRules: React.PropTypes.array.isRequired
validationRules: React.PropTypes.array.isRequired,
serverVersion: React.PropTypes.string
};

RuleBuilder.displayName = 'RuleBuilder';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,15 @@ class RuleCategoryType extends React.Component {
const typeNumber = this.props.parameters.type;

return (
<BSONTypeSelector typeNumber={typeNumber} onTypeClicked={this.onTypeClicked.bind(this)} />
<BSONTypeSelector typeNumber={typeNumber} serverVersion={this.props.serverVersion} onTypeClicked={this.onTypeClicked.bind(this)} />
);
}
}

RuleCategoryType.propTypes = {
id: React.PropTypes.string.isRequired,
parameters: React.PropTypes.object.isRequired
parameters: React.PropTypes.object.isRequired,
serverVersion: React.PropTypes.string
};

RuleCategoryType.displayName = 'RuleCategoryType';
Expand Down
4 changes: 3 additions & 1 deletion src/internal-packages/validation/lib/components/rule.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class Rule extends React.Component {
<Parameters
ref="Parameters"
id={this.props.id}
serverVersion={this.props.serverVersion}
parameters={this.props.parameters}
/> : null;

Expand Down Expand Up @@ -106,7 +107,8 @@ Rule.propTypes = {
field: React.PropTypes.string.isRequired,
category: React.PropTypes.string.isRequired,
parameters: React.PropTypes.object.isRequired,
nullable: React.PropTypes.bool.isRequired
nullable: React.PropTypes.bool.isRequired,
serverVersion: React.PropTypes.string
};

Rule.displayName = 'Rule';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class Validation extends React.Component {
validationAction={this.props.validationAction}
validationLevel={this.props.validationLevel}
editState={this.props.editState}
serverVersion={this.props.serverVersion}
/>
</div>
) : (
Expand Down Expand Up @@ -86,7 +87,8 @@ Validation.propTypes = {
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
validatorDoc: React.PropTypes.object.isRequired,
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
validationRules: React.PropTypes.array.isRequired
validationRules: React.PropTypes.array.isRequired,
serverVersion: React.PropTypes.string
};

Validation.defaultProps = {
Expand Down
8 changes: 7 additions & 1 deletion src/internal-packages/validation/lib/stores/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ const ValidationStore = Reflux.createStore({
validationAction: 'warn', // one of `warn`, `error`
fetchState: 'initial', // one of `initial`, `fetching`, `success`, `error`
editState: 'unmodified', // one of `unmodified`, `modified`, `updating`, `success`, `error`
isExpressibleByRules: true // boolean
isExpressibleByRules: true, // boolean
serverVersion: ''
};
},

Expand Down Expand Up @@ -223,6 +224,11 @@ const ValidationStore = Reflux.createStore({
*/
_fetchFromServer(callback) {
const ns = toNS(NamespaceStore.ns);

if (this.state.serverVersion === '') {
const serverVersion = app.instance.build.version;
this.setState({serverVersion: serverVersion});
}
app.dataService.listCollections(ns.database, {name: ns.collection}, function(err, res) {
if (err) {
return callback(err);
Expand Down
11 changes: 10 additions & 1 deletion test/validation.store.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const ValidationStore = require('../src/internal-packages/validation/lib/stores'
const sinon = require('sinon');
const _ = require('lodash');

function mockFetchFromServer(err, res, delay) {
function mockFetchFromServer(err, res, delay, serverVersion) {
if (delay === undefined) {
delay = 0;
}
Expand All @@ -14,6 +14,10 @@ function mockFetchFromServer(err, res, delay) {
return callback(err, res);
}, delay);
};
// the above fetchFromServer makes a call for app.instance.build.version
// which will be undefined at the time of this test so setting serverVersion
// manually here, which would otherwise be overwritten
ValidationStore.setState({serverVersion: serverVersion});
}

const mockValidatorDoc = {
Expand Down Expand Up @@ -47,6 +51,11 @@ describe('ValidationStore', function() {
unsubscribe = function() {};
});

it('check a pre 3.4 server version', function(done) {
mockFetchFromServer(null, mockValidatorDoc, 0, '3.1.9');
expect(ValidationStore.state.serverVersion).to.be.equal('3.1.9');
done();
});

it('goes into {fetchState: "fetching"} when starting to fetch from server', function(done) {
mockFetchFromServer(null, mockValidatorDoc);
Expand Down