shallowReadonly.spec.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { isReactive, isReadonly, shallowReadonly } from '../../src'
  2. describe('reactivity/collections', () => {
  3. describe('shallowReadonly/Map', () => {
  4. ;[Map, WeakMap].forEach(Collection => {
  5. test('should make the map/weak-map readonly', () => {
  6. const key = {}
  7. const val = { foo: 1 }
  8. const original = new Collection([[key, val]])
  9. const sroMap = shallowReadonly(original)
  10. expect(isReadonly(sroMap)).toBe(true)
  11. expect(isReactive(sroMap)).toBe(false)
  12. expect(sroMap.get(key)).toBe(val)
  13. sroMap.set(key, {} as any)
  14. expect(
  15. `Set operation on key "[object Object]" failed: target is readonly.`,
  16. ).toHaveBeenWarned()
  17. })
  18. test('should not make nested values readonly', () => {
  19. const key = {}
  20. const val = { foo: 1 }
  21. const original = new Collection([[key, val]])
  22. const sroMap = shallowReadonly(original)
  23. expect(isReadonly(sroMap.get(key))).toBe(false)
  24. expect(isReactive(sroMap.get(key))).toBe(false)
  25. sroMap.get(key)!.foo = 2
  26. expect(
  27. `Set operation on key "foo" failed: target is readonly.`,
  28. ).not.toHaveBeenWarned()
  29. })
  30. })
  31. test('should not make the value generated by the iterable method readonly', () => {
  32. const key = {}
  33. const val = { foo: 1 }
  34. const original = new Map([[key, val]])
  35. const sroMap = shallowReadonly(original)
  36. const values1 = [...sroMap.values()]
  37. const values2 = [...sroMap.entries()]
  38. expect(isReadonly(values1[0])).toBe(false)
  39. expect(isReactive(values1[0])).toBe(false)
  40. expect(values1[0]).toBe(val)
  41. values1[0].foo = 2
  42. expect(
  43. `Set operation on key "foo" failed: target is readonly.`,
  44. ).not.toHaveBeenWarned()
  45. expect(isReadonly(values2[0][1])).toBe(false)
  46. expect(isReactive(values2[0][1])).toBe(false)
  47. expect(values2[0][1]).toBe(val)
  48. values2[0][1].foo = 2
  49. expect(
  50. `Set operation on key "foo" failed: target is readonly.`,
  51. ).not.toHaveBeenWarned()
  52. })
  53. test('should not make the value generated by the forEach method readonly', () => {
  54. const val = { foo: 1 }
  55. const original = new Map([['key', val]])
  56. const sroMap = shallowReadonly(original)
  57. sroMap.forEach(val => {
  58. expect(isReadonly(val)).toBe(false)
  59. expect(isReactive(val)).toBe(false)
  60. expect(val).toBe(val)
  61. val.foo = 2
  62. expect(
  63. `Set operation on key "foo" failed: target is readonly.`,
  64. ).not.toHaveBeenWarned()
  65. })
  66. })
  67. })
  68. describe('shallowReadonly/Set', () => {
  69. test('should make the set/weak-set readonly', () => {
  70. ;[Set, WeakSet].forEach(Collection => {
  71. const obj = { foo: 1 }
  72. const original = new Collection([obj])
  73. const sroSet = shallowReadonly(original)
  74. expect(isReadonly(sroSet)).toBe(true)
  75. expect(isReactive(sroSet)).toBe(false)
  76. expect(sroSet.has(obj)).toBe(true)
  77. sroSet.add({} as any)
  78. expect(
  79. `Add operation on key "[object Object]" failed: target is readonly.`,
  80. ).toHaveBeenWarned()
  81. })
  82. })
  83. test('should not make nested values readonly', () => {
  84. const obj = { foo: 1 }
  85. const original = new Set([obj])
  86. const sroSet = shallowReadonly(original)
  87. const values = [...sroSet.values()]
  88. expect(values[0]).toBe(obj)
  89. expect(isReadonly(values[0])).toBe(false)
  90. expect(isReactive(values[0])).toBe(false)
  91. sroSet.add({} as any)
  92. expect(
  93. `Add operation on key "[object Object]" failed: target is readonly.`,
  94. ).toHaveBeenWarned()
  95. values[0].foo = 2
  96. expect(
  97. `Set operation on key "foo" failed: target is readonly.`,
  98. ).not.toHaveBeenWarned()
  99. })
  100. test('should not make the value generated by the iterable method readonly', () => {
  101. const val = { foo: 1 }
  102. const original = new Set([val])
  103. const sroSet = shallowReadonly(original)
  104. const values1 = [...sroSet.values()]
  105. const values2 = [...sroSet.entries()]
  106. expect(isReadonly(values1[0])).toBe(false)
  107. expect(isReactive(values1[0])).toBe(false)
  108. expect(values1[0]).toBe(val)
  109. values1[0].foo = 2
  110. expect(
  111. `Set operation on key "foo" failed: target is readonly.`,
  112. ).not.toHaveBeenWarned()
  113. expect(isReadonly(values2[0][1])).toBe(false)
  114. expect(isReactive(values2[0][1])).toBe(false)
  115. expect(values2[0][1]).toBe(val)
  116. values2[0][1].foo = 2
  117. expect(
  118. `Set operation on key "foo" failed: target is readonly.`,
  119. ).not.toHaveBeenWarned()
  120. })
  121. test('should not make the value generated by the forEach method readonly', () => {
  122. const val = { foo: 1 }
  123. const original = new Set([val])
  124. const sroSet = shallowReadonly(original)
  125. sroSet.forEach(val => {
  126. expect(isReadonly(val)).toBe(false)
  127. expect(isReactive(val)).toBe(false)
  128. expect(val).toBe(val)
  129. val.foo = 2
  130. expect(
  131. `Set operation on key "foo" failed: target is readonly.`,
  132. ).not.toHaveBeenWarned()
  133. })
  134. })
  135. })
  136. })