575 lines
15 KiB
JavaScript
575 lines
15 KiB
JavaScript
/* eslint-env mocha */
|
|
import expect from "expect"
|
|
import { fromJS } from "immutable"
|
|
import { mapToList, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered } from "core/utils"
|
|
import win from "core/window"
|
|
|
|
describe("utils", function() {
|
|
|
|
describe("mapToList", function(){
|
|
|
|
it("should convert a map to a list, setting `key`", function(){
|
|
// With
|
|
const aMap = fromJS({
|
|
a: {
|
|
one: 1,
|
|
},
|
|
b: {
|
|
two: 2,
|
|
}
|
|
})
|
|
|
|
// When
|
|
const aList = mapToList(aMap, "someKey")
|
|
|
|
// Then
|
|
expect(aList.toJS()).toEqual([
|
|
{ someKey: "a", one: 1 },
|
|
{ someKey: "b", two: 2 },
|
|
])
|
|
})
|
|
|
|
it("should flatten an arbitrarily deep map", function(){
|
|
// With
|
|
const aMap = fromJS({
|
|
a: {
|
|
one: {
|
|
alpha: true
|
|
}
|
|
},
|
|
b: {
|
|
two: {
|
|
bravo: true
|
|
},
|
|
three: {
|
|
charlie: true
|
|
}
|
|
}
|
|
})
|
|
|
|
// When
|
|
const aList = mapToList(aMap, ["levelA", "levelB"])
|
|
|
|
// Then
|
|
expect(aList.toJS()).toEqual([
|
|
{ levelA: "a", levelB: "one", alpha: true },
|
|
{ levelA: "b", levelB: "two", bravo: true },
|
|
{ levelA: "b", levelB: "three", charlie: true },
|
|
])
|
|
|
|
})
|
|
|
|
it("should handle an empty map", function(){
|
|
// With
|
|
const aMap = fromJS({})
|
|
|
|
// When
|
|
const aList = mapToList(aMap, ["levelA", "levelB"])
|
|
|
|
// Then
|
|
expect(aList.toJS()).toEqual([])
|
|
})
|
|
|
|
})
|
|
|
|
describe("validateNumber", function() {
|
|
let errorMessage = "Value must be a number"
|
|
|
|
it("doesn't return for whole numbers", function() {
|
|
expect(validateNumber(0)).toBeFalsy()
|
|
expect(validateNumber(1)).toBeFalsy()
|
|
expect(validateNumber(20)).toBeFalsy()
|
|
expect(validateNumber(5000000)).toBeFalsy()
|
|
expect(validateNumber("1")).toBeFalsy()
|
|
expect(validateNumber("2")).toBeFalsy()
|
|
expect(validateNumber(-1)).toBeFalsy()
|
|
expect(validateNumber(-20)).toBeFalsy()
|
|
expect(validateNumber(-5000000)).toBeFalsy()
|
|
})
|
|
|
|
it("doesn't return for negative numbers", function() {
|
|
expect(validateNumber(-1)).toBeFalsy()
|
|
expect(validateNumber(-20)).toBeFalsy()
|
|
expect(validateNumber(-5000000)).toBeFalsy()
|
|
})
|
|
|
|
it("doesn't return for decimal numbers", function() {
|
|
expect(validateNumber(1.1)).toBeFalsy()
|
|
expect(validateNumber(2.5)).toBeFalsy()
|
|
expect(validateNumber(-30.99)).toBeFalsy()
|
|
})
|
|
|
|
it("returns a message for strings", function() {
|
|
expect(validateNumber("")).toEqual(errorMessage)
|
|
expect(validateNumber(" ")).toEqual(errorMessage)
|
|
expect(validateNumber("test")).toEqual(errorMessage)
|
|
})
|
|
|
|
it("returns a message for invalid input", function() {
|
|
expect(validateNumber(undefined)).toEqual(errorMessage)
|
|
expect(validateNumber(null)).toEqual(errorMessage)
|
|
expect(validateNumber({})).toEqual(errorMessage)
|
|
expect(validateNumber([])).toEqual(errorMessage)
|
|
expect(validateNumber(true)).toEqual(errorMessage)
|
|
expect(validateNumber(false)).toEqual(errorMessage)
|
|
})
|
|
})
|
|
|
|
describe("validateInteger", function() {
|
|
let errorMessage = "Value must be an integer"
|
|
|
|
it("doesn't return for positive integers", function() {
|
|
expect(validateInteger(0)).toBeFalsy()
|
|
expect(validateInteger(1)).toBeFalsy()
|
|
expect(validateInteger(20)).toBeFalsy()
|
|
expect(validateInteger(5000000)).toBeFalsy()
|
|
expect(validateInteger("1")).toBeFalsy()
|
|
expect(validateInteger("2")).toBeFalsy()
|
|
expect(validateInteger(-1)).toBeFalsy()
|
|
expect(validateInteger(-20)).toBeFalsy()
|
|
expect(validateInteger(-5000000)).toBeFalsy()
|
|
})
|
|
|
|
it("doesn't return for negative integers", function() {
|
|
expect(validateInteger(-1)).toBeFalsy()
|
|
expect(validateInteger(-20)).toBeFalsy()
|
|
expect(validateInteger(-5000000)).toBeFalsy()
|
|
})
|
|
|
|
it("returns a message for decimal values", function() {
|
|
expect(validateInteger(1.1)).toEqual(errorMessage)
|
|
expect(validateInteger(2.5)).toEqual(errorMessage)
|
|
expect(validateInteger(-30.99)).toEqual(errorMessage)
|
|
})
|
|
|
|
it("returns a message for strings", function() {
|
|
expect(validateInteger("")).toEqual(errorMessage)
|
|
expect(validateInteger(" ")).toEqual(errorMessage)
|
|
expect(validateInteger("test")).toEqual(errorMessage)
|
|
})
|
|
|
|
it("returns a message for invalid input", function() {
|
|
expect(validateInteger(undefined)).toEqual(errorMessage)
|
|
expect(validateInteger(null)).toEqual(errorMessage)
|
|
expect(validateInteger({})).toEqual(errorMessage)
|
|
expect(validateInteger([])).toEqual(errorMessage)
|
|
expect(validateInteger(true)).toEqual(errorMessage)
|
|
expect(validateInteger(false)).toEqual(errorMessage)
|
|
})
|
|
})
|
|
|
|
describe("validateFile", function() {
|
|
let errorMessage = "Value must be a file"
|
|
|
|
it("validates against objects which are instances of 'File'", function() {
|
|
let fileObj = new win.File([], "Test File")
|
|
expect(validateFile(fileObj)).toBeFalsy()
|
|
expect(validateFile(null)).toBeFalsy()
|
|
expect(validateFile(undefined)).toBeFalsy()
|
|
expect(validateFile(1)).toEqual(errorMessage)
|
|
expect(validateFile("string")).toEqual(errorMessage)
|
|
})
|
|
})
|
|
|
|
describe("validateParam", function() {
|
|
let param = null
|
|
let result = null
|
|
|
|
it("validates required strings", function() {
|
|
// invalid string
|
|
param = fromJS({
|
|
required: true,
|
|
type: "string",
|
|
value: ""
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// valid string
|
|
param = fromJS({
|
|
required: true,
|
|
type: "string",
|
|
value: "test string"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional strings", function() {
|
|
// valid (empty) string
|
|
param = fromJS({
|
|
required: false,
|
|
type: "string",
|
|
value: ""
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid string
|
|
param = fromJS({
|
|
required: false,
|
|
type: "string",
|
|
value: "test"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates required files", function() {
|
|
// invalid file
|
|
param = fromJS({
|
|
required: true,
|
|
type: "file",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// valid file
|
|
param = fromJS({
|
|
required: true,
|
|
type: "file",
|
|
value: new win.File()
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional files", function() {
|
|
// invalid file
|
|
param = fromJS({
|
|
required: false,
|
|
type: "file",
|
|
value: "not a file"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Value must be a file"] )
|
|
|
|
// valid (empty) file
|
|
param = fromJS({
|
|
required: false,
|
|
type: "file",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid file
|
|
param = fromJS({
|
|
required: false,
|
|
type: "file",
|
|
value: new win.File()
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates required arrays", function() {
|
|
// invalid (empty) array
|
|
param = fromJS({
|
|
required: true,
|
|
type: "array",
|
|
value: []
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// invalid (not an array)
|
|
param = fromJS({
|
|
required: true,
|
|
type: "array",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// invalid array, items do not match correct type
|
|
param = fromJS({
|
|
required: true,
|
|
type: "array",
|
|
value: [1],
|
|
items: {
|
|
type: "string"
|
|
}
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [{index: 0, error: "Value must be a string"}] )
|
|
|
|
// valid array, with no 'type' for items
|
|
param = fromJS({
|
|
required: true,
|
|
type: "array",
|
|
value: ["1"]
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid array, items match type
|
|
param = fromJS({
|
|
required: true,
|
|
type: "array",
|
|
value: ["1"],
|
|
items: {
|
|
type: "string"
|
|
}
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional arrays", function() {
|
|
// valid, empty array
|
|
param = fromJS({
|
|
required: false,
|
|
type: "array",
|
|
value: []
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// invalid, items do not match correct type
|
|
param = fromJS({
|
|
required: false,
|
|
type: "array",
|
|
value: ["number"],
|
|
items: {
|
|
type: "number"
|
|
}
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [{index: 0, error: "Value must be a number"}] )
|
|
|
|
// valid
|
|
param = fromJS({
|
|
required: false,
|
|
type: "array",
|
|
value: ["test"],
|
|
items: {
|
|
type: "string"
|
|
}
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates required booleans", function() {
|
|
// invalid boolean value
|
|
param = fromJS({
|
|
required: true,
|
|
type: "boolean",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// invalid boolean value (not a boolean)
|
|
param = fromJS({
|
|
required: true,
|
|
type: "boolean",
|
|
value: "test string"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// valid boolean value
|
|
param = fromJS({
|
|
required: true,
|
|
type: "boolean",
|
|
value: "true"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid boolean value
|
|
param = fromJS({
|
|
required: true,
|
|
type: "boolean",
|
|
value: false
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional booleans", function() {
|
|
// valid (empty) boolean value
|
|
param = fromJS({
|
|
required: false,
|
|
type: "boolean",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// invalid boolean value (not a boolean)
|
|
param = fromJS({
|
|
required: false,
|
|
type: "boolean",
|
|
value: "test string"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Value must be a boolean"] )
|
|
|
|
// valid boolean value
|
|
param = fromJS({
|
|
required: false,
|
|
type: "boolean",
|
|
value: "true"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid boolean value
|
|
param = fromJS({
|
|
required: false,
|
|
type: "boolean",
|
|
value: false
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates required numbers", function() {
|
|
// invalid number, string instead of a number
|
|
param = fromJS({
|
|
required: true,
|
|
type: "number",
|
|
value: "test"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// invalid number, undefined value
|
|
param = fromJS({
|
|
required: true,
|
|
type: "number",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// valid number
|
|
param = fromJS({
|
|
required: true,
|
|
type: "number",
|
|
value: 10
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional numbers", function() {
|
|
// invalid number, string instead of a number
|
|
param = fromJS({
|
|
required: false,
|
|
type: "number",
|
|
value: "test"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Value must be a number"] )
|
|
|
|
// valid (empty) number
|
|
param = fromJS({
|
|
required: false,
|
|
type: "number",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid number
|
|
param = fromJS({
|
|
required: false,
|
|
type: "number",
|
|
value: 10
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates required integers", function() {
|
|
// invalid integer, string instead of an integer
|
|
param = fromJS({
|
|
required: true,
|
|
type: "integer",
|
|
value: "test"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// invalid integer, undefined value
|
|
param = fromJS({
|
|
required: true,
|
|
type: "integer",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Required field is not provided"] )
|
|
|
|
// valid integer
|
|
param = fromJS({
|
|
required: true,
|
|
type: "integer",
|
|
value: 10
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
|
|
it("validates optional integers", function() {
|
|
// invalid integer, string instead of an integer
|
|
param = fromJS({
|
|
required: false,
|
|
type: "integer",
|
|
value: "test"
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( ["Value must be an integer"] )
|
|
|
|
// valid (empty) integer
|
|
param = fromJS({
|
|
required: false,
|
|
type: "integer",
|
|
value: undefined
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
|
|
// valid number
|
|
param = fromJS({
|
|
required: false,
|
|
type: "integer",
|
|
value: 10
|
|
})
|
|
result = validateParam( param, false )
|
|
expect( result ).toEqual( [] )
|
|
})
|
|
})
|
|
|
|
describe("fromJSOrdered", () => {
|
|
it("should create an OrderedMap from an object", () => {
|
|
const param = {
|
|
value: "test"
|
|
}
|
|
|
|
const result = fromJSOrdered(param).toJS()
|
|
expect( result ).toEqual( { value: "test" } )
|
|
})
|
|
|
|
it("should not use an object's length property for Map size", () => {
|
|
const param = {
|
|
length: 5
|
|
}
|
|
|
|
const result = fromJSOrdered(param).toJS()
|
|
expect( result ).toEqual( { length: 5 } )
|
|
})
|
|
|
|
it("should create an OrderedMap from an array", () => {
|
|
const param = [1, 1, 2, 3, 5, 8]
|
|
|
|
const result = fromJSOrdered(param).toJS()
|
|
expect( result ).toEqual( [1, 1, 2, 3, 5, 8] )
|
|
})
|
|
})
|
|
})
|