bitbucket-datacenter-mcp 0.2.0

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 (1573) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/README.md +236 -0
  3. package/bin/run.js +7 -0
  4. package/build/__tests__/bitbucket-service.test.d.ts +2 -0
  5. package/build/__tests__/bitbucket-service.test.d.ts.map +1 -0
  6. package/build/__tests__/bitbucket-service.test.js +2824 -0
  7. package/build/__tests__/bitbucket-service.test.js.map +1 -0
  8. package/build/__tests__/bitbucket-token-optimization.test.d.ts +2 -0
  9. package/build/__tests__/bitbucket-token-optimization.test.d.ts.map +1 -0
  10. package/build/__tests__/bitbucket-token-optimization.test.js +391 -0
  11. package/build/__tests__/bitbucket-token-optimization.test.js.map +1 -0
  12. package/build/__tests__/config.test.d.ts +2 -0
  13. package/build/__tests__/config.test.d.ts.map +1 -0
  14. package/build/__tests__/config.test.js +49 -0
  15. package/build/__tests__/config.test.js.map +1 -0
  16. package/build/__tests__/inbox-pr-mapper.test.d.ts +2 -0
  17. package/build/__tests__/inbox-pr-mapper.test.d.ts.map +1 -0
  18. package/build/__tests__/inbox-pr-mapper.test.js +304 -0
  19. package/build/__tests__/inbox-pr-mapper.test.js.map +1 -0
  20. package/build/__tests__/pr-changes-mapper.test.d.ts +2 -0
  21. package/build/__tests__/pr-changes-mapper.test.d.ts.map +1 -0
  22. package/build/__tests__/pr-changes-mapper.test.js +396 -0
  23. package/build/__tests__/pr-changes-mapper.test.js.map +1 -0
  24. package/build/__tests__/pr-comment-mapper.test.d.ts +2 -0
  25. package/build/__tests__/pr-comment-mapper.test.d.ts.map +1 -0
  26. package/build/__tests__/pr-comment-mapper.test.js +490 -0
  27. package/build/__tests__/pr-comment-mapper.test.js.map +1 -0
  28. package/build/bitbucket-client/core/ApiError.d.ts +11 -0
  29. package/build/bitbucket-client/core/ApiError.d.ts.map +1 -0
  30. package/build/bitbucket-client/core/ApiError.js +17 -0
  31. package/build/bitbucket-client/core/ApiError.js.map +1 -0
  32. package/build/bitbucket-client/core/ApiRequestOptions.d.ts +14 -0
  33. package/build/bitbucket-client/core/ApiRequestOptions.d.ts.map +1 -0
  34. package/build/bitbucket-client/core/ApiRequestOptions.js +2 -0
  35. package/build/bitbucket-client/core/ApiRequestOptions.js.map +1 -0
  36. package/build/bitbucket-client/core/ApiResult.d.ts +8 -0
  37. package/build/bitbucket-client/core/ApiResult.d.ts.map +1 -0
  38. package/build/bitbucket-client/core/ApiResult.js +2 -0
  39. package/build/bitbucket-client/core/ApiResult.js.map +1 -0
  40. package/build/bitbucket-client/core/CancelablePromise.d.ts +21 -0
  41. package/build/bitbucket-client/core/CancelablePromise.d.ts.map +1 -0
  42. package/build/bitbucket-client/core/CancelablePromise.js +100 -0
  43. package/build/bitbucket-client/core/CancelablePromise.js.map +1 -0
  44. package/build/bitbucket-client/core/OpenAPI.d.ts +17 -0
  45. package/build/bitbucket-client/core/OpenAPI.d.ts.map +1 -0
  46. package/build/bitbucket-client/core/OpenAPI.js +12 -0
  47. package/build/bitbucket-client/core/OpenAPI.js.map +1 -0
  48. package/build/bitbucket-client/core/request.d.ts +31 -0
  49. package/build/bitbucket-client/core/request.d.ts.map +1 -0
  50. package/build/bitbucket-client/core/request.js +292 -0
  51. package/build/bitbucket-client/core/request.js.map +1 -0
  52. package/build/bitbucket-client/index.d.ts +297 -0
  53. package/build/bitbucket-client/index.d.ts.map +1 -0
  54. package/build/bitbucket-client/index.js +44 -0
  55. package/build/bitbucket-client/index.js.map +1 -0
  56. package/build/bitbucket-client/models/AdminPasswordUpdate.d.ts +6 -0
  57. package/build/bitbucket-client/models/AdminPasswordUpdate.d.ts.map +1 -0
  58. package/build/bitbucket-client/models/AdminPasswordUpdate.js +2 -0
  59. package/build/bitbucket-client/models/AdminPasswordUpdate.js.map +1 -0
  60. package/build/bitbucket-client/models/ApplicationId.d.ts +2 -0
  61. package/build/bitbucket-client/models/ApplicationId.d.ts.map +1 -0
  62. package/build/bitbucket-client/models/ApplicationId.js +2 -0
  63. package/build/bitbucket-client/models/ApplicationId.js.map +1 -0
  64. package/build/bitbucket-client/models/ApplicationUser.d.ts +2 -0
  65. package/build/bitbucket-client/models/ApplicationUser.d.ts.map +1 -0
  66. package/build/bitbucket-client/models/ApplicationUser.js +2 -0
  67. package/build/bitbucket-client/models/ApplicationUser.js.map +1 -0
  68. package/build/bitbucket-client/models/AuthenticationEntity.d.ts +9 -0
  69. package/build/bitbucket-client/models/AuthenticationEntity.d.ts.map +1 -0
  70. package/build/bitbucket-client/models/AuthenticationEntity.js +2 -0
  71. package/build/bitbucket-client/models/AuthenticationEntity.js.map +1 -0
  72. package/build/bitbucket-client/models/AuthenticationResponse.d.ts +2 -0
  73. package/build/bitbucket-client/models/AuthenticationResponse.d.ts.map +1 -0
  74. package/build/bitbucket-client/models/AuthenticationResponse.js +2 -0
  75. package/build/bitbucket-client/models/AuthenticationResponse.js.map +1 -0
  76. package/build/bitbucket-client/models/BasicAuthConfigEntity.d.ts +2 -0
  77. package/build/bitbucket-client/models/BasicAuthConfigEntity.d.ts.map +1 -0
  78. package/build/bitbucket-client/models/BasicAuthConfigEntity.js +2 -0
  79. package/build/bitbucket-client/models/BasicAuthConfigEntity.js.map +1 -0
  80. package/build/bitbucket-client/models/CaptchaDataEntity.d.ts +2 -0
  81. package/build/bitbucket-client/models/CaptchaDataEntity.d.ts.map +1 -0
  82. package/build/bitbucket-client/models/CaptchaDataEntity.js +2 -0
  83. package/build/bitbucket-client/models/CaptchaDataEntity.js.map +1 -0
  84. package/build/bitbucket-client/models/Comment.d.ts +33 -0
  85. package/build/bitbucket-client/models/Comment.d.ts.map +1 -0
  86. package/build/bitbucket-client/models/Comment.js +15 -0
  87. package/build/bitbucket-client/models/Comment.js.map +1 -0
  88. package/build/bitbucket-client/models/CommentOperations.d.ts +6 -0
  89. package/build/bitbucket-client/models/CommentOperations.d.ts.map +1 -0
  90. package/build/bitbucket-client/models/CommentOperations.js +2 -0
  91. package/build/bitbucket-client/models/CommentOperations.js.map +1 -0
  92. package/build/bitbucket-client/models/CommentThread.d.ts +17 -0
  93. package/build/bitbucket-client/models/CommentThread.d.ts.map +1 -0
  94. package/build/bitbucket-client/models/CommentThread.js +2 -0
  95. package/build/bitbucket-client/models/CommentThread.js.map +1 -0
  96. package/build/bitbucket-client/models/CommentThreadDiffAnchor.d.ts +41 -0
  97. package/build/bitbucket-client/models/CommentThreadDiffAnchor.d.ts.map +1 -0
  98. package/build/bitbucket-client/models/CommentThreadDiffAnchor.js +27 -0
  99. package/build/bitbucket-client/models/CommentThreadDiffAnchor.js.map +1 -0
  100. package/build/bitbucket-client/models/Commentable.d.ts +2 -0
  101. package/build/bitbucket-client/models/Commentable.d.ts.map +1 -0
  102. package/build/bitbucket-client/models/Commentable.js +2 -0
  103. package/build/bitbucket-client/models/Commentable.js.map +1 -0
  104. package/build/bitbucket-client/models/Context.d.ts +4 -0
  105. package/build/bitbucket-client/models/Context.d.ts.map +1 -0
  106. package/build/bitbucket-client/models/Context.js +2 -0
  107. package/build/bitbucket-client/models/Context.js.map +1 -0
  108. package/build/bitbucket-client/models/ConversationDTO.d.ts +4 -0
  109. package/build/bitbucket-client/models/ConversationDTO.d.ts.map +1 -0
  110. package/build/bitbucket-client/models/ConversationDTO.js +2 -0
  111. package/build/bitbucket-client/models/ConversationDTO.js.map +1 -0
  112. package/build/bitbucket-client/models/Credentials.d.ts +5 -0
  113. package/build/bitbucket-client/models/Credentials.d.ts.map +1 -0
  114. package/build/bitbucket-client/models/Credentials.js +2 -0
  115. package/build/bitbucket-client/models/Credentials.js.map +1 -0
  116. package/build/bitbucket-client/models/CredentialsCheckFailedDTO.d.ts +2 -0
  117. package/build/bitbucket-client/models/CredentialsCheckFailedDTO.d.ts.map +1 -0
  118. package/build/bitbucket-client/models/CredentialsCheckFailedDTO.js +2 -0
  119. package/build/bitbucket-client/models/CredentialsCheckFailedDTO.js.map +1 -0
  120. package/build/bitbucket-client/models/DiffContentFilter.d.ts +2 -0
  121. package/build/bitbucket-client/models/DiffContentFilter.d.ts.map +1 -0
  122. package/build/bitbucket-client/models/DiffContentFilter.js +2 -0
  123. package/build/bitbucket-client/models/DiffContentFilter.js.map +1 -0
  124. package/build/bitbucket-client/models/ElevationMethodRestDTO.d.ts +2 -0
  125. package/build/bitbucket-client/models/ElevationMethodRestDTO.d.ts.map +1 -0
  126. package/build/bitbucket-client/models/ElevationMethodRestDTO.js +2 -0
  127. package/build/bitbucket-client/models/ElevationMethodRestDTO.js.map +1 -0
  128. package/build/bitbucket-client/models/EnrichedRepository.d.ts +2 -0
  129. package/build/bitbucket-client/models/EnrichedRepository.d.ts.map +1 -0
  130. package/build/bitbucket-client/models/EnrichedRepository.js +2 -0
  131. package/build/bitbucket-client/models/EnrichedRepository.js.map +1 -0
  132. package/build/bitbucket-client/models/ErrorEntity.d.ts +2 -0
  133. package/build/bitbucket-client/models/ErrorEntity.d.ts.map +1 -0
  134. package/build/bitbucket-client/models/ErrorEntity.js +2 -0
  135. package/build/bitbucket-client/models/ErrorEntity.js.map +1 -0
  136. package/build/bitbucket-client/models/ExampleAvatarMultipartFormData.d.ts +7 -0
  137. package/build/bitbucket-client/models/ExampleAvatarMultipartFormData.d.ts.map +1 -0
  138. package/build/bitbucket-client/models/ExampleAvatarMultipartFormData.js +2 -0
  139. package/build/bitbucket-client/models/ExampleAvatarMultipartFormData.js.map +1 -0
  140. package/build/bitbucket-client/models/ExampleCertificateMultipartFormData.d.ts +7 -0
  141. package/build/bitbucket-client/models/ExampleCertificateMultipartFormData.d.ts.map +1 -0
  142. package/build/bitbucket-client/models/ExampleCertificateMultipartFormData.js +2 -0
  143. package/build/bitbucket-client/models/ExampleCertificateMultipartFormData.js.map +1 -0
  144. package/build/bitbucket-client/models/ExampleFiles.d.ts +2 -0
  145. package/build/bitbucket-client/models/ExampleFiles.d.ts.map +1 -0
  146. package/build/bitbucket-client/models/ExampleFiles.js +2 -0
  147. package/build/bitbucket-client/models/ExampleFiles.js.map +1 -0
  148. package/build/bitbucket-client/models/ExampleJsonLastModifiedCallback.d.ts +2 -0
  149. package/build/bitbucket-client/models/ExampleJsonLastModifiedCallback.d.ts.map +1 -0
  150. package/build/bitbucket-client/models/ExampleJsonLastModifiedCallback.js +2 -0
  151. package/build/bitbucket-client/models/ExampleJsonLastModifiedCallback.js.map +1 -0
  152. package/build/bitbucket-client/models/ExampleMultipartFormData.d.ts +23 -0
  153. package/build/bitbucket-client/models/ExampleMultipartFormData.d.ts.map +1 -0
  154. package/build/bitbucket-client/models/ExampleMultipartFormData.js +2 -0
  155. package/build/bitbucket-client/models/ExampleMultipartFormData.js.map +1 -0
  156. package/build/bitbucket-client/models/ExamplePostMultipartFormData.d.ts +19 -0
  157. package/build/bitbucket-client/models/ExamplePostMultipartFormData.d.ts.map +1 -0
  158. package/build/bitbucket-client/models/ExamplePostMultipartFormData.js +2 -0
  159. package/build/bitbucket-client/models/ExamplePostMultipartFormData.js.map +1 -0
  160. package/build/bitbucket-client/models/ExamplePreviewMigration.d.ts +2 -0
  161. package/build/bitbucket-client/models/ExamplePreviewMigration.d.ts.map +1 -0
  162. package/build/bitbucket-client/models/ExamplePreviewMigration.js +2 -0
  163. package/build/bitbucket-client/models/ExamplePreviewMigration.js.map +1 -0
  164. package/build/bitbucket-client/models/ExamplePutMultipartFormData.d.ts +15 -0
  165. package/build/bitbucket-client/models/ExamplePutMultipartFormData.d.ts.map +1 -0
  166. package/build/bitbucket-client/models/ExamplePutMultipartFormData.js +2 -0
  167. package/build/bitbucket-client/models/ExamplePutMultipartFormData.js.map +1 -0
  168. package/build/bitbucket-client/models/ExampleRequirements.d.ts +2 -0
  169. package/build/bitbucket-client/models/ExampleRequirements.d.ts.map +1 -0
  170. package/build/bitbucket-client/models/ExampleRequirements.js +2 -0
  171. package/build/bitbucket-client/models/ExampleRequirements.js.map +1 -0
  172. package/build/bitbucket-client/models/ExampleSettings.d.ts +2 -0
  173. package/build/bitbucket-client/models/ExampleSettings.d.ts.map +1 -0
  174. package/build/bitbucket-client/models/ExampleSettings.js +2 -0
  175. package/build/bitbucket-client/models/ExampleSettings.js.map +1 -0
  176. package/build/bitbucket-client/models/ExampleSettingsMap.d.ts +2 -0
  177. package/build/bitbucket-client/models/ExampleSettingsMap.d.ts.map +1 -0
  178. package/build/bitbucket-client/models/ExampleSettingsMap.js +2 -0
  179. package/build/bitbucket-client/models/ExampleSettingsMap.js.map +1 -0
  180. package/build/bitbucket-client/models/ExampleSocketAddress.d.ts +2 -0
  181. package/build/bitbucket-client/models/ExampleSocketAddress.d.ts.map +1 -0
  182. package/build/bitbucket-client/models/ExampleSocketAddress.js +2 -0
  183. package/build/bitbucket-client/models/ExampleSocketAddress.js.map +1 -0
  184. package/build/bitbucket-client/models/ExampleStatus.d.ts +2 -0
  185. package/build/bitbucket-client/models/ExampleStatus.d.ts.map +1 -0
  186. package/build/bitbucket-client/models/ExampleStatus.js +2 -0
  187. package/build/bitbucket-client/models/ExampleStatus.js.map +1 -0
  188. package/build/bitbucket-client/models/FileListResource.d.ts +2 -0
  189. package/build/bitbucket-client/models/FileListResource.d.ts.map +1 -0
  190. package/build/bitbucket-client/models/FileListResource.js +2 -0
  191. package/build/bitbucket-client/models/FileListResource.js.map +1 -0
  192. package/build/bitbucket-client/models/FilePart.d.ts +9 -0
  193. package/build/bitbucket-client/models/FilePart.d.ts.map +1 -0
  194. package/build/bitbucket-client/models/FilePart.js +2 -0
  195. package/build/bitbucket-client/models/FilePart.js.map +1 -0
  196. package/build/bitbucket-client/models/Group.d.ts +2 -0
  197. package/build/bitbucket-client/models/Group.d.ts.map +1 -0
  198. package/build/bitbucket-client/models/Group.js +2 -0
  199. package/build/bitbucket-client/models/Group.js.map +1 -0
  200. package/build/bitbucket-client/models/GroupAndUsers.d.ts +5 -0
  201. package/build/bitbucket-client/models/GroupAndUsers.d.ts.map +1 -0
  202. package/build/bitbucket-client/models/GroupAndUsers.js +2 -0
  203. package/build/bitbucket-client/models/GroupAndUsers.js.map +1 -0
  204. package/build/bitbucket-client/models/GroupPickerContext.d.ts +5 -0
  205. package/build/bitbucket-client/models/GroupPickerContext.d.ts.map +1 -0
  206. package/build/bitbucket-client/models/GroupPickerContext.js +2 -0
  207. package/build/bitbucket-client/models/GroupPickerContext.js.map +1 -0
  208. package/build/bitbucket-client/models/IdpConfigEntity.d.ts +2 -0
  209. package/build/bitbucket-client/models/IdpConfigEntity.d.ts.map +1 -0
  210. package/build/bitbucket-client/models/IdpConfigEntity.js +2 -0
  211. package/build/bitbucket-client/models/IdpConfigEntity.js.map +1 -0
  212. package/build/bitbucket-client/models/JitConfigEntity.d.ts +2 -0
  213. package/build/bitbucket-client/models/JitConfigEntity.d.ts.map +1 -0
  214. package/build/bitbucket-client/models/JitConfigEntity.js +2 -0
  215. package/build/bitbucket-client/models/JitConfigEntity.js.map +1 -0
  216. package/build/bitbucket-client/models/JitUserEntity.d.ts +2 -0
  217. package/build/bitbucket-client/models/JitUserEntity.d.ts.map +1 -0
  218. package/build/bitbucket-client/models/JitUserEntity.js +2 -0
  219. package/build/bitbucket-client/models/JitUserEntity.js.map +1 -0
  220. package/build/bitbucket-client/models/LineNumberRange.d.ts +6 -0
  221. package/build/bitbucket-client/models/LineNumberRange.d.ts.map +1 -0
  222. package/build/bitbucket-client/models/LineNumberRange.js +2 -0
  223. package/build/bitbucket-client/models/LineNumberRange.js.map +1 -0
  224. package/build/bitbucket-client/models/LoginOptionEntity.d.ts +2 -0
  225. package/build/bitbucket-client/models/LoginOptionEntity.d.ts.map +1 -0
  226. package/build/bitbucket-client/models/LoginOptionEntity.js +2 -0
  227. package/build/bitbucket-client/models/LoginOptionEntity.js.map +1 -0
  228. package/build/bitbucket-client/models/MethodStateDTO.d.ts +2 -0
  229. package/build/bitbucket-client/models/MethodStateDTO.d.ts.map +1 -0
  230. package/build/bitbucket-client/models/MethodStateDTO.js +2 -0
  231. package/build/bitbucket-client/models/MethodStateDTO.js.map +1 -0
  232. package/build/bitbucket-client/models/NextLoginStepDTO.d.ts +2 -0
  233. package/build/bitbucket-client/models/NextLoginStepDTO.d.ts.map +1 -0
  234. package/build/bitbucket-client/models/NextLoginStepDTO.js +2 -0
  235. package/build/bitbucket-client/models/NextLoginStepDTO.js.map +1 -0
  236. package/build/bitbucket-client/models/OptionalBodyBeanParam.d.ts +2 -0
  237. package/build/bitbucket-client/models/OptionalBodyBeanParam.d.ts.map +1 -0
  238. package/build/bitbucket-client/models/OptionalBodyBeanParam.js +2 -0
  239. package/build/bitbucket-client/models/OptionalBodyBeanParam.js.map +1 -0
  240. package/build/bitbucket-client/models/PageRequestImpl.d.ts +5 -0
  241. package/build/bitbucket-client/models/PageRequestImpl.d.ts.map +1 -0
  242. package/build/bitbucket-client/models/PageRequestImpl.js +2 -0
  243. package/build/bitbucket-client/models/PageRequestImpl.js.map +1 -0
  244. package/build/bitbucket-client/models/PasswordElevationRestDTO.d.ts +4 -0
  245. package/build/bitbucket-client/models/PasswordElevationRestDTO.d.ts.map +1 -0
  246. package/build/bitbucket-client/models/PasswordElevationRestDTO.js +2 -0
  247. package/build/bitbucket-client/models/PasswordElevationRestDTO.js.map +1 -0
  248. package/build/bitbucket-client/models/Project.d.ts +15 -0
  249. package/build/bitbucket-client/models/Project.d.ts.map +1 -0
  250. package/build/bitbucket-client/models/Project.js +9 -0
  251. package/build/bitbucket-client/models/Project.js.map +1 -0
  252. package/build/bitbucket-client/models/PropertyMap.d.ts +2 -0
  253. package/build/bitbucket-client/models/PropertyMap.d.ts.map +1 -0
  254. package/build/bitbucket-client/models/PropertyMap.js +2 -0
  255. package/build/bitbucket-client/models/PropertyMap.js.map +1 -0
  256. package/build/bitbucket-client/models/PullRequest.d.ts +31 -0
  257. package/build/bitbucket-client/models/PullRequest.d.ts.map +1 -0
  258. package/build/bitbucket-client/models/PullRequest.js +10 -0
  259. package/build/bitbucket-client/models/PullRequest.js.map +1 -0
  260. package/build/bitbucket-client/models/PullRequestParticipant.d.ts +23 -0
  261. package/build/bitbucket-client/models/PullRequestParticipant.d.ts.map +1 -0
  262. package/build/bitbucket-client/models/PullRequestParticipant.js +16 -0
  263. package/build/bitbucket-client/models/PullRequestParticipant.js.map +1 -0
  264. package/build/bitbucket-client/models/PullRequestRef.d.ts +10 -0
  265. package/build/bitbucket-client/models/PullRequestRef.d.ts.map +1 -0
  266. package/build/bitbucket-client/models/PullRequestRef.js +2 -0
  267. package/build/bitbucket-client/models/PullRequestRef.js.map +1 -0
  268. package/build/bitbucket-client/models/RefType.d.ts +2 -0
  269. package/build/bitbucket-client/models/RefType.d.ts.map +1 -0
  270. package/build/bitbucket-client/models/RefType.js +2 -0
  271. package/build/bitbucket-client/models/RefType.js.map +1 -0
  272. package/build/bitbucket-client/models/Repository.d.ts +31 -0
  273. package/build/bitbucket-client/models/Repository.d.ts.map +1 -0
  274. package/build/bitbucket-client/models/Repository.js +11 -0
  275. package/build/bitbucket-client/models/Repository.js.map +1 -0
  276. package/build/bitbucket-client/models/RepositoryHookDetails.d.ts +2 -0
  277. package/build/bitbucket-client/models/RepositoryHookDetails.d.ts.map +1 -0
  278. package/build/bitbucket-client/models/RepositoryHookDetails.js +2 -0
  279. package/build/bitbucket-client/models/RepositoryHookDetails.js.map +1 -0
  280. package/build/bitbucket-client/models/RestAccessToken.d.ts +2 -0
  281. package/build/bitbucket-client/models/RestAccessToken.d.ts.map +1 -0
  282. package/build/bitbucket-client/models/RestAccessToken.js +2 -0
  283. package/build/bitbucket-client/models/RestAccessToken.js.map +1 -0
  284. package/build/bitbucket-client/models/RestAccessTokenRequest.d.ts +6 -0
  285. package/build/bitbucket-client/models/RestAccessTokenRequest.d.ts.map +1 -0
  286. package/build/bitbucket-client/models/RestAccessTokenRequest.js +2 -0
  287. package/build/bitbucket-client/models/RestAccessTokenRequest.js.map +1 -0
  288. package/build/bitbucket-client/models/RestAggregateRejectCounter.d.ts +2 -0
  289. package/build/bitbucket-client/models/RestAggregateRejectCounter.d.ts.map +1 -0
  290. package/build/bitbucket-client/models/RestAggregateRejectCounter.js +2 -0
  291. package/build/bitbucket-client/models/RestAggregateRejectCounter.js.map +1 -0
  292. package/build/bitbucket-client/models/RestAnalyticsSettings.d.ts +2 -0
  293. package/build/bitbucket-client/models/RestAnalyticsSettings.d.ts.map +1 -0
  294. package/build/bitbucket-client/models/RestAnalyticsSettings.js +2 -0
  295. package/build/bitbucket-client/models/RestAnalyticsSettings.js.map +1 -0
  296. package/build/bitbucket-client/models/RestAnnouncementBanner.d.ts +2 -0
  297. package/build/bitbucket-client/models/RestAnnouncementBanner.d.ts.map +1 -0
  298. package/build/bitbucket-client/models/RestAnnouncementBanner.js +2 -0
  299. package/build/bitbucket-client/models/RestAnnouncementBanner.js.map +1 -0
  300. package/build/bitbucket-client/models/RestApplicationProperties.d.ts +2 -0
  301. package/build/bitbucket-client/models/RestApplicationProperties.d.ts.map +1 -0
  302. package/build/bitbucket-client/models/RestApplicationProperties.js +2 -0
  303. package/build/bitbucket-client/models/RestApplicationProperties.js.map +1 -0
  304. package/build/bitbucket-client/models/RestApplicationUser.d.ts +2 -0
  305. package/build/bitbucket-client/models/RestApplicationUser.d.ts.map +1 -0
  306. package/build/bitbucket-client/models/RestApplicationUser.js +2 -0
  307. package/build/bitbucket-client/models/RestApplicationUser.js.map +1 -0
  308. package/build/bitbucket-client/models/RestApplicationUserWithPermissions.d.ts +2 -0
  309. package/build/bitbucket-client/models/RestApplicationUserWithPermissions.d.ts.map +1 -0
  310. package/build/bitbucket-client/models/RestApplicationUserWithPermissions.js +2 -0
  311. package/build/bitbucket-client/models/RestApplicationUserWithPermissions.js.map +1 -0
  312. package/build/bitbucket-client/models/RestApplySuggestionRequest.d.ts +7 -0
  313. package/build/bitbucket-client/models/RestApplySuggestionRequest.d.ts.map +1 -0
  314. package/build/bitbucket-client/models/RestApplySuggestionRequest.js +2 -0
  315. package/build/bitbucket-client/models/RestApplySuggestionRequest.js.map +1 -0
  316. package/build/bitbucket-client/models/RestAttachmentMetadata.d.ts +2 -0
  317. package/build/bitbucket-client/models/RestAttachmentMetadata.d.ts.map +1 -0
  318. package/build/bitbucket-client/models/RestAttachmentMetadata.js +2 -0
  319. package/build/bitbucket-client/models/RestAttachmentMetadata.js.map +1 -0
  320. package/build/bitbucket-client/models/RestAuthenticationRequest.d.ts +6 -0
  321. package/build/bitbucket-client/models/RestAuthenticationRequest.d.ts.map +1 -0
  322. package/build/bitbucket-client/models/RestAuthenticationRequest.js +2 -0
  323. package/build/bitbucket-client/models/RestAuthenticationRequest.js.map +1 -0
  324. package/build/bitbucket-client/models/RestAutoDeclineSettings.d.ts +2 -0
  325. package/build/bitbucket-client/models/RestAutoDeclineSettings.d.ts.map +1 -0
  326. package/build/bitbucket-client/models/RestAutoDeclineSettings.js +2 -0
  327. package/build/bitbucket-client/models/RestAutoDeclineSettings.js.map +1 -0
  328. package/build/bitbucket-client/models/RestAutoDeclineSettingsRequest.d.ts +5 -0
  329. package/build/bitbucket-client/models/RestAutoDeclineSettingsRequest.d.ts.map +1 -0
  330. package/build/bitbucket-client/models/RestAutoDeclineSettingsRequest.js +2 -0
  331. package/build/bitbucket-client/models/RestAutoDeclineSettingsRequest.js.map +1 -0
  332. package/build/bitbucket-client/models/RestAutoMergeProcessingResult.d.ts +2 -0
  333. package/build/bitbucket-client/models/RestAutoMergeProcessingResult.d.ts.map +1 -0
  334. package/build/bitbucket-client/models/RestAutoMergeProcessingResult.js +2 -0
  335. package/build/bitbucket-client/models/RestAutoMergeProcessingResult.js.map +1 -0
  336. package/build/bitbucket-client/models/RestAutoMergeProjectSettingsRequest.d.ts +12 -0
  337. package/build/bitbucket-client/models/RestAutoMergeProjectSettingsRequest.d.ts.map +1 -0
  338. package/build/bitbucket-client/models/RestAutoMergeProjectSettingsRequest.js +10 -0
  339. package/build/bitbucket-client/models/RestAutoMergeProjectSettingsRequest.js.map +1 -0
  340. package/build/bitbucket-client/models/RestAutoMergeRequest.d.ts +2 -0
  341. package/build/bitbucket-client/models/RestAutoMergeRequest.d.ts.map +1 -0
  342. package/build/bitbucket-client/models/RestAutoMergeRequest.js +2 -0
  343. package/build/bitbucket-client/models/RestAutoMergeRequest.js.map +1 -0
  344. package/build/bitbucket-client/models/RestAutoMergeRestrictedSettings.d.ts +2 -0
  345. package/build/bitbucket-client/models/RestAutoMergeRestrictedSettings.d.ts.map +1 -0
  346. package/build/bitbucket-client/models/RestAutoMergeRestrictedSettings.js +2 -0
  347. package/build/bitbucket-client/models/RestAutoMergeRestrictedSettings.js.map +1 -0
  348. package/build/bitbucket-client/models/RestAutoMergeSettingsRequest.d.ts +4 -0
  349. package/build/bitbucket-client/models/RestAutoMergeSettingsRequest.d.ts.map +1 -0
  350. package/build/bitbucket-client/models/RestAutoMergeSettingsRequest.js +2 -0
  351. package/build/bitbucket-client/models/RestAutoMergeSettingsRequest.js.map +1 -0
  352. package/build/bitbucket-client/models/RestBearerTokenCredentials.d.ts +4 -0
  353. package/build/bitbucket-client/models/RestBearerTokenCredentials.d.ts.map +1 -0
  354. package/build/bitbucket-client/models/RestBearerTokenCredentials.js +2 -0
  355. package/build/bitbucket-client/models/RestBearerTokenCredentials.js.map +1 -0
  356. package/build/bitbucket-client/models/RestBitbucketLicense.d.ts +2 -0
  357. package/build/bitbucket-client/models/RestBitbucketLicense.d.ts.map +1 -0
  358. package/build/bitbucket-client/models/RestBitbucketLicense.js +2 -0
  359. package/build/bitbucket-client/models/RestBitbucketLicense.js.map +1 -0
  360. package/build/bitbucket-client/models/RestBranch.d.ts +2 -0
  361. package/build/bitbucket-client/models/RestBranch.d.ts.map +1 -0
  362. package/build/bitbucket-client/models/RestBranch.js +2 -0
  363. package/build/bitbucket-client/models/RestBranch.js.map +1 -0
  364. package/build/bitbucket-client/models/RestBranchCreateRequest.d.ts +11 -0
  365. package/build/bitbucket-client/models/RestBranchCreateRequest.d.ts.map +1 -0
  366. package/build/bitbucket-client/models/RestBranchCreateRequest.js +2 -0
  367. package/build/bitbucket-client/models/RestBranchCreateRequest.js.map +1 -0
  368. package/build/bitbucket-client/models/RestBranchDeleteRequest.d.ts +15 -0
  369. package/build/bitbucket-client/models/RestBranchDeleteRequest.d.ts.map +1 -0
  370. package/build/bitbucket-client/models/RestBranchDeleteRequest.js +2 -0
  371. package/build/bitbucket-client/models/RestBranchDeleteRequest.js.map +1 -0
  372. package/build/bitbucket-client/models/RestBuildCapabilities.d.ts +2 -0
  373. package/build/bitbucket-client/models/RestBuildCapabilities.d.ts.map +1 -0
  374. package/build/bitbucket-client/models/RestBuildCapabilities.js +2 -0
  375. package/build/bitbucket-client/models/RestBuildCapabilities.js.map +1 -0
  376. package/build/bitbucket-client/models/RestBuildStats.d.ts +2 -0
  377. package/build/bitbucket-client/models/RestBuildStats.d.ts.map +1 -0
  378. package/build/bitbucket-client/models/RestBuildStats.js +2 -0
  379. package/build/bitbucket-client/models/RestBuildStats.js.map +1 -0
  380. package/build/bitbucket-client/models/RestBuildStatus.d.ts +2 -0
  381. package/build/bitbucket-client/models/RestBuildStatus.d.ts.map +1 -0
  382. package/build/bitbucket-client/models/RestBuildStatus.js +2 -0
  383. package/build/bitbucket-client/models/RestBuildStatus.js.map +1 -0
  384. package/build/bitbucket-client/models/RestBuildStatusSetRequest.d.ts +27 -0
  385. package/build/bitbucket-client/models/RestBuildStatusSetRequest.d.ts.map +1 -0
  386. package/build/bitbucket-client/models/RestBuildStatusSetRequest.js +12 -0
  387. package/build/bitbucket-client/models/RestBuildStatusSetRequest.js.map +1 -0
  388. package/build/bitbucket-client/models/RestBulkAddInsightAnnotationRequest.d.ts +5 -0
  389. package/build/bitbucket-client/models/RestBulkAddInsightAnnotationRequest.d.ts.map +1 -0
  390. package/build/bitbucket-client/models/RestBulkAddInsightAnnotationRequest.js +2 -0
  391. package/build/bitbucket-client/models/RestBulkAddInsightAnnotationRequest.js.map +1 -0
  392. package/build/bitbucket-client/models/RestBulkUserRateLimitSettingsUpdateRequest.d.ts +9 -0
  393. package/build/bitbucket-client/models/RestBulkUserRateLimitSettingsUpdateRequest.d.ts.map +1 -0
  394. package/build/bitbucket-client/models/RestBulkUserRateLimitSettingsUpdateRequest.js +2 -0
  395. package/build/bitbucket-client/models/RestBulkUserRateLimitSettingsUpdateRequest.js.map +1 -0
  396. package/build/bitbucket-client/models/RestChange.d.ts +2 -0
  397. package/build/bitbucket-client/models/RestChange.d.ts.map +1 -0
  398. package/build/bitbucket-client/models/RestChange.js +2 -0
  399. package/build/bitbucket-client/models/RestChange.js.map +1 -0
  400. package/build/bitbucket-client/models/RestChangeset.d.ts +2 -0
  401. package/build/bitbucket-client/models/RestChangeset.d.ts.map +1 -0
  402. package/build/bitbucket-client/models/RestChangeset.js +2 -0
  403. package/build/bitbucket-client/models/RestChangeset.js.map +1 -0
  404. package/build/bitbucket-client/models/RestClusterInformation.d.ts +2 -0
  405. package/build/bitbucket-client/models/RestClusterInformation.d.ts.map +1 -0
  406. package/build/bitbucket-client/models/RestClusterInformation.js +2 -0
  407. package/build/bitbucket-client/models/RestClusterInformation.js.map +1 -0
  408. package/build/bitbucket-client/models/RestClusterNode.d.ts +2 -0
  409. package/build/bitbucket-client/models/RestClusterNode.d.ts.map +1 -0
  410. package/build/bitbucket-client/models/RestClusterNode.js +2 -0
  411. package/build/bitbucket-client/models/RestClusterNode.js.map +1 -0
  412. package/build/bitbucket-client/models/RestComment.d.ts +2 -0
  413. package/build/bitbucket-client/models/RestComment.d.ts.map +1 -0
  414. package/build/bitbucket-client/models/RestComment.js +2 -0
  415. package/build/bitbucket-client/models/RestComment.js.map +1 -0
  416. package/build/bitbucket-client/models/RestCommentJiraIssue.d.ts +2 -0
  417. package/build/bitbucket-client/models/RestCommentJiraIssue.d.ts.map +1 -0
  418. package/build/bitbucket-client/models/RestCommentJiraIssue.js +2 -0
  419. package/build/bitbucket-client/models/RestCommentJiraIssue.js.map +1 -0
  420. package/build/bitbucket-client/models/RestCommentThreadDiffAnchor.d.ts +2 -0
  421. package/build/bitbucket-client/models/RestCommentThreadDiffAnchor.d.ts.map +1 -0
  422. package/build/bitbucket-client/models/RestCommentThreadDiffAnchor.js +2 -0
  423. package/build/bitbucket-client/models/RestCommentThreadDiffAnchor.js.map +1 -0
  424. package/build/bitbucket-client/models/RestCommit.d.ts +2 -0
  425. package/build/bitbucket-client/models/RestCommit.d.ts.map +1 -0
  426. package/build/bitbucket-client/models/RestCommit.js +2 -0
  427. package/build/bitbucket-client/models/RestCommit.js.map +1 -0
  428. package/build/bitbucket-client/models/RestCommitMessageSuggestion.d.ts +2 -0
  429. package/build/bitbucket-client/models/RestCommitMessageSuggestion.d.ts.map +1 -0
  430. package/build/bitbucket-client/models/RestCommitMessageSuggestion.js +2 -0
  431. package/build/bitbucket-client/models/RestCommitMessageSuggestion.js.map +1 -0
  432. package/build/bitbucket-client/models/RestConflict.d.ts +2 -0
  433. package/build/bitbucket-client/models/RestConflict.d.ts.map +1 -0
  434. package/build/bitbucket-client/models/RestConflict.js +2 -0
  435. package/build/bitbucket-client/models/RestConflict.js.map +1 -0
  436. package/build/bitbucket-client/models/RestConflictChange.d.ts +2 -0
  437. package/build/bitbucket-client/models/RestConflictChange.d.ts.map +1 -0
  438. package/build/bitbucket-client/models/RestConflictChange.js +2 -0
  439. package/build/bitbucket-client/models/RestConflictChange.js.map +1 -0
  440. package/build/bitbucket-client/models/RestConnectivitySummary.d.ts +2 -0
  441. package/build/bitbucket-client/models/RestConnectivitySummary.d.ts.map +1 -0
  442. package/build/bitbucket-client/models/RestConnectivitySummary.js +2 -0
  443. package/build/bitbucket-client/models/RestConnectivitySummary.js.map +1 -0
  444. package/build/bitbucket-client/models/RestCreateBranchRequest.d.ts +6 -0
  445. package/build/bitbucket-client/models/RestCreateBranchRequest.d.ts.map +1 -0
  446. package/build/bitbucket-client/models/RestCreateBranchRequest.js +2 -0
  447. package/build/bitbucket-client/models/RestCreateBranchRequest.js.map +1 -0
  448. package/build/bitbucket-client/models/RestCreateTagRequest.d.ts +6 -0
  449. package/build/bitbucket-client/models/RestCreateTagRequest.d.ts.map +1 -0
  450. package/build/bitbucket-client/models/RestCreateTagRequest.js +2 -0
  451. package/build/bitbucket-client/models/RestCreateTagRequest.js.map +1 -0
  452. package/build/bitbucket-client/models/RestDefaultBranch.d.ts +4 -0
  453. package/build/bitbucket-client/models/RestDefaultBranch.d.ts.map +1 -0
  454. package/build/bitbucket-client/models/RestDefaultBranch.js +2 -0
  455. package/build/bitbucket-client/models/RestDefaultBranch.js.map +1 -0
  456. package/build/bitbucket-client/models/RestDefaultReviewersRequest.d.ts +33 -0
  457. package/build/bitbucket-client/models/RestDefaultReviewersRequest.d.ts.map +1 -0
  458. package/build/bitbucket-client/models/RestDefaultReviewersRequest.js +12 -0
  459. package/build/bitbucket-client/models/RestDefaultReviewersRequest.js.map +1 -0
  460. package/build/bitbucket-client/models/RestDefaultTask.d.ts +2 -0
  461. package/build/bitbucket-client/models/RestDefaultTask.d.ts.map +1 -0
  462. package/build/bitbucket-client/models/RestDefaultTask.js +2 -0
  463. package/build/bitbucket-client/models/RestDefaultTask.js.map +1 -0
  464. package/build/bitbucket-client/models/RestDefaultTaskRequest.d.ts +29 -0
  465. package/build/bitbucket-client/models/RestDefaultTaskRequest.d.ts.map +1 -0
  466. package/build/bitbucket-client/models/RestDefaultTaskRequest.js +12 -0
  467. package/build/bitbucket-client/models/RestDefaultTaskRequest.js.map +1 -0
  468. package/build/bitbucket-client/models/RestDelayedSyncRepository.d.ts +6 -0
  469. package/build/bitbucket-client/models/RestDelayedSyncRepository.d.ts.map +1 -0
  470. package/build/bitbucket-client/models/RestDelayedSyncRepository.js +2 -0
  471. package/build/bitbucket-client/models/RestDelayedSyncRepository.js.map +1 -0
  472. package/build/bitbucket-client/models/RestDeployment.d.ts +2 -0
  473. package/build/bitbucket-client/models/RestDeployment.d.ts.map +1 -0
  474. package/build/bitbucket-client/models/RestDeployment.js +2 -0
  475. package/build/bitbucket-client/models/RestDeployment.js.map +1 -0
  476. package/build/bitbucket-client/models/RestDeploymentEnvironment.d.ts +2 -0
  477. package/build/bitbucket-client/models/RestDeploymentEnvironment.d.ts.map +1 -0
  478. package/build/bitbucket-client/models/RestDeploymentEnvironment.js +2 -0
  479. package/build/bitbucket-client/models/RestDeploymentEnvironment.js.map +1 -0
  480. package/build/bitbucket-client/models/RestDeploymentSetRequest.d.ts +23 -0
  481. package/build/bitbucket-client/models/RestDeploymentSetRequest.d.ts.map +1 -0
  482. package/build/bitbucket-client/models/RestDeploymentSetRequest.js +14 -0
  483. package/build/bitbucket-client/models/RestDeploymentSetRequest.js.map +1 -0
  484. package/build/bitbucket-client/models/RestDetailedGroup.d.ts +2 -0
  485. package/build/bitbucket-client/models/RestDetailedGroup.d.ts.map +1 -0
  486. package/build/bitbucket-client/models/RestDetailedGroup.js +2 -0
  487. package/build/bitbucket-client/models/RestDetailedGroup.js.map +1 -0
  488. package/build/bitbucket-client/models/RestDetailedInvocation.d.ts +2 -0
  489. package/build/bitbucket-client/models/RestDetailedInvocation.d.ts.map +1 -0
  490. package/build/bitbucket-client/models/RestDetailedInvocation.js +2 -0
  491. package/build/bitbucket-client/models/RestDetailedInvocation.js.map +1 -0
  492. package/build/bitbucket-client/models/RestDetailedUser.d.ts +2 -0
  493. package/build/bitbucket-client/models/RestDetailedUser.d.ts.map +1 -0
  494. package/build/bitbucket-client/models/RestDetailedUser.js +2 -0
  495. package/build/bitbucket-client/models/RestDetailedUser.js.map +1 -0
  496. package/build/bitbucket-client/models/RestDiff.d.ts +2 -0
  497. package/build/bitbucket-client/models/RestDiff.d.ts.map +1 -0
  498. package/build/bitbucket-client/models/RestDiff.js +2 -0
  499. package/build/bitbucket-client/models/RestDiff.js.map +1 -0
  500. package/build/bitbucket-client/models/RestDiffHunk.d.ts +2 -0
  501. package/build/bitbucket-client/models/RestDiffHunk.d.ts.map +1 -0
  502. package/build/bitbucket-client/models/RestDiffHunk.js +2 -0
  503. package/build/bitbucket-client/models/RestDiffHunk.js.map +1 -0
  504. package/build/bitbucket-client/models/RestDiffLine.d.ts +2 -0
  505. package/build/bitbucket-client/models/RestDiffLine.d.ts.map +1 -0
  506. package/build/bitbucket-client/models/RestDiffLine.js +2 -0
  507. package/build/bitbucket-client/models/RestDiffLine.js.map +1 -0
  508. package/build/bitbucket-client/models/RestDiffSegment.d.ts +2 -0
  509. package/build/bitbucket-client/models/RestDiffSegment.d.ts.map +1 -0
  510. package/build/bitbucket-client/models/RestDiffSegment.js +2 -0
  511. package/build/bitbucket-client/models/RestDiffSegment.js.map +1 -0
  512. package/build/bitbucket-client/models/RestDiffStatsSummary.d.ts +2 -0
  513. package/build/bitbucket-client/models/RestDiffStatsSummary.d.ts.map +1 -0
  514. package/build/bitbucket-client/models/RestDiffStatsSummary.js +2 -0
  515. package/build/bitbucket-client/models/RestDiffStatsSummary.js.map +1 -0
  516. package/build/bitbucket-client/models/RestEmoticon.d.ts +2 -0
  517. package/build/bitbucket-client/models/RestEmoticon.d.ts.map +1 -0
  518. package/build/bitbucket-client/models/RestEmoticon.js +2 -0
  519. package/build/bitbucket-client/models/RestEmoticon.js.map +1 -0
  520. package/build/bitbucket-client/models/RestEnhancedEntityLink.d.ts +2 -0
  521. package/build/bitbucket-client/models/RestEnhancedEntityLink.d.ts.map +1 -0
  522. package/build/bitbucket-client/models/RestEnhancedEntityLink.js +2 -0
  523. package/build/bitbucket-client/models/RestEnhancedEntityLink.js.map +1 -0
  524. package/build/bitbucket-client/models/RestErasedUser.d.ts +2 -0
  525. package/build/bitbucket-client/models/RestErasedUser.d.ts.map +1 -0
  526. package/build/bitbucket-client/models/RestErasedUser.js +2 -0
  527. package/build/bitbucket-client/models/RestErasedUser.js.map +1 -0
  528. package/build/bitbucket-client/models/RestErrorMessage.d.ts +2 -0
  529. package/build/bitbucket-client/models/RestErrorMessage.d.ts.map +1 -0
  530. package/build/bitbucket-client/models/RestErrorMessage.js +2 -0
  531. package/build/bitbucket-client/models/RestErrorMessage.js.map +1 -0
  532. package/build/bitbucket-client/models/RestErrors.d.ts +2 -0
  533. package/build/bitbucket-client/models/RestErrors.d.ts.map +1 -0
  534. package/build/bitbucket-client/models/RestErrors.js +2 -0
  535. package/build/bitbucket-client/models/RestErrors.js.map +1 -0
  536. package/build/bitbucket-client/models/RestExportRequest.d.ts +8 -0
  537. package/build/bitbucket-client/models/RestExportRequest.d.ts.map +1 -0
  538. package/build/bitbucket-client/models/RestExportRequest.js +2 -0
  539. package/build/bitbucket-client/models/RestExportRequest.js.map +1 -0
  540. package/build/bitbucket-client/models/RestFarmSynchronizationRequest.d.ts +13 -0
  541. package/build/bitbucket-client/models/RestFarmSynchronizationRequest.d.ts.map +1 -0
  542. package/build/bitbucket-client/models/RestFarmSynchronizationRequest.js +9 -0
  543. package/build/bitbucket-client/models/RestFarmSynchronizationRequest.js.map +1 -0
  544. package/build/bitbucket-client/models/RestGitTagCreateRequest.d.ts +14 -0
  545. package/build/bitbucket-client/models/RestGitTagCreateRequest.d.ts.map +1 -0
  546. package/build/bitbucket-client/models/RestGitTagCreateRequest.js +9 -0
  547. package/build/bitbucket-client/models/RestGitTagCreateRequest.js.map +1 -0
  548. package/build/bitbucket-client/models/RestGpgKey.d.ts +2 -0
  549. package/build/bitbucket-client/models/RestGpgKey.d.ts.map +1 -0
  550. package/build/bitbucket-client/models/RestGpgKey.js +2 -0
  551. package/build/bitbucket-client/models/RestGpgKey.js.map +1 -0
  552. package/build/bitbucket-client/models/RestGpgSubKey.d.ts +2 -0
  553. package/build/bitbucket-client/models/RestGpgSubKey.d.ts.map +1 -0
  554. package/build/bitbucket-client/models/RestGpgSubKey.js +2 -0
  555. package/build/bitbucket-client/models/RestGpgSubKey.js.map +1 -0
  556. package/build/bitbucket-client/models/RestHookScript.d.ts +2 -0
  557. package/build/bitbucket-client/models/RestHookScript.d.ts.map +1 -0
  558. package/build/bitbucket-client/models/RestHookScript.js +2 -0
  559. package/build/bitbucket-client/models/RestHookScript.js.map +1 -0
  560. package/build/bitbucket-client/models/RestHookScriptConfig.d.ts +2 -0
  561. package/build/bitbucket-client/models/RestHookScriptConfig.d.ts.map +1 -0
  562. package/build/bitbucket-client/models/RestHookScriptConfig.js +2 -0
  563. package/build/bitbucket-client/models/RestHookScriptConfig.js.map +1 -0
  564. package/build/bitbucket-client/models/RestHookScriptTriggers.d.ts +4 -0
  565. package/build/bitbucket-client/models/RestHookScriptTriggers.d.ts.map +1 -0
  566. package/build/bitbucket-client/models/RestHookScriptTriggers.js +2 -0
  567. package/build/bitbucket-client/models/RestHookScriptTriggers.js.map +1 -0
  568. package/build/bitbucket-client/models/RestImportRequest.d.ts +4 -0
  569. package/build/bitbucket-client/models/RestImportRequest.d.ts.map +1 -0
  570. package/build/bitbucket-client/models/RestImportRequest.js +2 -0
  571. package/build/bitbucket-client/models/RestImportRequest.js.map +1 -0
  572. package/build/bitbucket-client/models/RestInsightAnnotation.d.ts +2 -0
  573. package/build/bitbucket-client/models/RestInsightAnnotation.d.ts.map +1 -0
  574. package/build/bitbucket-client/models/RestInsightAnnotation.js +2 -0
  575. package/build/bitbucket-client/models/RestInsightAnnotation.js.map +1 -0
  576. package/build/bitbucket-client/models/RestInsightAnnotationsResponse.d.ts +2 -0
  577. package/build/bitbucket-client/models/RestInsightAnnotationsResponse.d.ts.map +1 -0
  578. package/build/bitbucket-client/models/RestInsightAnnotationsResponse.js +2 -0
  579. package/build/bitbucket-client/models/RestInsightAnnotationsResponse.js.map +1 -0
  580. package/build/bitbucket-client/models/RestInsightReport.d.ts +2 -0
  581. package/build/bitbucket-client/models/RestInsightReport.d.ts.map +1 -0
  582. package/build/bitbucket-client/models/RestInsightReport.js +2 -0
  583. package/build/bitbucket-client/models/RestInsightReport.js.map +1 -0
  584. package/build/bitbucket-client/models/RestInsightReportData.d.ts +2 -0
  585. package/build/bitbucket-client/models/RestInsightReportData.d.ts.map +1 -0
  586. package/build/bitbucket-client/models/RestInsightReportData.js +2 -0
  587. package/build/bitbucket-client/models/RestInsightReportData.js.map +1 -0
  588. package/build/bitbucket-client/models/RestInvocationHistory.d.ts +2 -0
  589. package/build/bitbucket-client/models/RestInvocationHistory.d.ts.map +1 -0
  590. package/build/bitbucket-client/models/RestInvocationHistory.js +2 -0
  591. package/build/bitbucket-client/models/RestInvocationHistory.js.map +1 -0
  592. package/build/bitbucket-client/models/RestInvocationRequest.d.ts +2 -0
  593. package/build/bitbucket-client/models/RestInvocationRequest.d.ts.map +1 -0
  594. package/build/bitbucket-client/models/RestInvocationRequest.js +2 -0
  595. package/build/bitbucket-client/models/RestInvocationRequest.js.map +1 -0
  596. package/build/bitbucket-client/models/RestInvocationResult.d.ts +2 -0
  597. package/build/bitbucket-client/models/RestInvocationResult.d.ts.map +1 -0
  598. package/build/bitbucket-client/models/RestInvocationResult.js +2 -0
  599. package/build/bitbucket-client/models/RestInvocationResult.js.map +1 -0
  600. package/build/bitbucket-client/models/RestJiraIssue.d.ts +5 -0
  601. package/build/bitbucket-client/models/RestJiraIssue.d.ts.map +1 -0
  602. package/build/bitbucket-client/models/RestJiraIssue.js +2 -0
  603. package/build/bitbucket-client/models/RestJiraIssue.js.map +1 -0
  604. package/build/bitbucket-client/models/RestJob.d.ts +2 -0
  605. package/build/bitbucket-client/models/RestJob.d.ts.map +1 -0
  606. package/build/bitbucket-client/models/RestJob.js +2 -0
  607. package/build/bitbucket-client/models/RestJob.js.map +1 -0
  608. package/build/bitbucket-client/models/RestJobMessage.d.ts +2 -0
  609. package/build/bitbucket-client/models/RestJobMessage.d.ts.map +1 -0
  610. package/build/bitbucket-client/models/RestJobMessage.js +2 -0
  611. package/build/bitbucket-client/models/RestJobMessage.js.map +1 -0
  612. package/build/bitbucket-client/models/RestLabel.d.ts +2 -0
  613. package/build/bitbucket-client/models/RestLabel.d.ts.map +1 -0
  614. package/build/bitbucket-client/models/RestLabel.js +2 -0
  615. package/build/bitbucket-client/models/RestLabel.js.map +1 -0
  616. package/build/bitbucket-client/models/RestLabelable.d.ts +2 -0
  617. package/build/bitbucket-client/models/RestLabelable.d.ts.map +1 -0
  618. package/build/bitbucket-client/models/RestLabelable.js +2 -0
  619. package/build/bitbucket-client/models/RestLabelable.js.map +1 -0
  620. package/build/bitbucket-client/models/RestLogLevel.d.ts +2 -0
  621. package/build/bitbucket-client/models/RestLogLevel.d.ts.map +1 -0
  622. package/build/bitbucket-client/models/RestLogLevel.js +2 -0
  623. package/build/bitbucket-client/models/RestLogLevel.js.map +1 -0
  624. package/build/bitbucket-client/models/RestLoggingSettings.d.ts +2 -0
  625. package/build/bitbucket-client/models/RestLoggingSettings.d.ts.map +1 -0
  626. package/build/bitbucket-client/models/RestLoggingSettings.js +2 -0
  627. package/build/bitbucket-client/models/RestLoggingSettings.js.map +1 -0
  628. package/build/bitbucket-client/models/RestMailConfiguration.d.ts +2 -0
  629. package/build/bitbucket-client/models/RestMailConfiguration.d.ts.map +1 -0
  630. package/build/bitbucket-client/models/RestMailConfiguration.js +2 -0
  631. package/build/bitbucket-client/models/RestMailConfiguration.js.map +1 -0
  632. package/build/bitbucket-client/models/RestMarkup.d.ts +2 -0
  633. package/build/bitbucket-client/models/RestMarkup.d.ts.map +1 -0
  634. package/build/bitbucket-client/models/RestMarkup.js +2 -0
  635. package/build/bitbucket-client/models/RestMarkup.js.map +1 -0
  636. package/build/bitbucket-client/models/RestMeshConnectivityReport.d.ts +2 -0
  637. package/build/bitbucket-client/models/RestMeshConnectivityReport.d.ts.map +1 -0
  638. package/build/bitbucket-client/models/RestMeshConnectivityReport.js +2 -0
  639. package/build/bitbucket-client/models/RestMeshConnectivityReport.js.map +1 -0
  640. package/build/bitbucket-client/models/RestMeshMigrationQueueStateCounts.d.ts +2 -0
  641. package/build/bitbucket-client/models/RestMeshMigrationQueueStateCounts.d.ts.map +1 -0
  642. package/build/bitbucket-client/models/RestMeshMigrationQueueStateCounts.js +2 -0
  643. package/build/bitbucket-client/models/RestMeshMigrationQueueStateCounts.js.map +1 -0
  644. package/build/bitbucket-client/models/RestMeshMigrationRequest.d.ts +10 -0
  645. package/build/bitbucket-client/models/RestMeshMigrationRequest.d.ts.map +1 -0
  646. package/build/bitbucket-client/models/RestMeshMigrationRequest.js +2 -0
  647. package/build/bitbucket-client/models/RestMeshMigrationRequest.js.map +1 -0
  648. package/build/bitbucket-client/models/RestMeshMigrationSummary.d.ts +2 -0
  649. package/build/bitbucket-client/models/RestMeshMigrationSummary.d.ts.map +1 -0
  650. package/build/bitbucket-client/models/RestMeshMigrationSummary.js +2 -0
  651. package/build/bitbucket-client/models/RestMeshMigrationSummary.js.map +1 -0
  652. package/build/bitbucket-client/models/RestMeshNode.d.ts +2 -0
  653. package/build/bitbucket-client/models/RestMeshNode.d.ts.map +1 -0
  654. package/build/bitbucket-client/models/RestMeshNode.js +2 -0
  655. package/build/bitbucket-client/models/RestMeshNode.js.map +1 -0
  656. package/build/bitbucket-client/models/RestMigrationRepository.d.ts +2 -0
  657. package/build/bitbucket-client/models/RestMigrationRepository.d.ts.map +1 -0
  658. package/build/bitbucket-client/models/RestMigrationRepository.js +2 -0
  659. package/build/bitbucket-client/models/RestMigrationRepository.js.map +1 -0
  660. package/build/bitbucket-client/models/RestMinimalCommit.d.ts +2 -0
  661. package/build/bitbucket-client/models/RestMinimalCommit.d.ts.map +1 -0
  662. package/build/bitbucket-client/models/RestMinimalCommit.js +2 -0
  663. package/build/bitbucket-client/models/RestMinimalCommit.js.map +1 -0
  664. package/build/bitbucket-client/models/RestMinimalRef.d.ts +2 -0
  665. package/build/bitbucket-client/models/RestMinimalRef.d.ts.map +1 -0
  666. package/build/bitbucket-client/models/RestMinimalRef.js +2 -0
  667. package/build/bitbucket-client/models/RestMinimalRef.js.map +1 -0
  668. package/build/bitbucket-client/models/RestMirrorHashes.d.ts +2 -0
  669. package/build/bitbucket-client/models/RestMirrorHashes.d.ts.map +1 -0
  670. package/build/bitbucket-client/models/RestMirrorHashes.js +2 -0
  671. package/build/bitbucket-client/models/RestMirrorHashes.js.map +1 -0
  672. package/build/bitbucket-client/models/RestMirrorRepositorySynchronizationStatus.d.ts +2 -0
  673. package/build/bitbucket-client/models/RestMirrorRepositorySynchronizationStatus.d.ts.map +1 -0
  674. package/build/bitbucket-client/models/RestMirrorRepositorySynchronizationStatus.js +2 -0
  675. package/build/bitbucket-client/models/RestMirrorRepositorySynchronizationStatus.js.map +1 -0
  676. package/build/bitbucket-client/models/RestMirrorServer.d.ts +2 -0
  677. package/build/bitbucket-client/models/RestMirrorServer.d.ts.map +1 -0
  678. package/build/bitbucket-client/models/RestMirrorServer.js +2 -0
  679. package/build/bitbucket-client/models/RestMirrorServer.js.map +1 -0
  680. package/build/bitbucket-client/models/RestMirrorUpgradeRequest.d.ts +5 -0
  681. package/build/bitbucket-client/models/RestMirrorUpgradeRequest.d.ts.map +1 -0
  682. package/build/bitbucket-client/models/RestMirrorUpgradeRequest.js +2 -0
  683. package/build/bitbucket-client/models/RestMirrorUpgradeRequest.js.map +1 -0
  684. package/build/bitbucket-client/models/RestMirroredRepository.d.ts +2 -0
  685. package/build/bitbucket-client/models/RestMirroredRepository.d.ts.map +1 -0
  686. package/build/bitbucket-client/models/RestMirroredRepository.js +2 -0
  687. package/build/bitbucket-client/models/RestMirroredRepository.js.map +1 -0
  688. package/build/bitbucket-client/models/RestMirroredRepositoryDescriptor.d.ts +2 -0
  689. package/build/bitbucket-client/models/RestMirroredRepositoryDescriptor.d.ts.map +1 -0
  690. package/build/bitbucket-client/models/RestMirroredRepositoryDescriptor.js +2 -0
  691. package/build/bitbucket-client/models/RestMirroredRepositoryDescriptor.js.map +1 -0
  692. package/build/bitbucket-client/models/RestMirroringRequest.d.ts +2 -0
  693. package/build/bitbucket-client/models/RestMirroringRequest.d.ts.map +1 -0
  694. package/build/bitbucket-client/models/RestMirroringRequest.js +2 -0
  695. package/build/bitbucket-client/models/RestMirroringRequest.js.map +1 -0
  696. package/build/bitbucket-client/models/RestMultilineCommentMarker.d.ts +2 -0
  697. package/build/bitbucket-client/models/RestMultilineCommentMarker.d.ts.map +1 -0
  698. package/build/bitbucket-client/models/RestMultilineCommentMarker.js +2 -0
  699. package/build/bitbucket-client/models/RestMultilineCommentMarker.js.map +1 -0
  700. package/build/bitbucket-client/models/RestMultilineCommentSpan.d.ts +2 -0
  701. package/build/bitbucket-client/models/RestMultilineCommentSpan.d.ts.map +1 -0
  702. package/build/bitbucket-client/models/RestMultilineCommentSpan.js +2 -0
  703. package/build/bitbucket-client/models/RestMultilineCommentSpan.js.map +1 -0
  704. package/build/bitbucket-client/models/RestMultipleBuildStats.d.ts +2 -0
  705. package/build/bitbucket-client/models/RestMultipleBuildStats.d.ts.map +1 -0
  706. package/build/bitbucket-client/models/RestMultipleBuildStats.js +2 -0
  707. package/build/bitbucket-client/models/RestMultipleBuildStats.js.map +1 -0
  708. package/build/bitbucket-client/models/RestNamedLink.d.ts +2 -0
  709. package/build/bitbucket-client/models/RestNamedLink.d.ts.map +1 -0
  710. package/build/bitbucket-client/models/RestNamedLink.js +2 -0
  711. package/build/bitbucket-client/models/RestNamedLink.js.map +1 -0
  712. package/build/bitbucket-client/models/RestNode.d.ts +2 -0
  713. package/build/bitbucket-client/models/RestNode.d.ts.map +1 -0
  714. package/build/bitbucket-client/models/RestNode.js +2 -0
  715. package/build/bitbucket-client/models/RestNode.js.map +1 -0
  716. package/build/bitbucket-client/models/RestNodeConnectivityReport.d.ts +2 -0
  717. package/build/bitbucket-client/models/RestNodeConnectivityReport.d.ts.map +1 -0
  718. package/build/bitbucket-client/models/RestNodeConnectivityReport.js +2 -0
  719. package/build/bitbucket-client/models/RestNodeConnectivityReport.js.map +1 -0
  720. package/build/bitbucket-client/models/RestNodeConnectivitySummary.d.ts +2 -0
  721. package/build/bitbucket-client/models/RestNodeConnectivitySummary.d.ts.map +1 -0
  722. package/build/bitbucket-client/models/RestNodeConnectivitySummary.js +2 -0
  723. package/build/bitbucket-client/models/RestNodeConnectivitySummary.js.map +1 -0
  724. package/build/bitbucket-client/models/RestPageIdpConfigEntity.d.ts +9 -0
  725. package/build/bitbucket-client/models/RestPageIdpConfigEntity.d.ts.map +1 -0
  726. package/build/bitbucket-client/models/RestPageIdpConfigEntity.js +2 -0
  727. package/build/bitbucket-client/models/RestPageIdpConfigEntity.js.map +1 -0
  728. package/build/bitbucket-client/models/RestPageLoginOptionEntity.d.ts +9 -0
  729. package/build/bitbucket-client/models/RestPageLoginOptionEntity.d.ts.map +1 -0
  730. package/build/bitbucket-client/models/RestPageLoginOptionEntity.js +2 -0
  731. package/build/bitbucket-client/models/RestPageLoginOptionEntity.js.map +1 -0
  732. package/build/bitbucket-client/models/RestPageRestChange.d.ts +2 -0
  733. package/build/bitbucket-client/models/RestPageRestChange.d.ts.map +1 -0
  734. package/build/bitbucket-client/models/RestPageRestChange.js +2 -0
  735. package/build/bitbucket-client/models/RestPageRestChange.js.map +1 -0
  736. package/build/bitbucket-client/models/RestPath.d.ts +2 -0
  737. package/build/bitbucket-client/models/RestPath.d.ts.map +1 -0
  738. package/build/bitbucket-client/models/RestPath.js +2 -0
  739. package/build/bitbucket-client/models/RestPath.js.map +1 -0
  740. package/build/bitbucket-client/models/RestPermitted.d.ts +2 -0
  741. package/build/bitbucket-client/models/RestPermitted.d.ts.map +1 -0
  742. package/build/bitbucket-client/models/RestPermitted.js +2 -0
  743. package/build/bitbucket-client/models/RestPermitted.js.map +1 -0
  744. package/build/bitbucket-client/models/RestPermittedGroup.d.ts +2 -0
  745. package/build/bitbucket-client/models/RestPermittedGroup.d.ts.map +1 -0
  746. package/build/bitbucket-client/models/RestPermittedGroup.js +2 -0
  747. package/build/bitbucket-client/models/RestPermittedGroup.js.map +1 -0
  748. package/build/bitbucket-client/models/RestPermittedUser.d.ts +2 -0
  749. package/build/bitbucket-client/models/RestPermittedUser.d.ts.map +1 -0
  750. package/build/bitbucket-client/models/RestPermittedUser.js +2 -0
  751. package/build/bitbucket-client/models/RestPermittedUser.js.map +1 -0
  752. package/build/bitbucket-client/models/RestPerson.d.ts +2 -0
  753. package/build/bitbucket-client/models/RestPerson.d.ts.map +1 -0
  754. package/build/bitbucket-client/models/RestPerson.js +2 -0
  755. package/build/bitbucket-client/models/RestPerson.js.map +1 -0
  756. package/build/bitbucket-client/models/RestProgress.d.ts +2 -0
  757. package/build/bitbucket-client/models/RestProgress.d.ts.map +1 -0
  758. package/build/bitbucket-client/models/RestProgress.js +2 -0
  759. package/build/bitbucket-client/models/RestProgress.js.map +1 -0
  760. package/build/bitbucket-client/models/RestProject.d.ts +2 -0
  761. package/build/bitbucket-client/models/RestProject.d.ts.map +1 -0
  762. package/build/bitbucket-client/models/RestProject.js +2 -0
  763. package/build/bitbucket-client/models/RestProject.js.map +1 -0
  764. package/build/bitbucket-client/models/RestProjectSettingsRestriction.d.ts +2 -0
  765. package/build/bitbucket-client/models/RestProjectSettingsRestriction.d.ts.map +1 -0
  766. package/build/bitbucket-client/models/RestProjectSettingsRestriction.js +2 -0
  767. package/build/bitbucket-client/models/RestProjectSettingsRestriction.js.map +1 -0
  768. package/build/bitbucket-client/models/RestProjectSettingsRestrictionRequest.d.ts +6 -0
  769. package/build/bitbucket-client/models/RestProjectSettingsRestrictionRequest.d.ts.map +1 -0
  770. package/build/bitbucket-client/models/RestProjectSettingsRestrictionRequest.js +2 -0
  771. package/build/bitbucket-client/models/RestProjectSettingsRestrictionRequest.js.map +1 -0
  772. package/build/bitbucket-client/models/RestProperties.d.ts +2 -0
  773. package/build/bitbucket-client/models/RestProperties.d.ts.map +1 -0
  774. package/build/bitbucket-client/models/RestProperties.js +2 -0
  775. package/build/bitbucket-client/models/RestProperties.js.map +1 -0
  776. package/build/bitbucket-client/models/RestPullRequest.d.ts +2 -0
  777. package/build/bitbucket-client/models/RestPullRequest.d.ts.map +1 -0
  778. package/build/bitbucket-client/models/RestPullRequest.js +2 -0
  779. package/build/bitbucket-client/models/RestPullRequest.js.map +1 -0
  780. package/build/bitbucket-client/models/RestPullRequestActivity.d.ts +2 -0
  781. package/build/bitbucket-client/models/RestPullRequestActivity.d.ts.map +1 -0
  782. package/build/bitbucket-client/models/RestPullRequestActivity.js +2 -0
  783. package/build/bitbucket-client/models/RestPullRequestActivity.js.map +1 -0
  784. package/build/bitbucket-client/models/RestPullRequestAssignParticipantRoleRequest.d.ts +26 -0
  785. package/build/bitbucket-client/models/RestPullRequestAssignParticipantRoleRequest.d.ts.map +1 -0
  786. package/build/bitbucket-client/models/RestPullRequestAssignParticipantRoleRequest.js +15 -0
  787. package/build/bitbucket-client/models/RestPullRequestAssignParticipantRoleRequest.js.map +1 -0
  788. package/build/bitbucket-client/models/RestPullRequestAssignStatusRequest.d.ts +12 -0
  789. package/build/bitbucket-client/models/RestPullRequestAssignStatusRequest.d.ts.map +1 -0
  790. package/build/bitbucket-client/models/RestPullRequestAssignStatusRequest.js +10 -0
  791. package/build/bitbucket-client/models/RestPullRequestAssignStatusRequest.js.map +1 -0
  792. package/build/bitbucket-client/models/RestPullRequestCommitMessageTemplate.d.ts +2 -0
  793. package/build/bitbucket-client/models/RestPullRequestCommitMessageTemplate.d.ts.map +1 -0
  794. package/build/bitbucket-client/models/RestPullRequestCommitMessageTemplate.js +2 -0
  795. package/build/bitbucket-client/models/RestPullRequestCommitMessageTemplate.js.map +1 -0
  796. package/build/bitbucket-client/models/RestPullRequestCondition.d.ts +2 -0
  797. package/build/bitbucket-client/models/RestPullRequestCondition.d.ts.map +1 -0
  798. package/build/bitbucket-client/models/RestPullRequestCondition.js +2 -0
  799. package/build/bitbucket-client/models/RestPullRequestCondition.js.map +1 -0
  800. package/build/bitbucket-client/models/RestPullRequestDeclineRequest.d.ts +5 -0
  801. package/build/bitbucket-client/models/RestPullRequestDeclineRequest.d.ts.map +1 -0
  802. package/build/bitbucket-client/models/RestPullRequestDeclineRequest.js +2 -0
  803. package/build/bitbucket-client/models/RestPullRequestDeclineRequest.js.map +1 -0
  804. package/build/bitbucket-client/models/RestPullRequestDeleteRequest.d.ts +4 -0
  805. package/build/bitbucket-client/models/RestPullRequestDeleteRequest.d.ts.map +1 -0
  806. package/build/bitbucket-client/models/RestPullRequestDeleteRequest.js +2 -0
  807. package/build/bitbucket-client/models/RestPullRequestDeleteRequest.js.map +1 -0
  808. package/build/bitbucket-client/models/RestPullRequestFinishReviewRequest.d.ts +6 -0
  809. package/build/bitbucket-client/models/RestPullRequestFinishReviewRequest.d.ts.map +1 -0
  810. package/build/bitbucket-client/models/RestPullRequestFinishReviewRequest.js +2 -0
  811. package/build/bitbucket-client/models/RestPullRequestFinishReviewRequest.js.map +1 -0
  812. package/build/bitbucket-client/models/RestPullRequestMergeConfig.d.ts +2 -0
  813. package/build/bitbucket-client/models/RestPullRequestMergeConfig.d.ts.map +1 -0
  814. package/build/bitbucket-client/models/RestPullRequestMergeConfig.js +2 -0
  815. package/build/bitbucket-client/models/RestPullRequestMergeConfig.js.map +1 -0
  816. package/build/bitbucket-client/models/RestPullRequestMergeRequest.d.ts +8 -0
  817. package/build/bitbucket-client/models/RestPullRequestMergeRequest.d.ts.map +1 -0
  818. package/build/bitbucket-client/models/RestPullRequestMergeRequest.js +2 -0
  819. package/build/bitbucket-client/models/RestPullRequestMergeRequest.js.map +1 -0
  820. package/build/bitbucket-client/models/RestPullRequestMergeStrategy.d.ts +2 -0
  821. package/build/bitbucket-client/models/RestPullRequestMergeStrategy.d.ts.map +1 -0
  822. package/build/bitbucket-client/models/RestPullRequestMergeStrategy.js +2 -0
  823. package/build/bitbucket-client/models/RestPullRequestMergeStrategy.js.map +1 -0
  824. package/build/bitbucket-client/models/RestPullRequestMergeability.d.ts +2 -0
  825. package/build/bitbucket-client/models/RestPullRequestMergeability.d.ts.map +1 -0
  826. package/build/bitbucket-client/models/RestPullRequestMergeability.js +2 -0
  827. package/build/bitbucket-client/models/RestPullRequestMergeability.js.map +1 -0
  828. package/build/bitbucket-client/models/RestPullRequestParticipant.d.ts +2 -0
  829. package/build/bitbucket-client/models/RestPullRequestParticipant.d.ts.map +1 -0
  830. package/build/bitbucket-client/models/RestPullRequestParticipant.js +2 -0
  831. package/build/bitbucket-client/models/RestPullRequestParticipant.js.map +1 -0
  832. package/build/bitbucket-client/models/RestPullRequestRebaseRequest.d.ts +4 -0
  833. package/build/bitbucket-client/models/RestPullRequestRebaseRequest.d.ts.map +1 -0
  834. package/build/bitbucket-client/models/RestPullRequestRebaseRequest.js +2 -0
  835. package/build/bitbucket-client/models/RestPullRequestRebaseRequest.js.map +1 -0
  836. package/build/bitbucket-client/models/RestPullRequestRebaseResult.d.ts +2 -0
  837. package/build/bitbucket-client/models/RestPullRequestRebaseResult.d.ts.map +1 -0
  838. package/build/bitbucket-client/models/RestPullRequestRebaseResult.js +2 -0
  839. package/build/bitbucket-client/models/RestPullRequestRebaseResult.js.map +1 -0
  840. package/build/bitbucket-client/models/RestPullRequestRebaseability.d.ts +2 -0
  841. package/build/bitbucket-client/models/RestPullRequestRebaseability.d.ts.map +1 -0
  842. package/build/bitbucket-client/models/RestPullRequestRebaseability.js +2 -0
  843. package/build/bitbucket-client/models/RestPullRequestRebaseability.js.map +1 -0
  844. package/build/bitbucket-client/models/RestPullRequestRef.d.ts +2 -0
  845. package/build/bitbucket-client/models/RestPullRequestRef.d.ts.map +1 -0
  846. package/build/bitbucket-client/models/RestPullRequestRef.js +2 -0
  847. package/build/bitbucket-client/models/RestPullRequestRef.js.map +1 -0
  848. package/build/bitbucket-client/models/RestPullRequestReopenRequest.d.ts +4 -0
  849. package/build/bitbucket-client/models/RestPullRequestReopenRequest.d.ts.map +1 -0
  850. package/build/bitbucket-client/models/RestPullRequestReopenRequest.js +2 -0
  851. package/build/bitbucket-client/models/RestPullRequestReopenRequest.js.map +1 -0
  852. package/build/bitbucket-client/models/RestPullRequestSettings.d.ts +2 -0
  853. package/build/bitbucket-client/models/RestPullRequestSettings.d.ts.map +1 -0
  854. package/build/bitbucket-client/models/RestPullRequestSettings.js +2 -0
  855. package/build/bitbucket-client/models/RestPullRequestSettings.js.map +1 -0
  856. package/build/bitbucket-client/models/RestPullRequestSuggestion.d.ts +2 -0
  857. package/build/bitbucket-client/models/RestPullRequestSuggestion.d.ts.map +1 -0
  858. package/build/bitbucket-client/models/RestPullRequestSuggestion.js +2 -0
  859. package/build/bitbucket-client/models/RestPullRequestSuggestion.js.map +1 -0
  860. package/build/bitbucket-client/models/RestPushRefChange.d.ts +2 -0
  861. package/build/bitbucket-client/models/RestPushRefChange.d.ts.map +1 -0
  862. package/build/bitbucket-client/models/RestPushRefChange.js +2 -0
  863. package/build/bitbucket-client/models/RestPushRefChange.js.map +1 -0
  864. package/build/bitbucket-client/models/RestRateLimitSettings.d.ts +2 -0
  865. package/build/bitbucket-client/models/RestRateLimitSettings.d.ts.map +1 -0
  866. package/build/bitbucket-client/models/RestRateLimitSettings.js +2 -0
  867. package/build/bitbucket-client/models/RestRateLimitSettings.js.map +1 -0
  868. package/build/bitbucket-client/models/RestRawAccessToken.d.ts +2 -0
  869. package/build/bitbucket-client/models/RestRawAccessToken.d.ts.map +1 -0
  870. package/build/bitbucket-client/models/RestRawAccessToken.js +2 -0
  871. package/build/bitbucket-client/models/RestRawAccessToken.js.map +1 -0
  872. package/build/bitbucket-client/models/RestRefChange.d.ts +2 -0
  873. package/build/bitbucket-client/models/RestRefChange.d.ts.map +1 -0
  874. package/build/bitbucket-client/models/RestRefChange.js +2 -0
  875. package/build/bitbucket-client/models/RestRefChange.js.map +1 -0
  876. package/build/bitbucket-client/models/RestRefMatcher.d.ts +2 -0
  877. package/build/bitbucket-client/models/RestRefMatcher.d.ts.map +1 -0
  878. package/build/bitbucket-client/models/RestRefMatcher.js +2 -0
  879. package/build/bitbucket-client/models/RestRefMatcher.js.map +1 -0
  880. package/build/bitbucket-client/models/RestRefMatcherType.d.ts +2 -0
  881. package/build/bitbucket-client/models/RestRefMatcherType.d.ts.map +1 -0
  882. package/build/bitbucket-client/models/RestRefMatcherType.js +2 -0
  883. package/build/bitbucket-client/models/RestRefMatcherType.js.map +1 -0
  884. package/build/bitbucket-client/models/RestRefRestriction.d.ts +2 -0
  885. package/build/bitbucket-client/models/RestRefRestriction.d.ts.map +1 -0
  886. package/build/bitbucket-client/models/RestRefRestriction.js +2 -0
  887. package/build/bitbucket-client/models/RestRefRestriction.js.map +1 -0
  888. package/build/bitbucket-client/models/RestRefSyncQueue.d.ts +5 -0
  889. package/build/bitbucket-client/models/RestRefSyncQueue.d.ts.map +1 -0
  890. package/build/bitbucket-client/models/RestRefSyncQueue.js +2 -0
  891. package/build/bitbucket-client/models/RestRefSyncQueue.js.map +1 -0
  892. package/build/bitbucket-client/models/RestRefSyncRequest.d.ts +14 -0
  893. package/build/bitbucket-client/models/RestRefSyncRequest.d.ts.map +1 -0
  894. package/build/bitbucket-client/models/RestRefSyncRequest.js +10 -0
  895. package/build/bitbucket-client/models/RestRefSyncRequest.js.map +1 -0
  896. package/build/bitbucket-client/models/RestRefSyncStatus.d.ts +2 -0
  897. package/build/bitbucket-client/models/RestRefSyncStatus.d.ts.map +1 -0
  898. package/build/bitbucket-client/models/RestRefSyncStatus.js +2 -0
  899. package/build/bitbucket-client/models/RestRefSyncStatus.js.map +1 -0
  900. package/build/bitbucket-client/models/RestRejectedRef.d.ts +2 -0
  901. package/build/bitbucket-client/models/RestRejectedRef.d.ts.map +1 -0
  902. package/build/bitbucket-client/models/RestRejectedRef.js +2 -0
  903. package/build/bitbucket-client/models/RestRejectedRef.js.map +1 -0
  904. package/build/bitbucket-client/models/RestRelatedLinks.d.ts +2 -0
  905. package/build/bitbucket-client/models/RestRelatedLinks.d.ts.map +1 -0
  906. package/build/bitbucket-client/models/RestRelatedLinks.js +2 -0
  907. package/build/bitbucket-client/models/RestRelatedLinks.js.map +1 -0
  908. package/build/bitbucket-client/models/RestRepositoriesExportRequest.d.ts +5 -0
  909. package/build/bitbucket-client/models/RestRepositoriesExportRequest.d.ts.map +1 -0
  910. package/build/bitbucket-client/models/RestRepositoriesExportRequest.js +2 -0
  911. package/build/bitbucket-client/models/RestRepositoriesExportRequest.js.map +1 -0
  912. package/build/bitbucket-client/models/RestRepository.d.ts +2 -0
  913. package/build/bitbucket-client/models/RestRepository.d.ts.map +1 -0
  914. package/build/bitbucket-client/models/RestRepository.js +2 -0
  915. package/build/bitbucket-client/models/RestRepository.js.map +1 -0
  916. package/build/bitbucket-client/models/RestRepositoryHook.d.ts +2 -0
  917. package/build/bitbucket-client/models/RestRepositoryHook.d.ts.map +1 -0
  918. package/build/bitbucket-client/models/RestRepositoryHook.js +2 -0
  919. package/build/bitbucket-client/models/RestRepositoryHook.js.map +1 -0
  920. package/build/bitbucket-client/models/RestRepositoryHookVeto.d.ts +2 -0
  921. package/build/bitbucket-client/models/RestRepositoryHookVeto.d.ts.map +1 -0
  922. package/build/bitbucket-client/models/RestRepositoryHookVeto.js +2 -0
  923. package/build/bitbucket-client/models/RestRepositoryHookVeto.js.map +1 -0
  924. package/build/bitbucket-client/models/RestRepositoryLockOwner.d.ts +2 -0
  925. package/build/bitbucket-client/models/RestRepositoryLockOwner.d.ts.map +1 -0
  926. package/build/bitbucket-client/models/RestRepositoryLockOwner.js +2 -0
  927. package/build/bitbucket-client/models/RestRepositoryLockOwner.js.map +1 -0
  928. package/build/bitbucket-client/models/RestRepositoryMirrorEvent.d.ts +12 -0
  929. package/build/bitbucket-client/models/RestRepositoryMirrorEvent.d.ts.map +1 -0
  930. package/build/bitbucket-client/models/RestRepositoryMirrorEvent.js +9 -0
  931. package/build/bitbucket-client/models/RestRepositoryMirrorEvent.js.map +1 -0
  932. package/build/bitbucket-client/models/RestRepositoryPolicy.d.ts +2 -0
  933. package/build/bitbucket-client/models/RestRepositoryPolicy.d.ts.map +1 -0
  934. package/build/bitbucket-client/models/RestRepositoryPolicy.js +2 -0
  935. package/build/bitbucket-client/models/RestRepositoryPolicy.js.map +1 -0
  936. package/build/bitbucket-client/models/RestRepositoryPullRequestSettings.d.ts +2 -0
  937. package/build/bitbucket-client/models/RestRepositoryPullRequestSettings.d.ts.map +1 -0
  938. package/build/bitbucket-client/models/RestRepositoryPullRequestSettings.js +2 -0
  939. package/build/bitbucket-client/models/RestRepositoryPullRequestSettings.js.map +1 -0
  940. package/build/bitbucket-client/models/RestRepositoryRefChangeActivity.d.ts +2 -0
  941. package/build/bitbucket-client/models/RestRepositoryRefChangeActivity.d.ts.map +1 -0
  942. package/build/bitbucket-client/models/RestRepositoryRefChangeActivity.js +2 -0
  943. package/build/bitbucket-client/models/RestRepositoryRefChangeActivity.js.map +1 -0
  944. package/build/bitbucket-client/models/RestRepositorySelector.d.ts +5 -0
  945. package/build/bitbucket-client/models/RestRepositorySelector.d.ts.map +1 -0
  946. package/build/bitbucket-client/models/RestRepositorySelector.js +2 -0
  947. package/build/bitbucket-client/models/RestRepositorySelector.js.map +1 -0
  948. package/build/bitbucket-client/models/RestRequiredBuildCondition.d.ts +2 -0
  949. package/build/bitbucket-client/models/RestRequiredBuildCondition.d.ts.map +1 -0
  950. package/build/bitbucket-client/models/RestRequiredBuildCondition.js +2 -0
  951. package/build/bitbucket-client/models/RestRequiredBuildCondition.js.map +1 -0
  952. package/build/bitbucket-client/models/RestRequiredBuildConditionSetRequest.d.ts +26 -0
  953. package/build/bitbucket-client/models/RestRequiredBuildConditionSetRequest.d.ts.map +1 -0
  954. package/build/bitbucket-client/models/RestRequiredBuildConditionSetRequest.js +12 -0
  955. package/build/bitbucket-client/models/RestRequiredBuildConditionSetRequest.js.map +1 -0
  956. package/build/bitbucket-client/models/RestRestrictionRequest.d.ts +39 -0
  957. package/build/bitbucket-client/models/RestRestrictionRequest.d.ts.map +1 -0
  958. package/build/bitbucket-client/models/RestRestrictionRequest.js +18 -0
  959. package/build/bitbucket-client/models/RestRestrictionRequest.js.map +1 -0
  960. package/build/bitbucket-client/models/RestReviewerGroup.d.ts +2 -0
  961. package/build/bitbucket-client/models/RestReviewerGroup.d.ts.map +1 -0
  962. package/build/bitbucket-client/models/RestReviewerGroup.js +2 -0
  963. package/build/bitbucket-client/models/RestReviewerGroup.js.map +1 -0
  964. package/build/bitbucket-client/models/RestRollingUpgradeState.d.ts +2 -0
  965. package/build/bitbucket-client/models/RestRollingUpgradeState.d.ts.map +1 -0
  966. package/build/bitbucket-client/models/RestRollingUpgradeState.js +2 -0
  967. package/build/bitbucket-client/models/RestRollingUpgradeState.js.map +1 -0
  968. package/build/bitbucket-client/models/RestScope.d.ts +2 -0
  969. package/build/bitbucket-client/models/RestScope.d.ts.map +1 -0
  970. package/build/bitbucket-client/models/RestScope.js +2 -0
  971. package/build/bitbucket-client/models/RestScope.js.map +1 -0
  972. package/build/bitbucket-client/models/RestScopesExample.d.ts +2 -0
  973. package/build/bitbucket-client/models/RestScopesExample.d.ts.map +1 -0
  974. package/build/bitbucket-client/models/RestScopesExample.js +2 -0
  975. package/build/bitbucket-client/models/RestScopesExample.js.map +1 -0
  976. package/build/bitbucket-client/models/RestSecretScanningAllowlistRule.d.ts +2 -0
  977. package/build/bitbucket-client/models/RestSecretScanningAllowlistRule.d.ts.map +1 -0
  978. package/build/bitbucket-client/models/RestSecretScanningAllowlistRule.js +2 -0
  979. package/build/bitbucket-client/models/RestSecretScanningAllowlistRule.js.map +1 -0
  980. package/build/bitbucket-client/models/RestSecretScanningAllowlistRuleSetRequest.d.ts +15 -0
  981. package/build/bitbucket-client/models/RestSecretScanningAllowlistRuleSetRequest.d.ts.map +1 -0
  982. package/build/bitbucket-client/models/RestSecretScanningAllowlistRuleSetRequest.js +2 -0
  983. package/build/bitbucket-client/models/RestSecretScanningAllowlistRuleSetRequest.js.map +1 -0
  984. package/build/bitbucket-client/models/RestSecretScanningRule.d.ts +2 -0
  985. package/build/bitbucket-client/models/RestSecretScanningRule.d.ts.map +1 -0
  986. package/build/bitbucket-client/models/RestSecretScanningRule.js +2 -0
  987. package/build/bitbucket-client/models/RestSecretScanningRule.js.map +1 -0
  988. package/build/bitbucket-client/models/RestSecretScanningRuleSetRequest.d.ts +15 -0
  989. package/build/bitbucket-client/models/RestSecretScanningRuleSetRequest.d.ts.map +1 -0
  990. package/build/bitbucket-client/models/RestSecretScanningRuleSetRequest.js +2 -0
  991. package/build/bitbucket-client/models/RestSecretScanningRuleSetRequest.js.map +1 -0
  992. package/build/bitbucket-client/models/RestSetInsightReportRequest.d.ts +13 -0
  993. package/build/bitbucket-client/models/RestSetInsightReportRequest.d.ts.map +1 -0
  994. package/build/bitbucket-client/models/RestSetInsightReportRequest.js +2 -0
  995. package/build/bitbucket-client/models/RestSetInsightReportRequest.js.map +1 -0
  996. package/build/bitbucket-client/models/RestSingleAddInsightAnnotationRequest.d.ts +10 -0
  997. package/build/bitbucket-client/models/RestSingleAddInsightAnnotationRequest.d.ts.map +1 -0
  998. package/build/bitbucket-client/models/RestSingleAddInsightAnnotationRequest.js +2 -0
  999. package/build/bitbucket-client/models/RestSingleAddInsightAnnotationRequest.js.map +1 -0
  1000. package/build/bitbucket-client/models/RestSshAccessKey.d.ts +2 -0
  1001. package/build/bitbucket-client/models/RestSshAccessKey.d.ts.map +1 -0
  1002. package/build/bitbucket-client/models/RestSshAccessKey.js +2 -0
  1003. package/build/bitbucket-client/models/RestSshAccessKey.js.map +1 -0
  1004. package/build/bitbucket-client/models/RestSshAccessKeyLocations.d.ts +7 -0
  1005. package/build/bitbucket-client/models/RestSshAccessKeyLocations.d.ts.map +1 -0
  1006. package/build/bitbucket-client/models/RestSshAccessKeyLocations.js +2 -0
  1007. package/build/bitbucket-client/models/RestSshAccessKeyLocations.js.map +1 -0
  1008. package/build/bitbucket-client/models/RestSshCredentials.d.ts +12 -0
  1009. package/build/bitbucket-client/models/RestSshCredentials.d.ts.map +1 -0
  1010. package/build/bitbucket-client/models/RestSshCredentials.js +2 -0
  1011. package/build/bitbucket-client/models/RestSshCredentials.js.map +1 -0
  1012. package/build/bitbucket-client/models/RestSshKey.d.ts +2 -0
  1013. package/build/bitbucket-client/models/RestSshKey.d.ts.map +1 -0
  1014. package/build/bitbucket-client/models/RestSshKey.js +2 -0
  1015. package/build/bitbucket-client/models/RestSshKey.js.map +1 -0
  1016. package/build/bitbucket-client/models/RestSshKeySettings.d.ts +2 -0
  1017. package/build/bitbucket-client/models/RestSshKeySettings.d.ts.map +1 -0
  1018. package/build/bitbucket-client/models/RestSshKeySettings.js +2 -0
  1019. package/build/bitbucket-client/models/RestSshKeySettings.js.map +1 -0
  1020. package/build/bitbucket-client/models/RestSshKeyTypeRestriction.d.ts +2 -0
  1021. package/build/bitbucket-client/models/RestSshKeyTypeRestriction.d.ts.map +1 -0
  1022. package/build/bitbucket-client/models/RestSshKeyTypeRestriction.js +2 -0
  1023. package/build/bitbucket-client/models/RestSshKeyTypeRestriction.js.map +1 -0
  1024. package/build/bitbucket-client/models/RestSshSettings.d.ts +2 -0
  1025. package/build/bitbucket-client/models/RestSshSettings.d.ts.map +1 -0
  1026. package/build/bitbucket-client/models/RestSshSettings.js +2 -0
  1027. package/build/bitbucket-client/models/RestSshSettings.js.map +1 -0
  1028. package/build/bitbucket-client/models/RestSyncProgress.d.ts +2 -0
  1029. package/build/bitbucket-client/models/RestSyncProgress.d.ts.map +1 -0
  1030. package/build/bitbucket-client/models/RestSyncProgress.js +2 -0
  1031. package/build/bitbucket-client/models/RestSyncProgress.js.map +1 -0
  1032. package/build/bitbucket-client/models/RestSystemSigningConfiguration.d.ts +2 -0
  1033. package/build/bitbucket-client/models/RestSystemSigningConfiguration.d.ts.map +1 -0
  1034. package/build/bitbucket-client/models/RestSystemSigningConfiguration.js +2 -0
  1035. package/build/bitbucket-client/models/RestSystemSigningConfiguration.js.map +1 -0
  1036. package/build/bitbucket-client/models/RestTag.d.ts +2 -0
  1037. package/build/bitbucket-client/models/RestTag.d.ts.map +1 -0
  1038. package/build/bitbucket-client/models/RestTag.js +2 -0
  1039. package/build/bitbucket-client/models/RestTag.js.map +1 -0
  1040. package/build/bitbucket-client/models/RestTestResults.d.ts +2 -0
  1041. package/build/bitbucket-client/models/RestTestResults.d.ts.map +1 -0
  1042. package/build/bitbucket-client/models/RestTestResults.js +2 -0
  1043. package/build/bitbucket-client/models/RestTestResults.js.map +1 -0
  1044. package/build/bitbucket-client/models/RestTokenBucketSettings.d.ts +2 -0
  1045. package/build/bitbucket-client/models/RestTokenBucketSettings.d.ts.map +1 -0
  1046. package/build/bitbucket-client/models/RestTokenBucketSettings.js +2 -0
  1047. package/build/bitbucket-client/models/RestTokenBucketSettings.js.map +1 -0
  1048. package/build/bitbucket-client/models/RestUpstreamServer.d.ts +2 -0
  1049. package/build/bitbucket-client/models/RestUpstreamServer.d.ts.map +1 -0
  1050. package/build/bitbucket-client/models/RestUpstreamServer.js +2 -0
  1051. package/build/bitbucket-client/models/RestUpstreamServer.js.map +1 -0
  1052. package/build/bitbucket-client/models/RestUpstreamSettings.d.ts +2 -0
  1053. package/build/bitbucket-client/models/RestUpstreamSettings.d.ts.map +1 -0
  1054. package/build/bitbucket-client/models/RestUpstreamSettings.js +2 -0
  1055. package/build/bitbucket-client/models/RestUpstreamSettings.js.map +1 -0
  1056. package/build/bitbucket-client/models/RestUserDirectory.d.ts +2 -0
  1057. package/build/bitbucket-client/models/RestUserDirectory.d.ts.map +1 -0
  1058. package/build/bitbucket-client/models/RestUserDirectory.js +2 -0
  1059. package/build/bitbucket-client/models/RestUserDirectory.js.map +1 -0
  1060. package/build/bitbucket-client/models/RestUserRateLimitSettings.d.ts +2 -0
  1061. package/build/bitbucket-client/models/RestUserRateLimitSettings.d.ts.map +1 -0
  1062. package/build/bitbucket-client/models/RestUserRateLimitSettings.js +2 -0
  1063. package/build/bitbucket-client/models/RestUserRateLimitSettings.js.map +1 -0
  1064. package/build/bitbucket-client/models/RestUserRateLimitSettingsUpdateRequest.d.ts +8 -0
  1065. package/build/bitbucket-client/models/RestUserRateLimitSettingsUpdateRequest.d.ts.map +1 -0
  1066. package/build/bitbucket-client/models/RestUserRateLimitSettingsUpdateRequest.js +2 -0
  1067. package/build/bitbucket-client/models/RestUserRateLimitSettingsUpdateRequest.js.map +1 -0
  1068. package/build/bitbucket-client/models/RestUserReaction.d.ts +2 -0
  1069. package/build/bitbucket-client/models/RestUserReaction.d.ts.map +1 -0
  1070. package/build/bitbucket-client/models/RestUserReaction.js +2 -0
  1071. package/build/bitbucket-client/models/RestUserReaction.js.map +1 -0
  1072. package/build/bitbucket-client/models/RestUsernamePasswordCredentials.d.ts +5 -0
  1073. package/build/bitbucket-client/models/RestUsernamePasswordCredentials.d.ts.map +1 -0
  1074. package/build/bitbucket-client/models/RestUsernamePasswordCredentials.js +2 -0
  1075. package/build/bitbucket-client/models/RestUsernamePasswordCredentials.js.map +1 -0
  1076. package/build/bitbucket-client/models/RestWebhook.d.ts +2 -0
  1077. package/build/bitbucket-client/models/RestWebhook.d.ts.map +1 -0
  1078. package/build/bitbucket-client/models/RestWebhook.js +2 -0
  1079. package/build/bitbucket-client/models/RestWebhook.js.map +1 -0
  1080. package/build/bitbucket-client/models/RestWebhookCredentials.d.ts +2 -0
  1081. package/build/bitbucket-client/models/RestWebhookCredentials.d.ts.map +1 -0
  1082. package/build/bitbucket-client/models/RestWebhookCredentials.js +2 -0
  1083. package/build/bitbucket-client/models/RestWebhookCredentials.js.map +1 -0
  1084. package/build/bitbucket-client/models/RestWebhookRequestResponse.d.ts +2 -0
  1085. package/build/bitbucket-client/models/RestWebhookRequestResponse.d.ts.map +1 -0
  1086. package/build/bitbucket-client/models/RestWebhookRequestResponse.js +2 -0
  1087. package/build/bitbucket-client/models/RestWebhookRequestResponse.js.map +1 -0
  1088. package/build/bitbucket-client/models/RestWebhookScope.d.ts +2 -0
  1089. package/build/bitbucket-client/models/RestWebhookScope.d.ts.map +1 -0
  1090. package/build/bitbucket-client/models/RestWebhookScope.js +2 -0
  1091. package/build/bitbucket-client/models/RestWebhookScope.js.map +1 -0
  1092. package/build/bitbucket-client/models/RestX509Certificate.d.ts +2 -0
  1093. package/build/bitbucket-client/models/RestX509Certificate.d.ts.map +1 -0
  1094. package/build/bitbucket-client/models/RestX509Certificate.js +2 -0
  1095. package/build/bitbucket-client/models/RestX509Certificate.js.map +1 -0
  1096. package/build/bitbucket-client/models/Scope.d.ts +12 -0
  1097. package/build/bitbucket-client/models/Scope.d.ts.map +1 -0
  1098. package/build/bitbucket-client/models/Scope.js +10 -0
  1099. package/build/bitbucket-client/models/Scope.js.map +1 -0
  1100. package/build/bitbucket-client/models/SimpleSshKeyFingerprint.d.ts +2 -0
  1101. package/build/bitbucket-client/models/SimpleSshKeyFingerprint.d.ts.map +1 -0
  1102. package/build/bitbucket-client/models/SimpleSshKeyFingerprint.js +2 -0
  1103. package/build/bitbucket-client/models/SimpleSshKeyFingerprint.js.map +1 -0
  1104. package/build/bitbucket-client/models/SsoConfigEntity.d.ts +2 -0
  1105. package/build/bitbucket-client/models/SsoConfigEntity.d.ts.map +1 -0
  1106. package/build/bitbucket-client/models/SsoConfigEntity.js +2 -0
  1107. package/build/bitbucket-client/models/SsoConfigEntity.js.map +1 -0
  1108. package/build/bitbucket-client/models/SsoManagementStatusDTO.d.ts +2 -0
  1109. package/build/bitbucket-client/models/SsoManagementStatusDTO.d.ts.map +1 -0
  1110. package/build/bitbucket-client/models/SsoManagementStatusDTO.js +2 -0
  1111. package/build/bitbucket-client/models/SsoManagementStatusDTO.js.map +1 -0
  1112. package/build/bitbucket-client/models/StatusDTO.d.ts +2 -0
  1113. package/build/bitbucket-client/models/StatusDTO.d.ts.map +1 -0
  1114. package/build/bitbucket-client/models/StatusDTO.js +2 -0
  1115. package/build/bitbucket-client/models/StatusDTO.js.map +1 -0
  1116. package/build/bitbucket-client/models/TotpCodeVerificationDTO.d.ts +5 -0
  1117. package/build/bitbucket-client/models/TotpCodeVerificationDTO.d.ts.map +1 -0
  1118. package/build/bitbucket-client/models/TotpCodeVerificationDTO.js +2 -0
  1119. package/build/bitbucket-client/models/TotpCodeVerificationDTO.js.map +1 -0
  1120. package/build/bitbucket-client/models/TotpElevationRestDTO.d.ts +4 -0
  1121. package/build/bitbucket-client/models/TotpElevationRestDTO.d.ts.map +1 -0
  1122. package/build/bitbucket-client/models/TotpElevationRestDTO.js +2 -0
  1123. package/build/bitbucket-client/models/TotpElevationRestDTO.js.map +1 -0
  1124. package/build/bitbucket-client/models/TotpRecoveryCodeAuthenticationDTO.d.ts +5 -0
  1125. package/build/bitbucket-client/models/TotpRecoveryCodeAuthenticationDTO.d.ts.map +1 -0
  1126. package/build/bitbucket-client/models/TotpRecoveryCodeAuthenticationDTO.js +2 -0
  1127. package/build/bitbucket-client/models/TotpRecoveryCodeAuthenticationDTO.js.map +1 -0
  1128. package/build/bitbucket-client/models/TotpRecoveryCodeDTO.d.ts +2 -0
  1129. package/build/bitbucket-client/models/TotpRecoveryCodeDTO.d.ts.map +1 -0
  1130. package/build/bitbucket-client/models/TotpRecoveryCodeDTO.js +2 -0
  1131. package/build/bitbucket-client/models/TotpRecoveryCodeDTO.js.map +1 -0
  1132. package/build/bitbucket-client/models/TotpUserEnrollmentDTO.d.ts +2 -0
  1133. package/build/bitbucket-client/models/TotpUserEnrollmentDTO.d.ts.map +1 -0
  1134. package/build/bitbucket-client/models/TotpUserEnrollmentDTO.js +2 -0
  1135. package/build/bitbucket-client/models/TotpUserEnrollmentDTO.js.map +1 -0
  1136. package/build/bitbucket-client/models/UserAndGroups.d.ts +5 -0
  1137. package/build/bitbucket-client/models/UserAndGroups.d.ts.map +1 -0
  1138. package/build/bitbucket-client/models/UserAndGroups.js +2 -0
  1139. package/build/bitbucket-client/models/UserAndGroups.js.map +1 -0
  1140. package/build/bitbucket-client/models/UserPasswordUpdate.d.ts +6 -0
  1141. package/build/bitbucket-client/models/UserPasswordUpdate.d.ts.map +1 -0
  1142. package/build/bitbucket-client/models/UserPasswordUpdate.js +2 -0
  1143. package/build/bitbucket-client/models/UserPasswordUpdate.js.map +1 -0
  1144. package/build/bitbucket-client/models/UserPickerContext.d.ts +5 -0
  1145. package/build/bitbucket-client/models/UserPickerContext.d.ts.map +1 -0
  1146. package/build/bitbucket-client/models/UserPickerContext.js +2 -0
  1147. package/build/bitbucket-client/models/UserPickerContext.js.map +1 -0
  1148. package/build/bitbucket-client/models/UserRename.d.ts +5 -0
  1149. package/build/bitbucket-client/models/UserRename.d.ts.map +1 -0
  1150. package/build/bitbucket-client/models/UserRename.js +2 -0
  1151. package/build/bitbucket-client/models/UserRename.js.map +1 -0
  1152. package/build/bitbucket-client/models/UserUpdate.d.ts +6 -0
  1153. package/build/bitbucket-client/models/UserUpdate.d.ts.map +1 -0
  1154. package/build/bitbucket-client/models/UserUpdate.js +2 -0
  1155. package/build/bitbucket-client/models/UserUpdate.js.map +1 -0
  1156. package/build/bitbucket-client/models/UserUpdateWithCredentials.d.ts +10 -0
  1157. package/build/bitbucket-client/models/UserUpdateWithCredentials.d.ts.map +1 -0
  1158. package/build/bitbucket-client/models/UserUpdateWithCredentials.js +2 -0
  1159. package/build/bitbucket-client/models/UserUpdateWithCredentials.js.map +1 -0
  1160. package/build/bitbucket-client/services/AuthenticationService.d.ts +684 -0
  1161. package/build/bitbucket-client/services/AuthenticationService.d.ts.map +1 -0
  1162. package/build/bitbucket-client/services/AuthenticationService.js +1381 -0
  1163. package/build/bitbucket-client/services/AuthenticationService.js.map +1 -0
  1164. package/build/bitbucket-client/services/BuildsAndDeploymentsService.d.ts +364 -0
  1165. package/build/bitbucket-client/services/BuildsAndDeploymentsService.d.ts.map +1 -0
  1166. package/build/bitbucket-client/services/BuildsAndDeploymentsService.js +705 -0
  1167. package/build/bitbucket-client/services/BuildsAndDeploymentsService.js.map +1 -0
  1168. package/build/bitbucket-client/services/CapabilitiesService.d.ts +19 -0
  1169. package/build/bitbucket-client/services/CapabilitiesService.d.ts.map +1 -0
  1170. package/build/bitbucket-client/services/CapabilitiesService.js +32 -0
  1171. package/build/bitbucket-client/services/CapabilitiesService.js.map +1 -0
  1172. package/build/bitbucket-client/services/DashboardService.d.ts +46 -0
  1173. package/build/bitbucket-client/services/DashboardService.d.ts.map +1 -0
  1174. package/build/bitbucket-client/services/DashboardService.js +63 -0
  1175. package/build/bitbucket-client/services/DashboardService.js.map +1 -0
  1176. package/build/bitbucket-client/services/DefaultService.d.ts +21 -0
  1177. package/build/bitbucket-client/services/DefaultService.d.ts.map +1 -0
  1178. package/build/bitbucket-client/services/DefaultService.js +37 -0
  1179. package/build/bitbucket-client/services/DefaultService.js.map +1 -0
  1180. package/build/bitbucket-client/services/DeprecatedService.d.ts +185 -0
  1181. package/build/bitbucket-client/services/DeprecatedService.d.ts.map +1 -0
  1182. package/build/bitbucket-client/services/DeprecatedService.js +338 -0
  1183. package/build/bitbucket-client/services/DeprecatedService.js.map +1 -0
  1184. package/build/bitbucket-client/services/JiraIntegrationService.d.ts +64 -0
  1185. package/build/bitbucket-client/services/JiraIntegrationService.d.ts.map +1 -0
  1186. package/build/bitbucket-client/services/JiraIntegrationService.js +102 -0
  1187. package/build/bitbucket-client/services/JiraIntegrationService.js.map +1 -0
  1188. package/build/bitbucket-client/services/MarkupService.d.ts +19 -0
  1189. package/build/bitbucket-client/services/MarkupService.d.ts.map +1 -0
  1190. package/build/bitbucket-client/services/MarkupService.js +36 -0
  1191. package/build/bitbucket-client/services/MarkupService.js.map +1 -0
  1192. package/build/bitbucket-client/services/MirroringMirrorService.d.ts +182 -0
  1193. package/build/bitbucket-client/services/MirroringMirrorService.d.ts.map +1 -0
  1194. package/build/bitbucket-client/services/MirroringMirrorService.js +375 -0
  1195. package/build/bitbucket-client/services/MirroringMirrorService.js.map +1 -0
  1196. package/build/bitbucket-client/services/MirroringUpstreamService.d.ts +215 -0
  1197. package/build/bitbucket-client/services/MirroringUpstreamService.d.ts.map +1 -0
  1198. package/build/bitbucket-client/services/MirroringUpstreamService.js +405 -0
  1199. package/build/bitbucket-client/services/MirroringUpstreamService.js.map +1 -0
  1200. package/build/bitbucket-client/services/PermissionManagementService.d.ts +713 -0
  1201. package/build/bitbucket-client/services/PermissionManagementService.d.ts.map +1 -0
  1202. package/build/bitbucket-client/services/PermissionManagementService.js +1210 -0
  1203. package/build/bitbucket-client/services/PermissionManagementService.js.map +1 -0
  1204. package/build/bitbucket-client/services/ProjectService.d.ts +1082 -0
  1205. package/build/bitbucket-client/services/ProjectService.d.ts.map +1 -0
  1206. package/build/bitbucket-client/services/ProjectService.js +2096 -0
  1207. package/build/bitbucket-client/services/ProjectService.js.map +1 -0
  1208. package/build/bitbucket-client/services/PullRequestsService.d.ts +1370 -0
  1209. package/build/bitbucket-client/services/PullRequestsService.d.ts.map +1 -0
  1210. package/build/bitbucket-client/services/PullRequestsService.js +2481 -0
  1211. package/build/bitbucket-client/services/PullRequestsService.js.map +1 -0
  1212. package/build/bitbucket-client/services/RepositoryService.d.ts +1734 -0
  1213. package/build/bitbucket-client/services/RepositoryService.d.ts.map +1 -0
  1214. package/build/bitbucket-client/services/RepositoryService.js +3228 -0
  1215. package/build/bitbucket-client/services/RepositoryService.js.map +1 -0
  1216. package/build/bitbucket-client/services/SecurityService.d.ts +542 -0
  1217. package/build/bitbucket-client/services/SecurityService.d.ts.map +1 -0
  1218. package/build/bitbucket-client/services/SecurityService.js +1049 -0
  1219. package/build/bitbucket-client/services/SecurityService.js.map +1 -0
  1220. package/build/bitbucket-client/services/SystemMaintenanceService.d.ts +1174 -0
  1221. package/build/bitbucket-client/services/SystemMaintenanceService.d.ts.map +1 -0
  1222. package/build/bitbucket-client/services/SystemMaintenanceService.js +1996 -0
  1223. package/build/bitbucket-client/services/SystemMaintenanceService.js.map +1 -0
  1224. package/build/bitbucket-response-mapper.d.ts +8 -0
  1225. package/build/bitbucket-response-mapper.d.ts.map +1 -0
  1226. package/build/bitbucket-response-mapper.js +102 -0
  1227. package/build/bitbucket-response-mapper.js.map +1 -0
  1228. package/build/bitbucket-service.d.ts +1655 -0
  1229. package/build/bitbucket-service.d.ts.map +1 -0
  1230. package/build/bitbucket-service.js +2186 -0
  1231. package/build/bitbucket-service.js.map +1 -0
  1232. package/build/config.d.ts +6 -0
  1233. package/build/config.d.ts.map +1 -0
  1234. package/build/config.js +22 -0
  1235. package/build/config.js.map +1 -0
  1236. package/build/inbox-pr-mapper.d.ts +39 -0
  1237. package/build/inbox-pr-mapper.d.ts.map +1 -0
  1238. package/build/inbox-pr-mapper.js +76 -0
  1239. package/build/inbox-pr-mapper.js.map +1 -0
  1240. package/build/index.d.ts +2 -0
  1241. package/build/index.d.ts.map +1 -0
  1242. package/build/index.js +332 -0
  1243. package/build/index.js.map +1 -0
  1244. package/build/pr-changes-mapper.d.ts +32 -0
  1245. package/build/pr-changes-mapper.d.ts.map +1 -0
  1246. package/build/pr-changes-mapper.js +111 -0
  1247. package/build/pr-changes-mapper.js.map +1 -0
  1248. package/build/pr-comment-mapper.d.ts +55 -0
  1249. package/build/pr-comment-mapper.d.ts.map +1 -0
  1250. package/build/pr-comment-mapper.js +182 -0
  1251. package/build/pr-comment-mapper.js.map +1 -0
  1252. package/build/setup.d.ts +2 -0
  1253. package/build/setup.d.ts.map +1 -0
  1254. package/build/setup.js +16 -0
  1255. package/build/setup.js.map +1 -0
  1256. package/jest.config.js +24 -0
  1257. package/package.json +53 -0
  1258. package/server.json +51 -0
  1259. package/src/__tests__/bitbucket-service.test.ts +4626 -0
  1260. package/src/__tests__/bitbucket-token-optimization.test.ts +429 -0
  1261. package/src/__tests__/config.test.ts +64 -0
  1262. package/src/__tests__/inbox-pr-mapper.test.ts +347 -0
  1263. package/src/__tests__/pr-changes-mapper.test.ts +420 -0
  1264. package/src/__tests__/pr-comment-mapper.test.ts +559 -0
  1265. package/src/bitbucket-client/core/ApiError.ts +26 -0
  1266. package/src/bitbucket-client/core/ApiRequestOptions.ts +17 -0
  1267. package/src/bitbucket-client/core/ApiResult.ts +11 -0
  1268. package/src/bitbucket-client/core/CancelablePromise.ts +131 -0
  1269. package/src/bitbucket-client/core/OpenAPI.ts +33 -0
  1270. package/src/bitbucket-client/core/request.ts +337 -0
  1271. package/src/bitbucket-client/index.ts +303 -0
  1272. package/src/bitbucket-client/models/AdminPasswordUpdate.ts +10 -0
  1273. package/src/bitbucket-client/models/ApplicationId.ts +5 -0
  1274. package/src/bitbucket-client/models/ApplicationUser.ts +7 -0
  1275. package/src/bitbucket-client/models/AuthenticationEntity.ts +13 -0
  1276. package/src/bitbucket-client/models/AuthenticationResponse.ts +7 -0
  1277. package/src/bitbucket-client/models/BasicAuthConfigEntity.ts +7 -0
  1278. package/src/bitbucket-client/models/CaptchaDataEntity.ts +7 -0
  1279. package/src/bitbucket-client/models/Comment.ts +38 -0
  1280. package/src/bitbucket-client/models/CommentOperations.ts +10 -0
  1281. package/src/bitbucket-client/models/CommentThread.ts +22 -0
  1282. package/src/bitbucket-client/models/CommentThreadDiffAnchor.ts +46 -0
  1283. package/src/bitbucket-client/models/Commentable.ts +5 -0
  1284. package/src/bitbucket-client/models/Context.ts +8 -0
  1285. package/src/bitbucket-client/models/ConversationDTO.ts +8 -0
  1286. package/src/bitbucket-client/models/Credentials.ts +10 -0
  1287. package/src/bitbucket-client/models/CredentialsCheckFailedDTO.ts +7 -0
  1288. package/src/bitbucket-client/models/DiffContentFilter.ts +5 -0
  1289. package/src/bitbucket-client/models/ElevationMethodRestDTO.ts +7 -0
  1290. package/src/bitbucket-client/models/EnrichedRepository.ts +7 -0
  1291. package/src/bitbucket-client/models/ErrorEntity.ts +7 -0
  1292. package/src/bitbucket-client/models/ExampleAvatarMultipartFormData.ts +11 -0
  1293. package/src/bitbucket-client/models/ExampleCertificateMultipartFormData.ts +11 -0
  1294. package/src/bitbucket-client/models/ExampleFiles.ts +7 -0
  1295. package/src/bitbucket-client/models/ExampleJsonLastModifiedCallback.ts +7 -0
  1296. package/src/bitbucket-client/models/ExampleMultipartFormData.ts +27 -0
  1297. package/src/bitbucket-client/models/ExamplePostMultipartFormData.ts +23 -0
  1298. package/src/bitbucket-client/models/ExamplePreviewMigration.ts +7 -0
  1299. package/src/bitbucket-client/models/ExamplePutMultipartFormData.ts +19 -0
  1300. package/src/bitbucket-client/models/ExampleRequirements.ts +7 -0
  1301. package/src/bitbucket-client/models/ExampleSettings.ts +7 -0
  1302. package/src/bitbucket-client/models/ExampleSettingsMap.ts +7 -0
  1303. package/src/bitbucket-client/models/ExampleSocketAddress.ts +7 -0
  1304. package/src/bitbucket-client/models/ExampleStatus.ts +7 -0
  1305. package/src/bitbucket-client/models/FileListResource.ts +7 -0
  1306. package/src/bitbucket-client/models/FilePart.ts +13 -0
  1307. package/src/bitbucket-client/models/Group.ts +7 -0
  1308. package/src/bitbucket-client/models/GroupAndUsers.ts +9 -0
  1309. package/src/bitbucket-client/models/GroupPickerContext.ts +9 -0
  1310. package/src/bitbucket-client/models/IdpConfigEntity.ts +7 -0
  1311. package/src/bitbucket-client/models/JitConfigEntity.ts +7 -0
  1312. package/src/bitbucket-client/models/JitUserEntity.ts +7 -0
  1313. package/src/bitbucket-client/models/LineNumberRange.ts +10 -0
  1314. package/src/bitbucket-client/models/LoginOptionEntity.ts +7 -0
  1315. package/src/bitbucket-client/models/MethodStateDTO.ts +7 -0
  1316. package/src/bitbucket-client/models/NextLoginStepDTO.ts +7 -0
  1317. package/src/bitbucket-client/models/OptionalBodyBeanParam.ts +5 -0
  1318. package/src/bitbucket-client/models/PageRequestImpl.ts +9 -0
  1319. package/src/bitbucket-client/models/PasswordElevationRestDTO.ts +8 -0
  1320. package/src/bitbucket-client/models/Project.ts +19 -0
  1321. package/src/bitbucket-client/models/PropertyMap.ts +7 -0
  1322. package/src/bitbucket-client/models/PullRequest.ts +36 -0
  1323. package/src/bitbucket-client/models/PullRequestParticipant.ts +28 -0
  1324. package/src/bitbucket-client/models/PullRequestRef.ts +15 -0
  1325. package/src/bitbucket-client/models/RefType.ts +7 -0
  1326. package/src/bitbucket-client/models/Repository.ts +36 -0
  1327. package/src/bitbucket-client/models/RepositoryHookDetails.ts +7 -0
  1328. package/src/bitbucket-client/models/RestAccessToken.ts +7 -0
  1329. package/src/bitbucket-client/models/RestAccessTokenRequest.ts +10 -0
  1330. package/src/bitbucket-client/models/RestAggregateRejectCounter.ts +7 -0
  1331. package/src/bitbucket-client/models/RestAnalyticsSettings.ts +7 -0
  1332. package/src/bitbucket-client/models/RestAnnouncementBanner.ts +7 -0
  1333. package/src/bitbucket-client/models/RestApplicationProperties.ts +7 -0
  1334. package/src/bitbucket-client/models/RestApplicationUser.ts +7 -0
  1335. package/src/bitbucket-client/models/RestApplicationUserWithPermissions.ts +7 -0
  1336. package/src/bitbucket-client/models/RestApplySuggestionRequest.ts +11 -0
  1337. package/src/bitbucket-client/models/RestAttachmentMetadata.ts +7 -0
  1338. package/src/bitbucket-client/models/RestAuthenticationRequest.ts +11 -0
  1339. package/src/bitbucket-client/models/RestAutoDeclineSettings.ts +7 -0
  1340. package/src/bitbucket-client/models/RestAutoDeclineSettingsRequest.ts +9 -0
  1341. package/src/bitbucket-client/models/RestAutoMergeProcessingResult.ts +7 -0
  1342. package/src/bitbucket-client/models/RestAutoMergeProjectSettingsRequest.ts +16 -0
  1343. package/src/bitbucket-client/models/RestAutoMergeRequest.ts +7 -0
  1344. package/src/bitbucket-client/models/RestAutoMergeRestrictedSettings.ts +7 -0
  1345. package/src/bitbucket-client/models/RestAutoMergeSettingsRequest.ts +8 -0
  1346. package/src/bitbucket-client/models/RestBearerTokenCredentials.ts +8 -0
  1347. package/src/bitbucket-client/models/RestBitbucketLicense.ts +7 -0
  1348. package/src/bitbucket-client/models/RestBranch.ts +7 -0
  1349. package/src/bitbucket-client/models/RestBranchCreateRequest.ts +15 -0
  1350. package/src/bitbucket-client/models/RestBranchDeleteRequest.ts +19 -0
  1351. package/src/bitbucket-client/models/RestBuildCapabilities.ts +7 -0
  1352. package/src/bitbucket-client/models/RestBuildStats.ts +7 -0
  1353. package/src/bitbucket-client/models/RestBuildStatus.ts +7 -0
  1354. package/src/bitbucket-client/models/RestBuildStatusSetRequest.ts +31 -0
  1355. package/src/bitbucket-client/models/RestBulkAddInsightAnnotationRequest.ts +10 -0
  1356. package/src/bitbucket-client/models/RestBulkUserRateLimitSettingsUpdateRequest.ts +13 -0
  1357. package/src/bitbucket-client/models/RestChange.ts +7 -0
  1358. package/src/bitbucket-client/models/RestChangeset.ts +7 -0
  1359. package/src/bitbucket-client/models/RestClusterInformation.ts +7 -0
  1360. package/src/bitbucket-client/models/RestClusterNode.ts +7 -0
  1361. package/src/bitbucket-client/models/RestComment.ts +7 -0
  1362. package/src/bitbucket-client/models/RestCommentJiraIssue.ts +7 -0
  1363. package/src/bitbucket-client/models/RestCommentThreadDiffAnchor.ts +7 -0
  1364. package/src/bitbucket-client/models/RestCommit.ts +7 -0
  1365. package/src/bitbucket-client/models/RestCommitMessageSuggestion.ts +7 -0
  1366. package/src/bitbucket-client/models/RestConflict.ts +7 -0
  1367. package/src/bitbucket-client/models/RestConflictChange.ts +7 -0
  1368. package/src/bitbucket-client/models/RestConnectivitySummary.ts +7 -0
  1369. package/src/bitbucket-client/models/RestCreateBranchRequest.ts +10 -0
  1370. package/src/bitbucket-client/models/RestCreateTagRequest.ts +10 -0
  1371. package/src/bitbucket-client/models/RestDefaultBranch.ts +8 -0
  1372. package/src/bitbucket-client/models/RestDefaultReviewersRequest.ts +38 -0
  1373. package/src/bitbucket-client/models/RestDefaultTask.ts +7 -0
  1374. package/src/bitbucket-client/models/RestDefaultTaskRequest.ts +33 -0
  1375. package/src/bitbucket-client/models/RestDelayedSyncRepository.ts +10 -0
  1376. package/src/bitbucket-client/models/RestDeployment.ts +7 -0
  1377. package/src/bitbucket-client/models/RestDeploymentEnvironment.ts +7 -0
  1378. package/src/bitbucket-client/models/RestDeploymentSetRequest.ts +28 -0
  1379. package/src/bitbucket-client/models/RestDetailedGroup.ts +7 -0
  1380. package/src/bitbucket-client/models/RestDetailedInvocation.ts +7 -0
  1381. package/src/bitbucket-client/models/RestDetailedUser.ts +7 -0
  1382. package/src/bitbucket-client/models/RestDiff.ts +7 -0
  1383. package/src/bitbucket-client/models/RestDiffHunk.ts +7 -0
  1384. package/src/bitbucket-client/models/RestDiffLine.ts +7 -0
  1385. package/src/bitbucket-client/models/RestDiffSegment.ts +7 -0
  1386. package/src/bitbucket-client/models/RestDiffStatsSummary.ts +7 -0
  1387. package/src/bitbucket-client/models/RestEmoticon.ts +7 -0
  1388. package/src/bitbucket-client/models/RestEnhancedEntityLink.ts +7 -0
  1389. package/src/bitbucket-client/models/RestErasedUser.ts +7 -0
  1390. package/src/bitbucket-client/models/RestErrorMessage.ts +7 -0
  1391. package/src/bitbucket-client/models/RestErrors.ts +7 -0
  1392. package/src/bitbucket-client/models/RestExportRequest.ts +13 -0
  1393. package/src/bitbucket-client/models/RestFarmSynchronizationRequest.ts +17 -0
  1394. package/src/bitbucket-client/models/RestGitTagCreateRequest.ts +18 -0
  1395. package/src/bitbucket-client/models/RestGpgKey.ts +7 -0
  1396. package/src/bitbucket-client/models/RestGpgSubKey.ts +7 -0
  1397. package/src/bitbucket-client/models/RestHookScript.ts +7 -0
  1398. package/src/bitbucket-client/models/RestHookScriptConfig.ts +7 -0
  1399. package/src/bitbucket-client/models/RestHookScriptTriggers.ts +8 -0
  1400. package/src/bitbucket-client/models/RestImportRequest.ts +8 -0
  1401. package/src/bitbucket-client/models/RestInsightAnnotation.ts +7 -0
  1402. package/src/bitbucket-client/models/RestInsightAnnotationsResponse.ts +7 -0
  1403. package/src/bitbucket-client/models/RestInsightReport.ts +7 -0
  1404. package/src/bitbucket-client/models/RestInsightReportData.ts +7 -0
  1405. package/src/bitbucket-client/models/RestInvocationHistory.ts +7 -0
  1406. package/src/bitbucket-client/models/RestInvocationRequest.ts +7 -0
  1407. package/src/bitbucket-client/models/RestInvocationResult.ts +7 -0
  1408. package/src/bitbucket-client/models/RestJiraIssue.ts +9 -0
  1409. package/src/bitbucket-client/models/RestJob.ts +7 -0
  1410. package/src/bitbucket-client/models/RestJobMessage.ts +7 -0
  1411. package/src/bitbucket-client/models/RestLabel.ts +7 -0
  1412. package/src/bitbucket-client/models/RestLabelable.ts +7 -0
  1413. package/src/bitbucket-client/models/RestLogLevel.ts +7 -0
  1414. package/src/bitbucket-client/models/RestLoggingSettings.ts +7 -0
  1415. package/src/bitbucket-client/models/RestMailConfiguration.ts +7 -0
  1416. package/src/bitbucket-client/models/RestMarkup.ts +7 -0
  1417. package/src/bitbucket-client/models/RestMeshConnectivityReport.ts +7 -0
  1418. package/src/bitbucket-client/models/RestMeshMigrationQueueStateCounts.ts +7 -0
  1419. package/src/bitbucket-client/models/RestMeshMigrationRequest.ts +14 -0
  1420. package/src/bitbucket-client/models/RestMeshMigrationSummary.ts +7 -0
  1421. package/src/bitbucket-client/models/RestMeshNode.ts +7 -0
  1422. package/src/bitbucket-client/models/RestMigrationRepository.ts +7 -0
  1423. package/src/bitbucket-client/models/RestMinimalCommit.ts +7 -0
  1424. package/src/bitbucket-client/models/RestMinimalRef.ts +7 -0
  1425. package/src/bitbucket-client/models/RestMirrorHashes.ts +7 -0
  1426. package/src/bitbucket-client/models/RestMirrorRepositorySynchronizationStatus.ts +7 -0
  1427. package/src/bitbucket-client/models/RestMirrorServer.ts +7 -0
  1428. package/src/bitbucket-client/models/RestMirrorUpgradeRequest.ts +9 -0
  1429. package/src/bitbucket-client/models/RestMirroredRepository.ts +7 -0
  1430. package/src/bitbucket-client/models/RestMirroredRepositoryDescriptor.ts +7 -0
  1431. package/src/bitbucket-client/models/RestMirroringRequest.ts +7 -0
  1432. package/src/bitbucket-client/models/RestMultilineCommentMarker.ts +7 -0
  1433. package/src/bitbucket-client/models/RestMultilineCommentSpan.ts +7 -0
  1434. package/src/bitbucket-client/models/RestMultipleBuildStats.ts +7 -0
  1435. package/src/bitbucket-client/models/RestNamedLink.ts +7 -0
  1436. package/src/bitbucket-client/models/RestNode.ts +7 -0
  1437. package/src/bitbucket-client/models/RestNodeConnectivityReport.ts +7 -0
  1438. package/src/bitbucket-client/models/RestNodeConnectivitySummary.ts +7 -0
  1439. package/src/bitbucket-client/models/RestPageIdpConfigEntity.ts +14 -0
  1440. package/src/bitbucket-client/models/RestPageLoginOptionEntity.ts +14 -0
  1441. package/src/bitbucket-client/models/RestPageRestChange.ts +7 -0
  1442. package/src/bitbucket-client/models/RestPath.ts +7 -0
  1443. package/src/bitbucket-client/models/RestPermitted.ts +7 -0
  1444. package/src/bitbucket-client/models/RestPermittedGroup.ts +7 -0
  1445. package/src/bitbucket-client/models/RestPermittedUser.ts +7 -0
  1446. package/src/bitbucket-client/models/RestPerson.ts +7 -0
  1447. package/src/bitbucket-client/models/RestProgress.ts +7 -0
  1448. package/src/bitbucket-client/models/RestProject.ts +7 -0
  1449. package/src/bitbucket-client/models/RestProjectSettingsRestriction.ts +7 -0
  1450. package/src/bitbucket-client/models/RestProjectSettingsRestrictionRequest.ts +10 -0
  1451. package/src/bitbucket-client/models/RestProperties.ts +7 -0
  1452. package/src/bitbucket-client/models/RestPullRequest.ts +7 -0
  1453. package/src/bitbucket-client/models/RestPullRequestActivity.ts +7 -0
  1454. package/src/bitbucket-client/models/RestPullRequestAssignParticipantRoleRequest.ts +30 -0
  1455. package/src/bitbucket-client/models/RestPullRequestAssignStatusRequest.ts +16 -0
  1456. package/src/bitbucket-client/models/RestPullRequestCommitMessageTemplate.ts +7 -0
  1457. package/src/bitbucket-client/models/RestPullRequestCondition.ts +7 -0
  1458. package/src/bitbucket-client/models/RestPullRequestDeclineRequest.ts +9 -0
  1459. package/src/bitbucket-client/models/RestPullRequestDeleteRequest.ts +8 -0
  1460. package/src/bitbucket-client/models/RestPullRequestFinishReviewRequest.ts +10 -0
  1461. package/src/bitbucket-client/models/RestPullRequestMergeConfig.ts +7 -0
  1462. package/src/bitbucket-client/models/RestPullRequestMergeRequest.ts +12 -0
  1463. package/src/bitbucket-client/models/RestPullRequestMergeStrategy.ts +7 -0
  1464. package/src/bitbucket-client/models/RestPullRequestMergeability.ts +7 -0
  1465. package/src/bitbucket-client/models/RestPullRequestParticipant.ts +7 -0
  1466. package/src/bitbucket-client/models/RestPullRequestRebaseRequest.ts +8 -0
  1467. package/src/bitbucket-client/models/RestPullRequestRebaseResult.ts +7 -0
  1468. package/src/bitbucket-client/models/RestPullRequestRebaseability.ts +7 -0
  1469. package/src/bitbucket-client/models/RestPullRequestRef.ts +7 -0
  1470. package/src/bitbucket-client/models/RestPullRequestReopenRequest.ts +8 -0
  1471. package/src/bitbucket-client/models/RestPullRequestSettings.ts +7 -0
  1472. package/src/bitbucket-client/models/RestPullRequestSuggestion.ts +7 -0
  1473. package/src/bitbucket-client/models/RestPushRefChange.ts +7 -0
  1474. package/src/bitbucket-client/models/RestRateLimitSettings.ts +7 -0
  1475. package/src/bitbucket-client/models/RestRawAccessToken.ts +7 -0
  1476. package/src/bitbucket-client/models/RestRefChange.ts +7 -0
  1477. package/src/bitbucket-client/models/RestRefMatcher.ts +7 -0
  1478. package/src/bitbucket-client/models/RestRefMatcherType.ts +7 -0
  1479. package/src/bitbucket-client/models/RestRefRestriction.ts +7 -0
  1480. package/src/bitbucket-client/models/RestRefSyncQueue.ts +10 -0
  1481. package/src/bitbucket-client/models/RestRefSyncRequest.ts +19 -0
  1482. package/src/bitbucket-client/models/RestRefSyncStatus.ts +7 -0
  1483. package/src/bitbucket-client/models/RestRejectedRef.ts +7 -0
  1484. package/src/bitbucket-client/models/RestRelatedLinks.ts +7 -0
  1485. package/src/bitbucket-client/models/RestRepositoriesExportRequest.ts +10 -0
  1486. package/src/bitbucket-client/models/RestRepository.ts +7 -0
  1487. package/src/bitbucket-client/models/RestRepositoryHook.ts +7 -0
  1488. package/src/bitbucket-client/models/RestRepositoryHookVeto.ts +7 -0
  1489. package/src/bitbucket-client/models/RestRepositoryLockOwner.ts +7 -0
  1490. package/src/bitbucket-client/models/RestRepositoryMirrorEvent.ts +16 -0
  1491. package/src/bitbucket-client/models/RestRepositoryPolicy.ts +7 -0
  1492. package/src/bitbucket-client/models/RestRepositoryPullRequestSettings.ts +7 -0
  1493. package/src/bitbucket-client/models/RestRepositoryRefChangeActivity.ts +7 -0
  1494. package/src/bitbucket-client/models/RestRepositorySelector.ts +9 -0
  1495. package/src/bitbucket-client/models/RestRequiredBuildCondition.ts +7 -0
  1496. package/src/bitbucket-client/models/RestRequiredBuildConditionSetRequest.ts +31 -0
  1497. package/src/bitbucket-client/models/RestRestrictionRequest.ts +44 -0
  1498. package/src/bitbucket-client/models/RestReviewerGroup.ts +7 -0
  1499. package/src/bitbucket-client/models/RestRollingUpgradeState.ts +7 -0
  1500. package/src/bitbucket-client/models/RestScope.ts +7 -0
  1501. package/src/bitbucket-client/models/RestScopesExample.ts +7 -0
  1502. package/src/bitbucket-client/models/RestSecretScanningAllowlistRule.ts +7 -0
  1503. package/src/bitbucket-client/models/RestSecretScanningAllowlistRuleSetRequest.ts +19 -0
  1504. package/src/bitbucket-client/models/RestSecretScanningRule.ts +7 -0
  1505. package/src/bitbucket-client/models/RestSecretScanningRuleSetRequest.ts +19 -0
  1506. package/src/bitbucket-client/models/RestSetInsightReportRequest.ts +18 -0
  1507. package/src/bitbucket-client/models/RestSingleAddInsightAnnotationRequest.ts +14 -0
  1508. package/src/bitbucket-client/models/RestSshAccessKey.ts +7 -0
  1509. package/src/bitbucket-client/models/RestSshAccessKeyLocations.ts +12 -0
  1510. package/src/bitbucket-client/models/RestSshCredentials.ts +16 -0
  1511. package/src/bitbucket-client/models/RestSshKey.ts +7 -0
  1512. package/src/bitbucket-client/models/RestSshKeySettings.ts +7 -0
  1513. package/src/bitbucket-client/models/RestSshKeyTypeRestriction.ts +7 -0
  1514. package/src/bitbucket-client/models/RestSshSettings.ts +7 -0
  1515. package/src/bitbucket-client/models/RestSyncProgress.ts +7 -0
  1516. package/src/bitbucket-client/models/RestSystemSigningConfiguration.ts +7 -0
  1517. package/src/bitbucket-client/models/RestTag.ts +7 -0
  1518. package/src/bitbucket-client/models/RestTestResults.ts +7 -0
  1519. package/src/bitbucket-client/models/RestTokenBucketSettings.ts +7 -0
  1520. package/src/bitbucket-client/models/RestUpstreamServer.ts +7 -0
  1521. package/src/bitbucket-client/models/RestUpstreamSettings.ts +7 -0
  1522. package/src/bitbucket-client/models/RestUserDirectory.ts +7 -0
  1523. package/src/bitbucket-client/models/RestUserRateLimitSettings.ts +7 -0
  1524. package/src/bitbucket-client/models/RestUserRateLimitSettingsUpdateRequest.ts +12 -0
  1525. package/src/bitbucket-client/models/RestUserReaction.ts +7 -0
  1526. package/src/bitbucket-client/models/RestUsernamePasswordCredentials.ts +9 -0
  1527. package/src/bitbucket-client/models/RestWebhook.ts +7 -0
  1528. package/src/bitbucket-client/models/RestWebhookCredentials.ts +7 -0
  1529. package/src/bitbucket-client/models/RestWebhookRequestResponse.ts +7 -0
  1530. package/src/bitbucket-client/models/RestWebhookScope.ts +7 -0
  1531. package/src/bitbucket-client/models/RestX509Certificate.ts +7 -0
  1532. package/src/bitbucket-client/models/Scope.ts +16 -0
  1533. package/src/bitbucket-client/models/SimpleSshKeyFingerprint.ts +7 -0
  1534. package/src/bitbucket-client/models/SsoConfigEntity.ts +7 -0
  1535. package/src/bitbucket-client/models/SsoManagementStatusDTO.ts +7 -0
  1536. package/src/bitbucket-client/models/StatusDTO.ts +7 -0
  1537. package/src/bitbucket-client/models/TotpCodeVerificationDTO.ts +9 -0
  1538. package/src/bitbucket-client/models/TotpElevationRestDTO.ts +8 -0
  1539. package/src/bitbucket-client/models/TotpRecoveryCodeAuthenticationDTO.ts +9 -0
  1540. package/src/bitbucket-client/models/TotpRecoveryCodeDTO.ts +7 -0
  1541. package/src/bitbucket-client/models/TotpUserEnrollmentDTO.ts +7 -0
  1542. package/src/bitbucket-client/models/UserAndGroups.ts +9 -0
  1543. package/src/bitbucket-client/models/UserPasswordUpdate.ts +10 -0
  1544. package/src/bitbucket-client/models/UserPickerContext.ts +9 -0
  1545. package/src/bitbucket-client/models/UserRename.ts +9 -0
  1546. package/src/bitbucket-client/models/UserUpdate.ts +10 -0
  1547. package/src/bitbucket-client/models/UserUpdateWithCredentials.ts +14 -0
  1548. package/src/bitbucket-client/services/AuthenticationService.ts +1652 -0
  1549. package/src/bitbucket-client/services/BuildsAndDeploymentsService.ts +849 -0
  1550. package/src/bitbucket-client/services/CapabilitiesService.ts +38 -0
  1551. package/src/bitbucket-client/services/DashboardService.ts +96 -0
  1552. package/src/bitbucket-client/services/DefaultService.ts +46 -0
  1553. package/src/bitbucket-client/services/DeprecatedService.ts +396 -0
  1554. package/src/bitbucket-client/services/JiraIntegrationService.ts +133 -0
  1555. package/src/bitbucket-client/services/MarkupService.ts +48 -0
  1556. package/src/bitbucket-client/services/MirroringMirrorService.ts +421 -0
  1557. package/src/bitbucket-client/services/MirroringUpstreamService.ts +487 -0
  1558. package/src/bitbucket-client/services/PermissionManagementService.ts +1484 -0
  1559. package/src/bitbucket-client/services/ProjectService.ts +2502 -0
  1560. package/src/bitbucket-client/services/PullRequestsService.ts +2997 -0
  1561. package/src/bitbucket-client/services/RepositoryService.ts +3944 -0
  1562. package/src/bitbucket-client/services/SecurityService.ts +1253 -0
  1563. package/src/bitbucket-client/services/SystemMaintenanceService.ts +2279 -0
  1564. package/src/bitbucket-response-mapper.ts +127 -0
  1565. package/src/bitbucket-service.ts +3069 -0
  1566. package/src/config.ts +29 -0
  1567. package/src/inbox-pr-mapper.ts +183 -0
  1568. package/src/index.ts +811 -0
  1569. package/src/pr-changes-mapper.ts +216 -0
  1570. package/src/pr-comment-mapper.ts +399 -0
  1571. package/src/setup.ts +15 -0
  1572. package/tsconfig.json +12 -0
  1573. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,4626 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { initializeRuntimeConfig } from 'datacenter-mcp-core';
5
+ import { BitbucketService } from '../bitbucket-service.js';
6
+ import { BuildsAndDeploymentsService, DeprecatedService, ProjectService, PullRequestsService, RepositoryService } from '../bitbucket-client/index.js';
7
+ import { request as mockRequest } from '../bitbucket-client/core/request.js';
8
+
9
+ // Mock the request function
10
+ jest.mock('../bitbucket-client/core/request.js', () => ({
11
+ request: jest.fn()
12
+ }));
13
+
14
+ // Mock the PullRequestsService
15
+ jest.mock('../bitbucket-client/index.js', () => ({
16
+ PullRequestsService: {
17
+ streamRawDiff2: jest.fn(),
18
+ createComment2: jest.fn(),
19
+ updateComment2: jest.fn(),
20
+ streamChanges1: jest.fn(),
21
+ create: jest.fn(),
22
+ update: jest.fn(),
23
+ updateStatus: jest.fn(),
24
+ getPage: jest.fn(),
25
+ getReviewers: jest.fn(),
26
+ get3: jest.fn(),
27
+ getPullRequestConditions1: jest.fn(),
28
+ createPullRequestCondition1: jest.fn(),
29
+ updatePullRequestCondition1: jest.fn(),
30
+ deletePullRequestCondition1: jest.fn(),
31
+ canMerge: jest.fn(),
32
+ merge: jest.fn(),
33
+ decline: jest.fn(),
34
+ reopen: jest.fn(),
35
+ deleteComment2: jest.fn(),
36
+ applySuggestion: jest.fn(),
37
+ watch1: jest.fn(),
38
+ unwatch1: jest.fn(),
39
+ assignParticipantRole: jest.fn(),
40
+ unassignParticipantRole: jest.fn()
41
+ },
42
+ RepositoryService: {
43
+ getRestrictions1: jest.fn(),
44
+ createRestrictions1: jest.fn(),
45
+ getRestriction1: jest.fn(),
46
+ deleteRestriction1: jest.fn(),
47
+ createBranch: jest.fn(),
48
+ deleteBranch: jest.fn(),
49
+ getBranches: jest.fn(),
50
+ getDefaultBranch1: jest.fn(),
51
+ getComments: jest.fn(),
52
+ createComment: jest.fn(),
53
+ getCommit: jest.fn(),
54
+ streamDiff: jest.fn(),
55
+ streamCommits: jest.fn(),
56
+ streamChanges: jest.fn(),
57
+ streamRaw: jest.fn(),
58
+ getContent1: jest.fn(),
59
+ editFile: jest.fn(),
60
+ getTags: jest.fn(),
61
+ getTag: jest.fn(),
62
+ createTagForRepository: jest.fn(),
63
+ findWebhooks1: jest.fn(),
64
+ getWebhook1: jest.fn(),
65
+ createWebhook1: jest.fn(),
66
+ updateWebhook1: jest.fn(),
67
+ deleteWebhook1: jest.fn()
68
+ },
69
+ DeprecatedService: {
70
+ getBuildStatus: jest.fn()
71
+ },
72
+ BuildsAndDeploymentsService: {
73
+ add: jest.fn(),
74
+ get: jest.fn(),
75
+ setACodeInsightsReport: jest.fn(),
76
+ getACodeInsightsReport: jest.fn(),
77
+ deleteACodeInsightsReport: jest.fn(),
78
+ addAnnotations: jest.fn(),
79
+ getAnnotations: jest.fn(),
80
+ deleteAnnotations: jest.fn(),
81
+ getPageOfRequiredBuildsMergeChecks: jest.fn(),
82
+ createRequiredBuildsMergeCheck: jest.fn(),
83
+ updateRequiredBuildsMergeCheck: jest.fn(),
84
+ deleteRequiredBuildsMergeCheck: jest.fn()
85
+ },
86
+ ProjectService: {
87
+ createProject: jest.fn(),
88
+ updateProject: jest.fn(),
89
+ deleteProject: jest.fn(),
90
+ createRepository: jest.fn(),
91
+ updateRepository: jest.fn(),
92
+ forkRepository: jest.fn(),
93
+ deleteRepository: jest.fn()
94
+ },
95
+ OpenAPI: {
96
+ BASE: '',
97
+ TOKEN: '',
98
+ VERSION: ''
99
+ }
100
+ }));
101
+
102
+ describe('BitbucketService', () => {
103
+ let bitbucketService: BitbucketService;
104
+ const mockProjectKey = 'TEST';
105
+ const mockRepositorySlug = 'test-repo';
106
+ const mockPullRequestId = '123';
107
+ let tempHome: string;
108
+ let homedirSpy: jest.SpyInstance;
109
+ const originalPlatform = process.platform;
110
+
111
+ beforeEach(() => {
112
+ tempHome = fs.mkdtempSync(path.join(os.tmpdir(), 'bitbucket-service-home-'));
113
+ homedirSpy = jest.spyOn(os, 'homedir').mockReturnValue(tempHome);
114
+ Object.defineProperty(process, 'platform', { value: 'linux', configurable: true });
115
+ initializeRuntimeConfig();
116
+ bitbucketService = new BitbucketService('test-host', 'test-token');
117
+ jest.clearAllMocks();
118
+ });
119
+
120
+ afterEach(() => {
121
+ homedirSpy.mockRestore();
122
+ Object.defineProperty(process, 'platform', { value: originalPlatform, configurable: true });
123
+ fs.rmSync(tempHome, { recursive: true, force: true });
124
+ });
125
+
126
+ describe('getPullRequestChanges', () => {
127
+ it('should successfully get PR changes', async () => {
128
+ const mockChangesData = {
129
+ values: [
130
+ { path: { toString: 'file.txt' }, type: 'MODIFY' }
131
+ ],
132
+ size: 1,
133
+ isLastPage: true
134
+ };
135
+ (PullRequestsService.streamChanges1 as jest.Mock).mockResolvedValue(mockChangesData);
136
+
137
+ const result = await bitbucketService.getPullRequestChanges(
138
+ mockProjectKey,
139
+ mockRepositorySlug,
140
+ mockPullRequestId
141
+ );
142
+
143
+ expect(result.success).toBe(true);
144
+ expect(result.data).toBe(mockChangesData);
145
+ expect(PullRequestsService.streamChanges1).toHaveBeenCalledWith(
146
+ mockProjectKey,
147
+ mockPullRequestId,
148
+ mockRepositorySlug,
149
+ undefined,
150
+ undefined,
151
+ undefined,
152
+ undefined,
153
+ undefined,
154
+ 25
155
+ );
156
+ });
157
+
158
+ it('should successfully get PR changes with all parameters', async () => {
159
+ const mockChangesData = {
160
+ values: [
161
+ { path: { toString: 'file.txt' }, type: 'MODIFY' }
162
+ ],
163
+ size: 1,
164
+ isLastPage: true
165
+ };
166
+ (PullRequestsService.streamChanges1 as jest.Mock).mockResolvedValue(mockChangesData);
167
+
168
+ const result = await bitbucketService.getPullRequestChanges(
169
+ mockProjectKey,
170
+ mockRepositorySlug,
171
+ mockPullRequestId,
172
+ 'abc123',
173
+ 'RANGE',
174
+ 'def456',
175
+ 'true',
176
+ 0,
177
+ 50
178
+ );
179
+
180
+ expect(result.success).toBe(true);
181
+ expect(result.data).toBe(mockChangesData);
182
+ expect(PullRequestsService.streamChanges1).toHaveBeenCalledWith(
183
+ mockProjectKey,
184
+ mockPullRequestId,
185
+ mockRepositorySlug,
186
+ 'abc123',
187
+ 'RANGE',
188
+ 'def456',
189
+ 'true',
190
+ 0,
191
+ 50
192
+ );
193
+ });
194
+
195
+ it('should handle API errors gracefully', async () => {
196
+ const mockError = new Error('API Error');
197
+ (PullRequestsService.streamChanges1 as jest.Mock).mockRejectedValue(mockError);
198
+
199
+ const result = await bitbucketService.getPullRequestChanges(
200
+ mockProjectKey,
201
+ mockRepositorySlug,
202
+ mockPullRequestId
203
+ );
204
+
205
+ expect(result.success).toBe(false);
206
+ expect(result.error).toBe('API Error');
207
+ });
208
+ });
209
+
210
+ describe('createBranch', () => {
211
+ it('should successfully create a branch', async () => {
212
+ const mockBranch = { id: 'refs/heads/feature/login', displayId: 'feature/login' };
213
+ (RepositoryService.createBranch as jest.Mock).mockResolvedValue(mockBranch);
214
+
215
+ const result = await bitbucketService.createBranch(
216
+ mockProjectKey,
217
+ mockRepositorySlug,
218
+ 'feature/login',
219
+ 'refs/heads/master'
220
+ );
221
+
222
+ expect(result.success).toBe(true);
223
+ expect(result.data).toBe(mockBranch);
224
+ expect(RepositoryService.createBranch).toHaveBeenCalledWith(
225
+ mockProjectKey,
226
+ mockRepositorySlug,
227
+ { name: 'feature/login', startPoint: 'refs/heads/master' }
228
+ );
229
+ });
230
+
231
+ it('should handle API errors gracefully', async () => {
232
+ (RepositoryService.createBranch as jest.Mock).mockRejectedValue(new Error('API Error'));
233
+ const result = await bitbucketService.createBranch(
234
+ mockProjectKey,
235
+ mockRepositorySlug,
236
+ 'feature/login',
237
+ 'refs/heads/master'
238
+ );
239
+ expect(result.success).toBe(false);
240
+ expect(result.error).toBe('API Error');
241
+ });
242
+ });
243
+
244
+ describe('addPullRequestReviewer', () => {
245
+ it('should add a reviewer to a pull request', async () => {
246
+ const mockParticipant = { user: { name: 'reviewer1' }, role: 'REVIEWER' };
247
+ (PullRequestsService.assignParticipantRole as jest.Mock).mockResolvedValue(mockParticipant);
248
+
249
+ const result = await bitbucketService.addPullRequestReviewer(
250
+ mockProjectKey,
251
+ mockRepositorySlug,
252
+ mockPullRequestId,
253
+ 'reviewer1'
254
+ );
255
+
256
+ expect(result.success).toBe(true);
257
+ expect(result.data).toBe(mockParticipant);
258
+ expect(PullRequestsService.assignParticipantRole).toHaveBeenCalledWith(
259
+ mockProjectKey,
260
+ mockPullRequestId,
261
+ mockRepositorySlug,
262
+ { user: { name: 'reviewer1' }, role: 'REVIEWER' }
263
+ );
264
+ });
265
+
266
+ it('should handle API errors gracefully', async () => {
267
+ (PullRequestsService.assignParticipantRole as jest.Mock).mockRejectedValue(new Error('API Error'));
268
+ const result = await bitbucketService.addPullRequestReviewer(
269
+ mockProjectKey,
270
+ mockRepositorySlug,
271
+ mockPullRequestId,
272
+ 'reviewer1'
273
+ );
274
+ expect(result.success).toBe(false);
275
+ expect(result.error).toBe('API Error');
276
+ });
277
+ });
278
+
279
+ describe('removePullRequestReviewer', () => {
280
+ it('should remove a reviewer from a pull request', async () => {
281
+ (PullRequestsService.unassignParticipantRole as jest.Mock).mockResolvedValue(undefined);
282
+
283
+ const result = await bitbucketService.removePullRequestReviewer(
284
+ mockProjectKey,
285
+ mockRepositorySlug,
286
+ mockPullRequestId,
287
+ 'reviewer1'
288
+ );
289
+
290
+ expect(result.success).toBe(true);
291
+ expect(result.data).toEqual({ removed: true, userSlug: 'reviewer1' });
292
+ expect(PullRequestsService.unassignParticipantRole).toHaveBeenCalledWith(
293
+ mockProjectKey,
294
+ 'reviewer1',
295
+ mockPullRequestId,
296
+ mockRepositorySlug
297
+ );
298
+ });
299
+
300
+ it('should handle API errors gracefully', async () => {
301
+ (PullRequestsService.unassignParticipantRole as jest.Mock).mockRejectedValue(new Error('API Error'));
302
+ const result = await bitbucketService.removePullRequestReviewer(
303
+ mockProjectKey,
304
+ mockRepositorySlug,
305
+ mockPullRequestId,
306
+ 'reviewer1'
307
+ );
308
+ expect(result.success).toBe(false);
309
+ expect(result.error).toBe('API Error');
310
+ });
311
+ });
312
+
313
+ describe('getFileContent', () => {
314
+ it('should successfully get raw file content', async () => {
315
+ const mockContent = 'const x = 1;\nconst y = 2;\n';
316
+ (RepositoryService.streamRaw as jest.Mock).mockResolvedValue(mockContent);
317
+
318
+ const result = await bitbucketService.getFileContent(
319
+ mockProjectKey,
320
+ mockRepositorySlug,
321
+ 'src/index.ts'
322
+ );
323
+
324
+ expect(result.success).toBe(true);
325
+ expect(result.data).toBe(mockContent);
326
+ expect(RepositoryService.streamRaw).toHaveBeenCalledWith(
327
+ 'src/index.ts',
328
+ mockProjectKey,
329
+ mockRepositorySlug,
330
+ undefined
331
+ );
332
+ });
333
+
334
+ it('should pass the at ref through', async () => {
335
+ const mockContent = 'file content';
336
+ (RepositoryService.streamRaw as jest.Mock).mockResolvedValue(mockContent);
337
+
338
+ await bitbucketService.getFileContent(
339
+ mockProjectKey,
340
+ mockRepositorySlug,
341
+ 'README.md',
342
+ 'refs/heads/main'
343
+ );
344
+
345
+ expect(RepositoryService.streamRaw).toHaveBeenCalledWith(
346
+ 'README.md',
347
+ mockProjectKey,
348
+ mockRepositorySlug,
349
+ 'refs/heads/main'
350
+ );
351
+ });
352
+
353
+ it('should handle API errors gracefully', async () => {
354
+ const mockError = new Error('The repository does not exist.');
355
+ (RepositoryService.streamRaw as jest.Mock).mockRejectedValue(mockError);
356
+
357
+ const result = await bitbucketService.getFileContent(
358
+ mockProjectKey,
359
+ mockRepositorySlug,
360
+ 'missing.txt'
361
+ );
362
+
363
+ expect(result.success).toBe(false);
364
+ expect(result.error).toBe('The repository does not exist.');
365
+ });
366
+ });
367
+
368
+ describe('browseRepository', () => {
369
+ it('should browse the repository root by default', async () => {
370
+ const mockBrowse = { children: { values: [{ path: { toString: 'src' }, type: 'DIRECTORY' }] } };
371
+ (RepositoryService.getContent1 as jest.Mock).mockResolvedValue(mockBrowse);
372
+
373
+ const result = await bitbucketService.browseRepository(
374
+ mockProjectKey,
375
+ mockRepositorySlug
376
+ );
377
+
378
+ expect(result.success).toBe(true);
379
+ expect(result.data).toBe(mockBrowse);
380
+ expect(RepositoryService.getContent1).toHaveBeenCalledWith(
381
+ '',
382
+ mockProjectKey,
383
+ mockRepositorySlug,
384
+ undefined, // noContent
385
+ undefined, // at
386
+ undefined, // size
387
+ undefined, // blame
388
+ undefined // type
389
+ );
390
+ });
391
+
392
+ it('should map path, at, type and blame to the generated client', async () => {
393
+ const mockBrowse = { type: 'FILE' };
394
+ (RepositoryService.getContent1 as jest.Mock).mockResolvedValue(mockBrowse);
395
+
396
+ await bitbucketService.browseRepository(
397
+ mockProjectKey,
398
+ mockRepositorySlug,
399
+ 'src/index.ts',
400
+ 'refs/heads/main',
401
+ true,
402
+ true
403
+ );
404
+
405
+ expect(RepositoryService.getContent1).toHaveBeenCalledWith(
406
+ 'src/index.ts',
407
+ mockProjectKey,
408
+ mockRepositorySlug,
409
+ undefined,
410
+ 'refs/heads/main',
411
+ undefined,
412
+ 'true', // blame
413
+ 'true' // type
414
+ );
415
+ });
416
+
417
+ it('should handle API errors gracefully', async () => {
418
+ const mockError = new Error('API Error');
419
+ (RepositoryService.getContent1 as jest.Mock).mockRejectedValue(mockError);
420
+
421
+ const result = await bitbucketService.browseRepository(
422
+ mockProjectKey,
423
+ mockRepositorySlug,
424
+ 'src'
425
+ );
426
+
427
+ expect(result.success).toBe(false);
428
+ expect(result.error).toBe('API Error');
429
+ });
430
+ });
431
+
432
+ describe('Code Insights', () => {
433
+ const commitId = 'abc123';
434
+ const key = 'mycompany.eslint';
435
+
436
+ it('setInsightReport should PUT the report', async () => {
437
+ const mockReport = { key, title: 'ESLint' };
438
+ (BuildsAndDeploymentsService.setACodeInsightsReport as jest.Mock).mockResolvedValue(mockReport);
439
+ const report = { title: 'ESLint', result: 'PASS' };
440
+
441
+ const result = await bitbucketService.setInsightReport(mockProjectKey, mockRepositorySlug, commitId, key, report);
442
+
443
+ expect(result.success).toBe(true);
444
+ expect(result.data).toBe(mockReport);
445
+ expect(BuildsAndDeploymentsService.setACodeInsightsReport).toHaveBeenCalledWith(
446
+ mockProjectKey,
447
+ commitId,
448
+ mockRepositorySlug,
449
+ key,
450
+ report
451
+ );
452
+ });
453
+
454
+ it('getInsightReport should GET the report', async () => {
455
+ (BuildsAndDeploymentsService.getACodeInsightsReport as jest.Mock).mockResolvedValue({ key });
456
+ const result = await bitbucketService.getInsightReport(mockProjectKey, mockRepositorySlug, commitId, key);
457
+ expect(result.success).toBe(true);
458
+ expect(BuildsAndDeploymentsService.getACodeInsightsReport).toHaveBeenCalledWith(
459
+ mockProjectKey, commitId, mockRepositorySlug, key
460
+ );
461
+ });
462
+
463
+ it('deleteInsightReport should DELETE and ack', async () => {
464
+ (BuildsAndDeploymentsService.deleteACodeInsightsReport as jest.Mock).mockResolvedValue(undefined);
465
+ const result = await bitbucketService.deleteInsightReport(mockProjectKey, mockRepositorySlug, commitId, key);
466
+ expect(result.success).toBe(true);
467
+ expect(result.data).toEqual({ deleted: true, key });
468
+ });
469
+
470
+ it('addInsightAnnotations should POST {annotations} and ack with count', async () => {
471
+ (BuildsAndDeploymentsService.addAnnotations as jest.Mock).mockResolvedValue(undefined);
472
+ const annotations = [
473
+ { externalId: 'a1', path: 'app.js', line: 3, message: 'x', severity: 'HIGH' },
474
+ { externalId: 'a2', path: 'app.js', line: 9, message: 'y', severity: 'LOW' }
475
+ ];
476
+ const result = await bitbucketService.addInsightAnnotations(mockProjectKey, mockRepositorySlug, commitId, key, annotations);
477
+ expect(result.success).toBe(true);
478
+ expect(result.data).toEqual({ added: 2, key });
479
+ expect(BuildsAndDeploymentsService.addAnnotations).toHaveBeenCalledWith(
480
+ mockProjectKey, commitId, mockRepositorySlug, key, { annotations }
481
+ );
482
+ });
483
+
484
+ it('getInsightAnnotations should GET annotations', async () => {
485
+ (BuildsAndDeploymentsService.getAnnotations as jest.Mock).mockResolvedValue({ annotations: [] });
486
+ const result = await bitbucketService.getInsightAnnotations(mockProjectKey, mockRepositorySlug, commitId, key);
487
+ expect(result.success).toBe(true);
488
+ expect(BuildsAndDeploymentsService.getAnnotations).toHaveBeenCalledWith(
489
+ mockProjectKey, commitId, mockRepositorySlug, key
490
+ );
491
+ });
492
+
493
+ it('deleteInsightAnnotations should pass externalId and ack', async () => {
494
+ (BuildsAndDeploymentsService.deleteAnnotations as jest.Mock).mockResolvedValue(undefined);
495
+ const result = await bitbucketService.deleteInsightAnnotations(mockProjectKey, mockRepositorySlug, commitId, key, 'a1');
496
+ expect(result.success).toBe(true);
497
+ expect(result.data).toEqual({ deleted: true, key, externalId: 'a1' });
498
+ expect(BuildsAndDeploymentsService.deleteAnnotations).toHaveBeenCalledWith(
499
+ mockProjectKey, commitId, mockRepositorySlug, key, 'a1'
500
+ );
501
+ });
502
+
503
+ it('should handle API errors gracefully', async () => {
504
+ (BuildsAndDeploymentsService.getACodeInsightsReport as jest.Mock).mockRejectedValue(new Error('API Error'));
505
+ const result = await bitbucketService.getInsightReport(mockProjectKey, mockRepositorySlug, commitId, key);
506
+ expect(result.success).toBe(false);
507
+ expect(result.error).toBe('API Error');
508
+ });
509
+ });
510
+
511
+ describe('deleteBranch', () => {
512
+ it('should successfully delete a branch', async () => {
513
+ (RepositoryService.deleteBranch as jest.Mock).mockResolvedValue(undefined);
514
+
515
+ const result = await bitbucketService.deleteBranch(
516
+ mockProjectKey,
517
+ mockRepositorySlug,
518
+ 'refs/heads/feature/login'
519
+ );
520
+
521
+ expect(result.success).toBe(true);
522
+ expect(result.data).toEqual({ deleted: true, name: 'refs/heads/feature/login' });
523
+ expect(RepositoryService.deleteBranch).toHaveBeenCalledWith(
524
+ mockProjectKey,
525
+ mockRepositorySlug,
526
+ { name: 'refs/heads/feature/login' }
527
+ );
528
+ });
529
+
530
+ it('should pass dryRun through and report not-deleted', async () => {
531
+ (RepositoryService.deleteBranch as jest.Mock).mockResolvedValue(undefined);
532
+
533
+ const result = await bitbucketService.deleteBranch(
534
+ mockProjectKey,
535
+ mockRepositorySlug,
536
+ 'refs/heads/feature/login',
537
+ true
538
+ );
539
+
540
+ expect(result.success).toBe(true);
541
+ expect(result.data).toEqual({ deleted: false, name: 'refs/heads/feature/login' });
542
+ expect(RepositoryService.deleteBranch).toHaveBeenCalledWith(
543
+ mockProjectKey,
544
+ mockRepositorySlug,
545
+ { name: 'refs/heads/feature/login', dryRun: true }
546
+ );
547
+ });
548
+
549
+ it('should handle API errors gracefully', async () => {
550
+ (RepositoryService.deleteBranch as jest.Mock).mockRejectedValue(new Error('API Error'));
551
+ const result = await bitbucketService.deleteBranch(
552
+ mockProjectKey,
553
+ mockRepositorySlug,
554
+ 'refs/heads/feature/login'
555
+ );
556
+ expect(result.success).toBe(false);
557
+ expect(result.error).toBe('API Error');
558
+ });
559
+ });
560
+
561
+ describe('getBranches', () => {
562
+ it('should successfully get branches with default parameters', async () => {
563
+ const mockBranchesData = {
564
+ values: [
565
+ { id: 'refs/heads/main', displayId: 'main', isDefault: true },
566
+ { id: 'refs/heads/feature', displayId: 'feature', isDefault: false }
567
+ ],
568
+ size: 2,
569
+ isLastPage: true
570
+ };
571
+ (RepositoryService.getBranches as jest.Mock).mockResolvedValue(mockBranchesData);
572
+
573
+ const result = await bitbucketService.getBranches(
574
+ mockProjectKey,
575
+ mockRepositorySlug
576
+ );
577
+
578
+ expect(result.success).toBe(true);
579
+ expect(result.data).toBe(mockBranchesData);
580
+ expect(RepositoryService.getBranches).toHaveBeenCalledWith(
581
+ mockProjectKey,
582
+ mockRepositorySlug,
583
+ undefined, // boostMatches
584
+ undefined, // context
585
+ undefined, // orderBy
586
+ undefined, // details
587
+ undefined, // filterText
588
+ undefined, // base
589
+ undefined, // start
590
+ 25
591
+ );
592
+ });
593
+
594
+ it('should pass filterText, orderBy and pagination through', async () => {
595
+ const mockBranchesData = { values: [], size: 0, isLastPage: true };
596
+ (RepositoryService.getBranches as jest.Mock).mockResolvedValue(mockBranchesData);
597
+
598
+ await bitbucketService.getBranches(
599
+ mockProjectKey,
600
+ mockRepositorySlug,
601
+ 'feat',
602
+ 'MODIFICATION',
603
+ 10,
604
+ 50
605
+ );
606
+
607
+ expect(RepositoryService.getBranches).toHaveBeenCalledWith(
608
+ mockProjectKey,
609
+ mockRepositorySlug,
610
+ undefined,
611
+ undefined,
612
+ 'MODIFICATION',
613
+ undefined,
614
+ 'feat',
615
+ undefined,
616
+ 10,
617
+ 50
618
+ );
619
+ });
620
+
621
+ it('should handle API errors gracefully', async () => {
622
+ const mockError = new Error('API Error');
623
+ (RepositoryService.getBranches as jest.Mock).mockRejectedValue(mockError);
624
+
625
+ const result = await bitbucketService.getBranches(
626
+ mockProjectKey,
627
+ mockRepositorySlug
628
+ );
629
+
630
+ expect(result.success).toBe(false);
631
+ expect(result.error).toBe('API Error');
632
+ });
633
+ });
634
+
635
+ describe('getTags', () => {
636
+ it('should get tags with default parameters', async () => {
637
+ const mockTags = { values: [{ id: 'refs/tags/v1', displayId: 'v1' }], isLastPage: true };
638
+ (RepositoryService.getTags as jest.Mock).mockResolvedValue(mockTags);
639
+
640
+ const result = await bitbucketService.getTags(mockProjectKey, mockRepositorySlug);
641
+
642
+ expect(result.success).toBe(true);
643
+ expect(result.data).toBe(mockTags);
644
+ expect(RepositoryService.getTags).toHaveBeenCalledWith(
645
+ mockProjectKey,
646
+ mockRepositorySlug,
647
+ undefined, // orderBy
648
+ undefined, // filterText
649
+ undefined, // start
650
+ 25
651
+ );
652
+ });
653
+
654
+ it('should pass filterText, orderBy and pagination through', async () => {
655
+ (RepositoryService.getTags as jest.Mock).mockResolvedValue({ values: [] });
656
+ await bitbucketService.getTags(mockProjectKey, mockRepositorySlug, 'rel', 'MODIFICATION', 5, 50);
657
+ expect(RepositoryService.getTags).toHaveBeenCalledWith(
658
+ mockProjectKey,
659
+ mockRepositorySlug,
660
+ 'MODIFICATION',
661
+ 'rel',
662
+ 5,
663
+ 50
664
+ );
665
+ });
666
+
667
+ it('should handle API errors gracefully', async () => {
668
+ (RepositoryService.getTags as jest.Mock).mockRejectedValue(new Error('API Error'));
669
+ const result = await bitbucketService.getTags(mockProjectKey, mockRepositorySlug);
670
+ expect(result.success).toBe(false);
671
+ expect(result.error).toBe('API Error');
672
+ });
673
+ });
674
+
675
+ describe('getCommitComments', () => {
676
+ it('should get commit comments for a path', async () => {
677
+ const mockComments = { values: [{ id: 1, text: 'looks good' }], isLastPage: true };
678
+ (RepositoryService.getComments as jest.Mock).mockResolvedValue(mockComments);
679
+
680
+ const result = await bitbucketService.getCommitComments(mockProjectKey, mockRepositorySlug, 'abc123', 'src/app.js');
681
+
682
+ expect(result.success).toBe(true);
683
+ expect(result.data).toBe(mockComments);
684
+ expect(RepositoryService.getComments).toHaveBeenCalledWith(
685
+ mockProjectKey,
686
+ 'abc123',
687
+ mockRepositorySlug,
688
+ 'src/app.js',
689
+ undefined, // since
690
+ undefined, // start
691
+ 25
692
+ );
693
+ });
694
+
695
+ it('should pass since and pagination through', async () => {
696
+ (RepositoryService.getComments as jest.Mock).mockResolvedValue({ values: [] });
697
+ await bitbucketService.getCommitComments(mockProjectKey, mockRepositorySlug, 'abc123', 'src/app.js', 'def456', 5, 50);
698
+ expect(RepositoryService.getComments).toHaveBeenCalledWith(
699
+ mockProjectKey,
700
+ 'abc123',
701
+ mockRepositorySlug,
702
+ 'src/app.js',
703
+ 'def456',
704
+ 5,
705
+ 50
706
+ );
707
+ });
708
+
709
+ it('should handle API errors gracefully', async () => {
710
+ (RepositoryService.getComments as jest.Mock).mockRejectedValue(new Error('API Error'));
711
+ const result = await bitbucketService.getCommitComments(mockProjectKey, mockRepositorySlug, 'abc123', 'src/app.js');
712
+ expect(result.success).toBe(false);
713
+ expect(result.error).toBe('API Error');
714
+ });
715
+ });
716
+
717
+ describe('getTag', () => {
718
+ it('should get a single tag by name', async () => {
719
+ const mockTag = { id: 'refs/tags/v1', displayId: 'v1' };
720
+ (RepositoryService.getTag as jest.Mock).mockResolvedValue(mockTag);
721
+
722
+ const result = await bitbucketService.getTag(mockProjectKey, mockRepositorySlug, 'v1');
723
+
724
+ expect(result.success).toBe(true);
725
+ expect(result.data).toBe(mockTag);
726
+ expect(RepositoryService.getTag).toHaveBeenCalledWith(
727
+ mockProjectKey,
728
+ 'v1',
729
+ mockRepositorySlug
730
+ );
731
+ });
732
+
733
+ it('should handle API errors gracefully', async () => {
734
+ (RepositoryService.getTag as jest.Mock).mockRejectedValue(new Error('API Error'));
735
+ const result = await bitbucketService.getTag(mockProjectKey, mockRepositorySlug, 'v1');
736
+ expect(result.success).toBe(false);
737
+ expect(result.error).toBe('API Error');
738
+ });
739
+ });
740
+
741
+ describe('getDefaultBranch', () => {
742
+ it('should successfully get the default branch', async () => {
743
+ const mockBranch = { id: 'refs/heads/main', displayId: 'main', isDefault: true };
744
+ (RepositoryService.getDefaultBranch1 as jest.Mock).mockResolvedValue(mockBranch);
745
+
746
+ const result = await bitbucketService.getDefaultBranch(
747
+ mockProjectKey,
748
+ mockRepositorySlug
749
+ );
750
+
751
+ expect(result.success).toBe(true);
752
+ expect(result.data).toBe(mockBranch);
753
+ expect(RepositoryService.getDefaultBranch1).toHaveBeenCalledWith(
754
+ mockProjectKey,
755
+ mockRepositorySlug
756
+ );
757
+ });
758
+
759
+ it('should handle API errors gracefully', async () => {
760
+ const mockError = new Error('API Error');
761
+ (RepositoryService.getDefaultBranch1 as jest.Mock).mockRejectedValue(mockError);
762
+
763
+ const result = await bitbucketService.getDefaultBranch(
764
+ mockProjectKey,
765
+ mockRepositorySlug
766
+ );
767
+
768
+ expect(result.success).toBe(false);
769
+ expect(result.error).toBe('API Error');
770
+ });
771
+ });
772
+
773
+ describe('addCommitComment', () => {
774
+ it('should add a general commit comment', async () => {
775
+ const mockComment = { id: 99, text: 'nice' };
776
+ (RepositoryService.createComment as jest.Mock).mockResolvedValue(mockComment);
777
+
778
+ const result = await bitbucketService.addCommitComment(mockProjectKey, mockRepositorySlug, 'abc123', 'nice');
779
+
780
+ expect(result.success).toBe(true);
781
+ expect(result.data).toBe(mockComment);
782
+ expect(RepositoryService.createComment).toHaveBeenCalledWith(
783
+ mockProjectKey,
784
+ 'abc123',
785
+ mockRepositorySlug,
786
+ undefined,
787
+ { text: 'nice' }
788
+ );
789
+ });
790
+
791
+ it('should anchor the comment to a file and line', async () => {
792
+ (RepositoryService.createComment as jest.Mock).mockResolvedValue({ id: 100 });
793
+ await bitbucketService.addCommitComment(
794
+ mockProjectKey,
795
+ mockRepositorySlug,
796
+ 'abc123',
797
+ 'fix this',
798
+ 'src/app.js',
799
+ 12,
800
+ 'ADDED'
801
+ );
802
+ expect(RepositoryService.createComment).toHaveBeenCalledWith(
803
+ mockProjectKey,
804
+ 'abc123',
805
+ mockRepositorySlug,
806
+ undefined,
807
+ { text: 'fix this', anchor: { path: 'src/app.js', line: 12, lineType: 'ADDED', fileType: 'TO' } }
808
+ );
809
+ });
810
+
811
+ it('should default lineType to CONTEXT when a line is given without one', async () => {
812
+ (RepositoryService.createComment as jest.Mock).mockResolvedValue({ id: 101 });
813
+ await bitbucketService.addCommitComment(
814
+ mockProjectKey,
815
+ mockRepositorySlug,
816
+ 'abc123',
817
+ 'note',
818
+ 'src/app.js',
819
+ 3
820
+ );
821
+ expect(RepositoryService.createComment).toHaveBeenCalledWith(
822
+ mockProjectKey,
823
+ 'abc123',
824
+ mockRepositorySlug,
825
+ undefined,
826
+ { text: 'note', anchor: { path: 'src/app.js', line: 3, lineType: 'CONTEXT', fileType: 'TO' } }
827
+ );
828
+ });
829
+
830
+ it('should handle API errors gracefully', async () => {
831
+ (RepositoryService.createComment as jest.Mock).mockRejectedValue(new Error('API Error'));
832
+ const result = await bitbucketService.addCommitComment(mockProjectKey, mockRepositorySlug, 'abc123', 'x');
833
+ expect(result.success).toBe(false);
834
+ expect(result.error).toBe('API Error');
835
+ });
836
+ });
837
+
838
+ describe('listBuildStatuses', () => {
839
+ it('should list build statuses for a commit', async () => {
840
+ const mockStatuses = { values: [{ key: 'build-1', state: 'SUCCESSFUL' }], isLastPage: true };
841
+ (DeprecatedService.getBuildStatus as jest.Mock).mockResolvedValue(mockStatuses);
842
+
843
+ const result = await bitbucketService.listBuildStatuses('abc123');
844
+
845
+ expect(result.success).toBe(true);
846
+ expect(result.data).toBe(mockStatuses);
847
+ expect(DeprecatedService.getBuildStatus).toHaveBeenCalledWith('abc123', undefined, undefined, 25);
848
+ });
849
+
850
+ it('should pass orderBy and pagination through', async () => {
851
+ (DeprecatedService.getBuildStatus as jest.Mock).mockResolvedValue({ values: [] });
852
+ await bitbucketService.listBuildStatuses('abc123', 'newest', 5, 50);
853
+ expect(DeprecatedService.getBuildStatus).toHaveBeenCalledWith('abc123', 'newest', 5, 50);
854
+ });
855
+
856
+ it('should handle API errors gracefully', async () => {
857
+ (DeprecatedService.getBuildStatus as jest.Mock).mockRejectedValue(new Error('API Error'));
858
+ const result = await bitbucketService.listBuildStatuses('abc123');
859
+ expect(result.success).toBe(false);
860
+ expect(result.error).toBe('API Error');
861
+ });
862
+ });
863
+
864
+ describe('addBuildStatus', () => {
865
+ it('should add a build status with minimal fields', async () => {
866
+ (BuildsAndDeploymentsService.add as jest.Mock).mockResolvedValue(undefined);
867
+
868
+ const result = await bitbucketService.addBuildStatus(
869
+ mockProjectKey,
870
+ mockRepositorySlug,
871
+ 'abc123',
872
+ 'SUCCESSFUL',
873
+ 'build-1',
874
+ 'http://ci/build/1'
875
+ );
876
+
877
+ expect(result.success).toBe(true);
878
+ expect(result.data).toEqual({ added: true, commitId: 'abc123', key: 'build-1' });
879
+ expect(BuildsAndDeploymentsService.add).toHaveBeenCalledWith(
880
+ mockProjectKey,
881
+ 'abc123',
882
+ mockRepositorySlug,
883
+ { state: 'SUCCESSFUL', key: 'build-1', url: 'http://ci/build/1' }
884
+ );
885
+ });
886
+
887
+ it('should include optional name and description', async () => {
888
+ (BuildsAndDeploymentsService.add as jest.Mock).mockResolvedValue(undefined);
889
+ await bitbucketService.addBuildStatus(
890
+ mockProjectKey,
891
+ mockRepositorySlug,
892
+ 'abc123',
893
+ 'FAILED',
894
+ 'build-2',
895
+ 'http://ci/build/2',
896
+ 'Unit tests',
897
+ 'Failed on step 3'
898
+ );
899
+ expect(BuildsAndDeploymentsService.add).toHaveBeenCalledWith(
900
+ mockProjectKey,
901
+ 'abc123',
902
+ mockRepositorySlug,
903
+ { state: 'FAILED', key: 'build-2', url: 'http://ci/build/2', name: 'Unit tests', description: 'Failed on step 3' }
904
+ );
905
+ });
906
+
907
+ it('should handle API errors gracefully', async () => {
908
+ (BuildsAndDeploymentsService.add as jest.Mock).mockRejectedValue(new Error('API Error'));
909
+ const result = await bitbucketService.addBuildStatus(
910
+ mockProjectKey,
911
+ mockRepositorySlug,
912
+ 'abc123',
913
+ 'SUCCESSFUL',
914
+ 'build-1',
915
+ 'http://ci/build/1'
916
+ );
917
+ expect(result.success).toBe(false);
918
+ expect(result.error).toBe('API Error');
919
+ });
920
+ });
921
+
922
+ describe('getBuildStatus', () => {
923
+ it('should get a single build status by key', async () => {
924
+ const mockStatus = { key: 'build-1', state: 'SUCCESSFUL' };
925
+ (BuildsAndDeploymentsService.get as jest.Mock).mockResolvedValue(mockStatus);
926
+
927
+ const result = await bitbucketService.getBuildStatus(
928
+ mockProjectKey,
929
+ mockRepositorySlug,
930
+ 'abc123',
931
+ 'build-1'
932
+ );
933
+
934
+ expect(result.success).toBe(true);
935
+ expect(result.data).toBe(mockStatus);
936
+ expect(BuildsAndDeploymentsService.get).toHaveBeenCalledWith(
937
+ mockProjectKey,
938
+ 'abc123',
939
+ mockRepositorySlug,
940
+ 'build-1'
941
+ );
942
+ });
943
+
944
+ it('should handle API errors gracefully', async () => {
945
+ (BuildsAndDeploymentsService.get as jest.Mock).mockRejectedValue(new Error('API Error'));
946
+ const result = await bitbucketService.getBuildStatus(
947
+ mockProjectKey,
948
+ mockRepositorySlug,
949
+ 'abc123',
950
+ 'build-1'
951
+ );
952
+ expect(result.success).toBe(false);
953
+ expect(result.error).toBe('API Error');
954
+ });
955
+ });
956
+
957
+ describe('getCommit', () => {
958
+ it('should successfully get a single commit', async () => {
959
+ const mockCommit = { id: 'abc123', message: 'Initial commit', author: { name: 'dev' } };
960
+ (RepositoryService.getCommit as jest.Mock).mockResolvedValue(mockCommit);
961
+
962
+ const result = await bitbucketService.getCommit(mockProjectKey, mockRepositorySlug, 'abc123');
963
+
964
+ expect(result.success).toBe(true);
965
+ expect(result.data).toBe(mockCommit);
966
+ expect(RepositoryService.getCommit).toHaveBeenCalledWith(
967
+ mockProjectKey,
968
+ 'abc123',
969
+ mockRepositorySlug,
970
+ undefined
971
+ );
972
+ });
973
+
974
+ it('should pass the path through', async () => {
975
+ (RepositoryService.getCommit as jest.Mock).mockResolvedValue({});
976
+ await bitbucketService.getCommit(mockProjectKey, mockRepositorySlug, 'abc123', 'src/app.js');
977
+ expect(RepositoryService.getCommit).toHaveBeenCalledWith(
978
+ mockProjectKey,
979
+ 'abc123',
980
+ mockRepositorySlug,
981
+ 'src/app.js'
982
+ );
983
+ });
984
+
985
+ it('should handle API errors gracefully', async () => {
986
+ (RepositoryService.getCommit as jest.Mock).mockRejectedValue(new Error('API Error'));
987
+ const result = await bitbucketService.getCommit(mockProjectKey, mockRepositorySlug, 'abc123');
988
+ expect(result.success).toBe(false);
989
+ expect(result.error).toBe('API Error');
990
+ });
991
+ });
992
+
993
+ describe('editFile', () => {
994
+ it('should create a new file (no sourceCommitId)', async () => {
995
+ const mockCommit = { id: 'newsha', message: 'add file' };
996
+ (RepositoryService.editFile as jest.Mock).mockResolvedValue(mockCommit);
997
+
998
+ const result = await bitbucketService.editFile(
999
+ mockProjectKey,
1000
+ mockRepositorySlug,
1001
+ 'docs/new.md',
1002
+ '# Hello',
1003
+ 'add file',
1004
+ 'master'
1005
+ );
1006
+
1007
+ expect(result.success).toBe(true);
1008
+ expect(result.data).toBe(mockCommit);
1009
+ expect(RepositoryService.editFile).toHaveBeenCalledWith(
1010
+ 'docs/new.md',
1011
+ mockProjectKey,
1012
+ mockRepositorySlug,
1013
+ { content: '# Hello', message: 'add file', branch: 'master' }
1014
+ );
1015
+ });
1016
+
1017
+ it('should pass sourceCommitId and sourceBranch when editing', async () => {
1018
+ (RepositoryService.editFile as jest.Mock).mockResolvedValue({ id: 'sha2' });
1019
+ await bitbucketService.editFile(
1020
+ mockProjectKey,
1021
+ mockRepositorySlug,
1022
+ 'README.md',
1023
+ 'updated',
1024
+ 'edit readme',
1025
+ 'feature/x',
1026
+ 'oldsha',
1027
+ 'master'
1028
+ );
1029
+ expect(RepositoryService.editFile).toHaveBeenCalledWith(
1030
+ 'README.md',
1031
+ mockProjectKey,
1032
+ mockRepositorySlug,
1033
+ { content: 'updated', message: 'edit readme', branch: 'feature/x', sourceCommitId: 'oldsha', sourceBranch: 'master' }
1034
+ );
1035
+ });
1036
+
1037
+ it('should handle API errors gracefully', async () => {
1038
+ (RepositoryService.editFile as jest.Mock).mockRejectedValue(new Error('API Error'));
1039
+ const result = await bitbucketService.editFile(
1040
+ mockProjectKey,
1041
+ mockRepositorySlug,
1042
+ 'README.md',
1043
+ 'x',
1044
+ 'msg',
1045
+ 'master'
1046
+ );
1047
+ expect(result.success).toBe(false);
1048
+ expect(result.error).toBe('API Error');
1049
+ });
1050
+ });
1051
+
1052
+ describe('getCommitDiff', () => {
1053
+ it('should get a whole-commit diff by default (empty path)', async () => {
1054
+ const mockDiff = { diffs: [] };
1055
+ (RepositoryService.streamDiff as jest.Mock).mockResolvedValue(mockDiff);
1056
+
1057
+ const result = await bitbucketService.getCommitDiff(mockProjectKey, mockRepositorySlug, 'abc123');
1058
+
1059
+ expect(result.success).toBe(true);
1060
+ expect(result.data).toBe(mockDiff);
1061
+ expect(RepositoryService.streamDiff).toHaveBeenCalledWith(
1062
+ 'abc123',
1063
+ mockRepositorySlug,
1064
+ '',
1065
+ mockProjectKey,
1066
+ undefined, // srcPath
1067
+ undefined, // avatarSize
1068
+ undefined, // filter
1069
+ undefined, // avatarScheme
1070
+ undefined, // contextLines
1071
+ undefined, // autoSrcPath
1072
+ undefined, // whitespace
1073
+ undefined, // withComments
1074
+ undefined // since
1075
+ );
1076
+ });
1077
+
1078
+ it('should pass path, contextLines, whitespace and srcPath through', async () => {
1079
+ (RepositoryService.streamDiff as jest.Mock).mockResolvedValue({});
1080
+ await bitbucketService.getCommitDiff(
1081
+ mockProjectKey,
1082
+ mockRepositorySlug,
1083
+ 'abc123',
1084
+ 'src/app.js',
1085
+ '5',
1086
+ 'ignore-all',
1087
+ 'src/old.js'
1088
+ );
1089
+ expect(RepositoryService.streamDiff).toHaveBeenCalledWith(
1090
+ 'abc123',
1091
+ mockRepositorySlug,
1092
+ 'src/app.js',
1093
+ mockProjectKey,
1094
+ 'src/old.js',
1095
+ undefined,
1096
+ undefined,
1097
+ undefined,
1098
+ '5',
1099
+ undefined,
1100
+ 'ignore-all',
1101
+ undefined,
1102
+ undefined
1103
+ );
1104
+ });
1105
+
1106
+ it('should handle API errors gracefully', async () => {
1107
+ (RepositoryService.streamDiff as jest.Mock).mockRejectedValue(new Error('API Error'));
1108
+ const result = await bitbucketService.getCommitDiff(mockProjectKey, mockRepositorySlug, 'abc123');
1109
+ expect(result.success).toBe(false);
1110
+ expect(result.error).toBe('API Error');
1111
+ });
1112
+ });
1113
+
1114
+ describe('compareRefs', () => {
1115
+ it('should compare commits by default', async () => {
1116
+ const mockCompare = { values: [{ id: 'c1' }], isLastPage: true };
1117
+ (RepositoryService.streamCommits as jest.Mock).mockResolvedValue(mockCompare);
1118
+
1119
+ const result = await bitbucketService.compareRefs(
1120
+ mockProjectKey,
1121
+ mockRepositorySlug,
1122
+ 'refs/heads/feature',
1123
+ 'refs/heads/master'
1124
+ );
1125
+
1126
+ expect(result.success).toBe(true);
1127
+ expect(result.data).toBe(mockCompare);
1128
+ expect(RepositoryService.streamCommits).toHaveBeenCalledWith(
1129
+ mockProjectKey,
1130
+ mockRepositorySlug,
1131
+ undefined, // fromRepo
1132
+ 'refs/heads/feature',
1133
+ 'refs/heads/master',
1134
+ undefined, // start
1135
+ 25
1136
+ );
1137
+ expect(RepositoryService.streamChanges).not.toHaveBeenCalled();
1138
+ });
1139
+
1140
+ it('should compare changes when compareType is changes', async () => {
1141
+ const mockCompare = { values: [], isLastPage: true };
1142
+ (RepositoryService.streamChanges as jest.Mock).mockResolvedValue(mockCompare);
1143
+
1144
+ await bitbucketService.compareRefs(
1145
+ mockProjectKey,
1146
+ mockRepositorySlug,
1147
+ 'refs/heads/feature',
1148
+ 'refs/heads/master',
1149
+ 'OTHER/repo',
1150
+ 'changes',
1151
+ 10,
1152
+ 50
1153
+ );
1154
+
1155
+ expect(RepositoryService.streamChanges).toHaveBeenCalledWith(
1156
+ mockProjectKey,
1157
+ mockRepositorySlug,
1158
+ 'OTHER/repo',
1159
+ 'refs/heads/feature',
1160
+ 'refs/heads/master',
1161
+ 10,
1162
+ 50
1163
+ );
1164
+ });
1165
+
1166
+ it('should handle API errors gracefully', async () => {
1167
+ (RepositoryService.streamCommits as jest.Mock).mockRejectedValue(new Error('API Error'));
1168
+ const result = await bitbucketService.compareRefs(
1169
+ mockProjectKey,
1170
+ mockRepositorySlug,
1171
+ 'a',
1172
+ 'b'
1173
+ );
1174
+ expect(result.success).toBe(false);
1175
+ expect(result.error).toBe('API Error');
1176
+ });
1177
+ });
1178
+
1179
+ describe('createTag', () => {
1180
+ it('should create a lightweight tag', async () => {
1181
+ const mockTag = { id: 'refs/tags/v2', displayId: 'v2' };
1182
+ (RepositoryService.createTagForRepository as jest.Mock).mockResolvedValue(mockTag);
1183
+
1184
+ const result = await bitbucketService.createTag(
1185
+ mockProjectKey,
1186
+ mockRepositorySlug,
1187
+ 'v2',
1188
+ 'refs/heads/master'
1189
+ );
1190
+
1191
+ expect(result.success).toBe(true);
1192
+ expect(result.data).toBe(mockTag);
1193
+ expect(RepositoryService.createTagForRepository).toHaveBeenCalledWith(
1194
+ mockProjectKey,
1195
+ mockRepositorySlug,
1196
+ { name: 'v2', startPoint: 'refs/heads/master' }
1197
+ );
1198
+ });
1199
+
1200
+ it('should include message for an annotated tag', async () => {
1201
+ (RepositoryService.createTagForRepository as jest.Mock).mockResolvedValue({});
1202
+ await bitbucketService.createTag(
1203
+ mockProjectKey,
1204
+ mockRepositorySlug,
1205
+ 'v2',
1206
+ 'abc123',
1207
+ 'Release 2'
1208
+ );
1209
+ expect(RepositoryService.createTagForRepository).toHaveBeenCalledWith(
1210
+ mockProjectKey,
1211
+ mockRepositorySlug,
1212
+ { name: 'v2', startPoint: 'abc123', message: 'Release 2' }
1213
+ );
1214
+ });
1215
+
1216
+ it('should handle API errors gracefully', async () => {
1217
+ (RepositoryService.createTagForRepository as jest.Mock).mockRejectedValue(new Error('API Error'));
1218
+ const result = await bitbucketService.createTag(
1219
+ mockProjectKey,
1220
+ mockRepositorySlug,
1221
+ 'v2',
1222
+ 'refs/heads/master'
1223
+ );
1224
+ expect(result.success).toBe(false);
1225
+ expect(result.error).toBe('API Error');
1226
+ });
1227
+ });
1228
+
1229
+ describe('getPullRequests', () => {
1230
+ it('should successfully get pull requests with default parameters', async () => {
1231
+ const mockPullRequestsData = {
1232
+ values: [
1233
+ {
1234
+ id: 1,
1235
+ title: 'Test PR 1',
1236
+ state: 'OPEN',
1237
+ author: { user: { name: 'user1' } }
1238
+ },
1239
+ {
1240
+ id: 2,
1241
+ title: 'Test PR 2',
1242
+ state: 'OPEN',
1243
+ author: { user: { name: 'user2' } }
1244
+ }
1245
+ ],
1246
+ size: 2,
1247
+ isLastPage: true,
1248
+ start: 0,
1249
+ limit: 25
1250
+ };
1251
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1252
+
1253
+ const result = await bitbucketService.getPullRequests(
1254
+ mockProjectKey,
1255
+ mockRepositorySlug
1256
+ );
1257
+
1258
+ expect(result.success).toBe(true);
1259
+ expect(result.data).toBe(mockPullRequestsData);
1260
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1261
+ mockProjectKey,
1262
+ mockRepositorySlug,
1263
+ undefined, // withAttributes
1264
+ undefined, // at
1265
+ undefined, // withProperties
1266
+ undefined, // draft
1267
+ undefined, // filterText
1268
+ undefined, // state
1269
+ undefined, // order
1270
+ undefined, // direction
1271
+ undefined, // start
1272
+ 25 // limit
1273
+ );
1274
+ });
1275
+
1276
+ it('should successfully get pull requests with state filter', async () => {
1277
+ const mockPullRequestsData = {
1278
+ values: [
1279
+ {
1280
+ id: 1,
1281
+ title: 'Merged PR',
1282
+ state: 'MERGED',
1283
+ author: { user: { name: 'user1' } }
1284
+ }
1285
+ ],
1286
+ size: 1,
1287
+ isLastPage: true,
1288
+ start: 0,
1289
+ limit: 25
1290
+ };
1291
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1292
+
1293
+ const result = await bitbucketService.getPullRequests(
1294
+ mockProjectKey,
1295
+ mockRepositorySlug,
1296
+ undefined, // withAttributes
1297
+ undefined, // at
1298
+ undefined, // withProperties
1299
+ undefined, // draft
1300
+ undefined, // filterText
1301
+ 'MERGED' // state
1302
+ );
1303
+
1304
+ expect(result.success).toBe(true);
1305
+ expect(result.data).toBe(mockPullRequestsData);
1306
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1307
+ mockProjectKey,
1308
+ mockRepositorySlug,
1309
+ undefined,
1310
+ undefined,
1311
+ undefined,
1312
+ undefined,
1313
+ undefined,
1314
+ 'MERGED',
1315
+ undefined,
1316
+ undefined,
1317
+ undefined,
1318
+ 25
1319
+ );
1320
+ });
1321
+
1322
+ it('should successfully get pull requests with text filter', async () => {
1323
+ const mockPullRequestsData = {
1324
+ values: [
1325
+ {
1326
+ id: 1,
1327
+ title: 'Fix bug in authentication',
1328
+ state: 'OPEN',
1329
+ author: { user: { name: 'user1' } }
1330
+ }
1331
+ ],
1332
+ size: 1,
1333
+ isLastPage: true,
1334
+ start: 0,
1335
+ limit: 25
1336
+ };
1337
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1338
+
1339
+ const result = await bitbucketService.getPullRequests(
1340
+ mockProjectKey,
1341
+ mockRepositorySlug,
1342
+ undefined, // withAttributes
1343
+ undefined, // at
1344
+ undefined, // withProperties
1345
+ undefined, // draft
1346
+ 'authentication' // filterText
1347
+ );
1348
+
1349
+ expect(result.success).toBe(true);
1350
+ expect(result.data).toBe(mockPullRequestsData);
1351
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1352
+ mockProjectKey,
1353
+ mockRepositorySlug,
1354
+ undefined,
1355
+ undefined,
1356
+ undefined,
1357
+ undefined,
1358
+ 'authentication',
1359
+ undefined,
1360
+ undefined,
1361
+ undefined,
1362
+ undefined,
1363
+ 25
1364
+ );
1365
+ });
1366
+
1367
+ it('should successfully get pull requests with branch filter', async () => {
1368
+ const mockPullRequestsData = {
1369
+ values: [
1370
+ {
1371
+ id: 1,
1372
+ title: 'PR to master',
1373
+ state: 'OPEN',
1374
+ toRef: { id: 'refs/heads/master' }
1375
+ }
1376
+ ],
1377
+ size: 1,
1378
+ isLastPage: true,
1379
+ start: 0,
1380
+ limit: 25
1381
+ };
1382
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1383
+
1384
+ const result = await bitbucketService.getPullRequests(
1385
+ mockProjectKey,
1386
+ mockRepositorySlug,
1387
+ undefined, // withAttributes
1388
+ 'refs/heads/master' // at
1389
+ );
1390
+
1391
+ expect(result.success).toBe(true);
1392
+ expect(result.data).toBe(mockPullRequestsData);
1393
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1394
+ mockProjectKey,
1395
+ mockRepositorySlug,
1396
+ undefined,
1397
+ 'refs/heads/master',
1398
+ undefined,
1399
+ undefined,
1400
+ undefined,
1401
+ undefined,
1402
+ undefined,
1403
+ undefined,
1404
+ undefined,
1405
+ 25
1406
+ );
1407
+ });
1408
+
1409
+ it('should successfully get pull requests with direction filter', async () => {
1410
+ const mockPullRequestsData = {
1411
+ values: [
1412
+ {
1413
+ id: 1,
1414
+ title: 'Outgoing PR',
1415
+ state: 'OPEN'
1416
+ }
1417
+ ],
1418
+ size: 1,
1419
+ isLastPage: true,
1420
+ start: 0,
1421
+ limit: 25
1422
+ };
1423
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1424
+
1425
+ const result = await bitbucketService.getPullRequests(
1426
+ mockProjectKey,
1427
+ mockRepositorySlug,
1428
+ undefined, // withAttributes
1429
+ undefined, // at
1430
+ undefined, // withProperties
1431
+ undefined, // draft
1432
+ undefined, // filterText
1433
+ undefined, // state
1434
+ undefined, // order
1435
+ 'OUTGOING' // direction
1436
+ );
1437
+
1438
+ expect(result.success).toBe(true);
1439
+ expect(result.data).toBe(mockPullRequestsData);
1440
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1441
+ mockProjectKey,
1442
+ mockRepositorySlug,
1443
+ undefined,
1444
+ undefined,
1445
+ undefined,
1446
+ undefined,
1447
+ undefined,
1448
+ undefined,
1449
+ undefined,
1450
+ 'OUTGOING',
1451
+ undefined,
1452
+ 25
1453
+ );
1454
+ });
1455
+
1456
+ it('should successfully get pull requests with order filter', async () => {
1457
+ const mockPullRequestsData = {
1458
+ values: [
1459
+ {
1460
+ id: 1,
1461
+ title: 'Oldest PR',
1462
+ state: 'OPEN',
1463
+ createdDate: 1234567890
1464
+ },
1465
+ {
1466
+ id: 2,
1467
+ title: 'Newer PR',
1468
+ state: 'OPEN',
1469
+ createdDate: 1234567900
1470
+ }
1471
+ ],
1472
+ size: 2,
1473
+ isLastPage: true,
1474
+ start: 0,
1475
+ limit: 25
1476
+ };
1477
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1478
+
1479
+ const result = await bitbucketService.getPullRequests(
1480
+ mockProjectKey,
1481
+ mockRepositorySlug,
1482
+ undefined, // withAttributes
1483
+ undefined, // at
1484
+ undefined, // withProperties
1485
+ undefined, // draft
1486
+ undefined, // filterText
1487
+ undefined, // state
1488
+ 'OLDEST' // order
1489
+ );
1490
+
1491
+ expect(result.success).toBe(true);
1492
+ expect(result.data).toBe(mockPullRequestsData);
1493
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1494
+ mockProjectKey,
1495
+ mockRepositorySlug,
1496
+ undefined,
1497
+ undefined,
1498
+ undefined,
1499
+ undefined,
1500
+ undefined,
1501
+ undefined,
1502
+ 'OLDEST',
1503
+ undefined,
1504
+ undefined,
1505
+ 25
1506
+ );
1507
+ });
1508
+
1509
+ it('should successfully get pull requests with draft filter', async () => {
1510
+ const mockPullRequestsData = {
1511
+ values: [
1512
+ {
1513
+ id: 1,
1514
+ title: 'Draft PR',
1515
+ state: 'OPEN',
1516
+ draft: true
1517
+ }
1518
+ ],
1519
+ size: 1,
1520
+ isLastPage: true,
1521
+ start: 0,
1522
+ limit: 25
1523
+ };
1524
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1525
+
1526
+ const result = await bitbucketService.getPullRequests(
1527
+ mockProjectKey,
1528
+ mockRepositorySlug,
1529
+ undefined, // withAttributes
1530
+ undefined, // at
1531
+ undefined, // withProperties
1532
+ 'true' // draft
1533
+ );
1534
+
1535
+ expect(result.success).toBe(true);
1536
+ expect(result.data).toBe(mockPullRequestsData);
1537
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1538
+ mockProjectKey,
1539
+ mockRepositorySlug,
1540
+ undefined,
1541
+ undefined,
1542
+ undefined,
1543
+ 'true',
1544
+ undefined,
1545
+ undefined,
1546
+ undefined,
1547
+ undefined,
1548
+ undefined,
1549
+ 25
1550
+ );
1551
+ });
1552
+
1553
+ it('should successfully get pull requests with pagination', async () => {
1554
+ const mockPullRequestsData = {
1555
+ values: [
1556
+ {
1557
+ id: 51,
1558
+ title: 'PR 51',
1559
+ state: 'OPEN'
1560
+ }
1561
+ ],
1562
+ size: 1,
1563
+ isLastPage: false,
1564
+ start: 50,
1565
+ limit: 10,
1566
+ nextPageStart: 60
1567
+ };
1568
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1569
+
1570
+ const result = await bitbucketService.getPullRequests(
1571
+ mockProjectKey,
1572
+ mockRepositorySlug,
1573
+ undefined, // withAttributes
1574
+ undefined, // at
1575
+ undefined, // withProperties
1576
+ undefined, // draft
1577
+ undefined, // filterText
1578
+ undefined, // state
1579
+ undefined, // order
1580
+ undefined, // direction
1581
+ 50, // start
1582
+ 10 // limit
1583
+ );
1584
+
1585
+ expect(result.success).toBe(true);
1586
+ expect(result.data).toBe(mockPullRequestsData);
1587
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1588
+ mockProjectKey,
1589
+ mockRepositorySlug,
1590
+ undefined,
1591
+ undefined,
1592
+ undefined,
1593
+ undefined,
1594
+ undefined,
1595
+ undefined,
1596
+ undefined,
1597
+ undefined,
1598
+ 50,
1599
+ 10
1600
+ );
1601
+ });
1602
+
1603
+ it('should successfully get pull requests with all parameters', async () => {
1604
+ const mockPullRequestsData = {
1605
+ values: [
1606
+ {
1607
+ id: 1,
1608
+ title: 'Complete PR test',
1609
+ state: 'OPEN',
1610
+ draft: false
1611
+ }
1612
+ ],
1613
+ size: 1,
1614
+ isLastPage: true,
1615
+ start: 0,
1616
+ limit: 50
1617
+ };
1618
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1619
+
1620
+ const result = await bitbucketService.getPullRequests(
1621
+ mockProjectKey,
1622
+ mockRepositorySlug,
1623
+ 'true', // withAttributes
1624
+ 'refs/heads/develop', // at
1625
+ 'true', // withProperties
1626
+ 'false', // draft
1627
+ 'test', // filterText
1628
+ 'ALL', // state
1629
+ 'NEWEST', // order
1630
+ 'INCOMING', // direction
1631
+ 0, // start
1632
+ 50 // limit
1633
+ );
1634
+
1635
+ expect(result.success).toBe(true);
1636
+ expect(result.data).toBe(mockPullRequestsData);
1637
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
1638
+ mockProjectKey,
1639
+ mockRepositorySlug,
1640
+ 'true',
1641
+ 'refs/heads/develop',
1642
+ 'true',
1643
+ 'false',
1644
+ 'test',
1645
+ 'ALL',
1646
+ 'NEWEST',
1647
+ 'INCOMING',
1648
+ 0,
1649
+ 50
1650
+ );
1651
+ });
1652
+
1653
+ it('should handle empty results', async () => {
1654
+ const mockPullRequestsData = {
1655
+ values: [],
1656
+ size: 0,
1657
+ isLastPage: true,
1658
+ start: 0,
1659
+ limit: 25
1660
+ };
1661
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockPullRequestsData);
1662
+
1663
+ const result = await bitbucketService.getPullRequests(
1664
+ mockProjectKey,
1665
+ mockRepositorySlug
1666
+ );
1667
+
1668
+ expect(result.success).toBe(true);
1669
+ expect(result.data).toBe(mockPullRequestsData);
1670
+ if (result.data) {
1671
+ expect(result.data.values).toHaveLength(0);
1672
+ }
1673
+ });
1674
+
1675
+ it('should handle API errors gracefully', async () => {
1676
+ const mockError = new Error('Failed to fetch pull requests');
1677
+ (PullRequestsService.getPage as jest.Mock).mockRejectedValue(mockError);
1678
+
1679
+ const result = await bitbucketService.getPullRequests(
1680
+ mockProjectKey,
1681
+ mockRepositorySlug
1682
+ );
1683
+
1684
+ expect(result.success).toBe(false);
1685
+ expect(result.error).toBe('Failed to fetch pull requests');
1686
+ });
1687
+
1688
+ it('should handle permission errors', async () => {
1689
+ const mockError = new Error('Insufficient permissions');
1690
+ (PullRequestsService.getPage as jest.Mock).mockRejectedValue(mockError);
1691
+
1692
+ const result = await bitbucketService.getPullRequests(
1693
+ mockProjectKey,
1694
+ mockRepositorySlug,
1695
+ undefined,
1696
+ undefined,
1697
+ undefined,
1698
+ undefined,
1699
+ undefined,
1700
+ 'OPEN'
1701
+ );
1702
+
1703
+ expect(result.success).toBe(false);
1704
+ expect(result.error).toBe('Insufficient permissions');
1705
+ });
1706
+ });
1707
+
1708
+ describe('getPullRequest', () => {
1709
+ it('should successfully get a specific pull request by ID', async () => {
1710
+ const mockPullRequestData = {
1711
+ id: 123,
1712
+ version: 1,
1713
+ title: 'Feature: Add new functionality',
1714
+ description: 'This PR adds new functionality',
1715
+ state: 'OPEN',
1716
+ open: true,
1717
+ closed: false,
1718
+ createdDate: 1234567890,
1719
+ updatedDate: 1234567900,
1720
+ fromRef: {
1721
+ id: 'refs/heads/feature-branch',
1722
+ displayId: 'feature-branch',
1723
+ latestCommit: 'abc123',
1724
+ repository: {
1725
+ slug: 'test-repo',
1726
+ project: { key: 'TEST' }
1727
+ }
1728
+ },
1729
+ toRef: {
1730
+ id: 'refs/heads/main',
1731
+ displayId: 'main',
1732
+ latestCommit: 'def456',
1733
+ repository: {
1734
+ slug: 'test-repo',
1735
+ project: { key: 'TEST' }
1736
+ }
1737
+ },
1738
+ author: {
1739
+ user: {
1740
+ name: 'testuser',
1741
+ emailAddress: 'test@example.com',
1742
+ displayName: 'Test User'
1743
+ }
1744
+ },
1745
+ reviewers: [
1746
+ {
1747
+ user: { name: 'reviewer1', displayName: 'Reviewer One' },
1748
+ approved: true
1749
+ }
1750
+ ],
1751
+ participants: []
1752
+ };
1753
+ (PullRequestsService.get3 as jest.Mock).mockResolvedValue(mockPullRequestData);
1754
+
1755
+ const result = await bitbucketService.getPullRequest(
1756
+ mockProjectKey,
1757
+ mockRepositorySlug,
1758
+ '123'
1759
+ );
1760
+
1761
+ expect(result.success).toBe(true);
1762
+ expect(result.data).toBe(mockPullRequestData);
1763
+ expect(PullRequestsService.get3).toHaveBeenCalledWith(
1764
+ mockProjectKey,
1765
+ '123',
1766
+ mockRepositorySlug
1767
+ );
1768
+ });
1769
+
1770
+ it('should handle errors when pull request does not exist', async () => {
1771
+ const mockError = new Error('Not found');
1772
+ (PullRequestsService.get3 as jest.Mock).mockRejectedValue(mockError);
1773
+
1774
+ const result = await bitbucketService.getPullRequest(
1775
+ mockProjectKey,
1776
+ mockRepositorySlug,
1777
+ '999'
1778
+ );
1779
+
1780
+ expect(result.success).toBe(false);
1781
+ expect(result.error).toBe('Not found');
1782
+ });
1783
+
1784
+ it('should handle permission errors', async () => {
1785
+ const mockError = new Error('Insufficient permissions');
1786
+ (PullRequestsService.get3 as jest.Mock).mockRejectedValue(mockError);
1787
+
1788
+ const result = await bitbucketService.getPullRequest(
1789
+ mockProjectKey,
1790
+ mockRepositorySlug,
1791
+ '123'
1792
+ );
1793
+
1794
+ expect(result.success).toBe(false);
1795
+ expect(result.error).toBe('Insufficient permissions');
1796
+ });
1797
+ });
1798
+
1799
+ describe('postPullRequestComment', () => {
1800
+ it('should successfully post a general PR comment', async () => {
1801
+ const mockComment = {
1802
+ id: 12345,
1803
+ text: 'Test comment',
1804
+ author: { displayName: 'Test User' }
1805
+ };
1806
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
1807
+
1808
+ const result = await bitbucketService.postPullRequestComment(
1809
+ mockProjectKey,
1810
+ mockRepositorySlug,
1811
+ mockPullRequestId,
1812
+ 'Test comment'
1813
+ );
1814
+
1815
+ expect(result.success).toBe(true);
1816
+ expect(result.data).toEqual({
1817
+ id: 12345,
1818
+ pending: false,
1819
+ });
1820
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
1821
+ mockProjectKey,
1822
+ mockPullRequestId,
1823
+ mockRepositorySlug,
1824
+ { text: 'Test comment' }
1825
+ );
1826
+ });
1827
+
1828
+ it('should successfully post a reply comment', async () => {
1829
+ const mockComment = {
1830
+ id: 12346,
1831
+ text: 'Reply comment',
1832
+ author: { displayName: 'Test User' }
1833
+ };
1834
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
1835
+
1836
+ const result = await bitbucketService.postPullRequestComment(
1837
+ mockProjectKey,
1838
+ mockRepositorySlug,
1839
+ mockPullRequestId,
1840
+ 'Reply comment',
1841
+ 123 // parentId
1842
+ );
1843
+
1844
+ expect(result.success).toBe(true);
1845
+ expect(result.data).toEqual({
1846
+ id: 12346,
1847
+ pending: false,
1848
+ });
1849
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
1850
+ mockProjectKey,
1851
+ mockPullRequestId,
1852
+ mockRepositorySlug,
1853
+ {
1854
+ text: 'Reply comment',
1855
+ parent: { id: 123 }
1856
+ }
1857
+ );
1858
+ });
1859
+
1860
+ it('should successfully post a file comment', async () => {
1861
+ const mockComment = {
1862
+ id: 12347,
1863
+ text: 'File comment',
1864
+ author: { displayName: 'Test User' }
1865
+ };
1866
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
1867
+
1868
+ const result = await bitbucketService.postPullRequestComment(
1869
+ mockProjectKey,
1870
+ mockRepositorySlug,
1871
+ mockPullRequestId,
1872
+ 'File comment',
1873
+ undefined, // parentId
1874
+ 'src/test.js' // filePath
1875
+ );
1876
+
1877
+ expect(result.success).toBe(true);
1878
+ expect(result.data).toEqual({
1879
+ id: 12347,
1880
+ pending: false,
1881
+ });
1882
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
1883
+ mockProjectKey,
1884
+ mockPullRequestId,
1885
+ mockRepositorySlug,
1886
+ {
1887
+ text: 'File comment',
1888
+ anchor: {
1889
+ path: 'src/test.js',
1890
+ diffType: 'EFFECTIVE'
1891
+ }
1892
+ }
1893
+ );
1894
+ });
1895
+
1896
+ it('should successfully post a line comment', async () => {
1897
+ const mockComment = {
1898
+ id: 12348,
1899
+ text: 'Line comment',
1900
+ author: { displayName: 'Test User' }
1901
+ };
1902
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
1903
+
1904
+ const result = await bitbucketService.postPullRequestComment(
1905
+ mockProjectKey,
1906
+ mockRepositorySlug,
1907
+ mockPullRequestId,
1908
+ 'Line comment',
1909
+ undefined, // parentId
1910
+ 'src/test.js', // filePath
1911
+ undefined, // startLine
1912
+ undefined, // startLineType
1913
+ 42, // line
1914
+ 'ADDED' // lineType
1915
+ );
1916
+
1917
+ expect(result.success).toBe(true);
1918
+ expect(result.data).toEqual({
1919
+ id: 12348,
1920
+ pending: false,
1921
+ });
1922
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
1923
+ mockProjectKey,
1924
+ mockPullRequestId,
1925
+ mockRepositorySlug,
1926
+ {
1927
+ text: 'Line comment',
1928
+ anchor: {
1929
+ path: 'src/test.js',
1930
+ diffType: 'EFFECTIVE',
1931
+ line: 42,
1932
+ lineType: 'ADDED',
1933
+ fileType: 'TO'
1934
+ }
1935
+ }
1936
+ );
1937
+ });
1938
+
1939
+ it('should successfully post a multiline comment', async () => {
1940
+ const mockComment = {
1941
+ id: 12349,
1942
+ text: 'Multiline comment',
1943
+ author: { displayName: 'Test User' },
1944
+ anchor: {
1945
+ path: 'src/test.js',
1946
+ diffType: 'EFFECTIVE',
1947
+ line: 15,
1948
+ lineType: 'ADDED',
1949
+ fileType: 'TO',
1950
+ multilineMarker: { startLine: 10, startLineType: 'ADDED' },
1951
+ multilineSpan: { dstSpanStart: 10, dstSpanEnd: 15 }
1952
+ }
1953
+ };
1954
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
1955
+
1956
+ const result = await bitbucketService.postPullRequestComment(
1957
+ mockProjectKey,
1958
+ mockRepositorySlug,
1959
+ mockPullRequestId,
1960
+ 'Multiline comment',
1961
+ undefined, // parentId
1962
+ 'src/test.js', // filePath
1963
+ 10, // startLine
1964
+ undefined, // startLineType (should default to lineType)
1965
+ 15, // line (end line)
1966
+ 'ADDED' // lineType
1967
+ );
1968
+
1969
+ expect(result.success).toBe(true);
1970
+ expect(result.data).toEqual({
1971
+ id: 12349,
1972
+ pending: false,
1973
+ anchor: {
1974
+ path: 'src/test.js',
1975
+ line: 15,
1976
+ lineType: 'ADDED',
1977
+ startLine: 10,
1978
+ startLineType: 'ADDED',
1979
+ }
1980
+ });
1981
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
1982
+ mockProjectKey,
1983
+ mockPullRequestId,
1984
+ mockRepositorySlug,
1985
+ {
1986
+ text: 'Multiline comment',
1987
+ anchor: {
1988
+ path: 'src/test.js',
1989
+ diffType: 'EFFECTIVE',
1990
+ line: 15,
1991
+ lineType: 'ADDED',
1992
+ fileType: 'TO',
1993
+ multilineMarker: { startLine: 10, startLineType: 'ADDED' },
1994
+ multilineSpan: { dstSpanStart: 10, dstSpanEnd: 15 }
1995
+ }
1996
+ }
1997
+ );
1998
+ });
1999
+
2000
+ it('should post a multiline comment with explicit startLineType', async () => {
2001
+ const mockComment = {
2002
+ id: 12350,
2003
+ text: 'Mixed multiline comment',
2004
+ author: { displayName: 'Test User' },
2005
+ anchor: {
2006
+ path: 'src/test.js',
2007
+ diffType: 'EFFECTIVE',
2008
+ line: 8,
2009
+ lineType: 'ADDED',
2010
+ fileType: 'TO',
2011
+ multilineMarker: { startLine: 5, startLineType: 'CONTEXT' },
2012
+ multilineSpan: { dstSpanStart: 5, dstSpanEnd: 8 }
2013
+ }
2014
+ };
2015
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
2016
+
2017
+ await bitbucketService.postPullRequestComment(
2018
+ mockProjectKey,
2019
+ mockRepositorySlug,
2020
+ mockPullRequestId,
2021
+ 'Mixed multiline comment',
2022
+ undefined, // parentId
2023
+ 'src/test.js', // filePath
2024
+ 5, // startLine
2025
+ 'CONTEXT', // startLineType
2026
+ 8, // line (end line)
2027
+ 'ADDED' // lineType
2028
+ );
2029
+
2030
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
2031
+ mockProjectKey,
2032
+ mockPullRequestId,
2033
+ mockRepositorySlug,
2034
+ {
2035
+ text: 'Mixed multiline comment',
2036
+ anchor: {
2037
+ path: 'src/test.js',
2038
+ diffType: 'EFFECTIVE',
2039
+ line: 8,
2040
+ lineType: 'ADDED',
2041
+ fileType: 'TO',
2042
+ multilineMarker: { startLine: 5, startLineType: 'CONTEXT' },
2043
+ multilineSpan: { dstSpanStart: 5, dstSpanEnd: 8 }
2044
+ }
2045
+ }
2046
+ );
2047
+ });
2048
+
2049
+ it('should normalize a reversed multiline range (startLine > line)', async () => {
2050
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue({ id: 1, anchor: { path: 'src/test.js' } });
2051
+
2052
+ await bitbucketService.postPullRequestComment(
2053
+ mockProjectKey,
2054
+ mockRepositorySlug,
2055
+ mockPullRequestId,
2056
+ 'Reversed range',
2057
+ undefined, // parentId
2058
+ 'src/test.js', // filePath
2059
+ 15, // startLine (greater than line)
2060
+ 'ADDED', // startLineType
2061
+ 10, // line (end line, smaller)
2062
+ 'ADDED' // lineType
2063
+ );
2064
+
2065
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
2066
+ mockProjectKey,
2067
+ mockPullRequestId,
2068
+ mockRepositorySlug,
2069
+ {
2070
+ text: 'Reversed range',
2071
+ anchor: {
2072
+ path: 'src/test.js',
2073
+ diffType: 'EFFECTIVE',
2074
+ line: 15,
2075
+ lineType: 'ADDED',
2076
+ fileType: 'TO',
2077
+ multilineMarker: { startLine: 10, startLineType: 'ADDED' },
2078
+ multilineSpan: { dstSpanStart: 10, dstSpanEnd: 15 }
2079
+ }
2080
+ }
2081
+ );
2082
+ });
2083
+
2084
+ it('should anchor a REMOVED multiline range to the source file', async () => {
2085
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue({ id: 1, anchor: { path: 'src/test.js' } });
2086
+
2087
+ await bitbucketService.postPullRequestComment(
2088
+ mockProjectKey,
2089
+ mockRepositorySlug,
2090
+ mockPullRequestId,
2091
+ 'Removed range',
2092
+ undefined, // parentId
2093
+ 'src/test.js', // filePath
2094
+ 2, // startLine
2095
+ 'REMOVED', // startLineType
2096
+ 5, // line (end line)
2097
+ 'REMOVED' // lineType
2098
+ );
2099
+
2100
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
2101
+ mockProjectKey,
2102
+ mockPullRequestId,
2103
+ mockRepositorySlug,
2104
+ {
2105
+ text: 'Removed range',
2106
+ anchor: {
2107
+ path: 'src/test.js',
2108
+ diffType: 'EFFECTIVE',
2109
+ line: 5,
2110
+ lineType: 'REMOVED',
2111
+ fileType: 'FROM',
2112
+ multilineMarker: { startLine: 2, startLineType: 'REMOVED' },
2113
+ multilineSpan: { srcSpanStart: 2, srcSpanEnd: 5 }
2114
+ }
2115
+ }
2116
+ );
2117
+ });
2118
+
2119
+ it('should warn when a multi-line suggestion is anchored to a single line', async () => {
2120
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue({
2121
+ id: 99,
2122
+ anchor: { path: 'src/test.js', line: 5, lineType: 'ADDED' }
2123
+ });
2124
+
2125
+ const result = await bitbucketService.postPullRequestComment(
2126
+ mockProjectKey,
2127
+ mockRepositorySlug,
2128
+ mockPullRequestId,
2129
+ '```suggestion\nconst a = 1;\nconst b = 2;\n```',
2130
+ undefined, // parentId
2131
+ 'src/test.js', // filePath
2132
+ undefined, // startLine (single-line anchor — the bug shape)
2133
+ undefined, // startLineType
2134
+ 5, // line
2135
+ 'ADDED' // lineType
2136
+ );
2137
+
2138
+ expect(result.success).toBe(true);
2139
+ expect((result.data as any).warning).toMatch(/multi-line ```suggestion/);
2140
+ // single-line anchor: no multiline fields sent
2141
+ const sentAnchor = (PullRequestsService.createComment2 as jest.Mock).mock.calls[0][3].anchor;
2142
+ expect(sentAnchor.multilineMarker).toBeUndefined();
2143
+ expect(sentAnchor.multilineSpan).toBeUndefined();
2144
+ });
2145
+
2146
+ it('should not warn when a multi-line suggestion has a proper multiline range', async () => {
2147
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue({
2148
+ id: 100,
2149
+ anchor: { path: 'src/test.js', line: 5, lineType: 'ADDED', multilineMarker: { startLine: 4, startLineType: 'ADDED' } }
2150
+ });
2151
+
2152
+ const result = await bitbucketService.postPullRequestComment(
2153
+ mockProjectKey,
2154
+ mockRepositorySlug,
2155
+ mockPullRequestId,
2156
+ '```suggestion\nconst a = 1;\nconst b = 2;\n```',
2157
+ undefined, // parentId
2158
+ 'src/test.js', // filePath
2159
+ 4, // startLine
2160
+ 'ADDED', // startLineType
2161
+ 5, // line
2162
+ 'ADDED' // lineType
2163
+ );
2164
+
2165
+ expect(result.success).toBe(true);
2166
+ expect((result.data as any).warning).toBeUndefined();
2167
+ });
2168
+
2169
+ it('should handle API errors gracefully', async () => {
2170
+ const mockError = new Error('API Error');
2171
+ (PullRequestsService.createComment2 as jest.Mock).mockRejectedValue(mockError);
2172
+
2173
+ const result = await bitbucketService.postPullRequestComment(
2174
+ mockProjectKey,
2175
+ mockRepositorySlug,
2176
+ mockPullRequestId,
2177
+ 'Test comment'
2178
+ );
2179
+
2180
+ expect(result.success).toBe(false);
2181
+ expect(result.error).toBe('API Error');
2182
+ });
2183
+ });
2184
+
2185
+ describe('getPullRequestDiff', () => {
2186
+ const { request: mockRequest } = require('../bitbucket-client/core/request.js');
2187
+
2188
+ it('should successfully get raw diff with minimal parameters', async () => {
2189
+ const mockRawDiff = 'diff --git a/file.txt b/file.txt\nindex 1234567..abcdefg 100644\n--- a/file.txt\n+++ b/file.txt\n@@ -1,3 +1,4 @@\n line1\n line2\n+new line\n line3';
2190
+ mockRequest.mockResolvedValue(mockRawDiff);
2191
+
2192
+ const result = await bitbucketService.getPullRequestDiff(
2193
+ mockProjectKey,
2194
+ mockRepositorySlug,
2195
+ mockPullRequestId,
2196
+ 'src/file.txt'
2197
+ );
2198
+
2199
+ expect(result.success).toBe(true);
2200
+ expect(result.data).toBe(mockRawDiff);
2201
+ expect(mockRequest).toHaveBeenCalledWith(
2202
+ expect.any(Object), // OpenAPI config
2203
+ {
2204
+ method: 'GET',
2205
+ url: '/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/diff/{path}',
2206
+ path: {
2207
+ 'path': 'src/file.txt',
2208
+ 'projectKey': mockProjectKey,
2209
+ 'pullRequestId': mockPullRequestId,
2210
+ 'repositorySlug': mockRepositorySlug,
2211
+ },
2212
+ query: {
2213
+ 'contextLines': undefined,
2214
+ 'sinceId': undefined,
2215
+ 'srcPath': undefined,
2216
+ 'diffType': undefined,
2217
+ 'untilId': undefined,
2218
+ 'whitespace': undefined,
2219
+ },
2220
+ headers: {
2221
+ 'Accept': 'text/plain'
2222
+ },
2223
+ errors: {
2224
+ 400: `If the request was malformed.`,
2225
+ 401: `The currently authenticated user has insufficient permissions to view the repository or pull request.`,
2226
+ 404: `The repository or pull request does not exist.`,
2227
+ },
2228
+ }
2229
+ );
2230
+ });
2231
+
2232
+ it('should successfully get raw diff with all parameters', async () => {
2233
+ const mockRawDiff = 'diff --git a/old/file.txt b/new/file.txt\nindex 1234567..abcdefg 100644\n--- a/old/file.txt\n+++ b/new/file.txt\n@@ -1,5 +1,6 @@\n line1\n line2\n+new line\n line3\n line4\n line5';
2234
+ mockRequest.mockResolvedValue(mockRawDiff);
2235
+
2236
+ const result = await bitbucketService.getPullRequestDiff(
2237
+ mockProjectKey,
2238
+ mockRepositorySlug,
2239
+ mockPullRequestId,
2240
+ 'src/file.txt',
2241
+ '5', // contextLines
2242
+ 'abc123', // sinceId
2243
+ 'old/file.txt', // srcPath
2244
+ 'EFFECTIVE', // diffType
2245
+ 'def456', // untilId
2246
+ 'ignore-all' // whitespace
2247
+ );
2248
+
2249
+ expect(result.success).toBe(true);
2250
+ expect(result.data).toBe(mockRawDiff);
2251
+ expect(mockRequest).toHaveBeenCalledWith(
2252
+ expect.any(Object), // OpenAPI config
2253
+ {
2254
+ method: 'GET',
2255
+ url: '/api/latest/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/diff/{path}',
2256
+ path: {
2257
+ 'path': 'src/file.txt',
2258
+ 'projectKey': mockProjectKey,
2259
+ 'pullRequestId': mockPullRequestId,
2260
+ 'repositorySlug': mockRepositorySlug,
2261
+ },
2262
+ query: {
2263
+ 'contextLines': '5',
2264
+ 'sinceId': 'abc123',
2265
+ 'srcPath': 'old/file.txt',
2266
+ 'diffType': 'EFFECTIVE',
2267
+ 'untilId': 'def456',
2268
+ 'whitespace': 'ignore-all',
2269
+ },
2270
+ headers: {
2271
+ 'Accept': 'text/plain'
2272
+ },
2273
+ errors: {
2274
+ 400: `If the request was malformed.`,
2275
+ 401: `The currently authenticated user has insufficient permissions to view the repository or pull request.`,
2276
+ 404: `The repository or pull request does not exist.`,
2277
+ },
2278
+ }
2279
+ );
2280
+ });
2281
+
2282
+ it('should handle API errors gracefully', async () => {
2283
+ const mockError = new Error('API Error');
2284
+ mockRequest.mockRejectedValue(mockError);
2285
+
2286
+ const result = await bitbucketService.getPullRequestDiff(
2287
+ mockProjectKey,
2288
+ mockRepositorySlug,
2289
+ mockPullRequestId,
2290
+ 'src/file.txt'
2291
+ );
2292
+
2293
+ expect(result.success).toBe(false);
2294
+ expect(result.error).toBe('API Error');
2295
+ });
2296
+ });
2297
+
2298
+ describe('createPullRequest', () => {
2299
+ it('should successfully create a PR with minimal parameters', async () => {
2300
+ const mockPullRequest = {
2301
+ id: 1,
2302
+ version: 0,
2303
+ title: 'Test PR',
2304
+ description: 'Test description',
2305
+ state: 'OPEN',
2306
+ fromRef: {
2307
+ id: 'refs/heads/feature-branch',
2308
+ repository: {
2309
+ slug: mockRepositorySlug,
2310
+ project: { key: mockProjectKey }
2311
+ }
2312
+ },
2313
+ toRef: {
2314
+ id: 'refs/heads/main',
2315
+ repository: {
2316
+ slug: mockRepositorySlug,
2317
+ project: { key: mockProjectKey }
2318
+ }
2319
+ }
2320
+ };
2321
+ (PullRequestsService.create as jest.Mock).mockResolvedValue(mockPullRequest);
2322
+
2323
+ const result = await bitbucketService.createPullRequest(
2324
+ mockProjectKey,
2325
+ mockRepositorySlug,
2326
+ 'Test PR',
2327
+ 'Test description',
2328
+ 'refs/heads/feature-branch',
2329
+ 'refs/heads/main'
2330
+ );
2331
+
2332
+ expect(result.success).toBe(true);
2333
+ expect(result.data).toEqual({
2334
+ id: 1,
2335
+ version: 0,
2336
+ title: 'Test PR',
2337
+ state: 'OPEN',
2338
+ fromRefId: 'refs/heads/feature-branch',
2339
+ toRefId: 'refs/heads/main',
2340
+ reviewerCount: 0,
2341
+ });
2342
+ expect(PullRequestsService.create).toHaveBeenCalledWith(
2343
+ mockProjectKey,
2344
+ mockRepositorySlug,
2345
+ {
2346
+ title: 'Test PR',
2347
+ description: 'Test description',
2348
+ fromRef: {
2349
+ id: 'refs/heads/feature-branch',
2350
+ repository: {
2351
+ slug: mockRepositorySlug,
2352
+ project: { key: mockProjectKey }
2353
+ }
2354
+ },
2355
+ toRef: {
2356
+ id: 'refs/heads/main',
2357
+ repository: {
2358
+ slug: mockRepositorySlug,
2359
+ project: { key: mockProjectKey }
2360
+ }
2361
+ }
2362
+ }
2363
+ );
2364
+ });
2365
+
2366
+ it('should successfully create a PR without description', async () => {
2367
+ const mockPullRequest = {
2368
+ id: 2,
2369
+ version: 0,
2370
+ title: 'Test PR without description',
2371
+ state: 'OPEN',
2372
+ fromRef: {
2373
+ id: 'refs/heads/feature-branch',
2374
+ repository: {
2375
+ slug: mockRepositorySlug,
2376
+ project: { key: mockProjectKey }
2377
+ }
2378
+ },
2379
+ toRef: {
2380
+ id: 'refs/heads/main',
2381
+ repository: {
2382
+ slug: mockRepositorySlug,
2383
+ project: { key: mockProjectKey }
2384
+ }
2385
+ }
2386
+ };
2387
+ (PullRequestsService.create as jest.Mock).mockResolvedValue(mockPullRequest);
2388
+
2389
+ const result = await bitbucketService.createPullRequest(
2390
+ mockProjectKey,
2391
+ mockRepositorySlug,
2392
+ 'Test PR without description',
2393
+ undefined,
2394
+ 'refs/heads/feature-branch',
2395
+ 'refs/heads/main'
2396
+ );
2397
+
2398
+ expect(result.success).toBe(true);
2399
+ expect(result.data).toEqual({
2400
+ id: 2,
2401
+ version: 0,
2402
+ title: 'Test PR without description',
2403
+ state: 'OPEN',
2404
+ fromRefId: 'refs/heads/feature-branch',
2405
+ toRefId: 'refs/heads/main',
2406
+ reviewerCount: 0,
2407
+ });
2408
+ expect(PullRequestsService.create).toHaveBeenCalledWith(
2409
+ mockProjectKey,
2410
+ mockRepositorySlug,
2411
+ expect.objectContaining({
2412
+ title: 'Test PR without description',
2413
+ description: undefined
2414
+ })
2415
+ );
2416
+ });
2417
+
2418
+ it('should successfully create a PR with reviewers', async () => {
2419
+ const mockPullRequest = {
2420
+ id: 3,
2421
+ version: 0,
2422
+ title: 'Test PR with reviewers',
2423
+ description: 'PR with reviewers',
2424
+ state: 'OPEN',
2425
+ fromRef: {
2426
+ id: 'refs/heads/feature-branch',
2427
+ repository: {
2428
+ slug: mockRepositorySlug,
2429
+ project: { key: mockProjectKey }
2430
+ }
2431
+ },
2432
+ toRef: {
2433
+ id: 'refs/heads/main',
2434
+ repository: {
2435
+ slug: mockRepositorySlug,
2436
+ project: { key: mockProjectKey }
2437
+ }
2438
+ },
2439
+ reviewers: [
2440
+ { user: { name: 'reviewer1' } },
2441
+ { user: { name: 'reviewer2' } }
2442
+ ]
2443
+ };
2444
+ (PullRequestsService.create as jest.Mock).mockResolvedValue(mockPullRequest);
2445
+
2446
+ const result = await bitbucketService.createPullRequest(
2447
+ mockProjectKey,
2448
+ mockRepositorySlug,
2449
+ 'Test PR with reviewers',
2450
+ 'PR with reviewers',
2451
+ 'refs/heads/feature-branch',
2452
+ 'refs/heads/main',
2453
+ ['reviewer1', 'reviewer2']
2454
+ );
2455
+
2456
+ expect(result.success).toBe(true);
2457
+ expect(result.data).toEqual({
2458
+ id: 3,
2459
+ version: 0,
2460
+ title: 'Test PR with reviewers',
2461
+ state: 'OPEN',
2462
+ fromRefId: 'refs/heads/feature-branch',
2463
+ toRefId: 'refs/heads/main',
2464
+ reviewerCount: 2,
2465
+ });
2466
+ expect(PullRequestsService.create).toHaveBeenCalledWith(
2467
+ mockProjectKey,
2468
+ mockRepositorySlug,
2469
+ expect.objectContaining({
2470
+ title: 'Test PR with reviewers',
2471
+ reviewers: [
2472
+ { user: { name: 'reviewer1' } },
2473
+ { user: { name: 'reviewer2' } }
2474
+ ]
2475
+ })
2476
+ );
2477
+ });
2478
+
2479
+ it('should successfully create a PR with empty reviewers array', async () => {
2480
+ const mockPullRequest = {
2481
+ id: 4,
2482
+ version: 0,
2483
+ title: 'Test PR',
2484
+ description: 'Test',
2485
+ state: 'OPEN'
2486
+ };
2487
+ (PullRequestsService.create as jest.Mock).mockResolvedValue(mockPullRequest);
2488
+
2489
+ const result = await bitbucketService.createPullRequest(
2490
+ mockProjectKey,
2491
+ mockRepositorySlug,
2492
+ 'Test PR',
2493
+ 'Test',
2494
+ 'refs/heads/feature-branch',
2495
+ 'refs/heads/main',
2496
+ []
2497
+ );
2498
+
2499
+ expect(result.success).toBe(true);
2500
+ expect(PullRequestsService.create).toHaveBeenCalledWith(
2501
+ mockProjectKey,
2502
+ mockRepositorySlug,
2503
+ expect.not.objectContaining({
2504
+ reviewers: expect.anything()
2505
+ })
2506
+ );
2507
+ });
2508
+
2509
+ it('should handle API errors gracefully', async () => {
2510
+ const mockError = new Error('Failed to create PR');
2511
+ (PullRequestsService.create as jest.Mock).mockRejectedValue(mockError);
2512
+
2513
+ const result = await bitbucketService.createPullRequest(
2514
+ mockProjectKey,
2515
+ mockRepositorySlug,
2516
+ 'Test PR',
2517
+ 'Test description',
2518
+ 'refs/heads/feature-branch',
2519
+ 'refs/heads/main'
2520
+ );
2521
+
2522
+ expect(result.success).toBe(false);
2523
+ expect(result.error).toBe('Failed to create PR');
2524
+ });
2525
+ });
2526
+
2527
+ describe('updatePullRequest', () => {
2528
+ it('should successfully update PR with only title', async () => {
2529
+ const mockUpdatedPR = {
2530
+ id: 1,
2531
+ version: 1,
2532
+ title: 'Updated Title',
2533
+ description: 'Original description',
2534
+ state: 'OPEN'
2535
+ };
2536
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2537
+
2538
+ const result = await bitbucketService.updatePullRequest(
2539
+ mockProjectKey,
2540
+ mockRepositorySlug,
2541
+ mockPullRequestId,
2542
+ 0,
2543
+ 'Updated Title'
2544
+ );
2545
+
2546
+ expect(result.success).toBe(true);
2547
+ expect(result.data).toEqual({
2548
+ id: 1,
2549
+ version: 1,
2550
+ title: 'Updated Title',
2551
+ state: 'OPEN',
2552
+ reviewerCount: 0,
2553
+ });
2554
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2555
+ mockProjectKey,
2556
+ mockPullRequestId,
2557
+ mockRepositorySlug,
2558
+ {
2559
+ version: 0,
2560
+ title: 'Updated Title'
2561
+ }
2562
+ );
2563
+ });
2564
+
2565
+ it('should successfully update PR with only description', async () => {
2566
+ const mockUpdatedPR = {
2567
+ id: 1,
2568
+ version: 1,
2569
+ title: 'Original Title',
2570
+ description: 'Updated description',
2571
+ state: 'OPEN'
2572
+ };
2573
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2574
+
2575
+ const result = await bitbucketService.updatePullRequest(
2576
+ mockProjectKey,
2577
+ mockRepositorySlug,
2578
+ mockPullRequestId,
2579
+ 0,
2580
+ undefined,
2581
+ 'Updated description'
2582
+ );
2583
+
2584
+ expect(result.success).toBe(true);
2585
+ expect(result.data).toEqual({
2586
+ id: 1,
2587
+ version: 1,
2588
+ title: 'Original Title',
2589
+ state: 'OPEN',
2590
+ reviewerCount: 0,
2591
+ });
2592
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2593
+ mockProjectKey,
2594
+ mockPullRequestId,
2595
+ mockRepositorySlug,
2596
+ {
2597
+ version: 0,
2598
+ description: 'Updated description'
2599
+ }
2600
+ );
2601
+ });
2602
+
2603
+ it('should successfully update PR with title and description', async () => {
2604
+ const mockUpdatedPR = {
2605
+ id: 1,
2606
+ version: 1,
2607
+ title: 'Updated Title',
2608
+ description: 'Updated description',
2609
+ state: 'OPEN'
2610
+ };
2611
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2612
+
2613
+ const result = await bitbucketService.updatePullRequest(
2614
+ mockProjectKey,
2615
+ mockRepositorySlug,
2616
+ mockPullRequestId,
2617
+ 0,
2618
+ 'Updated Title',
2619
+ 'Updated description'
2620
+ );
2621
+
2622
+ expect(result.success).toBe(true);
2623
+ expect(result.data).toEqual({
2624
+ id: 1,
2625
+ version: 1,
2626
+ title: 'Updated Title',
2627
+ state: 'OPEN',
2628
+ reviewerCount: 0,
2629
+ });
2630
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2631
+ mockProjectKey,
2632
+ mockPullRequestId,
2633
+ mockRepositorySlug,
2634
+ {
2635
+ version: 0,
2636
+ title: 'Updated Title',
2637
+ description: 'Updated description'
2638
+ }
2639
+ );
2640
+ });
2641
+
2642
+ it('should successfully update PR with reviewers', async () => {
2643
+ const mockUpdatedPR = {
2644
+ id: 1,
2645
+ version: 1,
2646
+ title: 'Test PR',
2647
+ description: 'Test',
2648
+ state: 'OPEN',
2649
+ reviewers: [
2650
+ { user: { name: 'reviewer1' } },
2651
+ { user: { name: 'reviewer2' } },
2652
+ { user: { name: 'reviewer3' } }
2653
+ ]
2654
+ };
2655
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2656
+
2657
+ const result = await bitbucketService.updatePullRequest(
2658
+ mockProjectKey,
2659
+ mockRepositorySlug,
2660
+ mockPullRequestId,
2661
+ 0,
2662
+ undefined,
2663
+ undefined,
2664
+ ['reviewer1', 'reviewer2', 'reviewer3']
2665
+ );
2666
+
2667
+ expect(result.success).toBe(true);
2668
+ expect(result.data).toEqual({
2669
+ id: 1,
2670
+ version: 1,
2671
+ title: 'Test PR',
2672
+ state: 'OPEN',
2673
+ reviewerCount: 3,
2674
+ });
2675
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2676
+ mockProjectKey,
2677
+ mockPullRequestId,
2678
+ mockRepositorySlug,
2679
+ {
2680
+ version: 0,
2681
+ reviewers: [
2682
+ { user: { name: 'reviewer1' } },
2683
+ { user: { name: 'reviewer2' } },
2684
+ { user: { name: 'reviewer3' } }
2685
+ ]
2686
+ }
2687
+ );
2688
+ });
2689
+
2690
+ it('should successfully update PR with all parameters', async () => {
2691
+ const mockUpdatedPR = {
2692
+ id: 1,
2693
+ version: 2,
2694
+ title: 'Updated Title',
2695
+ description: 'Updated description',
2696
+ state: 'OPEN',
2697
+ reviewers: [
2698
+ { user: { name: 'newreviewer1' } },
2699
+ { user: { name: 'newreviewer2' } }
2700
+ ]
2701
+ };
2702
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2703
+
2704
+ const result = await bitbucketService.updatePullRequest(
2705
+ mockProjectKey,
2706
+ mockRepositorySlug,
2707
+ mockPullRequestId,
2708
+ 1,
2709
+ 'Updated Title',
2710
+ 'Updated description',
2711
+ ['newreviewer1', 'newreviewer2']
2712
+ );
2713
+
2714
+ expect(result.success).toBe(true);
2715
+ expect(result.data).toEqual({
2716
+ id: 1,
2717
+ version: 2,
2718
+ title: 'Updated Title',
2719
+ state: 'OPEN',
2720
+ reviewerCount: 2,
2721
+ });
2722
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2723
+ mockProjectKey,
2724
+ mockPullRequestId,
2725
+ mockRepositorySlug,
2726
+ {
2727
+ version: 1,
2728
+ title: 'Updated Title',
2729
+ description: 'Updated description',
2730
+ reviewers: [
2731
+ { user: { name: 'newreviewer1' } },
2732
+ { user: { name: 'newreviewer2' } }
2733
+ ]
2734
+ }
2735
+ );
2736
+ });
2737
+
2738
+ it('should successfully update PR with only version (no changes)', async () => {
2739
+ const mockUpdatedPR = {
2740
+ id: 1,
2741
+ version: 1,
2742
+ title: 'Original Title',
2743
+ description: 'Original description',
2744
+ state: 'OPEN'
2745
+ };
2746
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2747
+
2748
+ const result = await bitbucketService.updatePullRequest(
2749
+ mockProjectKey,
2750
+ mockRepositorySlug,
2751
+ mockPullRequestId,
2752
+ 0
2753
+ );
2754
+
2755
+ expect(result.success).toBe(true);
2756
+ expect(result.data).toEqual({
2757
+ id: 1,
2758
+ version: 1,
2759
+ title: 'Original Title',
2760
+ state: 'OPEN',
2761
+ reviewerCount: 0,
2762
+ });
2763
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2764
+ mockProjectKey,
2765
+ mockPullRequestId,
2766
+ mockRepositorySlug,
2767
+ {
2768
+ version: 0
2769
+ }
2770
+ );
2771
+ });
2772
+
2773
+ it('should successfully update PR with empty reviewers array', async () => {
2774
+ const mockUpdatedPR = {
2775
+ id: 1,
2776
+ version: 1,
2777
+ title: 'Test PR',
2778
+ description: 'Test',
2779
+ state: 'OPEN',
2780
+ reviewers: []
2781
+ };
2782
+ (PullRequestsService.update as jest.Mock).mockResolvedValue(mockUpdatedPR);
2783
+
2784
+ const result = await bitbucketService.updatePullRequest(
2785
+ mockProjectKey,
2786
+ mockRepositorySlug,
2787
+ mockPullRequestId,
2788
+ 0,
2789
+ undefined,
2790
+ undefined,
2791
+ []
2792
+ );
2793
+
2794
+ expect(result.success).toBe(true);
2795
+ expect(PullRequestsService.update).toHaveBeenCalledWith(
2796
+ mockProjectKey,
2797
+ mockPullRequestId,
2798
+ mockRepositorySlug,
2799
+ expect.not.objectContaining({
2800
+ reviewers: expect.anything()
2801
+ })
2802
+ );
2803
+ });
2804
+
2805
+ it('should handle API errors gracefully', async () => {
2806
+ const mockError = new Error('Failed to update PR');
2807
+ (PullRequestsService.update as jest.Mock).mockRejectedValue(mockError);
2808
+
2809
+ const result = await bitbucketService.updatePullRequest(
2810
+ mockProjectKey,
2811
+ mockRepositorySlug,
2812
+ mockPullRequestId,
2813
+ 0,
2814
+ 'Updated Title'
2815
+ );
2816
+
2817
+ expect(result.success).toBe(false);
2818
+ expect(result.error).toBe('Failed to update PR');
2819
+ });
2820
+
2821
+ it('should handle version conflict errors', async () => {
2822
+ const mockError = new Error('Version conflict - PR has been modified');
2823
+ (PullRequestsService.update as jest.Mock).mockRejectedValue(mockError);
2824
+
2825
+ const result = await bitbucketService.updatePullRequest(
2826
+ mockProjectKey,
2827
+ mockRepositorySlug,
2828
+ mockPullRequestId,
2829
+ 5,
2830
+ 'Updated Title'
2831
+ );
2832
+
2833
+ expect(result.success).toBe(false);
2834
+ expect(result.error).toBe('Version conflict - PR has been modified');
2835
+ });
2836
+ });
2837
+
2838
+ describe('canMergePullRequest', () => {
2839
+ it('should successfully check mergeability', async () => {
2840
+ const mockMergeability = { canMerge: true, conflicted: false, vetoes: [] };
2841
+ (PullRequestsService.canMerge as jest.Mock).mockResolvedValue(mockMergeability);
2842
+
2843
+ const result = await bitbucketService.canMergePullRequest(
2844
+ mockProjectKey,
2845
+ mockRepositorySlug,
2846
+ mockPullRequestId
2847
+ );
2848
+
2849
+ expect(result.success).toBe(true);
2850
+ expect(result.data).toBe(mockMergeability);
2851
+ expect(PullRequestsService.canMerge).toHaveBeenCalledWith(
2852
+ mockProjectKey,
2853
+ mockPullRequestId,
2854
+ mockRepositorySlug
2855
+ );
2856
+ });
2857
+
2858
+ it('should handle API errors gracefully', async () => {
2859
+ const mockError = new Error('API Error');
2860
+ (PullRequestsService.canMerge as jest.Mock).mockRejectedValue(mockError);
2861
+
2862
+ const result = await bitbucketService.canMergePullRequest(
2863
+ mockProjectKey,
2864
+ mockRepositorySlug,
2865
+ mockPullRequestId
2866
+ );
2867
+
2868
+ expect(result.success).toBe(false);
2869
+ expect(result.error).toBe('API Error');
2870
+ });
2871
+ });
2872
+
2873
+ describe('mergePullRequest', () => {
2874
+ it('should successfully merge a PR with minimal parameters', async () => {
2875
+ const mockMergedPR = {
2876
+ id: 1,
2877
+ version: 2,
2878
+ title: 'Test PR',
2879
+ state: 'MERGED',
2880
+ fromRef: { id: 'refs/heads/feature-branch' },
2881
+ toRef: { id: 'refs/heads/main' }
2882
+ };
2883
+ (PullRequestsService.merge as jest.Mock).mockResolvedValue(mockMergedPR);
2884
+
2885
+ const result = await bitbucketService.mergePullRequest(
2886
+ mockProjectKey,
2887
+ mockRepositorySlug,
2888
+ mockPullRequestId,
2889
+ 1
2890
+ );
2891
+
2892
+ expect(result.success).toBe(true);
2893
+ expect(result.data).toEqual({
2894
+ id: 1,
2895
+ version: 2,
2896
+ title: 'Test PR',
2897
+ state: 'MERGED',
2898
+ fromRefId: 'refs/heads/feature-branch',
2899
+ toRefId: 'refs/heads/main',
2900
+ reviewerCount: 0,
2901
+ });
2902
+ expect(PullRequestsService.merge).toHaveBeenCalledWith(
2903
+ mockProjectKey,
2904
+ mockPullRequestId,
2905
+ mockRepositorySlug,
2906
+ '1',
2907
+ {}
2908
+ );
2909
+ });
2910
+
2911
+ it('should pass message and strategyId in the request body', async () => {
2912
+ const mockMergedPR = { id: 1, version: 2, state: 'MERGED' };
2913
+ (PullRequestsService.merge as jest.Mock).mockResolvedValue(mockMergedPR);
2914
+
2915
+ await bitbucketService.mergePullRequest(
2916
+ mockProjectKey,
2917
+ mockRepositorySlug,
2918
+ mockPullRequestId,
2919
+ 1,
2920
+ 'Custom merge message',
2921
+ 'squash'
2922
+ );
2923
+
2924
+ expect(PullRequestsService.merge).toHaveBeenCalledWith(
2925
+ mockProjectKey,
2926
+ mockPullRequestId,
2927
+ mockRepositorySlug,
2928
+ '1',
2929
+ { message: 'Custom merge message', strategyId: 'squash' }
2930
+ );
2931
+ });
2932
+
2933
+ it('should return the full response when output is full', async () => {
2934
+ const mockMergedPR = { id: 1, version: 2, state: 'MERGED' };
2935
+ (PullRequestsService.merge as jest.Mock).mockResolvedValue(mockMergedPR);
2936
+
2937
+ const result = await bitbucketService.mergePullRequest(
2938
+ mockProjectKey,
2939
+ mockRepositorySlug,
2940
+ mockPullRequestId,
2941
+ 1,
2942
+ undefined,
2943
+ undefined,
2944
+ 'full'
2945
+ );
2946
+
2947
+ expect(result.success).toBe(true);
2948
+ expect(result.data).toBe(mockMergedPR);
2949
+ });
2950
+
2951
+ it('should handle merge veto errors gracefully', async () => {
2952
+ const mockError = new Error('The pull request has unresolved tasks');
2953
+ (PullRequestsService.merge as jest.Mock).mockRejectedValue(mockError);
2954
+
2955
+ const result = await bitbucketService.mergePullRequest(
2956
+ mockProjectKey,
2957
+ mockRepositorySlug,
2958
+ mockPullRequestId,
2959
+ 1
2960
+ );
2961
+
2962
+ expect(result.success).toBe(false);
2963
+ expect(result.error).toBe('The pull request has unresolved tasks');
2964
+ });
2965
+ });
2966
+
2967
+ describe('declinePullRequest', () => {
2968
+ it('should successfully decline a PR', async () => {
2969
+ const mockDeclinedPR = {
2970
+ id: 1,
2971
+ version: 2,
2972
+ title: 'Test PR',
2973
+ state: 'DECLINED'
2974
+ };
2975
+ (PullRequestsService.decline as jest.Mock).mockResolvedValue(mockDeclinedPR);
2976
+
2977
+ const result = await bitbucketService.declinePullRequest(
2978
+ mockProjectKey,
2979
+ mockRepositorySlug,
2980
+ mockPullRequestId,
2981
+ 1
2982
+ );
2983
+
2984
+ expect(result.success).toBe(true);
2985
+ expect(result.data).toEqual({
2986
+ id: 1,
2987
+ version: 2,
2988
+ title: 'Test PR',
2989
+ state: 'DECLINED',
2990
+ reviewerCount: 0,
2991
+ });
2992
+ expect(PullRequestsService.decline).toHaveBeenCalledWith(
2993
+ mockProjectKey,
2994
+ mockPullRequestId,
2995
+ mockRepositorySlug,
2996
+ '1',
2997
+ {}
2998
+ );
2999
+ });
3000
+
3001
+ it('should pass an optional comment in the request body', async () => {
3002
+ const mockDeclinedPR = { id: 1, version: 2, state: 'DECLINED' };
3003
+ (PullRequestsService.decline as jest.Mock).mockResolvedValue(mockDeclinedPR);
3004
+
3005
+ await bitbucketService.declinePullRequest(
3006
+ mockProjectKey,
3007
+ mockRepositorySlug,
3008
+ mockPullRequestId,
3009
+ 1,
3010
+ 'Superseded by another PR'
3011
+ );
3012
+
3013
+ expect(PullRequestsService.decline).toHaveBeenCalledWith(
3014
+ mockProjectKey,
3015
+ mockPullRequestId,
3016
+ mockRepositorySlug,
3017
+ '1',
3018
+ { comment: 'Superseded by another PR' }
3019
+ );
3020
+ });
3021
+
3022
+ it('should handle API errors gracefully', async () => {
3023
+ const mockError = new Error('API Error');
3024
+ (PullRequestsService.decline as jest.Mock).mockRejectedValue(mockError);
3025
+
3026
+ const result = await bitbucketService.declinePullRequest(
3027
+ mockProjectKey,
3028
+ mockRepositorySlug,
3029
+ mockPullRequestId,
3030
+ 1
3031
+ );
3032
+
3033
+ expect(result.success).toBe(false);
3034
+ expect(result.error).toBe('API Error');
3035
+ });
3036
+ });
3037
+
3038
+ describe('reopenPullRequest', () => {
3039
+ it('should successfully reopen a declined PR', async () => {
3040
+ const mockReopenedPR = {
3041
+ id: 1,
3042
+ version: 3,
3043
+ title: 'Test PR',
3044
+ state: 'OPEN'
3045
+ };
3046
+ (PullRequestsService.reopen as jest.Mock).mockResolvedValue(mockReopenedPR);
3047
+
3048
+ const result = await bitbucketService.reopenPullRequest(
3049
+ mockProjectKey,
3050
+ mockRepositorySlug,
3051
+ mockPullRequestId,
3052
+ 2
3053
+ );
3054
+
3055
+ expect(result.success).toBe(true);
3056
+ expect(result.data).toEqual({
3057
+ id: 1,
3058
+ version: 3,
3059
+ title: 'Test PR',
3060
+ state: 'OPEN',
3061
+ reviewerCount: 0,
3062
+ });
3063
+ expect(PullRequestsService.reopen).toHaveBeenCalledWith(
3064
+ mockProjectKey,
3065
+ mockPullRequestId,
3066
+ mockRepositorySlug,
3067
+ '2',
3068
+ {}
3069
+ );
3070
+ });
3071
+
3072
+ it('should handle API errors gracefully', async () => {
3073
+ const mockError = new Error('Pull request is not declined');
3074
+ (PullRequestsService.reopen as jest.Mock).mockRejectedValue(mockError);
3075
+
3076
+ const result = await bitbucketService.reopenPullRequest(
3077
+ mockProjectKey,
3078
+ mockRepositorySlug,
3079
+ mockPullRequestId,
3080
+ 2
3081
+ );
3082
+
3083
+ expect(result.success).toBe(false);
3084
+ expect(result.error).toBe('Pull request is not declined');
3085
+ });
3086
+ });
3087
+
3088
+ describe('getRequiredReviewers', () => {
3089
+ it('should successfully get required reviewers', async () => {
3090
+ const mockReviewersData = [
3091
+ {
3092
+ id: 1,
3093
+ reviewers: [
3094
+ { name: 'reviewer1', emailAddress: 'reviewer1@example.com' },
3095
+ { name: 'reviewer2', emailAddress: 'reviewer2@example.com' }
3096
+ ]
3097
+ }
3098
+ ];
3099
+ (PullRequestsService.getReviewers as jest.Mock).mockResolvedValue(mockReviewersData);
3100
+
3101
+ const result = await bitbucketService.getRequiredReviewers(
3102
+ mockProjectKey,
3103
+ mockRepositorySlug,
3104
+ 'refs/heads/feature',
3105
+ 'refs/heads/main'
3106
+ );
3107
+
3108
+ expect(result.success).toBe(true);
3109
+ expect(result.data).toBe(mockReviewersData);
3110
+ expect(PullRequestsService.getReviewers).toHaveBeenCalledWith(
3111
+ mockProjectKey,
3112
+ mockRepositorySlug,
3113
+ undefined, // targetRepoId
3114
+ undefined, // sourceRepoId
3115
+ 'refs/heads/feature',
3116
+ 'refs/heads/main'
3117
+ );
3118
+ });
3119
+
3120
+ it('should successfully get required reviewers with all parameters', async () => {
3121
+ const mockReviewersData = [
3122
+ {
3123
+ id: 1,
3124
+ reviewers: [
3125
+ { name: 'reviewer1', emailAddress: 'reviewer1@example.com' }
3126
+ ]
3127
+ }
3128
+ ];
3129
+ (PullRequestsService.getReviewers as jest.Mock).mockResolvedValue(mockReviewersData);
3130
+
3131
+ const result = await bitbucketService.getRequiredReviewers(
3132
+ mockProjectKey,
3133
+ mockRepositorySlug,
3134
+ 'refs/heads/feature',
3135
+ 'refs/heads/main',
3136
+ '123', // sourceRepoId
3137
+ '456' // targetRepoId
3138
+ );
3139
+
3140
+ expect(result.success).toBe(true);
3141
+ expect(result.data).toBe(mockReviewersData);
3142
+ expect(PullRequestsService.getReviewers).toHaveBeenCalledWith(
3143
+ mockProjectKey,
3144
+ mockRepositorySlug,
3145
+ '456', // targetRepoId
3146
+ '123', // sourceRepoId
3147
+ 'refs/heads/feature',
3148
+ 'refs/heads/main'
3149
+ );
3150
+ });
3151
+
3152
+ it('should handle errors when getting required reviewers', async () => {
3153
+ const mockError = new Error('API Error');
3154
+ (PullRequestsService.getReviewers as jest.Mock).mockRejectedValue(mockError);
3155
+
3156
+ const result = await bitbucketService.getRequiredReviewers(
3157
+ mockProjectKey,
3158
+ mockRepositorySlug,
3159
+ 'refs/heads/feature',
3160
+ 'refs/heads/main'
3161
+ );
3162
+
3163
+ expect(result.success).toBe(false);
3164
+ expect(result.error).toBe('API Error');
3165
+ });
3166
+ });
3167
+
3168
+ describe('getDashboardPullRequests', () => {
3169
+ const { request: mockRequest } = require('../bitbucket-client/core/request.js');
3170
+
3171
+ it('should default to AUTHOR role and the package page size', async () => {
3172
+ const mockData = {
3173
+ values: [
3174
+ { id: 1, title: 'PR 1', state: 'OPEN' },
3175
+ { id: 2, title: 'PR 2', state: 'OPEN' }
3176
+ ],
3177
+ size: 2,
3178
+ isLastPage: true
3179
+ };
3180
+ mockRequest.mockResolvedValue(mockData);
3181
+
3182
+ const result = await bitbucketService.getDashboardPullRequests();
3183
+
3184
+ expect(result.success).toBe(true);
3185
+ expect(result.data).toBe(mockData);
3186
+ expect(mockRequest).toHaveBeenCalledWith(
3187
+ expect.any(Object),
3188
+ {
3189
+ method: 'GET',
3190
+ url: '/api/1.0/dashboard/pull-requests',
3191
+ query: {
3192
+ 'role': 'AUTHOR',
3193
+ 'state': 'OPEN',
3194
+ 'closedSince': undefined,
3195
+ 'order': 'NEWEST',
3196
+ 'start': undefined,
3197
+ 'limit': 25,
3198
+ },
3199
+ errors: {
3200
+ 401: 'The currently authenticated user is not permitted to access the dashboard.',
3201
+ },
3202
+ }
3203
+ );
3204
+ });
3205
+
3206
+ it('should get dashboard PRs filtered by role and state', async () => {
3207
+ const mockData = {
3208
+ values: [{ id: 1, title: 'My PR', state: 'OPEN' }],
3209
+ size: 1,
3210
+ isLastPage: true
3211
+ };
3212
+ mockRequest.mockResolvedValue(mockData);
3213
+
3214
+ const result = await bitbucketService.getDashboardPullRequests(
3215
+ 'REVIEWER',
3216
+ 'OPEN',
3217
+ undefined,
3218
+ 'NEWEST',
3219
+ 0,
3220
+ 5
3221
+ );
3222
+
3223
+ expect(result.success).toBe(true);
3224
+ expect(result.data).toBe(mockData);
3225
+ expect(mockRequest).toHaveBeenCalledWith(
3226
+ expect.any(Object),
3227
+ {
3228
+ method: 'GET',
3229
+ url: '/api/1.0/dashboard/pull-requests',
3230
+ query: {
3231
+ 'role': 'REVIEWER',
3232
+ 'state': 'OPEN',
3233
+ 'closedSince': undefined,
3234
+ 'order': 'NEWEST',
3235
+ 'start': 0,
3236
+ 'limit': 5,
3237
+ },
3238
+ errors: {
3239
+ 401: 'The currently authenticated user is not permitted to access the dashboard.',
3240
+ },
3241
+ }
3242
+ );
3243
+ });
3244
+
3245
+ it('should get dashboard PRs with closedSince filter', async () => {
3246
+ const mockData = {
3247
+ values: [{ id: 3, title: 'Merged PR', state: 'MERGED' }],
3248
+ size: 1,
3249
+ isLastPage: true
3250
+ };
3251
+ mockRequest.mockResolvedValue(mockData);
3252
+
3253
+ const closedSince = 1700000000000;
3254
+ const result = await bitbucketService.getDashboardPullRequests(
3255
+ 'PARTICIPANT',
3256
+ 'MERGED',
3257
+ closedSince
3258
+ );
3259
+
3260
+ expect(result.success).toBe(true);
3261
+ expect(result.data).toBe(mockData);
3262
+ expect(mockRequest).toHaveBeenCalledWith(
3263
+ expect.any(Object),
3264
+ {
3265
+ method: 'GET',
3266
+ url: '/api/1.0/dashboard/pull-requests',
3267
+ query: {
3268
+ 'role': 'PARTICIPANT',
3269
+ 'state': 'MERGED',
3270
+ 'closedSince': closedSince,
3271
+ 'order': 'NEWEST',
3272
+ 'start': undefined,
3273
+ 'limit': 25,
3274
+ },
3275
+ errors: {
3276
+ 401: 'The currently authenticated user is not permitted to access the dashboard.',
3277
+ },
3278
+ }
3279
+ );
3280
+ });
3281
+
3282
+ it('should handle API errors', async () => {
3283
+ const mockError = new Error('Unauthorized');
3284
+ mockRequest.mockRejectedValue(mockError);
3285
+
3286
+ const result = await bitbucketService.getDashboardPullRequests();
3287
+
3288
+ expect(result.success).toBe(false);
3289
+ expect(result.error).toBe('Unauthorized');
3290
+ });
3291
+ });
3292
+
3293
+ describe('getInboxPullRequests', () => {
3294
+ const { request: mockRequest } = require('../bitbucket-client/core/request.js');
3295
+
3296
+ it('should successfully get inbox pull requests with default parameters', async () => {
3297
+ const mockInboxData = {
3298
+ values: [
3299
+ {
3300
+ id: 1,
3301
+ title: 'Fix bug',
3302
+ state: 'OPEN',
3303
+ createdDate: 1700000000000,
3304
+ updatedDate: 1700001000000,
3305
+ author: { user: { name: 'user1', displayName: 'User One' } },
3306
+ fromRef: { id: 'refs/heads/feature', displayId: 'feature', repository: { slug: 'repo1', project: { key: 'PROJ' } } },
3307
+ toRef: { id: 'refs/heads/main', displayId: 'main', repository: { slug: 'repo1', project: { key: 'PROJ' } } },
3308
+ reviewers: [{ user: { name: 'reviewer1' }, approved: false, status: 'UNAPPROVED' }],
3309
+ },
3310
+ ],
3311
+ size: 1,
3312
+ isLastPage: true,
3313
+ start: 0,
3314
+ limit: 25,
3315
+ };
3316
+ mockRequest.mockResolvedValue(mockInboxData);
3317
+
3318
+ const result = await bitbucketService.getInboxPullRequests();
3319
+
3320
+ expect(result.success).toBe(true);
3321
+ expect(result.data).toBeDefined();
3322
+ expect(mockRequest).toHaveBeenCalledWith(
3323
+ expect.any(Object),
3324
+ expect.objectContaining({
3325
+ method: 'GET',
3326
+ url: '/api/latest/inbox/pull-requests',
3327
+ query: { start: undefined, limit: 25 },
3328
+ })
3329
+ );
3330
+ });
3331
+
3332
+ it('should successfully get inbox pull requests with pagination parameters', async () => {
3333
+ const mockInboxData = {
3334
+ values: [
3335
+ {
3336
+ id: 2,
3337
+ title: 'Add feature',
3338
+ state: 'OPEN',
3339
+ createdDate: 1700000000000,
3340
+ updatedDate: 1700001000000,
3341
+ fromRef: { id: 'refs/heads/feat', displayId: 'feat', repository: { slug: 'repo1', project: { key: 'PROJ' } } },
3342
+ toRef: { id: 'refs/heads/main', displayId: 'main', repository: { slug: 'repo1', project: { key: 'PROJ' } } },
3343
+ },
3344
+ ],
3345
+ size: 1,
3346
+ isLastPage: false,
3347
+ start: 25,
3348
+ limit: 10,
3349
+ nextPageStart: 35,
3350
+ };
3351
+ mockRequest.mockResolvedValue(mockInboxData);
3352
+
3353
+ const result = await bitbucketService.getInboxPullRequests(25, 10);
3354
+
3355
+ expect(result.success).toBe(true);
3356
+ expect(mockRequest).toHaveBeenCalledWith(
3357
+ expect.any(Object),
3358
+ expect.objectContaining({
3359
+ query: { start: 25, limit: 10 },
3360
+ })
3361
+ );
3362
+ });
3363
+
3364
+ it('should handle empty inbox', async () => {
3365
+ const mockInboxData = {
3366
+ values: [],
3367
+ size: 0,
3368
+ isLastPage: true,
3369
+ start: 0,
3370
+ limit: 25,
3371
+ };
3372
+ mockRequest.mockResolvedValue(mockInboxData);
3373
+
3374
+ const result = await bitbucketService.getInboxPullRequests();
3375
+
3376
+ expect(result.success).toBe(true);
3377
+ expect(result.data).toBeDefined();
3378
+ });
3379
+
3380
+ it('should handle API errors gracefully', async () => {
3381
+ const mockError = new Error('Unauthorized');
3382
+ mockRequest.mockRejectedValue(mockError);
3383
+
3384
+ const result = await bitbucketService.getInboxPullRequests();
3385
+
3386
+ expect(result.success).toBe(false);
3387
+ expect(result.error).toBe('Unauthorized');
3388
+ });
3389
+ });
3390
+
3391
+ describe('validateConfig', () => {
3392
+ const originalEnv = process.env;
3393
+ let tempDir: string;
3394
+
3395
+ beforeEach(() => {
3396
+ process.env = { ...originalEnv };
3397
+ delete process.env.ATLASSIAN_DC_MCP_CONFIG_FILE;
3398
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'bitbucket-validate-config-'));
3399
+ initializeRuntimeConfig({ cwd: tempDir });
3400
+ });
3401
+
3402
+ afterEach(() => {
3403
+ fs.rmSync(tempDir, { recursive: true, force: true });
3404
+ });
3405
+
3406
+ afterAll(() => {
3407
+ process.env = originalEnv;
3408
+ });
3409
+
3410
+ it('should return empty array when all required env vars are present', () => {
3411
+ process.env.BITBUCKET_API_TOKEN = 'test-token';
3412
+ process.env.BITBUCKET_HOST = 'test-host';
3413
+
3414
+ const missingVars = BitbucketService.validateConfig();
3415
+ expect(missingVars).toEqual([]);
3416
+ });
3417
+
3418
+ it('should allow anonymous access when BITBUCKET_API_TOKEN is missing', () => {
3419
+ delete process.env.BITBUCKET_API_TOKEN;
3420
+ process.env.BITBUCKET_HOST = 'test-host';
3421
+
3422
+ const missingVars = BitbucketService.validateConfig();
3423
+ expect(missingVars).toEqual([]);
3424
+ });
3425
+
3426
+ it('should return missing vars when both host options are missing', () => {
3427
+ process.env.BITBUCKET_API_TOKEN = 'test-token';
3428
+ delete process.env.BITBUCKET_HOST;
3429
+ delete process.env.BITBUCKET_API_BASE_PATH;
3430
+
3431
+ const missingVars = BitbucketService.validateConfig();
3432
+ expect(missingVars).toContain('BITBUCKET_HOST or BITBUCKET_API_BASE_PATH');
3433
+ });
3434
+
3435
+ it('should accept BITBUCKET_API_BASE_PATH as alternative to BITBUCKET_HOST', () => {
3436
+ process.env.BITBUCKET_API_TOKEN = 'test-token';
3437
+ delete process.env.BITBUCKET_HOST;
3438
+ process.env.BITBUCKET_API_BASE_PATH = 'https://test-host/rest';
3439
+
3440
+ const missingVars = BitbucketService.validateConfig();
3441
+ expect(missingVars).toEqual([]);
3442
+ });
3443
+
3444
+ it('should accept required config from the shared config file', () => {
3445
+ const sharedConfigPath = path.join(tempDir, 'shared.env');
3446
+ fs.writeFileSync(sharedConfigPath, 'BITBUCKET_HOST=file-host\nBITBUCKET_API_TOKEN=file-token\n');
3447
+ process.env.ATLASSIAN_DC_MCP_CONFIG_FILE = sharedConfigPath;
3448
+
3449
+ const missingVars = BitbucketService.validateConfig();
3450
+ expect(missingVars).toEqual([]);
3451
+ });
3452
+ });
3453
+
3454
+ describe('updatePullRequestComment', () => {
3455
+ it('should resolve a task by sending state RESOLVED with the version', async () => {
3456
+ const mockComment = { id: 500, version: 2, state: 'RESOLVED', text: 'Task body' };
3457
+ (PullRequestsService.updateComment2 as jest.Mock).mockResolvedValue(mockComment);
3458
+
3459
+ const result = await bitbucketService.updatePullRequestComment(
3460
+ mockProjectKey,
3461
+ mockRepositorySlug,
3462
+ mockPullRequestId,
3463
+ '500', // commentId
3464
+ 1, // version
3465
+ undefined, // text
3466
+ 'RESOLVED' // state
3467
+ );
3468
+
3469
+ expect(result.success).toBe(true);
3470
+ expect(PullRequestsService.updateComment2).toHaveBeenCalledWith(
3471
+ mockProjectKey,
3472
+ '500',
3473
+ mockPullRequestId,
3474
+ mockRepositorySlug,
3475
+ { version: 1, state: 'RESOLVED' }
3476
+ );
3477
+ });
3478
+
3479
+ it('should edit the comment text without changing state or severity', async () => {
3480
+ const mockComment = { id: 501, version: 3, text: 'Edited text' };
3481
+ (PullRequestsService.updateComment2 as jest.Mock).mockResolvedValue(mockComment);
3482
+
3483
+ await bitbucketService.updatePullRequestComment(
3484
+ mockProjectKey,
3485
+ mockRepositorySlug,
3486
+ mockPullRequestId,
3487
+ '501',
3488
+ 2,
3489
+ 'Edited text'
3490
+ );
3491
+
3492
+ expect(PullRequestsService.updateComment2).toHaveBeenCalledWith(
3493
+ mockProjectKey,
3494
+ '501',
3495
+ mockPullRequestId,
3496
+ mockRepositorySlug,
3497
+ { version: 2, text: 'Edited text' }
3498
+ );
3499
+ });
3500
+
3501
+ it('should support combining text, state, and severity in a single update', async () => {
3502
+ const mockComment = { id: 502, version: 4, text: 'New body', state: 'RESOLVED', severity: 'BLOCKER' };
3503
+ (PullRequestsService.updateComment2 as jest.Mock).mockResolvedValue(mockComment);
3504
+
3505
+ await bitbucketService.updatePullRequestComment(
3506
+ mockProjectKey,
3507
+ mockRepositorySlug,
3508
+ mockPullRequestId,
3509
+ '502',
3510
+ 3,
3511
+ 'New body',
3512
+ 'RESOLVED',
3513
+ 'BLOCKER'
3514
+ );
3515
+
3516
+ expect(PullRequestsService.updateComment2).toHaveBeenCalledWith(
3517
+ mockProjectKey,
3518
+ '502',
3519
+ mockPullRequestId,
3520
+ mockRepositorySlug,
3521
+ { version: 3, text: 'New body', state: 'RESOLVED', severity: 'BLOCKER' }
3522
+ );
3523
+ });
3524
+
3525
+ it('should propagate API errors', async () => {
3526
+ (PullRequestsService.updateComment2 as jest.Mock).mockRejectedValue(new Error('Conflict'));
3527
+
3528
+ const result = await bitbucketService.updatePullRequestComment(
3529
+ mockProjectKey,
3530
+ mockRepositorySlug,
3531
+ mockPullRequestId,
3532
+ '503',
3533
+ 1,
3534
+ undefined,
3535
+ 'RESOLVED'
3536
+ );
3537
+
3538
+ expect(result.success).toBe(false);
3539
+ expect(result.error).toBe('Conflict');
3540
+ });
3541
+ });
3542
+
3543
+ describe('postPullRequestComment - severity flag', () => {
3544
+ it('should include severity: BLOCKER in the request body when severity is BLOCKER', async () => {
3545
+ const mockComment = { id: 200, text: 'Task comment', author: { displayName: 'Test User' } };
3546
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3547
+
3548
+ const result = await bitbucketService.postPullRequestComment(
3549
+ mockProjectKey,
3550
+ mockRepositorySlug,
3551
+ mockPullRequestId,
3552
+ 'Task comment',
3553
+ undefined, // parentId
3554
+ undefined, // filePath
3555
+ undefined, // startLine
3556
+ undefined, // startLineType
3557
+ undefined, // line
3558
+ undefined, // lineType
3559
+ undefined, // pending
3560
+ 'BLOCKER' // severity
3561
+ );
3562
+
3563
+ expect(result.success).toBe(true);
3564
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3565
+ mockProjectKey,
3566
+ mockPullRequestId,
3567
+ mockRepositorySlug,
3568
+ { text: 'Task comment', severity: 'BLOCKER' }
3569
+ );
3570
+ });
3571
+
3572
+ it('should NOT include severity in the request body when severity is omitted', async () => {
3573
+ const mockComment = { id: 201, text: 'Normal comment', author: { displayName: 'Test User' } };
3574
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3575
+
3576
+ await bitbucketService.postPullRequestComment(
3577
+ mockProjectKey,
3578
+ mockRepositorySlug,
3579
+ mockPullRequestId,
3580
+ 'Normal comment'
3581
+ );
3582
+
3583
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3584
+ mockProjectKey,
3585
+ mockPullRequestId,
3586
+ mockRepositorySlug,
3587
+ { text: 'Normal comment' } // no severity field
3588
+ );
3589
+ });
3590
+
3591
+ it('should support severity BLOCKER combined with a file/line anchor', async () => {
3592
+ const mockComment = { id: 202, text: 'Inline task', author: { displayName: 'Test User' } };
3593
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3594
+
3595
+ await bitbucketService.postPullRequestComment(
3596
+ mockProjectKey,
3597
+ mockRepositorySlug,
3598
+ mockPullRequestId,
3599
+ 'Inline task',
3600
+ undefined, // parentId
3601
+ 'src/index.ts', // filePath
3602
+ undefined, // startLine
3603
+ undefined, // startLineType
3604
+ 10, // line
3605
+ 'ADDED', // lineType
3606
+ undefined, // pending
3607
+ 'BLOCKER' // severity
3608
+ );
3609
+
3610
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3611
+ mockProjectKey,
3612
+ mockPullRequestId,
3613
+ mockRepositorySlug,
3614
+ {
3615
+ text: 'Inline task',
3616
+ severity: 'BLOCKER',
3617
+ anchor: {
3618
+ path: 'src/index.ts',
3619
+ diffType: 'EFFECTIVE',
3620
+ line: 10,
3621
+ lineType: 'ADDED',
3622
+ fileType: 'TO'
3623
+ }
3624
+ }
3625
+ );
3626
+ });
3627
+ });
3628
+
3629
+ describe('postPullRequestComment - pending flag', () => {
3630
+ it('should include state: PENDING in the request body when pending is true', async () => {
3631
+ const mockComment = { id: 99, text: 'Draft comment', author: { displayName: 'Test User' } };
3632
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3633
+
3634
+ const result = await bitbucketService.postPullRequestComment(
3635
+ mockProjectKey,
3636
+ mockRepositorySlug,
3637
+ mockPullRequestId,
3638
+ 'Draft comment',
3639
+ undefined, // parentId
3640
+ undefined, // filePath
3641
+ undefined, // startLine
3642
+ undefined, // startLineType
3643
+ undefined, // line
3644
+ undefined, // lineType
3645
+ true // pending
3646
+ );
3647
+
3648
+ expect(result.success).toBe(true);
3649
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3650
+ mockProjectKey,
3651
+ mockPullRequestId,
3652
+ mockRepositorySlug,
3653
+ { text: 'Draft comment', state: 'PENDING' }
3654
+ );
3655
+ });
3656
+
3657
+ it('should NOT include pending in the request body when pending is false or omitted', async () => {
3658
+ const mockComment = { id: 100, text: 'Normal comment', author: { displayName: 'Test User' } };
3659
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3660
+
3661
+ await bitbucketService.postPullRequestComment(
3662
+ mockProjectKey,
3663
+ mockRepositorySlug,
3664
+ mockPullRequestId,
3665
+ 'Normal comment'
3666
+ );
3667
+
3668
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3669
+ mockProjectKey,
3670
+ mockPullRequestId,
3671
+ mockRepositorySlug,
3672
+ { text: 'Normal comment' } // no pending field
3673
+ );
3674
+ });
3675
+
3676
+ it('should support state: PENDING combined with a file anchor', async () => {
3677
+ const mockComment = { id: 101, text: 'Pending file comment', author: { displayName: 'Test User' } };
3678
+ (PullRequestsService.createComment2 as jest.Mock).mockResolvedValue(mockComment);
3679
+
3680
+ await bitbucketService.postPullRequestComment(
3681
+ mockProjectKey,
3682
+ mockRepositorySlug,
3683
+ mockPullRequestId,
3684
+ 'Pending file comment',
3685
+ undefined, // parentId
3686
+ 'src/index.ts', // filePath
3687
+ undefined, // startLine
3688
+ undefined, // startLineType
3689
+ 10, // line
3690
+ 'ADDED', // lineType
3691
+ true // pending
3692
+ );
3693
+
3694
+ expect(PullRequestsService.createComment2).toHaveBeenCalledWith(
3695
+ mockProjectKey,
3696
+ mockPullRequestId,
3697
+ mockRepositorySlug,
3698
+ {
3699
+ text: 'Pending file comment',
3700
+ state: 'PENDING',
3701
+ anchor: {
3702
+ path: 'src/index.ts',
3703
+ diffType: 'EFFECTIVE',
3704
+ line: 10,
3705
+ lineType: 'ADDED',
3706
+ fileType: 'TO'
3707
+ }
3708
+ }
3709
+ );
3710
+ });
3711
+ });
3712
+
3713
+ describe('submitPullRequestReview', () => {
3714
+ const mockUserSlug = 'test-user';
3715
+
3716
+ it('should submit a NEEDS_WORK review and call updateStatus with correct args', async () => {
3717
+ const mockParticipant = {
3718
+ user: { name: mockUserSlug },
3719
+ role: 'REVIEWER',
3720
+ status: 'NEEDS_WORK'
3721
+ };
3722
+ (PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
3723
+
3724
+ const result = await bitbucketService.submitPullRequestReview(
3725
+ mockProjectKey,
3726
+ mockRepositorySlug,
3727
+ mockPullRequestId,
3728
+ mockUserSlug,
3729
+ 'NEEDS_WORK'
3730
+ );
3731
+
3732
+ expect(result.success).toBe(true);
3733
+ expect(result.data).toBe(mockParticipant);
3734
+ expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
3735
+ mockProjectKey,
3736
+ mockUserSlug,
3737
+ mockPullRequestId,
3738
+ mockRepositorySlug,
3739
+ { status: 'NEEDS_WORK' }
3740
+ );
3741
+ });
3742
+
3743
+ it('should submit an APPROVED review', async () => {
3744
+ const mockParticipant = { user: { name: mockUserSlug }, status: 'APPROVED' };
3745
+ (PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
3746
+
3747
+ const result = await bitbucketService.submitPullRequestReview(
3748
+ mockProjectKey,
3749
+ mockRepositorySlug,
3750
+ mockPullRequestId,
3751
+ mockUserSlug,
3752
+ 'APPROVED'
3753
+ );
3754
+
3755
+ expect(result.success).toBe(true);
3756
+ expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
3757
+ mockProjectKey,
3758
+ mockUserSlug,
3759
+ mockPullRequestId,
3760
+ mockRepositorySlug,
3761
+ { status: 'APPROVED' }
3762
+ );
3763
+ });
3764
+
3765
+ it('should include lastReviewedCommit when provided', async () => {
3766
+ const mockParticipant = { user: { name: mockUserSlug }, status: 'NEEDS_WORK' };
3767
+ (PullRequestsService.updateStatus as jest.Mock).mockResolvedValue(mockParticipant);
3768
+
3769
+ await bitbucketService.submitPullRequestReview(
3770
+ mockProjectKey,
3771
+ mockRepositorySlug,
3772
+ mockPullRequestId,
3773
+ mockUserSlug,
3774
+ 'NEEDS_WORK',
3775
+ 'abc123def456'
3776
+ );
3777
+
3778
+ expect(PullRequestsService.updateStatus).toHaveBeenCalledWith(
3779
+ mockProjectKey,
3780
+ mockUserSlug,
3781
+ mockPullRequestId,
3782
+ mockRepositorySlug,
3783
+ { status: 'NEEDS_WORK', lastReviewedCommit: 'abc123def456' }
3784
+ );
3785
+ });
3786
+
3787
+ it('should handle API errors gracefully', async () => {
3788
+ const mockError = new Error('Forbidden');
3789
+ (PullRequestsService.updateStatus as jest.Mock).mockRejectedValue(mockError);
3790
+
3791
+ const result = await bitbucketService.submitPullRequestReview(
3792
+ mockProjectKey,
3793
+ mockRepositorySlug,
3794
+ mockPullRequestId,
3795
+ mockUserSlug,
3796
+ 'APPROVED'
3797
+ );
3798
+
3799
+ expect(result.success).toBe(false);
3800
+ expect(result.error).toBe('Forbidden');
3801
+ });
3802
+ });
3803
+
3804
+ describe('getUser', () => {
3805
+ it('should fetch a user by exact slug', async () => {
3806
+ const mockUser = { slug: 'jsmith', displayName: 'John Smith', emailAddress: 'jsmith@example.com' };
3807
+ (mockRequest as jest.Mock).mockResolvedValue(mockUser);
3808
+
3809
+ const result = await bitbucketService.getUser('jsmith', undefined);
3810
+
3811
+ expect(result.success).toBe(true);
3812
+ expect(result.data).toEqual(mockUser);
3813
+ expect(mockRequest).toHaveBeenCalledWith(
3814
+ expect.anything(),
3815
+ expect.objectContaining({
3816
+ method: 'GET',
3817
+ url: '/api/latest/users/{userSlug}',
3818
+ path: { userSlug: 'jsmith' }
3819
+ })
3820
+ );
3821
+ });
3822
+
3823
+ it('should search for users by filter string', async () => {
3824
+ const mockUsers = { values: [{ slug: 'jsmith', displayName: 'John Smith' }], size: 1, isLastPage: true };
3825
+ (mockRequest as jest.Mock).mockResolvedValue(mockUsers);
3826
+
3827
+ const result = await bitbucketService.getUser(undefined, 'John');
3828
+
3829
+ expect(result.success).toBe(true);
3830
+ expect(result.data).toEqual(mockUsers);
3831
+ expect(mockRequest).toHaveBeenCalledWith(
3832
+ expect.anything(),
3833
+ expect.objectContaining({
3834
+ method: 'GET',
3835
+ url: '/api/latest/users',
3836
+ query: { filter: 'John' }
3837
+ })
3838
+ );
3839
+ });
3840
+
3841
+ it('should handle API errors gracefully', async () => {
3842
+ (mockRequest as jest.Mock).mockRejectedValue(new Error('Not Found'));
3843
+
3844
+ const result = await bitbucketService.getUser('nonexistent', undefined);
3845
+
3846
+ expect(result.success).toBe(false);
3847
+ expect(result.error).toBe('Not Found');
3848
+ });
3849
+ });
3850
+
3851
+ describe('case-insensitive project keys and repository slugs', () => {
3852
+ it('should uppercase projectKey and lowercase repositorySlug for getPullRequests', async () => {
3853
+ const mockData = { values: [], size: 0, isLastPage: true };
3854
+ (PullRequestsService.getPage as jest.Mock).mockResolvedValue(mockData);
3855
+
3856
+ await bitbucketService.getPullRequests('test', 'Test-Repo');
3857
+
3858
+ expect(PullRequestsService.getPage).toHaveBeenCalledWith(
3859
+ 'TEST',
3860
+ 'test-repo',
3861
+ undefined, undefined, undefined, undefined, undefined,
3862
+ undefined, undefined, undefined, undefined, 25
3863
+ );
3864
+ });
3865
+
3866
+ it('should uppercase projectKey and lowercase repositorySlug for getPullRequest', async () => {
3867
+ const mockData = { id: 1, title: 'Test PR' };
3868
+ (PullRequestsService.get3 as jest.Mock).mockResolvedValue(mockData);
3869
+
3870
+ await bitbucketService.getPullRequest('test', 'Test-Repo', '1');
3871
+
3872
+ expect(PullRequestsService.get3).toHaveBeenCalledWith('TEST', '1', 'test-repo');
3873
+ });
3874
+
3875
+ it('should uppercase projectKey and lowercase repositorySlug for getPullRequestChanges', async () => {
3876
+ const mockData = { values: [], size: 0, isLastPage: true };
3877
+ (PullRequestsService.streamChanges1 as jest.Mock).mockResolvedValue(mockData);
3878
+
3879
+ await bitbucketService.getPullRequestChanges('test', 'Test-Repo', '1');
3880
+
3881
+ expect(PullRequestsService.streamChanges1).toHaveBeenCalledWith(
3882
+ 'TEST', '1', 'test-repo',
3883
+ undefined, undefined, undefined, undefined, undefined, 25
3884
+ );
3885
+ });
3886
+
3887
+ it('should uppercase projectKey and lowercase repositorySlug for createPullRequest', async () => {
3888
+ const mockData = { id: 1, title: 'New PR' };
3889
+ (PullRequestsService.create as jest.Mock).mockResolvedValue(mockData);
3890
+
3891
+ await bitbucketService.createPullRequest(
3892
+ 'test', 'Test-Repo', 'title', 'desc',
3893
+ 'refs/heads/feature', 'refs/heads/main'
3894
+ );
3895
+
3896
+ expect(PullRequestsService.create).toHaveBeenCalledWith(
3897
+ 'TEST', 'test-repo',
3898
+ expect.objectContaining({
3899
+ title: 'title',
3900
+ fromRef: expect.objectContaining({
3901
+ repository: expect.objectContaining({
3902
+ slug: 'test-repo',
3903
+ project: { key: 'TEST' }
3904
+ })
3905
+ })
3906
+ })
3907
+ );
3908
+ });
3909
+
3910
+ it('should uppercase projectKey and lowercase repositorySlug for getRequiredReviewers', async () => {
3911
+ const mockData: never[] = [];
3912
+ (PullRequestsService.getReviewers as jest.Mock).mockResolvedValue(mockData);
3913
+
3914
+ await bitbucketService.getRequiredReviewers(
3915
+ 'test', 'Test-Repo', 'refs/heads/feature', 'refs/heads/main'
3916
+ );
3917
+
3918
+ expect(PullRequestsService.getReviewers).toHaveBeenCalledWith(
3919
+ 'TEST', 'test-repo', undefined, undefined,
3920
+ 'refs/heads/feature', 'refs/heads/main'
3921
+ );
3922
+ });
3923
+ });
3924
+
3925
+ describe('pull request operations', () => {
3926
+ it('should delete a pull request comment and return an ack', async () => {
3927
+ (PullRequestsService.deleteComment2 as jest.Mock).mockResolvedValue(undefined);
3928
+
3929
+ const result = await bitbucketService.deletePullRequestComment('test', 'Test-Repo', '123', '99', 4);
3930
+
3931
+ expect(result.success).toBe(true);
3932
+ expect(result.data).toEqual({ deleted: true, commentId: '99' });
3933
+ expect(PullRequestsService.deleteComment2).toHaveBeenCalledWith('TEST', '99', '123', 'test-repo', '4');
3934
+ });
3935
+
3936
+ it('should preserve the error field when comment delete fails', async () => {
3937
+ (PullRequestsService.deleteComment2 as jest.Mock).mockRejectedValue(new Error('API Error'));
3938
+
3939
+ const result = await bitbucketService.deletePullRequestComment('TEST', 'test-repo', '123', '99', 4);
3940
+
3941
+ expect(result.success).toBe(false);
3942
+ expect(result.error).toBeDefined();
3943
+ });
3944
+
3945
+ it('should apply a suggestion with a full body', async () => {
3946
+ (PullRequestsService.applySuggestion as jest.Mock).mockResolvedValue(undefined);
3947
+
3948
+ const result = await bitbucketService.applyPullRequestSuggestion(
3949
+ 'test', 'Test-Repo', '123', '99', 2, 5, 'apply fix', 1
3950
+ );
3951
+
3952
+ expect(result.success).toBe(true);
3953
+ expect(result.data).toEqual({ applied: true, commentId: '99' });
3954
+ expect(PullRequestsService.applySuggestion).toHaveBeenCalledWith('TEST', '99', '123', 'test-repo', {
3955
+ commentVersion: 2,
3956
+ pullRequestVersion: 5,
3957
+ message: 'apply fix',
3958
+ suggestionIndex: 1
3959
+ });
3960
+ });
3961
+
3962
+ it('should apply a suggestion omitting the optional suggestion index', async () => {
3963
+ (PullRequestsService.applySuggestion as jest.Mock).mockResolvedValue(undefined);
3964
+
3965
+ await bitbucketService.applyPullRequestSuggestion('TEST', 'test-repo', '123', '99', 2, 5, 'apply fix');
3966
+
3967
+ expect(PullRequestsService.applySuggestion).toHaveBeenCalledWith('TEST', '99', '123', 'test-repo', {
3968
+ commentVersion: 2,
3969
+ pullRequestVersion: 5,
3970
+ message: 'apply fix'
3971
+ });
3972
+ });
3973
+
3974
+ it('should watch a pull request and return an ack', async () => {
3975
+ (PullRequestsService.watch1 as jest.Mock).mockResolvedValue(undefined);
3976
+
3977
+ const result = await bitbucketService.watchPullRequest('test', 'Test-Repo', '123');
3978
+
3979
+ expect(result.success).toBe(true);
3980
+ expect(result.data).toEqual({ watching: true, pullRequestId: '123' });
3981
+ expect(PullRequestsService.watch1).toHaveBeenCalledWith('TEST', '123', 'test-repo');
3982
+ });
3983
+
3984
+ it('should unwatch a pull request and return an ack', async () => {
3985
+ (PullRequestsService.unwatch1 as jest.Mock).mockResolvedValue(undefined);
3986
+
3987
+ const result = await bitbucketService.unwatchPullRequest('test', 'Test-Repo', '123');
3988
+
3989
+ expect(result.success).toBe(true);
3990
+ expect(result.data).toEqual({ watching: false, pullRequestId: '123' });
3991
+ expect(PullRequestsService.unwatch1).toHaveBeenCalledWith('TEST', '123', 'test-repo');
3992
+ });
3993
+
3994
+ it('should preserve the error field when watch fails', async () => {
3995
+ (PullRequestsService.watch1 as jest.Mock).mockRejectedValue(new Error('API Error'));
3996
+
3997
+ const result = await bitbucketService.watchPullRequest('TEST', 'test-repo', '123');
3998
+
3999
+ expect(result.success).toBe(false);
4000
+ expect(result.error).toBeDefined();
4001
+ });
4002
+ });
4003
+
4004
+ describe('repository CRUD', () => {
4005
+ it('should create a repository with default scm', async () => {
4006
+ const mockData = { slug: 'new-repo' };
4007
+ (ProjectService.createRepository as jest.Mock).mockResolvedValue(mockData);
4008
+
4009
+ const result = await bitbucketService.createRepository('test', 'New Repo');
4010
+
4011
+ expect(result.success).toBe(true);
4012
+ expect(result.data).toBe(mockData);
4013
+ expect(ProjectService.createRepository).toHaveBeenCalledWith('TEST', {
4014
+ name: 'New Repo',
4015
+ scmId: 'git'
4016
+ });
4017
+ });
4018
+
4019
+ it('should create a repository with a custom scm and default branch', async () => {
4020
+ (ProjectService.createRepository as jest.Mock).mockResolvedValue({});
4021
+
4022
+ await bitbucketService.createRepository('TEST', 'Repo', 'hg', 'main');
4023
+
4024
+ expect(ProjectService.createRepository).toHaveBeenCalledWith('TEST', {
4025
+ name: 'Repo',
4026
+ scmId: 'hg',
4027
+ defaultBranch: 'main'
4028
+ });
4029
+ });
4030
+
4031
+ it('should handle errors when creating a repository', async () => {
4032
+ (ProjectService.createRepository as jest.Mock).mockRejectedValue(new Error('API Error'));
4033
+
4034
+ const result = await bitbucketService.createRepository('TEST', 'Repo');
4035
+
4036
+ expect(result.success).toBe(false);
4037
+ expect(result.error).toBeDefined();
4038
+ });
4039
+
4040
+ it('should update a repository with only the provided fields', async () => {
4041
+ const mockData = { slug: 'renamed' };
4042
+ (ProjectService.updateRepository as jest.Mock).mockResolvedValue(mockData);
4043
+
4044
+ const result = await bitbucketService.updateRepository(
4045
+ 'test', 'Test-Repo', 'Renamed', 'desc', 'main', 'dest'
4046
+ );
4047
+
4048
+ expect(result.success).toBe(true);
4049
+ expect(result.data).toBe(mockData);
4050
+ expect(ProjectService.updateRepository).toHaveBeenCalledWith('TEST', 'test-repo', {
4051
+ name: 'Renamed',
4052
+ description: 'desc',
4053
+ defaultBranch: 'main',
4054
+ project: { key: 'DEST' }
4055
+ });
4056
+ });
4057
+
4058
+ it('should send an empty body when no update fields are provided', async () => {
4059
+ (ProjectService.updateRepository as jest.Mock).mockResolvedValue({});
4060
+
4061
+ await bitbucketService.updateRepository('TEST', 'test-repo');
4062
+
4063
+ expect(ProjectService.updateRepository).toHaveBeenCalledWith('TEST', 'test-repo', {});
4064
+ });
4065
+
4066
+ it('should fork a repository into a target project', async () => {
4067
+ const mockData = { slug: 'fork' };
4068
+ (ProjectService.forkRepository as jest.Mock).mockResolvedValue(mockData);
4069
+
4070
+ const result = await bitbucketService.forkRepository('test', 'Test-Repo', 'my-fork', 'dest');
4071
+
4072
+ expect(result.success).toBe(true);
4073
+ expect(result.data).toBe(mockData);
4074
+ expect(ProjectService.forkRepository).toHaveBeenCalledWith('TEST', 'test-repo', {
4075
+ name: 'my-fork',
4076
+ project: { key: 'DEST' }
4077
+ });
4078
+ });
4079
+
4080
+ it('should fork a repository with an empty body when no options provided', async () => {
4081
+ (ProjectService.forkRepository as jest.Mock).mockResolvedValue({});
4082
+
4083
+ await bitbucketService.forkRepository('TEST', 'test-repo');
4084
+
4085
+ expect(ProjectService.forkRepository).toHaveBeenCalledWith('TEST', 'test-repo', {});
4086
+ });
4087
+
4088
+ it('should delete a repository and return an ack', async () => {
4089
+ (ProjectService.deleteRepository as jest.Mock).mockResolvedValue(undefined);
4090
+
4091
+ const result = await bitbucketService.deleteRepository('test', 'Test-Repo');
4092
+
4093
+ expect(result.success).toBe(true);
4094
+ expect(result.data).toEqual({
4095
+ scheduledForDeletion: true,
4096
+ projectKey: 'TEST',
4097
+ repositorySlug: 'test-repo'
4098
+ });
4099
+ expect(ProjectService.deleteRepository).toHaveBeenCalledWith('TEST', 'test-repo');
4100
+ });
4101
+
4102
+ it('should preserve the error field when delete fails', async () => {
4103
+ (ProjectService.deleteRepository as jest.Mock).mockRejectedValue(new Error('API Error'));
4104
+
4105
+ const result = await bitbucketService.deleteRepository('TEST', 'test-repo');
4106
+
4107
+ expect(result.success).toBe(false);
4108
+ expect(result.error).toBeDefined();
4109
+ });
4110
+ });
4111
+
4112
+ describe('webhooks', () => {
4113
+ it('should get webhooks with normalized keys', async () => {
4114
+ const mockData = { values: [{ id: 1 }], isLastPage: true };
4115
+ (RepositoryService.findWebhooks1 as jest.Mock).mockResolvedValue(mockData);
4116
+
4117
+ const result = await bitbucketService.getWebhooks('test', 'Test-Repo', 'repo:refs_changed', true);
4118
+
4119
+ expect(result.success).toBe(true);
4120
+ expect(result.data).toBe(mockData);
4121
+ expect(RepositoryService.findWebhooks1).toHaveBeenCalledWith(
4122
+ 'TEST', 'test-repo', 'repo:refs_changed', true
4123
+ );
4124
+ });
4125
+
4126
+ it('should handle errors when getting webhooks', async () => {
4127
+ (RepositoryService.findWebhooks1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4128
+
4129
+ const result = await bitbucketService.getWebhooks('TEST', 'test-repo');
4130
+
4131
+ expect(result.success).toBe(false);
4132
+ expect(result.error).toBeDefined();
4133
+ });
4134
+
4135
+ it('should get a single webhook and stringify the statistics flag', async () => {
4136
+ const mockData = { id: 7, name: 'hook' };
4137
+ (RepositoryService.getWebhook1 as jest.Mock).mockResolvedValue(mockData);
4138
+
4139
+ const result = await bitbucketService.getWebhook('test', 'Test-Repo', '7', true);
4140
+
4141
+ expect(result.success).toBe(true);
4142
+ expect(result.data).toBe(mockData);
4143
+ expect(RepositoryService.getWebhook1).toHaveBeenCalledWith('TEST', '7', 'test-repo', 'true');
4144
+ });
4145
+
4146
+ it('should pass undefined statistics when omitted on getWebhook', async () => {
4147
+ (RepositoryService.getWebhook1 as jest.Mock).mockResolvedValue({});
4148
+
4149
+ await bitbucketService.getWebhook('TEST', 'test-repo', '7');
4150
+
4151
+ expect(RepositoryService.getWebhook1).toHaveBeenCalledWith('TEST', '7', 'test-repo', undefined);
4152
+ });
4153
+
4154
+ it('should create a webhook with a built request body', async () => {
4155
+ const mockData = { id: 9 };
4156
+ (RepositoryService.createWebhook1 as jest.Mock).mockResolvedValue(mockData);
4157
+
4158
+ const result = await bitbucketService.createWebhook(
4159
+ 'test', 'Test-Repo', 'my hook', 'https://example.com/hook',
4160
+ ['repo:refs_changed', 'pr:opened'], true, 's3cret', false
4161
+ );
4162
+
4163
+ expect(result.success).toBe(true);
4164
+ expect(result.data).toBe(mockData);
4165
+ expect(RepositoryService.createWebhook1).toHaveBeenCalledWith('TEST', 'test-repo', {
4166
+ name: 'my hook',
4167
+ url: 'https://example.com/hook',
4168
+ events: ['repo:refs_changed', 'pr:opened'],
4169
+ active: true,
4170
+ configuration: { secret: 's3cret' },
4171
+ sslVerificationRequired: false
4172
+ });
4173
+ });
4174
+
4175
+ it('should omit optional fields from the webhook body when not provided', async () => {
4176
+ (RepositoryService.createWebhook1 as jest.Mock).mockResolvedValue({ id: 1 });
4177
+
4178
+ await bitbucketService.createWebhook(
4179
+ 'TEST', 'test-repo', 'minimal', 'https://example.com/h', ['pr:merged']
4180
+ );
4181
+
4182
+ expect(RepositoryService.createWebhook1).toHaveBeenCalledWith('TEST', 'test-repo', {
4183
+ name: 'minimal',
4184
+ url: 'https://example.com/h',
4185
+ events: ['pr:merged']
4186
+ });
4187
+ });
4188
+
4189
+ it('should update a webhook', async () => {
4190
+ const mockData = { id: 5 };
4191
+ (RepositoryService.updateWebhook1 as jest.Mock).mockResolvedValue(mockData);
4192
+
4193
+ const result = await bitbucketService.updateWebhook(
4194
+ 'test', 'Test-Repo', '5', 'renamed', 'https://example.com/new', ['pr:declined'], false
4195
+ );
4196
+
4197
+ expect(result.success).toBe(true);
4198
+ expect(result.data).toBe(mockData);
4199
+ expect(RepositoryService.updateWebhook1).toHaveBeenCalledWith('TEST', '5', 'test-repo', {
4200
+ name: 'renamed',
4201
+ url: 'https://example.com/new',
4202
+ events: ['pr:declined'],
4203
+ active: false
4204
+ });
4205
+ });
4206
+
4207
+ it('should delete a webhook and return an ack', async () => {
4208
+ (RepositoryService.deleteWebhook1 as jest.Mock).mockResolvedValue(undefined);
4209
+
4210
+ const result = await bitbucketService.deleteWebhook('test', 'Test-Repo', '5');
4211
+
4212
+ expect(result.success).toBe(true);
4213
+ expect(result.data).toEqual({ deleted: true, webhookId: '5' });
4214
+ expect(RepositoryService.deleteWebhook1).toHaveBeenCalledWith('TEST', '5', 'test-repo');
4215
+ });
4216
+
4217
+ it('should preserve the error field when delete fails', async () => {
4218
+ (RepositoryService.deleteWebhook1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4219
+
4220
+ const result = await bitbucketService.deleteWebhook('TEST', 'test-repo', '5');
4221
+
4222
+ expect(result.success).toBe(false);
4223
+ expect(result.error).toBeDefined();
4224
+ });
4225
+ });
4226
+
4227
+ describe('branch restrictions', () => {
4228
+ it('should get branch restrictions with filters and default limit', async () => {
4229
+ const mockData = { values: [{ id: 1 }], isLastPage: true };
4230
+ (RepositoryService.getRestrictions1 as jest.Mock).mockResolvedValue(mockData);
4231
+
4232
+ const result = await bitbucketService.getBranchRestrictions('test', 'Test-Repo', 'BRANCH', 'refs/heads/master', 'no-deletes');
4233
+
4234
+ expect(result.success).toBe(true);
4235
+ expect(result.data).toBe(mockData);
4236
+ expect(RepositoryService.getRestrictions1).toHaveBeenCalledWith(
4237
+ 'TEST', 'test-repo', 'BRANCH', 'refs/heads/master', 'no-deletes', undefined, 25
4238
+ );
4239
+ });
4240
+
4241
+ it('should create a branch restriction wrapped in a bulk array', async () => {
4242
+ const mockData = { id: 1, type: 'no-deletes' };
4243
+ (RepositoryService.createRestrictions1 as jest.Mock).mockResolvedValue(mockData);
4244
+
4245
+ const result = await bitbucketService.createBranchRestriction(
4246
+ 'test', 'Test-Repo', 'no-deletes', 'BRANCH', 'refs/heads/master', 'master', ['admin'], ['devs'], [7]
4247
+ );
4248
+
4249
+ expect(result.success).toBe(true);
4250
+ expect(result.data).toBe(mockData);
4251
+ expect(RepositoryService.createRestrictions1).toHaveBeenCalledWith('TEST', 'test-repo', [{
4252
+ type: 'no-deletes',
4253
+ matcher: { id: 'refs/heads/master', displayId: 'master', type: { id: 'BRANCH' } },
4254
+ userSlugs: ['admin'],
4255
+ groupNames: ['devs'],
4256
+ accessKeyIds: [7]
4257
+ }]);
4258
+ });
4259
+
4260
+ it('should omit exemption fields when not provided', async () => {
4261
+ (RepositoryService.createRestrictions1 as jest.Mock).mockResolvedValue({});
4262
+
4263
+ await bitbucketService.createBranchRestriction('TEST', 'test-repo', 'read-only', 'ANY_REF', 'ANY_REF');
4264
+
4265
+ expect(RepositoryService.createRestrictions1).toHaveBeenCalledWith('TEST', 'test-repo', [{
4266
+ type: 'read-only',
4267
+ matcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } }
4268
+ }]);
4269
+ });
4270
+
4271
+ it('should handle errors when creating a restriction', async () => {
4272
+ (RepositoryService.createRestrictions1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4273
+
4274
+ const result = await bitbucketService.createBranchRestriction('TEST', 'test-repo', 'read-only', 'ANY_REF', 'ANY_REF');
4275
+
4276
+ expect(result.success).toBe(false);
4277
+ expect(result.error).toBeDefined();
4278
+ });
4279
+
4280
+ it('should get a single restriction by id', async () => {
4281
+ const mockData = { id: 5 };
4282
+ (RepositoryService.getRestriction1 as jest.Mock).mockResolvedValue(mockData);
4283
+
4284
+ const result = await bitbucketService.getBranchRestriction('test', 'Test-Repo', '5');
4285
+
4286
+ expect(result.success).toBe(true);
4287
+ expect(result.data).toBe(mockData);
4288
+ expect(RepositoryService.getRestriction1).toHaveBeenCalledWith('TEST', '5', 'test-repo');
4289
+ });
4290
+
4291
+ it('should delete a restriction and return an ack', async () => {
4292
+ (RepositoryService.deleteRestriction1 as jest.Mock).mockResolvedValue(undefined);
4293
+
4294
+ const result = await bitbucketService.deleteBranchRestriction('test', 'Test-Repo', '5');
4295
+
4296
+ expect(result.success).toBe(true);
4297
+ expect(result.data).toEqual({ deleted: true, id: '5' });
4298
+ expect(RepositoryService.deleteRestriction1).toHaveBeenCalledWith('TEST', '5', 'test-repo');
4299
+ });
4300
+
4301
+ it('should preserve the error field when delete fails', async () => {
4302
+ (RepositoryService.deleteRestriction1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4303
+
4304
+ const result = await bitbucketService.deleteBranchRestriction('TEST', 'test-repo', '5');
4305
+
4306
+ expect(result.success).toBe(false);
4307
+ expect(result.error).toBeDefined();
4308
+ });
4309
+ });
4310
+
4311
+ describe('searchCode', () => {
4312
+ const { request: mockRequest } = require('../bitbucket-client/core/request.js');
4313
+
4314
+ it('should search code with the default page size', async () => {
4315
+ const mockData = { code: { count: 1, values: [{ repository: { slug: 'demo' } }] } };
4316
+ mockRequest.mockResolvedValue(mockData);
4317
+
4318
+ const result = await bitbucketService.searchCode('app');
4319
+
4320
+ expect(result.success).toBe(true);
4321
+ expect(result.data).toBe(mockData);
4322
+ expect(mockRequest).toHaveBeenCalledWith(
4323
+ expect.any(Object),
4324
+ {
4325
+ method: 'POST',
4326
+ url: '/search/latest/search',
4327
+ body: {
4328
+ query: 'app',
4329
+ entities: { code: {} },
4330
+ limits: { primary: 25 }
4331
+ },
4332
+ mediaType: 'application/json',
4333
+ errors: {
4334
+ 400: 'The search query was malformed.',
4335
+ 401: 'The currently authenticated user is not permitted to search.',
4336
+ },
4337
+ }
4338
+ );
4339
+ });
4340
+
4341
+ it('should pass explicit primary and secondary limits', async () => {
4342
+ mockRequest.mockResolvedValue({ code: { count: 0, values: [] } });
4343
+
4344
+ await bitbucketService.searchCode('repo:demo TODO', 10, 5);
4345
+
4346
+ expect(mockRequest).toHaveBeenCalledWith(
4347
+ expect.any(Object),
4348
+ expect.objectContaining({
4349
+ method: 'POST',
4350
+ url: '/search/latest/search',
4351
+ body: {
4352
+ query: 'repo:demo TODO',
4353
+ entities: { code: {} },
4354
+ limits: { primary: 10, secondary: 5 }
4355
+ },
4356
+ })
4357
+ );
4358
+ });
4359
+
4360
+ it('should handle errors when searching', async () => {
4361
+ mockRequest.mockRejectedValue(new Error('API Error'));
4362
+
4363
+ const result = await bitbucketService.searchCode('app');
4364
+
4365
+ expect(result.success).toBe(false);
4366
+ expect(result.error).toBeDefined();
4367
+ });
4368
+ });
4369
+
4370
+ describe('default reviewer conditions', () => {
4371
+ it('should get default reviewer conditions with normalized keys', async () => {
4372
+ const mockData = [{ id: 1 }];
4373
+ (PullRequestsService.getPullRequestConditions1 as jest.Mock).mockResolvedValue(mockData);
4374
+
4375
+ const result = await bitbucketService.getDefaultReviewerConditions('test', 'Test-Repo');
4376
+
4377
+ expect(result.success).toBe(true);
4378
+ expect(result.data).toBe(mockData);
4379
+ expect(PullRequestsService.getPullRequestConditions1).toHaveBeenCalledWith('TEST', 'test-repo');
4380
+ });
4381
+
4382
+ it('should create a condition mapping reviewer ids and matchers', async () => {
4383
+ const mockData = { id: 1 };
4384
+ (PullRequestsService.createPullRequestCondition1 as jest.Mock).mockResolvedValue(mockData);
4385
+
4386
+ const result = await bitbucketService.createDefaultReviewerCondition(
4387
+ 'test', 'Test-Repo', 'ANY_REF', 'ANY_REF', 'BRANCH', 'refs/heads/main', [52], 1, undefined, 'main'
4388
+ );
4389
+
4390
+ expect(result.success).toBe(true);
4391
+ expect(result.data).toBe(mockData);
4392
+ expect(PullRequestsService.createPullRequestCondition1).toHaveBeenCalledWith('TEST', 'test-repo', {
4393
+ reviewers: [{ id: 52 }],
4394
+ sourceMatcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } },
4395
+ targetMatcher: { id: 'refs/heads/main', displayId: 'main', type: { id: 'BRANCH' } },
4396
+ requiredApprovals: 1
4397
+ });
4398
+ });
4399
+
4400
+ it('should omit requiredApprovals when not provided', async () => {
4401
+ (PullRequestsService.createPullRequestCondition1 as jest.Mock).mockResolvedValue({});
4402
+
4403
+ await bitbucketService.createDefaultReviewerCondition(
4404
+ 'TEST', 'test-repo', 'ANY_REF', 'ANY_REF', 'ANY_REF', 'ANY_REF', [52]
4405
+ );
4406
+
4407
+ expect(PullRequestsService.createPullRequestCondition1).toHaveBeenCalledWith('TEST', 'test-repo', {
4408
+ reviewers: [{ id: 52 }],
4409
+ sourceMatcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } },
4410
+ targetMatcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } }
4411
+ });
4412
+ });
4413
+
4414
+ it('should handle errors when creating a condition', async () => {
4415
+ (PullRequestsService.createPullRequestCondition1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4416
+
4417
+ const result = await bitbucketService.createDefaultReviewerCondition(
4418
+ 'TEST', 'test-repo', 'ANY_REF', 'ANY_REF', 'ANY_REF', 'ANY_REF', [52]
4419
+ );
4420
+
4421
+ expect(result.success).toBe(false);
4422
+ expect(result.error).toBeDefined();
4423
+ });
4424
+
4425
+ it('should update a condition passing the id as a string', async () => {
4426
+ const mockData = { id: 1, requiredApprovals: 2 };
4427
+ (PullRequestsService.updatePullRequestCondition1 as jest.Mock).mockResolvedValue(mockData);
4428
+
4429
+ const result = await bitbucketService.updateDefaultReviewerCondition(
4430
+ 'test', 'Test-Repo', '1', 'ANY_REF', 'ANY_REF', 'BRANCH', 'refs/heads/main', [52], 2, undefined, 'main'
4431
+ );
4432
+
4433
+ expect(result.success).toBe(true);
4434
+ expect(result.data).toBe(mockData);
4435
+ expect(PullRequestsService.updatePullRequestCondition1).toHaveBeenCalledWith('TEST', '1', 'test-repo', {
4436
+ reviewers: [{ id: 52 }],
4437
+ sourceMatcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } },
4438
+ targetMatcher: { id: 'refs/heads/main', displayId: 'main', type: { id: 'BRANCH' } },
4439
+ requiredApprovals: 2
4440
+ });
4441
+ });
4442
+
4443
+ it('should delete a condition coercing the id to a number and return an ack', async () => {
4444
+ (PullRequestsService.deletePullRequestCondition1 as jest.Mock).mockResolvedValue(undefined);
4445
+
4446
+ const result = await bitbucketService.deleteDefaultReviewerCondition('test', 'Test-Repo', '1');
4447
+
4448
+ expect(result.success).toBe(true);
4449
+ expect(result.data).toEqual({ deleted: true, id: '1' });
4450
+ expect(PullRequestsService.deletePullRequestCondition1).toHaveBeenCalledWith('TEST', 1, 'test-repo');
4451
+ });
4452
+
4453
+ it('should preserve the error field when delete fails', async () => {
4454
+ (PullRequestsService.deletePullRequestCondition1 as jest.Mock).mockRejectedValue(new Error('API Error'));
4455
+
4456
+ const result = await bitbucketService.deleteDefaultReviewerCondition('TEST', 'test-repo', '1');
4457
+
4458
+ expect(result.success).toBe(false);
4459
+ expect(result.error).toBeDefined();
4460
+ });
4461
+ });
4462
+
4463
+ describe('required builds merge checks', () => {
4464
+ it('should get merge checks with the default page size', async () => {
4465
+ const mockData = { values: [{ id: 1 }], isLastPage: true };
4466
+ (BuildsAndDeploymentsService.getPageOfRequiredBuildsMergeChecks as jest.Mock).mockResolvedValue(mockData);
4467
+
4468
+ const result = await bitbucketService.getRequiredBuildsMergeChecks('test', 'Test-Repo');
4469
+
4470
+ expect(result.success).toBe(true);
4471
+ expect(result.data).toBe(mockData);
4472
+ expect(BuildsAndDeploymentsService.getPageOfRequiredBuildsMergeChecks).toHaveBeenCalledWith('TEST', 'test-repo', undefined, 25);
4473
+ });
4474
+
4475
+ it('should create a merge check with a built body', async () => {
4476
+ const mockData = { id: 1 };
4477
+ (BuildsAndDeploymentsService.createRequiredBuildsMergeCheck as jest.Mock).mockResolvedValue(mockData);
4478
+
4479
+ const result = await bitbucketService.createRequiredBuildsMergeCheck(
4480
+ 'test', 'Test-Repo', ['build-foo'], 'BRANCH', 'refs/heads/master', 'master', 'BRANCH', 'refs/heads/dev', 'dev'
4481
+ );
4482
+
4483
+ expect(result.success).toBe(true);
4484
+ expect(result.data).toBe(mockData);
4485
+ expect(BuildsAndDeploymentsService.createRequiredBuildsMergeCheck).toHaveBeenCalledWith('TEST', 'test-repo', {
4486
+ buildParentKeys: ['build-foo'],
4487
+ refMatcher: { id: 'refs/heads/master', displayId: 'master', type: { id: 'BRANCH' } },
4488
+ exemptRefMatcher: { id: 'refs/heads/dev', displayId: 'dev', type: { id: 'BRANCH' } }
4489
+ });
4490
+ });
4491
+
4492
+ it('should omit the exempt matcher when not fully provided', async () => {
4493
+ (BuildsAndDeploymentsService.createRequiredBuildsMergeCheck as jest.Mock).mockResolvedValue({});
4494
+
4495
+ await bitbucketService.createRequiredBuildsMergeCheck('TEST', 'test-repo', ['build-foo'], 'ANY_REF', 'ANY_REF');
4496
+
4497
+ expect(BuildsAndDeploymentsService.createRequiredBuildsMergeCheck).toHaveBeenCalledWith('TEST', 'test-repo', {
4498
+ buildParentKeys: ['build-foo'],
4499
+ refMatcher: { id: 'ANY_REF', displayId: 'ANY_REF', type: { id: 'ANY_REF' } }
4500
+ });
4501
+ });
4502
+
4503
+ it('should handle errors when creating a merge check', async () => {
4504
+ (BuildsAndDeploymentsService.createRequiredBuildsMergeCheck as jest.Mock).mockRejectedValue(new Error('API Error'));
4505
+
4506
+ const result = await bitbucketService.createRequiredBuildsMergeCheck('TEST', 'test-repo', ['build-foo'], 'ANY_REF', 'ANY_REF');
4507
+
4508
+ expect(result.success).toBe(false);
4509
+ expect(result.error).toBeDefined();
4510
+ });
4511
+
4512
+ it('should update a merge check coercing the id to a number', async () => {
4513
+ const mockData = { id: 1 };
4514
+ (BuildsAndDeploymentsService.updateRequiredBuildsMergeCheck as jest.Mock).mockResolvedValue(mockData);
4515
+
4516
+ const result = await bitbucketService.updateRequiredBuildsMergeCheck(
4517
+ 'test', 'Test-Repo', '1', ['build-foo', 'build-bar'], 'BRANCH', 'refs/heads/master', 'master'
4518
+ );
4519
+
4520
+ expect(result.success).toBe(true);
4521
+ expect(result.data).toBe(mockData);
4522
+ expect(BuildsAndDeploymentsService.updateRequiredBuildsMergeCheck).toHaveBeenCalledWith('TEST', 1, 'test-repo', {
4523
+ buildParentKeys: ['build-foo', 'build-bar'],
4524
+ refMatcher: { id: 'refs/heads/master', displayId: 'master', type: { id: 'BRANCH' } }
4525
+ });
4526
+ });
4527
+
4528
+ it('should delete a merge check coercing the id and return an ack', async () => {
4529
+ (BuildsAndDeploymentsService.deleteRequiredBuildsMergeCheck as jest.Mock).mockResolvedValue(undefined);
4530
+
4531
+ const result = await bitbucketService.deleteRequiredBuildsMergeCheck('test', 'Test-Repo', '1');
4532
+
4533
+ expect(result.success).toBe(true);
4534
+ expect(result.data).toEqual({ deleted: true, id: '1' });
4535
+ expect(BuildsAndDeploymentsService.deleteRequiredBuildsMergeCheck).toHaveBeenCalledWith('TEST', 1, 'test-repo');
4536
+ });
4537
+
4538
+ it('should preserve the error field when delete fails', async () => {
4539
+ (BuildsAndDeploymentsService.deleteRequiredBuildsMergeCheck as jest.Mock).mockRejectedValue(new Error('API Error'));
4540
+
4541
+ const result = await bitbucketService.deleteRequiredBuildsMergeCheck('TEST', 'test-repo', '1');
4542
+
4543
+ expect(result.success).toBe(false);
4544
+ expect(result.error).toBeDefined();
4545
+ });
4546
+ });
4547
+
4548
+ describe('project CRUD', () => {
4549
+ it('should create a project', async () => {
4550
+ const mockData = { key: 'PROJ' };
4551
+ (ProjectService.createProject as jest.Mock).mockResolvedValue(mockData);
4552
+
4553
+ const result = await bitbucketService.createProject('proj', 'My Project', 'desc');
4554
+
4555
+ expect(result.success).toBe(true);
4556
+ expect(result.data).toBe(mockData);
4557
+ expect(ProjectService.createProject).toHaveBeenCalledWith({
4558
+ key: 'PROJ',
4559
+ name: 'My Project',
4560
+ description: 'desc'
4561
+ });
4562
+ });
4563
+
4564
+ it('should omit description when not provided on create', async () => {
4565
+ (ProjectService.createProject as jest.Mock).mockResolvedValue({});
4566
+
4567
+ await bitbucketService.createProject('PROJ', 'My Project');
4568
+
4569
+ expect(ProjectService.createProject).toHaveBeenCalledWith({
4570
+ key: 'PROJ',
4571
+ name: 'My Project'
4572
+ });
4573
+ });
4574
+
4575
+ it('should handle errors when creating a project', async () => {
4576
+ (ProjectService.createProject as jest.Mock).mockRejectedValue(new Error('API Error'));
4577
+
4578
+ const result = await bitbucketService.createProject('PROJ', 'My Project');
4579
+
4580
+ expect(result.success).toBe(false);
4581
+ expect(result.error).toBeDefined();
4582
+ });
4583
+
4584
+ it('should update a project with only the provided fields', async () => {
4585
+ const mockData = { key: 'PROJ' };
4586
+ (ProjectService.updateProject as jest.Mock).mockResolvedValue(mockData);
4587
+
4588
+ const result = await bitbucketService.updateProject('proj', 'Renamed', 'new desc');
4589
+
4590
+ expect(result.success).toBe(true);
4591
+ expect(result.data).toBe(mockData);
4592
+ expect(ProjectService.updateProject).toHaveBeenCalledWith('PROJ', {
4593
+ key: 'PROJ',
4594
+ name: 'Renamed',
4595
+ description: 'new desc'
4596
+ });
4597
+ });
4598
+
4599
+ it('should update a project sending only the key when nothing else provided', async () => {
4600
+ (ProjectService.updateProject as jest.Mock).mockResolvedValue({});
4601
+
4602
+ await bitbucketService.updateProject('PROJ');
4603
+
4604
+ expect(ProjectService.updateProject).toHaveBeenCalledWith('PROJ', { key: 'PROJ' });
4605
+ });
4606
+
4607
+ it('should delete a project and return an ack', async () => {
4608
+ (ProjectService.deleteProject as jest.Mock).mockResolvedValue(undefined);
4609
+
4610
+ const result = await bitbucketService.deleteProject('proj');
4611
+
4612
+ expect(result.success).toBe(true);
4613
+ expect(result.data).toEqual({ deleted: true, key: 'PROJ' });
4614
+ expect(ProjectService.deleteProject).toHaveBeenCalledWith('PROJ');
4615
+ });
4616
+
4617
+ it('should preserve the error field when delete fails', async () => {
4618
+ (ProjectService.deleteProject as jest.Mock).mockRejectedValue(new Error('API Error'));
4619
+
4620
+ const result = await bitbucketService.deleteProject('PROJ');
4621
+
4622
+ expect(result.success).toBe(false);
4623
+ expect(result.error).toBeDefined();
4624
+ });
4625
+ });
4626
+ });