dc-thing
Version:
Data controller for 'thing' that conforms to Schema.org
406 lines (367 loc) • 17 kB
JavaScript
var model = {};
model.name = "Jose Barrios";
model.identifier = "1234";
const TYPE = "thing";
var assert = require("assert");
var ThingDataController = require("../index.js");
var thing = new ThingDataController(model);
describe("Constructors:", function () {
it("should be extendible", function () {
class Test extends ThingDataController {
constructor(model){
super(model);
this.passed = model.passed;
this.type = "type";
}
}
let testModel = {
passed: "value",
name: "test"
};
let test = new Test(testModel);
// first identifier (second under thing.identifier test)
assert.equal(test.identifier, "1");
assert.equal(testModel.passed, test.passed);
assert.equal(testModel.name, test.name);
assert.equal(test.type, "type");
});
})
describe("Static Methods:", function () {
describe("ThingDataController.isNumber(value)", function () {
it("should return true if value is a number, false otherwise", function () {
assert.equal(ThingDataController.isNumber(1), true);
assert.equal(ThingDataController.isNumber("string"), false);
assert.equal(ThingDataController.isNumber(""), false);
assert.equal(ThingDataController.isNumber(true), false);
assert.equal(ThingDataController.isNumber(false), false);
assert.equal(ThingDataController.isNumber([]), false);
assert.equal(ThingDataController.isNumber({}), false);
assert.equal(ThingDataController.isNumber(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
//TODO: make test for this static method
//assert.equal(ThingDataController.validateInputType('number', 1, 'whatever'), true)
});
});
describe("ThingDataController.isString(value)", function () {
it("should return true if value is string, false otherwise", function () {
assert.equal(ThingDataController.isString(1), false);
assert.equal(ThingDataController.isString("string"), true);
assert.equal(ThingDataController.isString(""), true);
assert.equal(ThingDataController.isString(true), false);
assert.equal(ThingDataController.isString(false), false);
assert.equal(ThingDataController.isString([]), false);
assert.equal(ThingDataController.isString({}), false);
assert.equal(ThingDataController.isString(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isBoolean(value)", function () {
it("should return true if value is boolean, false otherwise", function () {
assert.equal(ThingDataController.isBoolean(1), false);
assert.equal(ThingDataController.isBoolean("string"), false);
assert.equal(ThingDataController.isBoolean(""), false);
assert.equal(ThingDataController.isBoolean(true), true);
assert.equal(ThingDataController.isBoolean(false), true);
assert.equal(ThingDataController.isBoolean([]), false);
assert.equal(ThingDataController.isBoolean({}), false);
assert.equal(ThingDataController.isBoolean(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isArray(value)", function () {
it("should return true if value is array, false otherwise", function () {
assert.equal(ThingDataController.isArray(1), false);
assert.equal(ThingDataController.isArray("string"), false);
assert.equal(ThingDataController.isArray(""), false);
assert.equal(ThingDataController.isArray(true), false);
assert.equal(ThingDataController.isArray(false), false);
assert.equal(ThingDataController.isArray([]), true);
assert.equal(ThingDataController.isArray({}), false);
assert.equal(ThingDataController.isArray(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isObject(value)", function () {
it("should return true if value is plain object, false otherwise", function () {
assert.equal(ThingDataController.isObject(1), false);
assert.equal(ThingDataController.isObject("string"), false);
assert.equal(ThingDataController.isObject(""), false);
assert.equal(ThingDataController.isObject(true), false);
assert.equal(ThingDataController.isObject(false), false);
assert.equal(ThingDataController.isObject([1, 2, 3]), true);
assert.equal(ThingDataController.isObject({}), true);
assert.equal(ThingDataController.isObject({
"hello": "world"
}), true);
assert.equal(ThingDataController.isObject({
hello: "world"
}), true);
assert.equal(ThingDataController.isObject({
greeting: {
hello: "world"
}
}), true);
assert.equal(ThingDataController.isObject(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isPlainObject(value)", function () {
it("should return true if value is plain object, false otherwise", function () {
assert.equal(ThingDataController.isPlainObject(1), false);
assert.equal(ThingDataController.isPlainObject("string"), false);
assert.equal(ThingDataController.isPlainObject(""), false);
assert.equal(ThingDataController.isPlainObject(true), false);
assert.equal(ThingDataController.isPlainObject(false), false);
assert.equal(ThingDataController.isPlainObject([]), false);
assert.equal(ThingDataController.isPlainObject({}), true);
assert.equal(ThingDataController.isPlainObject({
"hello": "world"
}), true);
assert.equal(ThingDataController.isPlainObject({
hello: "world"
}), true);
assert.equal(ThingDataController.isPlainObject({
greeting: {
hello: "world"
}
}), true);
assert.equal(ThingDataController.isPlainObject(null), false);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isNull(value)", function () {
it("should return true if value is null, false otherwise", function () {
assert.equal(ThingDataController.isNull(1), false);
assert.equal(ThingDataController.isNull("string"), false);
assert.equal(ThingDataController.isNull(""), false);
assert.equal(ThingDataController.isNull(true), false);
assert.equal(ThingDataController.isNull(false), false);
assert.equal(ThingDataController.isNull([]), false);
assert.equal(ThingDataController.isNull({}), false);
assert.equal(ThingDataController.isNull(null), true);
assert.equal(ThingDataController.isNull(undefined), false);
});
});
describe("ThingDataController.isDate(value)", function () {
it("should return true if value is is an ISO8601 date, false otherwise", function () {
assert.equal(ThingDataController.isDate("string"), false, "isDate('string')");
assert.equal(ThingDataController.isDate(""), false, "isDate('')");
assert.equal(ThingDataController.isDate(true), false, "isDate(true)");
assert.equal(ThingDataController.isDate(false), false, "isDate(false)");
assert.equal(ThingDataController.isDate(null), false, "isDate(null)");
assert.equal(ThingDataController.isDate(1), true, "isDate(1)");
assert.equal(ThingDataController.isDate([]), true, "isDate([])");
assert.equal(ThingDataController.isDate({}), true, "isDate({})");
assert.equal(ThingDataController.isDate(Date.now()), true, "isDate(Date.now())")
assert.equal(ThingDataController.isDate(ThingDataController.moment().format()), true, "isDate(moment().format())")
assert.equal(ThingDataController.isDate(undefined), true, "isDate(undefined)");
});
});
describe("ThingDataController.isEmpty(value)", function () {
it("should return true if value is empty object or array, false otherwise", function () {
assert.equal(ThingDataController.isEmpty(1), true, "isEmpty(1)");
assert.equal(ThingDataController.isEmpty("string"), false, "isEmpty('string')");
assert.equal(ThingDataController.isEmpty(""), true, "isEmpty('')");
assert.equal(ThingDataController.isEmpty(true), true, "isEmpty(true)");
assert.equal(ThingDataController.isEmpty(false), true), "isEmpty(false)";
assert.equal(ThingDataController.isEmpty([]), true, "isEmpty([])");
assert.equal(ThingDataController.isEmpty([1]), false, "isEmpty([1])");
assert.equal(ThingDataController.isEmpty({
num: 1
}), false, "isEmpty({ num:1 })");
assert.equal(ThingDataController.isEmpty(null), true, "isEmpty(null)");
assert.equal(ThingDataController.isEmpty(undefined), true, "isEmpty(undefined)");
});
});
describe("ThingDataController.isEmptyString(value)", function () {
it("should return true if value is \"\", false otherwise", function () {
assert.equal(ThingDataController.isEmptyString(1), false);
assert.equal(ThingDataController.isEmptyString("string"), false);
assert.equal(ThingDataController.isEmptyString(true), false);
assert.equal(ThingDataController.isEmptyString(false), false);
assert.equal(ThingDataController.isEmptyString(""), true);
assert.equal(ThingDataController.isEmptyString([]), false);
assert.equal(ThingDataController.isEmptyString({}), false);
assert.equal(ThingDataController.isEmptyString(null), false);
assert.equal(ThingDataController.isEmptyString(undefined), false);
});
});
describe("ThingDataController.isValidJSONInput(value)", function () {
it("should return true if value is JSON supported, false otherwise", function () {
assert.equal(ThingDataController.isValidJSONInput(1), true);
assert.equal(ThingDataController.isValidJSONInput("string"), true);
assert.equal(ThingDataController.isValidJSONInput(""), true);
assert.equal(ThingDataController.isValidJSONInput(true), true);
assert.equal(ThingDataController.isValidJSONInput(true), true);
assert.equal(ThingDataController.isValidJSONInput([]), true);
assert.equal(ThingDataController.isValidJSONInput({}), true);
assert.equal(ThingDataController.isValidJSONInput(null), true);
assert.equal(ThingDataController.isValidJSONInput(undefined), false);
});
});
describe("ThingDataController.isURL(value)", function () {
it("should return true if value is a valid URL, false otherwise", function () {
assert.equal(ThingDataController.isURL("www.google.com"), true, "1");
assert.equal(ThingDataController.isURL("google.com"), true, "2");
assert.equal(ThingDataController.isURL("http://google.com"), true, 3);
assert.equal(ThingDataController.isURL("https://google.com"), true, 4);
assert.equal(ThingDataController.isURL("https://google.com/something"), true, 5);
assert.equal(ThingDataController.isURL("https://google.com/something?value=true"), true, 6);
assert.equal(ThingDataController.isURL(1), false, 7);
assert.equal(ThingDataController.isURL("string"), false, 8);
assert.equal(ThingDataController.isURL(""), false, 9);
assert.equal(ThingDataController.isURL(true), false, 10);
assert.equal(ThingDataController.isURL(true), false, 11);
assert.equal(ThingDataController.isURL([]), false, 12);
assert.equal(ThingDataController.isURL({}), false, 13);
assert.equal(ThingDataController.isURL(null), false, 14);
assert.equal(ThingDataController.isURL(undefined), false, 15);
});
});
describe("ThingDataController.model", function () {
it("should return the serialized version of the class model", function () {
thing.description = "description"
assert.equal(ThingDataController.model(thing).description, "description");
});
});
describe("ThingDataController.keys", function () {
it("should return the object key names in array", function () {
assert.equal(ThingDataController.keys(thing).includes("description"), true);
});
});
describe("ThingDataController.values", function () {
it("should return the object values in array", function () {
thing.description = "description";
assert.equal(ThingDataController.values(thing).includes("description"), true);
});
});
describe("ThingDataController.isInstance", function () {
it("should return the true if param is an instance of this class", function () {
assert.equal(ThingDataController.isInstance(thing), true);
assert.equal(ThingDataController.isInstance({}), false);
});
});
describe("ThingDataController.type", function () {
it("should return the type of this class\n", function () {
assert.equal(ThingDataController.type, TYPE);
});
});
});
describe("Properties:", function () {
describe("thing.model", function () {
it("should return the instance model", function () {
assert.equal(thing.model.description, "description");
});
});
describe("thing.type", function () {
it("should return the class type", function () {
assert.equal(thing.type, TYPE);
assert.equal(thing.type, ThingDataController.type);
});
});
describe("thing.additionalType", function () {
it("should only allow value to be set if it is of type string (url)", function () {
let test = "not-a-url";
assert.throws(() => {
thing.additionalType = test
});
test = "www.google.com";
thing.additionalType = test;
assert.equal(thing.additionalType, test);
});
});
describe("thing.alternateName", function () {
it("should only allow value to be set if it is of type string", function () {
let str = "alternateName";
thing.alternateName = str;
assert.equal(thing.alternateName, str);
});
});
describe("thing.description", function () {
it("should only allow value to be set if it is of type string", function () {
let str = "description";
thing.description = str;
assert.equal(thing.description, str);
});
});
describe("thing.disambiguatingDescription", function () {
it("should only allow value to be set if it is of type string", function () {
let str = "disambiguatingDescription";
thing.disambiguatingDescription = str;
assert.equal(thing.disambiguatingDescription, str);
});
});
describe("thing.identifier", function () {
it("should only allow value to be set if it is of type string", function () {
let str = "identifier";
thing.identifier = str;
assert.equal(thing.identifier, str);
});
it("should look for _id property in the passed model", function () {
let testModel = {
_id: "123"
};
let testController = new ThingDataController(testModel)
assert.equal(testController.identifier, testModel._id);
});
it("should create a unique identifier for the current context if none is provided", function () {
let testModel = {};
let testController = new ThingDataController(testModel)
// First auto-identifier generated on Constructor tests
assert.equal(testController.identifier, "2");
});
});
describe("thing.image", function () {
it("should only allow value to be set if it is of type string (url)", function () {
let url = "google.com";
thing.image = url;
assert.equal(thing.image, url);
});
});
//TODO
//describe('thing.mainEntityOfPage', function() {
//it('should only allow value to be set if it is of type string', function() {
//let str = 'mainEntityOfPage';
//thing.mainEntityOfPage = str;
//assert.equal(thing.mainEntityOfPage, str);
//});
//});
describe("thing.name", function () {
it("should only allow value to be set if it is of type string", function () {
let str = "name";
thing.name = str;
assert.equal(thing.name, str);
});
});
//TODO
//describe('thing.potentialAction', function() {
//it('should only allow value to be set if it is of type string', function() {
//let str = 'potentialAction';
//thing.potentialAction = str;
//assert.equal(thing.potentialAction, str);
//});
//});
describe("thing.sameAs", function () {
it("should only allow value to be set if it is of type string (url)", function () {
let url = "google.com";
thing.sameAs = url;
assert.equal(thing.sameAs, url);
});
});
describe("thing.url", function () {
it("should only allow value to be set if it is of type string (url) \n", function () {
let url = "google.com";
thing.url = url;
assert.equal(thing.url, url);
});
});
});
describe("Methods:", function () {
describe("#isValidKey", function () {
it("should return false if object does not accept key, true otherwise", function () {
assert.equal(thing.isValidKey("name"), true);
assert.equal(thing.isValidKey("invalid"), false);
});
});
});