/* eslint-env mocha */ import expect from "expect" import { fromJS } from "immutable" import { mapToList, validateNumber, validateInteger, validateParam } from "core/utils" 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("validateParam", function() { let param = null let result = null it("validates required strings", function() { param = fromJS({ required: true, type: "string", value: "" }) result = validateParam( param, false ) expect( result ).toEqual( ["Required field is not provided"] ) }) it("validates required arrays", function() { param = fromJS({ required: true, type: "array", value: [] }) result = validateParam( param, false ) expect( result ).toEqual( ["Required field is not provided"] ) param = fromJS({ required: true, type: "array", value: [] }) result = validateParam( param, false ) expect( result ).toEqual( ["Required field is not provided"] ) }) it("validates numbers", function() { param = fromJS({ required: false, type: "number", value: "test" }) result = validateParam( param, false ) expect( result ).toEqual( ["Value must be a number"] ) }) it("validates integers", function() { param = fromJS({ required: false, type: "integer", value: "test" }) result = validateParam( param, false ) expect( result ).toEqual( ["Value must be an integer"] ) }) it("validates arrays", function() { // empty array param = fromJS({ required: false, type: "array", value: [] }) result = validateParam( param, false ) expect( result ).toEqual( [] ) // numbers 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"}] ) // integers param = fromJS({ required: false, type: "array", value: ["not", "numbers"], items: { type: "integer" } }) result = validateParam( param, false ) expect( result ).toEqual( [{index: 0, error: "Value must be an integer"}, {index: 1, error: "Value must be an integer"}] ) }) }) })