25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

586 satır
16 KiB

  1. /* eslint-env mocha */
  2. import expect from "expect"
  3. import { fromJS } from "immutable"
  4. import { mapToList, validateNumber, validateInteger, validateParam, validateFile, fromJSOrdered } 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)).toBeFalsy()
  141. expect(validateFile(undefined)).toBeFalsy()
  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("skips validation when `type` is not specified", function() {
  150. // invalid type
  151. param = fromJS({
  152. required: false,
  153. type: undefined,
  154. value: ""
  155. })
  156. result = validateParam( param, false )
  157. expect( result ).toEqual( [] )
  158. })
  159. it("validates required strings", function() {
  160. // invalid string
  161. param = fromJS({
  162. required: true,
  163. type: "string",
  164. value: ""
  165. })
  166. result = validateParam( param, false )
  167. expect( result ).toEqual( ["Required field is not provided"] )
  168. // valid string
  169. param = fromJS({
  170. required: true,
  171. type: "string",
  172. value: "test string"
  173. })
  174. result = validateParam( param, false )
  175. expect( result ).toEqual( [] )
  176. })
  177. it("validates optional strings", function() {
  178. // valid (empty) string
  179. param = fromJS({
  180. required: false,
  181. type: "string",
  182. value: ""
  183. })
  184. result = validateParam( param, false )
  185. expect( result ).toEqual( [] )
  186. // valid string
  187. param = fromJS({
  188. required: false,
  189. type: "string",
  190. value: "test"
  191. })
  192. result = validateParam( param, false )
  193. expect( result ).toEqual( [] )
  194. })
  195. it("validates required files", function() {
  196. // invalid file
  197. param = fromJS({
  198. required: true,
  199. type: "file",
  200. value: undefined
  201. })
  202. result = validateParam( param, false )
  203. expect( result ).toEqual( ["Required field is not provided"] )
  204. // valid file
  205. param = fromJS({
  206. required: true,
  207. type: "file",
  208. value: new win.File()
  209. })
  210. result = validateParam( param, false )
  211. expect( result ).toEqual( [] )
  212. })
  213. it("validates optional files", function() {
  214. // invalid file
  215. param = fromJS({
  216. required: false,
  217. type: "file",
  218. value: "not a file"
  219. })
  220. result = validateParam( param, false )
  221. expect( result ).toEqual( ["Value must be a file"] )
  222. // valid (empty) file
  223. param = fromJS({
  224. required: false,
  225. type: "file",
  226. value: undefined
  227. })
  228. result = validateParam( param, false )
  229. expect( result ).toEqual( [] )
  230. // valid file
  231. param = fromJS({
  232. required: false,
  233. type: "file",
  234. value: new win.File()
  235. })
  236. result = validateParam( param, false )
  237. expect( result ).toEqual( [] )
  238. })
  239. it("validates required arrays", function() {
  240. // invalid (empty) array
  241. param = fromJS({
  242. required: true,
  243. type: "array",
  244. value: []
  245. })
  246. result = validateParam( param, false )
  247. expect( result ).toEqual( ["Required field is not provided"] )
  248. // invalid (not an array)
  249. param = fromJS({
  250. required: true,
  251. type: "array",
  252. value: undefined
  253. })
  254. result = validateParam( param, false )
  255. expect( result ).toEqual( ["Required field is not provided"] )
  256. // invalid array, items do not match correct type
  257. param = fromJS({
  258. required: true,
  259. type: "array",
  260. value: [1],
  261. items: {
  262. type: "string"
  263. }
  264. })
  265. result = validateParam( param, false )
  266. expect( result ).toEqual( [{index: 0, error: "Value must be a string"}] )
  267. // valid array, with no 'type' for items
  268. param = fromJS({
  269. required: true,
  270. type: "array",
  271. value: ["1"]
  272. })
  273. result = validateParam( param, false )
  274. expect( result ).toEqual( [] )
  275. // valid array, items match type
  276. param = fromJS({
  277. required: true,
  278. type: "array",
  279. value: ["1"],
  280. items: {
  281. type: "string"
  282. }
  283. })
  284. result = validateParam( param, false )
  285. expect( result ).toEqual( [] )
  286. })
  287. it("validates optional arrays", function() {
  288. // valid, empty array
  289. param = fromJS({
  290. required: false,
  291. type: "array",
  292. value: []
  293. })
  294. result = validateParam( param, false )
  295. expect( result ).toEqual( [] )
  296. // invalid, items do not match correct type
  297. param = fromJS({
  298. required: false,
  299. type: "array",
  300. value: ["number"],
  301. items: {
  302. type: "number"
  303. }
  304. })
  305. result = validateParam( param, false )
  306. expect( result ).toEqual( [{index: 0, error: "Value must be a number"}] )
  307. // valid
  308. param = fromJS({
  309. required: false,
  310. type: "array",
  311. value: ["test"],
  312. items: {
  313. type: "string"
  314. }
  315. })
  316. result = validateParam( param, false )
  317. expect( result ).toEqual( [] )
  318. })
  319. it("validates required booleans", function() {
  320. // invalid boolean value
  321. param = fromJS({
  322. required: true,
  323. type: "boolean",
  324. value: undefined
  325. })
  326. result = validateParam( param, false )
  327. expect( result ).toEqual( ["Required field is not provided"] )
  328. // invalid boolean value (not a boolean)
  329. param = fromJS({
  330. required: true,
  331. type: "boolean",
  332. value: "test string"
  333. })
  334. result = validateParam( param, false )
  335. expect( result ).toEqual( ["Required field is not provided"] )
  336. // valid boolean value
  337. param = fromJS({
  338. required: true,
  339. type: "boolean",
  340. value: "true"
  341. })
  342. result = validateParam( param, false )
  343. expect( result ).toEqual( [] )
  344. // valid boolean value
  345. param = fromJS({
  346. required: true,
  347. type: "boolean",
  348. value: false
  349. })
  350. result = validateParam( param, false )
  351. expect( result ).toEqual( [] )
  352. })
  353. it("validates optional booleans", function() {
  354. // valid (empty) boolean value
  355. param = fromJS({
  356. required: false,
  357. type: "boolean",
  358. value: undefined
  359. })
  360. result = validateParam( param, false )
  361. expect( result ).toEqual( [] )
  362. // invalid boolean value (not a boolean)
  363. param = fromJS({
  364. required: false,
  365. type: "boolean",
  366. value: "test string"
  367. })
  368. result = validateParam( param, false )
  369. expect( result ).toEqual( ["Value must be a boolean"] )
  370. // valid boolean value
  371. param = fromJS({
  372. required: false,
  373. type: "boolean",
  374. value: "true"
  375. })
  376. result = validateParam( param, false )
  377. expect( result ).toEqual( [] )
  378. // valid boolean value
  379. param = fromJS({
  380. required: false,
  381. type: "boolean",
  382. value: false
  383. })
  384. result = validateParam( param, false )
  385. expect( result ).toEqual( [] )
  386. })
  387. it("validates required numbers", function() {
  388. // invalid number, string instead of a number
  389. param = fromJS({
  390. required: true,
  391. type: "number",
  392. value: "test"
  393. })
  394. result = validateParam( param, false )
  395. expect( result ).toEqual( ["Required field is not provided"] )
  396. // invalid number, undefined value
  397. param = fromJS({
  398. required: true,
  399. type: "number",
  400. value: undefined
  401. })
  402. result = validateParam( param, false )
  403. expect( result ).toEqual( ["Required field is not provided"] )
  404. // valid number
  405. param = fromJS({
  406. required: true,
  407. type: "number",
  408. value: 10
  409. })
  410. result = validateParam( param, false )
  411. expect( result ).toEqual( [] )
  412. })
  413. it("validates optional numbers", function() {
  414. // invalid number, string instead of a number
  415. param = fromJS({
  416. required: false,
  417. type: "number",
  418. value: "test"
  419. })
  420. result = validateParam( param, false )
  421. expect( result ).toEqual( ["Value must be a number"] )
  422. // valid (empty) number
  423. param = fromJS({
  424. required: false,
  425. type: "number",
  426. value: undefined
  427. })
  428. result = validateParam( param, false )
  429. expect( result ).toEqual( [] )
  430. // valid number
  431. param = fromJS({
  432. required: false,
  433. type: "number",
  434. value: 10
  435. })
  436. result = validateParam( param, false )
  437. expect( result ).toEqual( [] )
  438. })
  439. it("validates required integers", function() {
  440. // invalid integer, string instead of an integer
  441. param = fromJS({
  442. required: true,
  443. type: "integer",
  444. value: "test"
  445. })
  446. result = validateParam( param, false )
  447. expect( result ).toEqual( ["Required field is not provided"] )
  448. // invalid integer, undefined value
  449. param = fromJS({
  450. required: true,
  451. type: "integer",
  452. value: undefined
  453. })
  454. result = validateParam( param, false )
  455. expect( result ).toEqual( ["Required field is not provided"] )
  456. // valid integer
  457. param = fromJS({
  458. required: true,
  459. type: "integer",
  460. value: 10
  461. })
  462. result = validateParam( param, false )
  463. expect( result ).toEqual( [] )
  464. })
  465. it("validates optional integers", function() {
  466. // invalid integer, string instead of an integer
  467. param = fromJS({
  468. required: false,
  469. type: "integer",
  470. value: "test"
  471. })
  472. result = validateParam( param, false )
  473. expect( result ).toEqual( ["Value must be an integer"] )
  474. // valid (empty) integer
  475. param = fromJS({
  476. required: false,
  477. type: "integer",
  478. value: undefined
  479. })
  480. result = validateParam( param, false )
  481. expect( result ).toEqual( [] )
  482. // integers
  483. param = fromJS({
  484. required: false,
  485. type: "integer",
  486. value: 10
  487. })
  488. result = validateParam( param, false )
  489. expect( result ).toEqual( [] )
  490. })
  491. })
  492. describe("fromJSOrdered", () => {
  493. it("should create an OrderedMap from an object", () => {
  494. const param = {
  495. value: "test"
  496. }
  497. const result = fromJSOrdered(param).toJS()
  498. expect( result ).toEqual( { value: "test" } )
  499. })
  500. it("should not use an object's length property for Map size", () => {
  501. const param = {
  502. length: 5
  503. }
  504. const result = fromJSOrdered(param).toJS()
  505. expect( result ).toEqual( { length: 5 } )
  506. })
  507. it("should create an OrderedMap from an array", () => {
  508. const param = [1, 1, 2, 3, 5, 8]
  509. const result = fromJSOrdered(param).toJS()
  510. expect( result ).toEqual( [1, 1, 2, 3, 5, 8] )
  511. })
  512. })
  513. })