選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

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