@pdtf/schemas 3.6.0-dev.3 → 3.6.0-dev.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/charming-napier-57a77c/LICENSE +21 -0
  2. package/charming-napier-57a77c/README.md +430 -0
  3. package/charming-napier-57a77c/docs/sef25-extensions-ui-spec.md +355 -0
  4. package/charming-napier-57a77c/index.js +654 -0
  5. package/charming-napier-57a77c/package-lock.json +7297 -0
  6. package/charming-napier-57a77c/package.json +41 -0
  7. package/charming-napier-57a77c/src/examples/v1/exampleAddParticipantVouch.json +32 -0
  8. package/charming-napier-57a77c/src/examples/v1/exampleDocumentedVouch.json +40 -0
  9. package/charming-napier-57a77c/src/examples/v1/exampleElectronicRecord.json +30 -0
  10. package/charming-napier-57a77c/src/examples/v1/exampleTransaction.json +878 -0
  11. package/charming-napier-57a77c/src/examples/v1/exampleVouch.json +25 -0
  12. package/charming-napier-57a77c/src/examples/v2/exampleTransaction.json +901 -0
  13. package/charming-napier-57a77c/src/examples/v3/exampleAddParticipantVouch.json +38 -0
  14. package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay.json +55 -0
  15. package/charming-napier-57a77c/src/examples/v3/exampleCustomOverlay2.json +93 -0
  16. package/charming-napier-57a77c/src/examples/v3/exampleDocumentedVouch.json +47 -0
  17. package/charming-napier-57a77c/src/examples/v3/exampleElectronicRecord.json +36 -0
  18. package/charming-napier-57a77c/src/examples/v3/exampleTransaction.json +1038 -0
  19. package/charming-napier-57a77c/src/examples/v3/exampleVouch.json +32 -0
  20. package/charming-napier-57a77c/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
  21. package/charming-napier-57a77c/src/mappings/adf.js +198 -0
  22. package/charming-napier-57a77c/src/schemas/v1/GeoJSON.json +1279 -0
  23. package/charming-napier-57a77c/src/schemas/v1/baspiNotes.html +102 -0
  24. package/charming-napier-57a77c/src/schemas/v1/energy-performance-certificate.json +124 -0
  25. package/charming-napier-57a77c/src/schemas/v1/freehold-information.json +2051 -0
  26. package/charming-napier-57a77c/src/schemas/v1/leasehold-information.json +2064 -0
  27. package/charming-napier-57a77c/src/schemas/v1/legal-information.json +1045 -0
  28. package/charming-napier-57a77c/src/schemas/v1/material-facts.json +2109 -0
  29. package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
  30. package/charming-napier-57a77c/src/schemas/v1/pdtf-transaction.json +191 -0
  31. package/charming-napier-57a77c/src/schemas/v1/searches/drainage-and-water.json +261 -0
  32. package/charming-napier-57a77c/src/schemas/v1/searches/local-land-charges.json +69 -0
  33. package/charming-napier-57a77c/src/schemas/v1/searches/local-searches-required.json +857 -0
  34. package/charming-napier-57a77c/src/schemas/v1/searches.json +237 -0
  35. package/charming-napier-57a77c/src/schemas/v1/title-deed.json +841 -0
  36. package/charming-napier-57a77c/src/schemas/v2/baspiNotes.html +102 -0
  37. package/charming-napier-57a77c/src/schemas/v2/combined.json +37731 -0
  38. package/charming-napier-57a77c/src/schemas/v2/overlays/baspi.json +8132 -0
  39. package/charming-napier-57a77c/src/schemas/v2/overlays/con29DW.json +705 -0
  40. package/charming-napier-57a77c/src/schemas/v2/overlays/con29R.json +2956 -0
  41. package/charming-napier-57a77c/src/schemas/v2/overlays/fme1.json +1259 -0
  42. package/charming-napier-57a77c/src/schemas/v2/overlays/llc1.json +25 -0
  43. package/charming-napier-57a77c/src/schemas/v2/overlays/lpe1.json +2171 -0
  44. package/charming-napier-57a77c/src/schemas/v2/overlays/nts.json +326 -0
  45. package/charming-napier-57a77c/src/schemas/v2/overlays/oc1.json +2799 -0
  46. package/charming-napier-57a77c/src/schemas/v2/overlays/piq.json +3419 -0
  47. package/charming-napier-57a77c/src/schemas/v2/overlays/rds.json +3736 -0
  48. package/charming-napier-57a77c/src/schemas/v2/overlays/ta10.json +5306 -0
  49. package/charming-napier-57a77c/src/schemas/v2/overlays/ta6.json +4533 -0
  50. package/charming-napier-57a77c/src/schemas/v2/overlays/ta7.json +1045 -0
  51. package/charming-napier-57a77c/src/schemas/v2/pdtf-transaction.json +34351 -0
  52. package/charming-napier-57a77c/src/schemas/v2/skeleton.json +3973 -0
  53. package/charming-napier-57a77c/src/schemas/v3/combined.json +48153 -0
  54. package/charming-napier-57a77c/src/schemas/v3/compactSkeleton.txt +4457 -0
  55. package/charming-napier-57a77c/src/schemas/v3/overlays/README.md +299 -0
  56. package/charming-napier-57a77c/src/schemas/v3/overlays/baspi4.json +8027 -0
  57. package/charming-napier-57a77c/src/schemas/v3/overlays/baspi5.json +8177 -0
  58. package/charming-napier-57a77c/src/schemas/v3/overlays/con29DW.json +716 -0
  59. package/charming-napier-57a77c/src/schemas/v3/overlays/con29R.json +2981 -0
  60. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ac.json +333 -0
  61. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/as.json +74 -0
  62. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dk.json +32 -0
  63. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/dr.json +73 -0
  64. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/er.json +85 -0
  65. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/fd.json +75 -0
  66. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hi.json +51 -0
  67. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/hs.json +73 -0
  68. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ic.json +59 -0
  69. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/jk.json +96 -0
  70. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/la.json +85 -0
  71. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/lc.json +75 -0
  72. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ma.json +90 -0
  73. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mc.json +38 -0
  74. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/mi.json +69 -0
  75. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/nd.json +43 -0
  76. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oa.json +24 -0
  77. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/oc.json +57 -0
  78. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/pc.json +37 -0
  79. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ph.json +194 -0
  80. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/rw.json +68 -0
  81. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sb.json +73 -0
  82. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sc.json +129 -0
  83. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sd.json +63 -0
  84. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sf.json +74 -0
  85. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/sl.json +68 -0
  86. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/ta.json +240 -0
  87. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tf.json +103 -0
  88. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/tr.json +73 -0
  89. package/charming-napier-57a77c/src/schemas/v3/overlays/extensions/wg.json +350 -0
  90. package/charming-napier-57a77c/src/schemas/v3/overlays/fme1.json +1266 -0
  91. package/charming-napier-57a77c/src/schemas/v3/overlays/llc1.json +25 -0
  92. package/charming-napier-57a77c/src/schemas/v3/overlays/lpe1.json +2199 -0
  93. package/charming-napier-57a77c/src/schemas/v3/overlays/nts.json +2157 -0
  94. package/charming-napier-57a77c/src/schemas/v3/overlays/nts2.json +2742 -0
  95. package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl.json +1813 -0
  96. package/charming-napier-57a77c/src/schemas/v3/overlays/ntsl2.json +2217 -0
  97. package/charming-napier-57a77c/src/schemas/v3/overlays/oc1.json +2817 -0
  98. package/charming-napier-57a77c/src/schemas/v3/overlays/piq.json +3321 -0
  99. package/charming-napier-57a77c/src/schemas/v3/overlays/rds.json +3665 -0
  100. package/charming-napier-57a77c/src/schemas/v3/overlays/sef25.json +1639 -0
  101. package/charming-napier-57a77c/src/schemas/v3/overlays/sr24.json +38 -0
  102. package/charming-napier-57a77c/src/schemas/v3/overlays/ta10.json +4654 -0
  103. package/charming-napier-57a77c/src/schemas/v3/overlays/ta6.json +4568 -0
  104. package/charming-napier-57a77c/src/schemas/v3/overlays/ta6ed6.json +6537 -0
  105. package/charming-napier-57a77c/src/schemas/v3/overlays/ta7.json +1537 -0
  106. package/charming-napier-57a77c/src/schemas/v3/overlays/ta7ed5.json +1551 -0
  107. package/charming-napier-57a77c/src/schemas/v3/pdtf-transaction.json +41229 -0
  108. package/charming-napier-57a77c/src/schemas/v3/skeleton.json +5703 -0
  109. package/charming-napier-57a77c/src/schemas/verifiedClaims/README.md +21 -0
  110. package/charming-napier-57a77c/src/schemas/verifiedClaims/pdtf-verified-claims.json +447 -0
  111. package/charming-napier-57a77c/src/tests/v3/buyerCircumstances.test.js +543 -0
  112. package/charming-napier-57a77c/src/tests/v3/caching.test.js +591 -0
  113. package/charming-napier-57a77c/src/tests/v3/enquiries.test.js +1096 -0
  114. package/charming-napier-57a77c/src/tests/v3/extensionOverlays.test.js +1599 -0
  115. package/charming-napier-57a77c/src/tests/v3/offers.test.js +823 -0
  116. package/charming-napier-57a77c/src/tests/v3/patternProperties.test.js +688 -0
  117. package/charming-napier-57a77c/src/tests/v3/ta6ed6.test.js +2374 -0
  118. package/charming-napier-57a77c/src/tests/v3/ta7ed5.test.js +600 -0
  119. package/charming-napier-57a77c/src/tests/v3/transactionSchema.test.js +646 -0
  120. package/charming-napier-57a77c/src/tests/v3/verifiedClaimsValidator.test.js +195 -0
  121. package/charming-napier-57a77c/src/utils/compactSkeleton.js +84 -0
  122. package/charming-napier-57a77c/src/utils/countTokens.js +67 -0
  123. package/charming-napier-57a77c/src/utils/extractExtensionOverlays.js +624 -0
  124. package/charming-napier-57a77c/src/utils/extractOverlay.js +381 -0
  125. package/charming-napier-57a77c/src/utils/extractProperties.js +44 -0
  126. package/charming-napier-57a77c/src/utils/listPathTitles.js +36 -0
  127. package/charming-napier-57a77c/src/utils/minimalSkeleton.js +85 -0
  128. package/charming-napier-57a77c/src/utils/pathList.csv +903 -0
  129. package/charming-napier-57a77c/src/utils/pathSkeleton.js +181 -0
  130. package/keen-dewdney-6ae15b/LICENSE +21 -0
  131. package/keen-dewdney-6ae15b/README.md +334 -0
  132. package/keen-dewdney-6ae15b/index.js +557 -0
  133. package/keen-dewdney-6ae15b/package-lock.json +7296 -0
  134. package/keen-dewdney-6ae15b/package.json +39 -0
  135. package/keen-dewdney-6ae15b/src/examples/v1/exampleAddParticipantVouch.json +32 -0
  136. package/keen-dewdney-6ae15b/src/examples/v1/exampleDocumentedVouch.json +40 -0
  137. package/keen-dewdney-6ae15b/src/examples/v1/exampleElectronicRecord.json +30 -0
  138. package/keen-dewdney-6ae15b/src/examples/v1/exampleTransaction.json +878 -0
  139. package/keen-dewdney-6ae15b/src/examples/v1/exampleVouch.json +25 -0
  140. package/keen-dewdney-6ae15b/src/examples/v2/exampleTransaction.json +901 -0
  141. package/keen-dewdney-6ae15b/src/examples/v3/exampleAddParticipantVouch.json +35 -0
  142. package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay.json +55 -0
  143. package/keen-dewdney-6ae15b/src/examples/v3/exampleCustomOverlay2.json +93 -0
  144. package/keen-dewdney-6ae15b/src/examples/v3/exampleDocumentedVouch.json +44 -0
  145. package/keen-dewdney-6ae15b/src/examples/v3/exampleElectronicRecord.json +33 -0
  146. package/keen-dewdney-6ae15b/src/examples/v3/exampleTransaction.json +1034 -0
  147. package/keen-dewdney-6ae15b/src/examples/v3/exampleVouch.json +29 -0
  148. package/keen-dewdney-6ae15b/src/mappings/SendPropertyDetailsRequestSchema.json +1588 -0
  149. package/keen-dewdney-6ae15b/src/mappings/adf.js +198 -0
  150. package/keen-dewdney-6ae15b/src/schemas/v1/GeoJSON.json +1279 -0
  151. package/keen-dewdney-6ae15b/src/schemas/v1/baspiNotes.html +102 -0
  152. package/keen-dewdney-6ae15b/src/schemas/v1/energy-performance-certificate.json +124 -0
  153. package/keen-dewdney-6ae15b/src/schemas/v1/freehold-information.json +2051 -0
  154. package/keen-dewdney-6ae15b/src/schemas/v1/leasehold-information.json +2064 -0
  155. package/keen-dewdney-6ae15b/src/schemas/v1/legal-information.json +1045 -0
  156. package/keen-dewdney-6ae15b/src/schemas/v1/material-facts.json +2109 -0
  157. package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction-search-results.json +40 -0
  158. package/keen-dewdney-6ae15b/src/schemas/v1/pdtf-transaction.json +191 -0
  159. package/keen-dewdney-6ae15b/src/schemas/v1/searches/drainage-and-water.json +261 -0
  160. package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-land-charges.json +69 -0
  161. package/keen-dewdney-6ae15b/src/schemas/v1/searches/local-searches-required.json +857 -0
  162. package/keen-dewdney-6ae15b/src/schemas/v1/searches.json +237 -0
  163. package/keen-dewdney-6ae15b/src/schemas/v1/title-deed.json +841 -0
  164. package/keen-dewdney-6ae15b/src/schemas/v2/baspiNotes.html +102 -0
  165. package/keen-dewdney-6ae15b/src/schemas/v2/combined.json +37731 -0
  166. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/baspi.json +8132 -0
  167. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29DW.json +705 -0
  168. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/con29R.json +2956 -0
  169. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/fme1.json +1259 -0
  170. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/llc1.json +25 -0
  171. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/lpe1.json +2171 -0
  172. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/nts.json +326 -0
  173. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/oc1.json +2799 -0
  174. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/piq.json +3419 -0
  175. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/rds.json +3736 -0
  176. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta10.json +5306 -0
  177. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta6.json +4533 -0
  178. package/keen-dewdney-6ae15b/src/schemas/v2/overlays/ta7.json +1045 -0
  179. package/keen-dewdney-6ae15b/src/schemas/v2/pdtf-transaction.json +34351 -0
  180. package/keen-dewdney-6ae15b/src/schemas/v2/skeleton.json +3973 -0
  181. package/keen-dewdney-6ae15b/src/schemas/v3/combined.json +41720 -0
  182. package/keen-dewdney-6ae15b/src/schemas/v3/compactSkeleton.txt +3325 -0
  183. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/README.md +299 -0
  184. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi4.json +7872 -0
  185. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/baspi5.json +8019 -0
  186. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29DW.json +716 -0
  187. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/con29R.json +2981 -0
  188. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/as.json +72 -0
  189. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/dr.json +73 -0
  190. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/er.json +83 -0
  191. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/fd.json +72 -0
  192. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hi.json +48 -0
  193. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/hs.json +71 -0
  194. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/jk.json +76 -0
  195. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/la.json +83 -0
  196. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/ma.json +87 -0
  197. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/mc.json +36 -0
  198. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oa.json +22 -0
  199. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/oc.json +55 -0
  200. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sb.json +71 -0
  201. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sf.json +72 -0
  202. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/sl.json +66 -0
  203. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/extensions/tf.json +100 -0
  204. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/fme1.json +1264 -0
  205. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/llc1.json +25 -0
  206. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/lpe1.json +2226 -0
  207. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts.json +2090 -0
  208. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/nts2.json +2678 -0
  209. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl.json +1746 -0
  210. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ntsl2.json +2153 -0
  211. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/oc1.json +2817 -0
  212. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/piq.json +3276 -0
  213. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/rds.json +3552 -0
  214. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/sr24.json +38 -0
  215. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta10.json +4642 -0
  216. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta6.json +4501 -0
  217. package/keen-dewdney-6ae15b/src/schemas/v3/overlays/ta7.json +1435 -0
  218. package/keen-dewdney-6ae15b/src/schemas/v3/pdtf-transaction.json +37225 -0
  219. package/keen-dewdney-6ae15b/src/schemas/v3/skeleton.json +4323 -0
  220. package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/README.md +12 -0
  221. package/keen-dewdney-6ae15b/src/schemas/verifiedClaims/pdtf-verified-claims.json +431 -0
  222. package/keen-dewdney-6ae15b/src/tests/v3/caching.test.js +591 -0
  223. package/keen-dewdney-6ae15b/src/tests/v3/extensionOverlays.test.js +525 -0
  224. package/keen-dewdney-6ae15b/src/tests/v3/transactionSchema.test.js +574 -0
  225. package/keen-dewdney-6ae15b/src/tests/v3/verifiedClaimsValidator.test.js +128 -0
  226. package/keen-dewdney-6ae15b/src/utils/compactSkeleton.js +84 -0
  227. package/keen-dewdney-6ae15b/src/utils/countTokens.js +67 -0
  228. package/keen-dewdney-6ae15b/src/utils/extractExtensionOverlays.js +362 -0
  229. package/keen-dewdney-6ae15b/src/utils/extractOverlay.js +290 -0
  230. package/keen-dewdney-6ae15b/src/utils/extractProperties.js +44 -0
  231. package/keen-dewdney-6ae15b/src/utils/listPathTitles.js +36 -0
  232. package/keen-dewdney-6ae15b/src/utils/minimalSkeleton.js +85 -0
  233. package/keen-dewdney-6ae15b/src/utils/pathList.csv +903 -0
  234. package/keen-dewdney-6ae15b/src/utils/pathSkeleton.js +181 -0
  235. package/package.json +1 -1
  236. package/src/schemas/v3/combined.json +8 -15
  237. package/src/schemas/v3/overlays/baspi4.json +12 -7
  238. package/src/schemas/v3/overlays/baspi5.json +12 -7
  239. package/src/schemas/v3/overlays/extensions/ac.json +2 -1
  240. package/src/schemas/v3/overlays/extensions/dk.json +3 -2
  241. package/src/schemas/v3/overlays/extensions/ic.json +2 -1
  242. package/src/schemas/v3/overlays/extensions/lc.json +3 -2
  243. package/src/schemas/v3/overlays/extensions/mi.json +2 -1
  244. package/src/schemas/v3/overlays/extensions/nd.json +3 -2
  245. package/src/schemas/v3/overlays/extensions/pc.json +3 -2
  246. package/src/schemas/v3/overlays/extensions/ph.json +2 -1
  247. package/src/schemas/v3/overlays/extensions/rw.json +4 -3
  248. package/src/schemas/v3/overlays/extensions/sc.json +8 -4
  249. package/src/schemas/v3/overlays/extensions/sd.json +3 -2
  250. package/src/schemas/v3/overlays/extensions/tr.json +3 -2
  251. package/src/schemas/v3/overlays/extensions/wg.json +2 -1
  252. package/src/schemas/v3/overlays/lpe1.json +1 -1
  253. package/src/schemas/v3/overlays/nts.json +3 -1
  254. package/src/schemas/v3/overlays/nts2.json +3 -1
  255. package/src/schemas/v3/overlays/ntsl.json +3 -1
  256. package/src/schemas/v3/overlays/ntsl2.json +3 -1
  257. package/src/schemas/v3/overlays/piq.json +7 -5
  258. package/src/schemas/v3/overlays/rds.json +9 -6
  259. package/src/schemas/v3/overlays/ta10.json +0 -9
  260. package/src/schemas/v3/overlays/ta6.json +8 -4
  261. package/src/schemas/v3/overlays/ta6ed6.json +4 -2
  262. package/src/schemas/v3/pdtf-transaction.json +15 -18
  263. package/src/utils/extractExtensionOverlays.js +10 -1
@@ -0,0 +1,1096 @@
1
+ const { getValidator } = require("../../../index.js");
2
+
3
+ const schemaId =
4
+ "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json";
5
+
6
+ describe("Enquiries object validation", () => {
7
+ describe("Valid enquiry keys", () => {
8
+ test("accepts valid UUID as enquiry key", () => {
9
+ const validator = getValidator(schemaId);
10
+ const transaction = {
11
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
12
+ status: "active",
13
+ participants: [
14
+ {
15
+ role: "Buyer",
16
+ participantStatus: "Active",
17
+ },
18
+ ],
19
+ enquiries: {
20
+ "550e8400-e29b-41d4-a716-446655440000": {
21
+ subject: "Boundary wall responsibility",
22
+ status: "pending",
23
+ messages: {},
24
+ },
25
+ },
26
+ };
27
+
28
+ const isValid = validator(transaction);
29
+ expect(isValid).toBe(true);
30
+ });
31
+
32
+ test("accepts valid DID as enquiry key", () => {
33
+ const validator = getValidator(schemaId);
34
+ const transaction = {
35
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
36
+ status: "active",
37
+ participants: [
38
+ {
39
+ role: "Buyer",
40
+ participantStatus: "Active",
41
+ },
42
+ ],
43
+ enquiries: {
44
+ "did:example:enquiry123": {
45
+ subject: "Japanese knotweed treatment",
46
+ status: "open",
47
+ messages: {},
48
+ },
49
+ },
50
+ };
51
+
52
+ const isValid = validator(transaction);
53
+ expect(isValid).toBe(true);
54
+ });
55
+
56
+ test("accepts multiple enquiries with different key types", () => {
57
+ const validator = getValidator(schemaId);
58
+ const transaction = {
59
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
60
+ status: "active",
61
+ participants: [
62
+ {
63
+ role: "Buyer",
64
+ participantStatus: "Active",
65
+ },
66
+ ],
67
+ enquiries: {
68
+ "550e8400-e29b-41d4-a716-446655440000": {
69
+ subject: "Drainage issues",
70
+ status: "pending",
71
+ messages: {},
72
+ },
73
+ "did:example:enquiry456": {
74
+ subject: "Electrical certificates",
75
+ status: "resolved",
76
+ messages: {},
77
+ },
78
+ "enq-abc123": {
79
+ subject: "Planning permissions",
80
+ status: "withdrawn",
81
+ messages: {},
82
+ },
83
+ },
84
+ };
85
+
86
+ const isValid = validator(transaction);
87
+ expect(isValid).toBe(true);
88
+ });
89
+ });
90
+
91
+ describe("Invalid enquiry keys", () => {
92
+ test("rejects enquiry key starting with invalid character", () => {
93
+ const validator = getValidator(schemaId);
94
+ const transaction = {
95
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
96
+ status: "active",
97
+ participants: [
98
+ {
99
+ role: "Buyer",
100
+ participantStatus: "Active",
101
+ },
102
+ ],
103
+ enquiries: {
104
+ "-invalid-key": {
105
+ subject: "Test enquiry",
106
+ status: "pending",
107
+ messages: {},
108
+ },
109
+ },
110
+ };
111
+
112
+ const isValid = validator(transaction);
113
+ expect(isValid).toBe(false);
114
+ });
115
+
116
+ test("rejects enquiry key with spaces", () => {
117
+ const validator = getValidator(schemaId);
118
+ const transaction = {
119
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
120
+ status: "active",
121
+ participants: [
122
+ {
123
+ role: "Buyer",
124
+ participantStatus: "Active",
125
+ },
126
+ ],
127
+ enquiries: {
128
+ "invalid key with spaces": {
129
+ subject: "Test enquiry",
130
+ status: "pending",
131
+ messages: {},
132
+ },
133
+ },
134
+ };
135
+
136
+ const isValid = validator(transaction);
137
+ expect(isValid).toBe(false);
138
+ });
139
+
140
+ test("rejects enquiry key with special characters", () => {
141
+ const validator = getValidator(schemaId);
142
+ const transaction = {
143
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
144
+ status: "active",
145
+ participants: [
146
+ {
147
+ role: "Buyer",
148
+ participantStatus: "Active",
149
+ },
150
+ ],
151
+ enquiries: {
152
+ "invalid@key#here": {
153
+ subject: "Test enquiry",
154
+ status: "pending",
155
+ messages: {},
156
+ },
157
+ },
158
+ };
159
+
160
+ const isValid = validator(transaction);
161
+ expect(isValid).toBe(false);
162
+ });
163
+ });
164
+
165
+ describe("Valid enquiry contents", () => {
166
+ test("accepts enquiry with all required fields", () => {
167
+ const validator = getValidator(schemaId);
168
+ const transaction = {
169
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
170
+ status: "active",
171
+ participants: [
172
+ {
173
+ role: "Buyer",
174
+ participantStatus: "Active",
175
+ },
176
+ ],
177
+ enquiries: {
178
+ "enq-1": {
179
+ subject: "Roof condition",
180
+ status: "pending",
181
+ messages: {},
182
+ },
183
+ },
184
+ };
185
+
186
+ const isValid = validator(transaction);
187
+ expect(isValid).toBe(true);
188
+ });
189
+
190
+ test("accepts all valid status values", () => {
191
+ const validator = getValidator(schemaId);
192
+ const validStatuses = [
193
+ "pending",
194
+ "open",
195
+ "resolved",
196
+ "resolvedWithCondition",
197
+ "withdrawn",
198
+ ];
199
+
200
+ validStatuses.forEach((status) => {
201
+ const transaction = {
202
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
203
+ status: "active",
204
+ participants: [
205
+ {
206
+ role: "Buyer",
207
+ participantStatus: "Active",
208
+ },
209
+ ],
210
+ enquiries: {
211
+ "enq-1": {
212
+ subject: "Test enquiry",
213
+ status: status,
214
+ messages: {},
215
+ ...(status === "resolvedWithCondition" && {
216
+ resolutionCondition: "Subject to completion of remedial works",
217
+ }),
218
+ },
219
+ },
220
+ };
221
+
222
+ const isValid = validator(transaction);
223
+ expect(isValid).toBe(true);
224
+ });
225
+ });
226
+
227
+ test("accepts enquiry with resolutionCondition when status is resolvedWithCondition", () => {
228
+ const validator = getValidator(schemaId);
229
+ const transaction = {
230
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
231
+ status: "active",
232
+ participants: [
233
+ {
234
+ role: "Buyer",
235
+ participantStatus: "Active",
236
+ },
237
+ ],
238
+ enquiries: {
239
+ "enq-1": {
240
+ subject: "Damp in basement",
241
+ status: "resolvedWithCondition",
242
+ resolutionCondition:
243
+ "Seller to provide evidence of damp-proofing works within 30 days",
244
+ messages: {},
245
+ },
246
+ },
247
+ };
248
+
249
+ const isValid = validator(transaction);
250
+ expect(isValid).toBe(true);
251
+ });
252
+
253
+ test("accepts enquiry with optional resolutionCondition when status is not resolvedWithCondition", () => {
254
+ const validator = getValidator(schemaId);
255
+ const transaction = {
256
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
257
+ status: "active",
258
+ participants: [
259
+ {
260
+ role: "Buyer",
261
+ participantStatus: "Active",
262
+ },
263
+ ],
264
+ enquiries: {
265
+ "enq-1": {
266
+ subject: "Roof condition",
267
+ status: "resolved",
268
+ resolutionCondition: "No action required",
269
+ messages: {},
270
+ },
271
+ },
272
+ };
273
+
274
+ const isValid = validator(transaction);
275
+ expect(isValid).toBe(true);
276
+ });
277
+
278
+ test("accepts enquiry with messages containing all required fields", () => {
279
+ const validator = getValidator(schemaId);
280
+ const transaction = {
281
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
282
+ status: "active",
283
+ participants: [
284
+ {
285
+ role: "Buyer",
286
+ participantStatus: "Active",
287
+ },
288
+ ],
289
+ enquiries: {
290
+ "enq-1": {
291
+ subject: "Boundary dispute",
292
+ status: "open",
293
+ messages: {
294
+ "msg-1": {
295
+ datetime: "2025-01-15T10:30:00Z",
296
+ originatorRole: "Buyer's Conveyancer",
297
+ destinationRole: "Seller's Conveyancer",
298
+ messageText:
299
+ "Can you provide details of the boundary agreement with the neighboring property?",
300
+ },
301
+ },
302
+ },
303
+ },
304
+ };
305
+
306
+ const isValid = validator(transaction);
307
+ expect(isValid).toBe(true);
308
+ });
309
+
310
+ test("accepts enquiry with multiple messages", () => {
311
+ const validator = getValidator(schemaId);
312
+ const transaction = {
313
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
314
+ status: "active",
315
+ participants: [
316
+ {
317
+ role: "Buyer",
318
+ participantStatus: "Active",
319
+ },
320
+ ],
321
+ enquiries: {
322
+ "enq-1": {
323
+ subject: "Tree preservation order",
324
+ status: "open",
325
+ messages: {
326
+ "msg-1": {
327
+ datetime: "2025-01-15T10:30:00Z",
328
+ originatorRole: "Buyer's Conveyancer",
329
+ destinationRole: "Seller's Conveyancer",
330
+ messageText: "Is there a tree preservation order on the oak tree in the garden?",
331
+ },
332
+ "msg-2": {
333
+ datetime: "2025-01-16T14:20:00Z",
334
+ originatorRole: "Seller's Conveyancer",
335
+ destinationRole: "Buyer's Conveyancer",
336
+ messageText: "Yes, we will provide documentation from the council.",
337
+ },
338
+ "msg-3": {
339
+ datetime: "2025-01-17T09:15:00Z",
340
+ originatorRole: "Seller's Conveyancer",
341
+ destinationRole: "Buyer's Conveyancer",
342
+ messageText: "Please find attached the TPO certificate from the local authority.",
343
+ },
344
+ },
345
+ },
346
+ },
347
+ };
348
+
349
+ const isValid = validator(transaction);
350
+ expect(isValid).toBe(true);
351
+ });
352
+
353
+ test("accepts all valid participant roles for originatorRole and destinationRole", () => {
354
+ const validator = getValidator(schemaId);
355
+ const validRoles = [
356
+ "Seller",
357
+ "Seller's Conveyancer",
358
+ "Buyer",
359
+ "Buyer's Conveyancer",
360
+ "Estate Agent",
361
+ "Buyer's Agent",
362
+ "Surveyor",
363
+ "Mortgage Broker",
364
+ "Lender",
365
+ ];
366
+
367
+ validRoles.forEach((role) => {
368
+ const transaction = {
369
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
370
+ status: "active",
371
+ participants: [
372
+ {
373
+ role: "Buyer",
374
+ participantStatus: "Active",
375
+ },
376
+ ],
377
+ enquiries: {
378
+ "enq-1": {
379
+ subject: "Test enquiry",
380
+ status: "open",
381
+ messages: {
382
+ "msg-1": {
383
+ datetime: "2025-01-15T10:30:00Z",
384
+ originatorRole: role,
385
+ destinationRole: "Buyer's Conveyancer",
386
+ messageText: "Test message",
387
+ },
388
+ },
389
+ },
390
+ },
391
+ };
392
+
393
+ const isValid = validator(transaction);
394
+ expect(isValid).toBe(true);
395
+ });
396
+ });
397
+
398
+ test("accepts message key as UUID", () => {
399
+ const validator = getValidator(schemaId);
400
+ const transaction = {
401
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
402
+ status: "active",
403
+ participants: [
404
+ {
405
+ role: "Buyer",
406
+ participantStatus: "Active",
407
+ },
408
+ ],
409
+ enquiries: {
410
+ "enq-1": {
411
+ subject: "Test enquiry",
412
+ status: "open",
413
+ messages: {
414
+ "550e8400-e29b-41d4-a716-446655440000": {
415
+ datetime: "2025-01-15T10:30:00Z",
416
+ originatorRole: "Buyer's Conveyancer",
417
+ destinationRole: "Seller's Conveyancer",
418
+ messageText: "Test message",
419
+ },
420
+ },
421
+ },
422
+ },
423
+ };
424
+
425
+ const isValid = validator(transaction);
426
+ expect(isValid).toBe(true);
427
+ });
428
+
429
+ test("accepts message key as DID", () => {
430
+ const validator = getValidator(schemaId);
431
+ const transaction = {
432
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
433
+ status: "active",
434
+ participants: [
435
+ {
436
+ role: "Buyer",
437
+ participantStatus: "Active",
438
+ },
439
+ ],
440
+ enquiries: {
441
+ "enq-1": {
442
+ subject: "Test enquiry",
443
+ status: "open",
444
+ messages: {
445
+ "did:example:message123": {
446
+ datetime: "2025-01-15T10:30:00Z",
447
+ originatorRole: "Buyer's Conveyancer",
448
+ destinationRole: "Seller's Conveyancer",
449
+ messageText: "Test message",
450
+ },
451
+ },
452
+ },
453
+ },
454
+ };
455
+
456
+ const isValid = validator(transaction);
457
+ expect(isValid).toBe(true);
458
+ });
459
+ });
460
+
461
+ describe("Invalid enquiry contents", () => {
462
+ test("rejects enquiry missing required subject field", () => {
463
+ const validator = getValidator(schemaId);
464
+ const transaction = {
465
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
466
+ status: "active",
467
+ participants: [
468
+ {
469
+ role: "Buyer",
470
+ participantStatus: "Active",
471
+ },
472
+ ],
473
+ enquiries: {
474
+ "enq-1": {
475
+ status: "pending",
476
+ messages: {},
477
+ },
478
+ },
479
+ };
480
+
481
+ const isValid = validator(transaction);
482
+ expect(isValid).toBe(false);
483
+ expect(
484
+ validator.errors.some((e) => e.message.includes("required property"))
485
+ ).toBe(true);
486
+ });
487
+
488
+ test("rejects enquiry missing required status field", () => {
489
+ const validator = getValidator(schemaId);
490
+ const transaction = {
491
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
492
+ status: "active",
493
+ participants: [
494
+ {
495
+ role: "Buyer",
496
+ participantStatus: "Active",
497
+ },
498
+ ],
499
+ enquiries: {
500
+ "enq-1": {
501
+ subject: "Test enquiry",
502
+ messages: {},
503
+ },
504
+ },
505
+ };
506
+
507
+ const isValid = validator(transaction);
508
+ expect(isValid).toBe(false);
509
+ });
510
+
511
+ test("rejects enquiry missing required messages field", () => {
512
+ const validator = getValidator(schemaId);
513
+ const transaction = {
514
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
515
+ status: "active",
516
+ participants: [
517
+ {
518
+ role: "Buyer",
519
+ participantStatus: "Active",
520
+ },
521
+ ],
522
+ enquiries: {
523
+ "enq-1": {
524
+ subject: "Test enquiry",
525
+ status: "pending",
526
+ },
527
+ },
528
+ };
529
+
530
+ const isValid = validator(transaction);
531
+ expect(isValid).toBe(false);
532
+ });
533
+
534
+ test("rejects enquiry with invalid status value", () => {
535
+ const validator = getValidator(schemaId);
536
+ const transaction = {
537
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
538
+ status: "active",
539
+ participants: [
540
+ {
541
+ role: "Buyer",
542
+ participantStatus: "Active",
543
+ },
544
+ ],
545
+ enquiries: {
546
+ "enq-1": {
547
+ subject: "Test enquiry",
548
+ status: "invalid-status",
549
+ messages: {},
550
+ },
551
+ },
552
+ };
553
+
554
+ const isValid = validator(transaction);
555
+ expect(isValid).toBe(false);
556
+ });
557
+
558
+ test("rejects enquiry with status resolvedWithCondition but missing resolutionCondition", () => {
559
+ const validator = getValidator(schemaId);
560
+ const transaction = {
561
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
562
+ status: "active",
563
+ participants: [
564
+ {
565
+ role: "Buyer",
566
+ participantStatus: "Active",
567
+ },
568
+ ],
569
+ enquiries: {
570
+ "enq-1": {
571
+ subject: "Damp issue",
572
+ status: "resolvedWithCondition",
573
+ messages: {},
574
+ },
575
+ },
576
+ };
577
+
578
+ const isValid = validator(transaction);
579
+ expect(isValid).toBe(false);
580
+ expect(
581
+ validator.errors.some((e) => e.message.includes("required property"))
582
+ ).toBe(true);
583
+ });
584
+
585
+ test("rejects message missing required datetime field", () => {
586
+ const validator = getValidator(schemaId);
587
+ const transaction = {
588
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
589
+ status: "active",
590
+ participants: [
591
+ {
592
+ role: "Buyer",
593
+ participantStatus: "Active",
594
+ },
595
+ ],
596
+ enquiries: {
597
+ "enq-1": {
598
+ subject: "Test enquiry",
599
+ status: "open",
600
+ messages: {
601
+ "msg-1": {
602
+ originatorRole: "Buyer's Conveyancer",
603
+ destinationRole: "Seller's Conveyancer",
604
+ messageText: "Test message",
605
+ },
606
+ },
607
+ },
608
+ },
609
+ };
610
+
611
+ const isValid = validator(transaction);
612
+ expect(isValid).toBe(false);
613
+ });
614
+
615
+ test("rejects message missing required originatorRole field", () => {
616
+ const validator = getValidator(schemaId);
617
+ const transaction = {
618
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
619
+ status: "active",
620
+ participants: [
621
+ {
622
+ role: "Buyer",
623
+ participantStatus: "Active",
624
+ },
625
+ ],
626
+ enquiries: {
627
+ "enq-1": {
628
+ subject: "Test enquiry",
629
+ status: "open",
630
+ messages: {
631
+ "msg-1": {
632
+ datetime: "2025-01-15T10:30:00Z",
633
+ destinationRole: "Seller's Conveyancer",
634
+ messageText: "Test message",
635
+ },
636
+ },
637
+ },
638
+ },
639
+ };
640
+
641
+ const isValid = validator(transaction);
642
+ expect(isValid).toBe(false);
643
+ });
644
+
645
+ test("rejects message missing required destinationRole field", () => {
646
+ const validator = getValidator(schemaId);
647
+ const transaction = {
648
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
649
+ status: "active",
650
+ participants: [
651
+ {
652
+ role: "Buyer",
653
+ participantStatus: "Active",
654
+ },
655
+ ],
656
+ enquiries: {
657
+ "enq-1": {
658
+ subject: "Test enquiry",
659
+ status: "open",
660
+ messages: {
661
+ "msg-1": {
662
+ datetime: "2025-01-15T10:30:00Z",
663
+ originatorRole: "Buyer's Conveyancer",
664
+ messageText: "Test message",
665
+ },
666
+ },
667
+ },
668
+ },
669
+ };
670
+
671
+ const isValid = validator(transaction);
672
+ expect(isValid).toBe(false);
673
+ });
674
+
675
+ test("rejects message missing required messageText field", () => {
676
+ const validator = getValidator(schemaId);
677
+ const transaction = {
678
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
679
+ status: "active",
680
+ participants: [
681
+ {
682
+ role: "Buyer",
683
+ participantStatus: "Active",
684
+ },
685
+ ],
686
+ enquiries: {
687
+ "enq-1": {
688
+ subject: "Test enquiry",
689
+ status: "open",
690
+ messages: {
691
+ "msg-1": {
692
+ datetime: "2025-01-15T10:30:00Z",
693
+ originatorRole: "Buyer's Conveyancer",
694
+ destinationRole: "Seller's Conveyancer",
695
+ },
696
+ },
697
+ },
698
+ },
699
+ };
700
+
701
+ const isValid = validator(transaction);
702
+ expect(isValid).toBe(false);
703
+ });
704
+
705
+ test("rejects message with invalid datetime format", () => {
706
+ const validator = getValidator(schemaId);
707
+ const transaction = {
708
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
709
+ status: "active",
710
+ participants: [
711
+ {
712
+ role: "Buyer",
713
+ participantStatus: "Active",
714
+ },
715
+ ],
716
+ enquiries: {
717
+ "enq-1": {
718
+ subject: "Test enquiry",
719
+ status: "open",
720
+ messages: {
721
+ "msg-1": {
722
+ datetime: "15/01/2025 10:30",
723
+ originatorRole: "Buyer's Conveyancer",
724
+ destinationRole: "Seller's Conveyancer",
725
+ messageText: "Test message",
726
+ },
727
+ },
728
+ },
729
+ },
730
+ };
731
+
732
+ const isValid = validator(transaction);
733
+ expect(isValid).toBe(false);
734
+ });
735
+
736
+ test("rejects message with invalid originatorRole", () => {
737
+ const validator = getValidator(schemaId);
738
+ const transaction = {
739
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
740
+ status: "active",
741
+ participants: [
742
+ {
743
+ role: "Buyer",
744
+ participantStatus: "Active",
745
+ },
746
+ ],
747
+ enquiries: {
748
+ "enq-1": {
749
+ subject: "Test enquiry",
750
+ status: "open",
751
+ messages: {
752
+ "msg-1": {
753
+ datetime: "2025-01-15T10:30:00Z",
754
+ originatorRole: "Invalid Role",
755
+ destinationRole: "Seller's Conveyancer",
756
+ messageText: "Test message",
757
+ },
758
+ },
759
+ },
760
+ },
761
+ };
762
+
763
+ const isValid = validator(transaction);
764
+ expect(isValid).toBe(false);
765
+ });
766
+
767
+ test("rejects message with invalid destinationRole", () => {
768
+ const validator = getValidator(schemaId);
769
+ const transaction = {
770
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
771
+ status: "active",
772
+ participants: [
773
+ {
774
+ role: "Buyer",
775
+ participantStatus: "Active",
776
+ },
777
+ ],
778
+ enquiries: {
779
+ "enq-1": {
780
+ subject: "Test enquiry",
781
+ status: "open",
782
+ messages: {
783
+ "msg-1": {
784
+ datetime: "2025-01-15T10:30:00Z",
785
+ originatorRole: "Buyer's Conveyancer",
786
+ destinationRole: "Invalid Role",
787
+ messageText: "Test message",
788
+ },
789
+ },
790
+ },
791
+ },
792
+ };
793
+
794
+ const isValid = validator(transaction);
795
+ expect(isValid).toBe(false);
796
+ });
797
+
798
+ test("rejects message key starting with invalid character", () => {
799
+ const validator = getValidator(schemaId);
800
+ const transaction = {
801
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
802
+ status: "active",
803
+ participants: [
804
+ {
805
+ role: "Buyer",
806
+ participantStatus: "Active",
807
+ },
808
+ ],
809
+ enquiries: {
810
+ "enq-1": {
811
+ subject: "Test enquiry",
812
+ status: "open",
813
+ messages: {
814
+ "-invalid-message-key": {
815
+ datetime: "2025-01-15T10:30:00Z",
816
+ originatorRole: "Buyer's Conveyancer",
817
+ destinationRole: "Seller's Conveyancer",
818
+ messageText: "Test message",
819
+ },
820
+ },
821
+ },
822
+ },
823
+ };
824
+
825
+ const isValid = validator(transaction);
826
+ expect(isValid).toBe(false);
827
+ });
828
+
829
+ test("rejects message key with spaces", () => {
830
+ const validator = getValidator(schemaId);
831
+ const transaction = {
832
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
833
+ status: "active",
834
+ participants: [
835
+ {
836
+ role: "Buyer",
837
+ participantStatus: "Active",
838
+ },
839
+ ],
840
+ enquiries: {
841
+ "enq-1": {
842
+ subject: "Test enquiry",
843
+ status: "open",
844
+ messages: {
845
+ "invalid message key": {
846
+ datetime: "2025-01-15T10:30:00Z",
847
+ originatorRole: "Buyer's Conveyancer",
848
+ destinationRole: "Seller's Conveyancer",
849
+ messageText: "Test message",
850
+ },
851
+ },
852
+ },
853
+ },
854
+ };
855
+
856
+ const isValid = validator(transaction);
857
+ expect(isValid).toBe(false);
858
+ });
859
+
860
+ test("rejects messages as array instead of object", () => {
861
+ const validator = getValidator(schemaId);
862
+ const transaction = {
863
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
864
+ status: "active",
865
+ participants: [
866
+ {
867
+ role: "Buyer",
868
+ participantStatus: "Active",
869
+ },
870
+ ],
871
+ enquiries: {
872
+ "enq-1": {
873
+ subject: "Test enquiry",
874
+ status: "open",
875
+ messages: [
876
+ {
877
+ datetime: "2025-01-15T10:30:00Z",
878
+ originatorRole: "Buyer's Conveyancer",
879
+ destinationRole: "Seller's Conveyancer",
880
+ messageText: "Test message",
881
+ },
882
+ ],
883
+ },
884
+ },
885
+ };
886
+
887
+ const isValid = validator(transaction);
888
+ expect(isValid).toBe(false);
889
+ });
890
+ });
891
+
892
+ describe("Empty enquiries object", () => {
893
+ test("accepts empty enquiries object", () => {
894
+ const validator = getValidator(schemaId);
895
+ const transaction = {
896
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
897
+ status: "active",
898
+ participants: [
899
+ {
900
+ role: "Buyer",
901
+ participantStatus: "Active",
902
+ },
903
+ ],
904
+ enquiries: {},
905
+ };
906
+
907
+ const isValid = validator(transaction);
908
+ expect(isValid).toBe(true);
909
+ });
910
+
911
+ test("accepts transaction without enquiries property", () => {
912
+ const validator = getValidator(schemaId);
913
+ const transaction = {
914
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
915
+ status: "active",
916
+ participants: [
917
+ {
918
+ role: "Buyer",
919
+ participantStatus: "Active",
920
+ },
921
+ ],
922
+ };
923
+
924
+ const isValid = validator(transaction);
925
+ expect(isValid).toBe(true);
926
+ });
927
+
928
+ test("accepts enquiry with empty messages object", () => {
929
+ const validator = getValidator(schemaId);
930
+ const transaction = {
931
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
932
+ status: "active",
933
+ participants: [
934
+ {
935
+ role: "Buyer",
936
+ participantStatus: "Active",
937
+ },
938
+ ],
939
+ enquiries: {
940
+ "enq-1": {
941
+ subject: "Newly created enquiry",
942
+ status: "pending",
943
+ messages: {},
944
+ },
945
+ },
946
+ };
947
+
948
+ const isValid = validator(transaction);
949
+ expect(isValid).toBe(true);
950
+ });
951
+ });
952
+
953
+ describe("Complex enquiry scenarios", () => {
954
+ test("accepts complete enquiry lifecycle with multiple messages", () => {
955
+ const validator = getValidator(schemaId);
956
+ const transaction = {
957
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
958
+ status: "active",
959
+ participants: [
960
+ {
961
+ role: "Buyer",
962
+ participantStatus: "Active",
963
+ },
964
+ {
965
+ role: "Seller",
966
+ participantStatus: "Active",
967
+ },
968
+ ],
969
+ enquiries: {
970
+ "enq-drainage": {
971
+ subject: "Drainage and water runoff concerns",
972
+ status: "resolvedWithCondition",
973
+ resolutionCondition:
974
+ "Seller to provide drainage survey report before exchange of contracts",
975
+ messages: {
976
+ "msg-001": {
977
+ datetime: "2025-01-10T09:00:00Z",
978
+ originatorRole: "Buyer's Conveyancer",
979
+ destinationRole: "Seller's Conveyancer",
980
+ messageText:
981
+ "Our client has raised concerns about drainage in the rear garden. Can you provide details of any drainage works carried out?",
982
+ },
983
+ "msg-002": {
984
+ datetime: "2025-01-12T14:30:00Z",
985
+ originatorRole: "Seller's Conveyancer",
986
+ destinationRole: "Buyer's Conveyancer",
987
+ messageText:
988
+ "The seller confirms drainage works were carried out in 2020. We will obtain the relevant documentation.",
989
+ },
990
+ "msg-003": {
991
+ datetime: "2025-01-15T11:00:00Z",
992
+ originatorRole: "Seller's Conveyancer",
993
+ destinationRole: "Buyer's Conveyancer",
994
+ messageText:
995
+ "Please find attached the drainage survey report from 2020 and building control certificates.",
996
+ },
997
+ "msg-004": {
998
+ datetime: "2025-01-17T10:00:00Z",
999
+ originatorRole: "Buyer's Conveyancer",
1000
+ destinationRole: "Seller's Conveyancer",
1001
+ messageText:
1002
+ "Thank you. Our client's surveyor has reviewed the documentation and is satisfied, subject to a final drainage inspection before exchange.",
1003
+ },
1004
+ },
1005
+ },
1006
+ "enq-boundaries": {
1007
+ subject: "Boundary responsibilities",
1008
+ status: "resolved",
1009
+ messages: {
1010
+ "msg-101": {
1011
+ datetime: "2025-01-08T10:00:00Z",
1012
+ originatorRole: "Buyer's Conveyancer",
1013
+ destinationRole: "Seller's Conveyancer",
1014
+ messageText:
1015
+ "Please confirm which boundaries the seller is responsible for maintaining.",
1016
+ },
1017
+ "msg-102": {
1018
+ datetime: "2025-01-09T15:00:00Z",
1019
+ originatorRole: "Seller's Conveyancer",
1020
+ destinationRole: "Buyer's Conveyancer",
1021
+ messageText:
1022
+ "The seller is responsible for the left-hand boundary fence and the rear hedge, as shown on the title plan. The right-hand fence is the neighbor's responsibility.",
1023
+ },
1024
+ },
1025
+ },
1026
+ "enq-planning": {
1027
+ subject: "Planning permission for extension",
1028
+ status: "withdrawn",
1029
+ messages: {
1030
+ "msg-201": {
1031
+ datetime: "2025-01-11T09:30:00Z",
1032
+ originatorRole: "Buyer's Conveyancer",
1033
+ destinationRole: "Seller's Conveyancer",
1034
+ messageText:
1035
+ "Can you confirm whether planning permission was obtained for the rear extension?",
1036
+ },
1037
+ "msg-202": {
1038
+ datetime: "2025-01-12T16:00:00Z",
1039
+ originatorRole: "Buyer's Conveyancer",
1040
+ destinationRole: "Seller's Conveyancer",
1041
+ messageText:
1042
+ "Please disregard previous enquiry. Our client has confirmed they have obtained the planning documentation from the council search.",
1043
+ },
1044
+ },
1045
+ },
1046
+ },
1047
+ };
1048
+
1049
+ const isValid = validator(transaction);
1050
+ expect(isValid).toBe(true);
1051
+ });
1052
+
1053
+ test("accepts enquiry with mixed participant roles in messages", () => {
1054
+ const validator = getValidator(schemaId);
1055
+ const transaction = {
1056
+ transactionId: "123e4567-e89b-12d3-a456-426614174000",
1057
+ status: "active",
1058
+ participants: [
1059
+ {
1060
+ role: "Buyer",
1061
+ participantStatus: "Active",
1062
+ },
1063
+ ],
1064
+ enquiries: {
1065
+ "enq-1": {
1066
+ subject: "Survey findings requiring seller input",
1067
+ status: "open",
1068
+ messages: {
1069
+ "msg-1": {
1070
+ datetime: "2025-01-15T09:00:00Z",
1071
+ originatorRole: "Surveyor",
1072
+ destinationRole: "Buyer's Conveyancer",
1073
+ messageText: "Survey has identified potential subsidence. Recommend further investigation.",
1074
+ },
1075
+ "msg-2": {
1076
+ datetime: "2025-01-15T11:00:00Z",
1077
+ originatorRole: "Buyer's Conveyancer",
1078
+ destinationRole: "Seller's Conveyancer",
1079
+ messageText: "Please see surveyor's comments regarding subsidence. Can the seller provide any relevant information?",
1080
+ },
1081
+ "msg-3": {
1082
+ datetime: "2025-01-16T14:00:00Z",
1083
+ originatorRole: "Seller's Conveyancer",
1084
+ destinationRole: "Buyer's Conveyancer",
1085
+ messageText: "The seller has confirmed no subsidence issues known. Will investigate further with structural engineer.",
1086
+ },
1087
+ },
1088
+ },
1089
+ },
1090
+ };
1091
+
1092
+ const isValid = validator(transaction);
1093
+ expect(isValid).toBe(true);
1094
+ });
1095
+ });
1096
+ });