You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

272 line
7.8 KiB

  1. /* eslint-env mocha */
  2. import expect from "expect"
  3. import { fromJS } from "immutable"
  4. import { mapToList, validateNumber, validateInteger, validateParam, validateFile } from "core/utils"
  5. import win from "core/window"
  6. describe("utils", function(){
  7. describe("mapToList", function(){
  8. it("should convert a map to a list, setting `key`", function(){
  9. // With
  10. const aMap = fromJS({
  11. a: {
  12. one: 1,
  13. },
  14. b: {
  15. two: 2,
  16. }
  17. })
  18. // When
  19. const aList = mapToList(aMap, "someKey")
  20. // Then
  21. expect(aList.toJS()).toEqual([
  22. { someKey: "a", one: 1 },
  23. { someKey: "b", two: 2 },
  24. ])
  25. })
  26. it("should flatten an arbitrarily deep map", function(){
  27. // With
  28. const aMap = fromJS({
  29. a: {
  30. one: {
  31. alpha: true
  32. }
  33. },
  34. b: {
  35. two: {
  36. bravo: true
  37. },
  38. three: {
  39. charlie: true
  40. }
  41. }
  42. })
  43. // When
  44. const aList = mapToList(aMap, ["levelA", "levelB"])
  45. // Then
  46. expect(aList.toJS()).toEqual([
  47. { levelA: "a", levelB: "one", alpha: true },
  48. { levelA: "b", levelB: "two", bravo: true },
  49. { levelA: "b", levelB: "three", charlie: true },
  50. ])
  51. })
  52. it("should handle an empty map", function(){
  53. // With
  54. const aMap = fromJS({})
  55. // When
  56. const aList = mapToList(aMap, ["levelA", "levelB"])
  57. // Then
  58. expect(aList.toJS()).toEqual([])
  59. })
  60. })
  61. describe("validateNumber", function() {
  62. let errorMessage = "Value must be a number"
  63. it("doesn't return for whole numbers", function() {
  64. expect(validateNumber(0)).toBeFalsy()
  65. expect(validateNumber(1)).toBeFalsy()
  66. expect(validateNumber(20)).toBeFalsy()
  67. expect(validateNumber(5000000)).toBeFalsy()
  68. expect(validateNumber("1")).toBeFalsy()
  69. expect(validateNumber("2")).toBeFalsy()
  70. expect(validateNumber(-1)).toBeFalsy()
  71. expect(validateNumber(-20)).toBeFalsy()
  72. expect(validateNumber(-5000000)).toBeFalsy()
  73. })
  74. it("doesn't return for negative numbers", function() {
  75. expect(validateNumber(-1)).toBeFalsy()
  76. expect(validateNumber(-20)).toBeFalsy()
  77. expect(validateNumber(-5000000)).toBeFalsy()
  78. })
  79. it("doesn't return for decimal numbers", function() {
  80. expect(validateNumber(1.1)).toBeFalsy()
  81. expect(validateNumber(2.5)).toBeFalsy()
  82. expect(validateNumber(-30.99)).toBeFalsy()
  83. })
  84. it("returns a message for strings", function() {
  85. expect(validateNumber("")).toEqual(errorMessage)
  86. expect(validateNumber(" ")).toEqual(errorMessage)
  87. expect(validateNumber("test")).toEqual(errorMessage)
  88. })
  89. it("returns a message for invalid input", function() {
  90. expect(validateNumber(undefined)).toEqual(errorMessage)
  91. expect(validateNumber(null)).toEqual(errorMessage)
  92. expect(validateNumber({})).toEqual(errorMessage)
  93. expect(validateNumber([])).toEqual(errorMessage)
  94. expect(validateNumber(true)).toEqual(errorMessage)
  95. expect(validateNumber(false)).toEqual(errorMessage)
  96. })
  97. })
  98. describe("validateInteger", function() {
  99. let errorMessage = "Value must be an integer"
  100. it("doesn't return for positive integers", function() {
  101. expect(validateInteger(0)).toBeFalsy()
  102. expect(validateInteger(1)).toBeFalsy()
  103. expect(validateInteger(20)).toBeFalsy()
  104. expect(validateInteger(5000000)).toBeFalsy()
  105. expect(validateInteger("1")).toBeFalsy()
  106. expect(validateInteger("2")).toBeFalsy()
  107. expect(validateInteger(-1)).toBeFalsy()
  108. expect(validateInteger(-20)).toBeFalsy()
  109. expect(validateInteger(-5000000)).toBeFalsy()
  110. })
  111. it("doesn't return for negative integers", function() {
  112. expect(validateInteger(-1)).toBeFalsy()
  113. expect(validateInteger(-20)).toBeFalsy()
  114. expect(validateInteger(-5000000)).toBeFalsy()
  115. })
  116. it("returns a message for decimal values", function() {
  117. expect(validateInteger(1.1)).toEqual(errorMessage)
  118. expect(validateInteger(2.5)).toEqual(errorMessage)
  119. expect(validateInteger(-30.99)).toEqual(errorMessage)
  120. })
  121. it("returns a message for strings", function() {
  122. expect(validateInteger("")).toEqual(errorMessage)
  123. expect(validateInteger(" ")).toEqual(errorMessage)
  124. expect(validateInteger("test")).toEqual(errorMessage)
  125. })
  126. it("returns a message for invalid input", function() {
  127. expect(validateInteger(undefined)).toEqual(errorMessage)
  128. expect(validateInteger(null)).toEqual(errorMessage)
  129. expect(validateInteger({})).toEqual(errorMessage)
  130. expect(validateInteger([])).toEqual(errorMessage)
  131. expect(validateInteger(true)).toEqual(errorMessage)
  132. expect(validateInteger(false)).toEqual(errorMessage)
  133. })
  134. })
  135. describe("validateFile", function() {
  136. let errorMessage = "Value must be a file"
  137. it("validates against objects which are instances of 'File'", function() {
  138. let fileObj = new win.File([], "Test File")
  139. expect(validateFile(fileObj)).toBeFalsy()
  140. expect(validateFile(null)).toEqual(errorMessage)
  141. expect(validateFile(undefined)).toEqual(errorMessage)
  142. expect(validateFile(1)).toEqual(errorMessage)
  143. expect(validateFile("string")).toEqual(errorMessage)
  144. })
  145. })
  146. describe("validateParam", function() {
  147. let param = null
  148. let result = null
  149. it("validates required strings", function() {
  150. param = fromJS({
  151. required: true,
  152. type: "string",
  153. value: ""
  154. })
  155. result = validateParam( param, false )
  156. expect( result ).toEqual( ["Required field is not provided"] )
  157. })
  158. it("validates required files", function() {
  159. param = fromJS({
  160. required: true,
  161. type: "file",
  162. value: undefined
  163. })
  164. result = validateParam( param, false )
  165. expect( result ).toEqual( ["Required field is not provided"] )
  166. })
  167. it("validates required arrays", function() {
  168. param = fromJS({
  169. required: true,
  170. type: "array",
  171. value: []
  172. })
  173. result = validateParam( param, false )
  174. expect( result ).toEqual( ["Required field is not provided"] )
  175. param = fromJS({
  176. required: true,
  177. type: "array",
  178. value: []
  179. })
  180. result = validateParam( param, false )
  181. expect( result ).toEqual( ["Required field is not provided"] )
  182. })
  183. it("validates numbers", function() {
  184. param = fromJS({
  185. required: false,
  186. type: "number",
  187. value: "test"
  188. })
  189. result = validateParam( param, false )
  190. expect( result ).toEqual( ["Value must be a number"] )
  191. })
  192. it("validates integers", function() {
  193. param = fromJS({
  194. required: false,
  195. type: "integer",
  196. value: "test"
  197. })
  198. result = validateParam( param, false )
  199. expect( result ).toEqual( ["Value must be an integer"] )
  200. })
  201. it("validates arrays", function() {
  202. // empty array
  203. param = fromJS({
  204. required: false,
  205. type: "array",
  206. value: []
  207. })
  208. result = validateParam( param, false )
  209. expect( result ).toEqual( [] )
  210. // numbers
  211. param = fromJS({
  212. required: false,
  213. type: "array",
  214. value: ["number"],
  215. items: {
  216. type: "number"
  217. }
  218. })
  219. result = validateParam( param, false )
  220. expect( result ).toEqual( [{index: 0, error: "Value must be a number"}] )
  221. // integers
  222. param = fromJS({
  223. required: false,
  224. type: "array",
  225. value: ["not", "numbers"],
  226. items: {
  227. type: "integer"
  228. }
  229. })
  230. result = validateParam( param, false )
  231. expect( result ).toEqual( [{index: 0, error: "Value must be an integer"}, {index: 1, error: "Value must be an integer"}] )
  232. })
  233. })
  234. })