shallowReadonly.spec.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import { isReactive, shallowReadonly, readonly, isReadonly } from 'v3'
  2. describe('reactivity/shallowReadonly', () => {
  3. test('should be readonly', () => {
  4. expect(isReadonly(shallowReadonly({}))).toBe(true)
  5. })
  6. test('should not make non-reactive properties reactive', () => {
  7. const props = shallowReadonly({ n: { foo: 1 } })
  8. expect(isReactive(props.n)).toBe(false)
  9. })
  10. test('should make root level properties readonly', () => {
  11. const props = shallowReadonly({ n: 1 })
  12. // @ts-expect-error
  13. props.n = 2
  14. expect(props.n).toBe(1)
  15. expect(
  16. `Set operation on key "n" failed: target is readonly.`
  17. ).toHaveBeenWarned()
  18. })
  19. // to retain 2.x behavior.
  20. test('should NOT make nested properties readonly', () => {
  21. const props = shallowReadonly({ n: { foo: 1 } })
  22. props.n.foo = 2
  23. expect(props.n.foo).toBe(2)
  24. expect(
  25. `Set operation on key "foo" failed: target is readonly.`
  26. ).not.toHaveBeenWarned()
  27. })
  28. // #2843
  29. test('should differentiate from normal readonly calls', () => {
  30. const original = { foo: {} }
  31. const shallowProxy = shallowReadonly(original)
  32. const reactiveProxy = readonly(original)
  33. expect(shallowProxy).not.toBe(reactiveProxy)
  34. expect(isReadonly(shallowProxy.foo)).toBe(false)
  35. expect(isReadonly(reactiveProxy.foo)).toBe(true)
  36. })
  37. // @discrepancy does not support collections
  38. // describe('collection/Map', () => {
  39. // ;[Map, WeakMap].forEach(Collection => {
  40. // test('should make the map/weak-map readonly', () => {
  41. // const key = {}
  42. // const val = { foo: 1 }
  43. // const original = new Collection([[key, val]])
  44. // const sroMap = shallowReadonly(original)
  45. // expect(isReadonly(sroMap)).toBe(true)
  46. // expect(isReactive(sroMap)).toBe(false)
  47. // expect(sroMap.get(key)).toBe(val)
  48. // sroMap.set(key, {} as any)
  49. // expect(
  50. // `Set operation on key "[object Object]" failed: target is readonly.`
  51. // ).toHaveBeenWarned()
  52. // })
  53. // test('should not make nested values readonly', () => {
  54. // const key = {}
  55. // const val = { foo: 1 }
  56. // const original = new Collection([[key, val]])
  57. // const sroMap = shallowReadonly(original)
  58. // expect(isReadonly(sroMap.get(key))).toBe(false)
  59. // expect(isReactive(sroMap.get(key))).toBe(false)
  60. // sroMap.get(key)!.foo = 2
  61. // expect(
  62. // `Set operation on key "foo" failed: target is readonly.`
  63. // ).not.toHaveBeenWarned()
  64. // })
  65. // })
  66. // test('should not make the value generated by the iterable method readonly', () => {
  67. // const key = {}
  68. // const val = { foo: 1 }
  69. // const original = new Map([[key, val]])
  70. // const sroMap = shallowReadonly(original)
  71. // const values1 = [...sroMap.values()]
  72. // const values2 = [...sroMap.entries()]
  73. // expect(isReadonly(values1[0])).toBe(false)
  74. // expect(isReactive(values1[0])).toBe(false)
  75. // expect(values1[0]).toBe(val)
  76. // values1[0].foo = 2
  77. // expect(
  78. // `Set operation on key "foo" failed: target is readonly.`
  79. // ).not.toHaveBeenWarned()
  80. // expect(isReadonly(values2[0][1])).toBe(false)
  81. // expect(isReactive(values2[0][1])).toBe(false)
  82. // expect(values2[0][1]).toBe(val)
  83. // values2[0][1].foo = 2
  84. // expect(
  85. // `Set operation on key "foo" failed: target is readonly.`
  86. // ).not.toHaveBeenWarned()
  87. // })
  88. // test('should not make the value generated by the forEach method readonly', () => {
  89. // const val = { foo: 1 }
  90. // const original = new Map([['key', val]])
  91. // const sroMap = shallowReadonly(original)
  92. // sroMap.forEach(val => {
  93. // expect(isReadonly(val)).toBe(false)
  94. // expect(isReactive(val)).toBe(false)
  95. // expect(val).toBe(val)
  96. // val.foo = 2
  97. // expect(
  98. // `Set operation on key "foo" failed: target is readonly.`
  99. // ).not.toHaveBeenWarned()
  100. // })
  101. // })
  102. // })
  103. // describe('collection/Set', () => {
  104. // test('should make the set/weak-set readonly', () => {
  105. // ;[Set, WeakSet].forEach(Collection => {
  106. // const obj = { foo: 1 }
  107. // const original = new Collection([obj])
  108. // const sroSet = shallowReadonly(original)
  109. // expect(isReadonly(sroSet)).toBe(true)
  110. // expect(isReactive(sroSet)).toBe(false)
  111. // expect(sroSet.has(obj)).toBe(true)
  112. // sroSet.add({} as any)
  113. // expect(
  114. // `Add operation on key "[object Object]" failed: target is readonly.`
  115. // ).toHaveBeenWarned()
  116. // })
  117. // })
  118. // test('should not make nested values readonly', () => {
  119. // const obj = { foo: 1 }
  120. // const original = new Set([obj])
  121. // const sroSet = shallowReadonly(original)
  122. // const values = [...sroSet.values()]
  123. // expect(values[0]).toBe(obj)
  124. // expect(isReadonly(values[0])).toBe(false)
  125. // expect(isReactive(values[0])).toBe(false)
  126. // sroSet.add({} as any)
  127. // expect(
  128. // `Add operation on key "[object Object]" failed: target is readonly.`
  129. // ).toHaveBeenWarned()
  130. // values[0].foo = 2
  131. // expect(
  132. // `Set operation on key "foo" failed: target is readonly.`
  133. // ).not.toHaveBeenWarned()
  134. // })
  135. // test('should not make the value generated by the iterable method readonly', () => {
  136. // const val = { foo: 1 }
  137. // const original = new Set([val])
  138. // const sroSet = shallowReadonly(original)
  139. // const values1 = [...sroSet.values()]
  140. // const values2 = [...sroSet.entries()]
  141. // expect(isReadonly(values1[0])).toBe(false)
  142. // expect(isReactive(values1[0])).toBe(false)
  143. // expect(values1[0]).toBe(val)
  144. // values1[0].foo = 2
  145. // expect(
  146. // `Set operation on key "foo" failed: target is readonly.`
  147. // ).not.toHaveBeenWarned()
  148. // expect(isReadonly(values2[0][1])).toBe(false)
  149. // expect(isReactive(values2[0][1])).toBe(false)
  150. // expect(values2[0][1]).toBe(val)
  151. // values2[0][1].foo = 2
  152. // expect(
  153. // `Set operation on key "foo" failed: target is readonly.`
  154. // ).not.toHaveBeenWarned()
  155. // })
  156. // test('should not make the value generated by the forEach method readonly', () => {
  157. // const val = { foo: 1 }
  158. // const original = new Set([val])
  159. // const sroSet = shallowReadonly(original)
  160. // sroSet.forEach(val => {
  161. // expect(isReadonly(val)).toBe(false)
  162. // expect(isReactive(val)).toBe(false)
  163. // expect(val).toBe(val)
  164. // val.foo = 2
  165. // expect(
  166. // `Set operation on key "foo" failed: target is readonly.`
  167. // ).not.toHaveBeenWarned()
  168. // })
  169. // })
  170. // })
  171. })