pact_broker 2.74.1 → 2.77.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +12 -0
  3. data/.github/workflows/test-ruby-3.yml +19 -0
  4. data/.github/workflows/test.yml +19 -4
  5. data/.gitignore +3 -1
  6. data/.optic/.gitignore +2 -0
  7. data/.optic/api/specification.json +1 -0
  8. data/.optic/ignore +14 -0
  9. data/CHANGELOG.md +58 -0
  10. data/DEVELOPER_SETUP.md +70 -2
  11. data/Dockerfile +2 -0
  12. data/ISSUES.md +13 -5
  13. data/README.md +1 -1
  14. data/config.ru +1 -0
  15. data/config/database.yml +1 -1
  16. data/db/ddl_statements/head_pact_tags.rb +24 -1
  17. data/db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb +11 -0
  18. data/db/ddl_statements/latest_tagged_pact_publications.rb +6 -0
  19. data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +13 -0
  20. data/db/migrations/20210115_add_webhook_foreign_key_indexes.rb +49 -0
  21. data/db/migrations/20210116_add_context_to_triggered_webhook.rb +11 -0
  22. data/db/migrations/20210117_add_branch_to_version.rb +9 -0
  23. data/db/migrations/20210202_add_created_at_to_head_pact_tags.rb +14 -0
  24. data/db/migrations/20210205_add_pacticipant_id_to_tag.rb +17 -0
  25. data/db/migrations/20210206_add_index_to_tags_and_versions.rb +27 -0
  26. data/db/migrations/20210207_optimise_latest_verification_ids_for_consumer_version_tags.rb +13 -0
  27. data/db/migrations/20210208_optimise_latest_tagged_pact_cv_orders.rb +13 -0
  28. data/db/migrations/migration_helper.rb +8 -0
  29. data/docker-compose-issue-repro-with-pact-broker-docker-image.yml +44 -0
  30. data/docker-compose-test.yml +4 -4
  31. data/lib/pact_broker/api.rb +15 -4
  32. data/lib/pact_broker/api/decorators.rb +3 -7
  33. data/lib/pact_broker/api/decorators/configuration.rb +33 -0
  34. data/lib/pact_broker/api/decorators/dashboard_decorator.rb +5 -1
  35. data/lib/pact_broker/api/decorators/decorator_context_creator.rb +13 -0
  36. data/lib/pact_broker/api/decorators/matrix_decorator.rb +8 -2
  37. data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +1 -0
  38. data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +2 -3
  39. data/lib/pact_broker/api/decorators/reason_decorator.rb +4 -2
  40. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +2 -0
  41. data/lib/pact_broker/api/decorators/version_decorator.rb +4 -2
  42. data/lib/pact_broker/api/paths.rb +5 -0
  43. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +2 -2
  44. data/lib/pact_broker/api/resources/all_webhooks.rb +3 -3
  45. data/lib/pact_broker/api/resources/can_i_deploy_badge.rb +1 -1
  46. data/lib/pact_broker/api/resources/dashboard.rb +2 -2
  47. data/lib/pact_broker/api/resources/default_base_resource.rb +41 -12
  48. data/lib/pact_broker/api/resources/error_response_body_generator.rb +41 -0
  49. data/lib/pact_broker/api/resources/group.rb +1 -1
  50. data/lib/pact_broker/api/resources/index.rb +6 -0
  51. data/lib/pact_broker/api/resources/integrations.rb +1 -1
  52. data/lib/pact_broker/api/resources/label.rb +1 -1
  53. data/lib/pact_broker/api/resources/latest_pact.rb +2 -2
  54. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  55. data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +2 -2
  56. data/lib/pact_broker/api/resources/latest_version.rb +27 -0
  57. data/lib/pact_broker/api/resources/matrix.rb +2 -2
  58. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -1
  59. data/lib/pact_broker/api/resources/pact.rb +2 -2
  60. data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +1 -1
  61. data/lib/pact_broker/api/resources/pact_versions.rb +1 -1
  62. data/lib/pact_broker/api/resources/pact_webhooks.rb +3 -3
  63. data/lib/pact_broker/api/resources/pact_webhooks_status.rb +2 -2
  64. data/lib/pact_broker/api/resources/pacticipant.rb +1 -1
  65. data/lib/pact_broker/api/resources/pacticipants.rb +3 -3
  66. data/lib/pact_broker/api/resources/pacticipants_for_label.rb +1 -1
  67. data/lib/pact_broker/api/resources/previous_distinct_pact_version.rb +1 -1
  68. data/lib/pact_broker/api/resources/provider_pacts.rb +1 -7
  69. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +3 -2
  70. data/lib/pact_broker/api/resources/relationships.rb +1 -1
  71. data/lib/pact_broker/api/resources/tag.rb +1 -1
  72. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +1 -1
  73. data/lib/pact_broker/api/resources/verification.rb +2 -2
  74. data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +1 -1
  75. data/lib/pact_broker/api/resources/verifications.rb +6 -3
  76. data/lib/pact_broker/api/resources/version.rb +16 -10
  77. data/lib/pact_broker/api/resources/versions.rb +1 -1
  78. data/lib/pact_broker/api/resources/webhook.rb +2 -2
  79. data/lib/pact_broker/api/resources/webhook_execution.rb +5 -5
  80. data/lib/pact_broker/api/resources/webhook_execution_methods.rb +1 -3
  81. data/lib/pact_broker/api/resources/webhooks.rb +3 -3
  82. data/lib/pact_broker/app.rb +11 -3
  83. data/lib/pact_broker/application_context.rb +41 -0
  84. data/lib/pact_broker/certificates/certificate.rb +1 -1
  85. data/lib/pact_broker/config/setting.rb +1 -1
  86. data/lib/pact_broker/config/space_delimited_integer_list.rb +25 -0
  87. data/lib/pact_broker/configuration.rb +17 -1
  88. data/lib/pact_broker/db/data_migrations/helpers.rb +4 -0
  89. data/lib/pact_broker/db/data_migrations/set_extra_columns_for_tags.rb +29 -0
  90. data/lib/pact_broker/db/migrate_data.rb +1 -0
  91. data/lib/pact_broker/db/seed_example_data.rb +13 -13
  92. data/lib/pact_broker/doc/controllers/app.rb +3 -2
  93. data/lib/pact_broker/doc/views/index/pacticipant-version.markdown +13 -0
  94. data/lib/pact_broker/domain/index_item.rb +18 -4
  95. data/lib/pact_broker/domain/pacticipant.rb +9 -5
  96. data/lib/pact_broker/domain/tag.rb +131 -71
  97. data/lib/pact_broker/domain/verification.rb +3 -2
  98. data/lib/pact_broker/domain/version.rb +58 -23
  99. data/lib/pact_broker/domain/webhook.rb +12 -9
  100. data/lib/pact_broker/domain/webhook_request.rb +1 -1
  101. data/lib/pact_broker/error.rb +0 -2
  102. data/lib/pact_broker/errors.rb +28 -0
  103. data/lib/pact_broker/errors/error_logger.rb +25 -0
  104. data/lib/pact_broker/hash_refinements.rb +4 -0
  105. data/lib/pact_broker/index/service.rb +55 -49
  106. data/lib/pact_broker/matrix/quick_row.rb +8 -0
  107. data/lib/pact_broker/metrics/service.rb +1 -1
  108. data/lib/pact_broker/pacts/eager_loaders.rb +52 -0
  109. data/lib/pact_broker/pacts/latest_pact_publication_id_for_consumer_version.rb +18 -13
  110. data/lib/pact_broker/pacts/lazy_loaders.rb +14 -0
  111. data/lib/pact_broker/pacts/pact_publication.rb +38 -84
  112. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +297 -0
  113. data/lib/pact_broker/pacts/pact_version.rb +1 -2
  114. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +286 -0
  115. data/lib/pact_broker/pacts/repository.rb +5 -231
  116. data/lib/pact_broker/pacts/selected_pact.rb +4 -0
  117. data/lib/pact_broker/pacts/selector.rb +56 -1
  118. data/lib/pact_broker/pacts/selectors.rb +16 -0
  119. data/lib/pact_broker/pacts/service.rb +6 -8
  120. data/lib/pact_broker/pacts/squash_pacts_for_verification.rb +1 -4
  121. data/lib/pact_broker/pacts/verifiable_pact.rb +45 -2
  122. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +56 -16
  123. data/lib/pact_broker/repositories/helpers.rb +4 -0
  124. data/lib/pact_broker/services.rb +106 -31
  125. data/lib/pact_broker/tags/eager_loaders.rb +47 -0
  126. data/lib/pact_broker/tags/repository.rb +3 -1
  127. data/lib/pact_broker/tags/service.rb +0 -3
  128. data/lib/pact_broker/tags/tag_with_latest_flag.rb +1 -0
  129. data/lib/pact_broker/test/http_test_data_builder.rb +130 -29
  130. data/lib/pact_broker/test/test_data_builder.rb +39 -5
  131. data/lib/pact_broker/ui/app.rb +6 -0
  132. data/lib/pact_broker/ui/controllers/base_controller.rb +5 -1
  133. data/lib/pact_broker/ui/controllers/pacts.rb +18 -0
  134. data/lib/pact_broker/ui/view_models/index_item.rb +9 -0
  135. data/lib/pact_broker/ui/view_models/matrix_line.rb +36 -0
  136. data/lib/pact_broker/ui/views/index/_getting-started.haml +1 -1
  137. data/lib/pact_broker/ui/views/index/show-with-tags.haml +24 -16
  138. data/lib/pact_broker/ui/views/index/show.haml +6 -6
  139. data/lib/pact_broker/ui/views/layouts/main.haml +2 -2
  140. data/lib/pact_broker/ui/views/matrix/show.haml +42 -33
  141. data/lib/pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version.rb +7 -5
  142. data/lib/pact_broker/verifications/service.rb +2 -1
  143. data/lib/pact_broker/version.rb +1 -1
  144. data/lib/pact_broker/versions/eager_loaders.rb +71 -0
  145. data/lib/pact_broker/versions/lazy_loaders.rb +13 -0
  146. data/lib/pact_broker/versions/repository.rb +11 -2
  147. data/lib/pact_broker/versions/service.rb +5 -1
  148. data/lib/pact_broker/webhooks/execution.rb +3 -2
  149. data/lib/pact_broker/webhooks/execution_configuration.rb +4 -0
  150. data/lib/pact_broker/webhooks/execution_configuration_creator.rb +14 -0
  151. data/lib/pact_broker/webhooks/latest_triggered_webhook.rb +2 -0
  152. data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +10 -3
  153. data/lib/pact_broker/webhooks/repository.rb +3 -2
  154. data/lib/pact_broker/webhooks/service.rb +8 -6
  155. data/lib/pact_broker/webhooks/trigger_service.rb +56 -23
  156. data/lib/pact_broker/webhooks/triggered_webhook.rb +15 -5
  157. data/lib/pact_broker/webhooks/webhook.rb +1 -1
  158. data/lib/pact_broker/webhooks/webhook_event.rb +1 -1
  159. data/lib/pact_broker/webhooks/webhook_request_logger.rb +5 -1
  160. data/lib/rack/pact_broker/set_base_url.rb +22 -0
  161. data/lib/sequel/plugins/upsert.rb +18 -4
  162. data/optic.yml +5 -0
  163. data/pact_broker.gemspec +1 -1
  164. data/public/css/bootstrap-grid.css +3719 -0
  165. data/public/css/bootstrap-grid.css.map +1 -0
  166. data/public/css/bootstrap-grid.min.css +7 -0
  167. data/public/css/bootstrap-grid.min.css.map +1 -0
  168. data/public/css/bootstrap-reboot.css +331 -0
  169. data/public/css/bootstrap-reboot.css.map +1 -0
  170. data/public/css/bootstrap-reboot.min.css +8 -0
  171. data/public/css/bootstrap-reboot.min.css.map +1 -0
  172. data/public/css/bootstrap.css +8885 -5604
  173. data/public/css/bootstrap.css.map +1 -1
  174. data/public/css/bootstrap.min.css +4 -3
  175. data/public/css/bootstrap.min.css.map +1 -1
  176. data/public/images/alert.svg +1 -0
  177. data/public/images/arrow-switch.svg +1 -0
  178. data/public/images/check.svg +1 -0
  179. data/public/images/clock.svg +1 -0
  180. data/public/images/copy.svg +1 -0
  181. data/public/images/kebab-horizontal.svg +1 -0
  182. data/public/javascripts/clipboard.js +3 -3
  183. data/public/javascripts/{jquery-3.3.1.js → jquery-3.5.1.js} +1150 -642
  184. data/public/javascripts/jquery-3.5.1.min.js +2 -0
  185. data/public/javascripts/jquery-3.5.1.min.map +1 -0
  186. data/public/javascripts/matrix.js +2 -2
  187. data/public/js/bootstrap.bundle.js +7013 -0
  188. data/public/js/bootstrap.bundle.js.map +1 -0
  189. data/public/js/bootstrap.bundle.min.js +7 -0
  190. data/public/js/bootstrap.bundle.min.js.map +1 -0
  191. data/public/js/bootstrap.js +3862 -1804
  192. data/public/js/bootstrap.js.map +1 -0
  193. data/public/js/bootstrap.min.js +6 -6
  194. data/public/js/bootstrap.min.js.map +1 -0
  195. data/public/stylesheets/index.css +77 -3
  196. data/public/stylesheets/matrix.css +34 -5
  197. data/public/stylesheets/pact.css +14 -0
  198. data/regression/.gitignore +1 -0
  199. data/regression/can_i_deploy_spec.rb +43 -0
  200. data/regression/index_spec.rb +26 -0
  201. data/regression/regression_helper.rb +63 -0
  202. data/regression/script/approval-all.sh +6 -0
  203. data/regression/script/clear.sh +3 -0
  204. data/regression/script/run.sh +3 -0
  205. data/script/demonstrate-version-branches.rb +33 -0
  206. data/script/exercise-api-for-optic.sh +3 -0
  207. data/script/pry.rb +2 -2
  208. data/script/reproduce-issue-starting-up.rb +13 -23
  209. data/script/reproduce-issue.rb +18 -14
  210. data/script/trigger-release.sh +1 -1
  211. data/script/webhook-server.ru +5 -5
  212. data/spec/features/create_version_spec.rb +44 -0
  213. data/spec/fixtures/dashboard.json +4 -2
  214. data/spec/integration/ui/index_spec.rb +4 -4
  215. data/spec/lib/pact_broker/api/decorators/dashboard_decorator_spec.rb +4 -2
  216. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +11 -6
  217. data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +6 -6
  218. data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +6 -0
  219. data/spec/lib/pact_broker/api/resources/can_i_deploy_badge_spec.rb +1 -1
  220. data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +59 -10
  221. data/spec/lib/pact_broker/api/resources/error_response_body_generator_spec.rb +69 -0
  222. data/spec/lib/pact_broker/api/resources/provider_pacts_for_verification_spec.rb +4 -0
  223. data/spec/lib/pact_broker/api/resources/verifications_spec.rb +2 -5
  224. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +3 -2
  225. data/spec/lib/pact_broker/config/space_delimited_integer_list_spec.rb +47 -0
  226. data/spec/lib/pact_broker/configuration_spec.rb +12 -0
  227. data/spec/lib/pact_broker/db/log_quietener_spec.rb +1 -1
  228. data/spec/lib/pact_broker/doc/controllers/app_spec.rb +3 -5
  229. data/spec/lib/pact_broker/domain/tag_spec.rb +101 -27
  230. data/spec/lib/pact_broker/domain/version_spec.rb +103 -15
  231. data/spec/lib/pact_broker/domain/webhook_spec.rb +7 -7
  232. data/spec/lib/pact_broker/errors/error_logger_spec.rb +62 -0
  233. data/spec/lib/pact_broker/errors_spec.rb +55 -0
  234. data/spec/lib/pact_broker/index/service_spec.rb +89 -15
  235. data/spec/lib/pact_broker/pacts/pact_publication_dataset_module_spec.rb +400 -0
  236. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +434 -14
  237. data/spec/lib/pact_broker/pacts/repository_find_for_verification_fallback_spec.rb +1 -1
  238. data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +1 -1
  239. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_branch_spec.rb +224 -0
  240. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +46 -7
  241. data/spec/lib/pact_broker/pacts/selector_spec.rb +3 -2
  242. data/spec/lib/pact_broker/pacts/service_find_for_verification_spec.rb +2 -3
  243. data/spec/lib/pact_broker/pacts/service_spec.rb +9 -7
  244. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +57 -10
  245. data/spec/lib/pact_broker/tags/repository_spec.rb +2 -0
  246. data/spec/lib/pact_broker/verifications/service_spec.rb +4 -1
  247. data/spec/lib/pact_broker/versions/repository_spec.rb +44 -0
  248. data/spec/lib/pact_broker/webhooks/render_spec.rb +6 -5
  249. data/spec/lib/pact_broker/webhooks/repository_spec.rb +5 -2
  250. data/spec/lib/pact_broker/webhooks/service_spec.rb +14 -9
  251. data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +60 -18
  252. data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +8 -0
  253. data/spec/lib/sequel/plugins/upsert_spec.rb +31 -3
  254. data/spec/spec_helper.rb +17 -5
  255. data/spec/support/approvals.rb +24 -0
  256. data/tasks/db.rake +1 -0
  257. data/tasks/rspec.rake +6 -0
  258. metadata +90 -18
  259. data/docker-compose-issue-repro.yml +0 -22
  260. data/public/css/bootstrap-theme.css +0 -587
  261. data/public/css/bootstrap-theme.css.map +0 -1
  262. data/public/css/bootstrap-theme.min.css +0 -6
  263. data/public/css/bootstrap-theme.min.css.map +0 -1
  264. data/public/fonts/glyphicons-halflings-regular.svg +0 -288
  265. data/public/javascripts/jquery-3.3.1.min.js +0 -2
  266. data/public/javascripts/jquery-3.3.1.min.map +0 -1
  267. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +0 -211
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bb163d5ed55a2b3f98f18b63763749a0a9a337538a69b30af9f01295e720154
4
- data.tar.gz: cd8cc58097602d87c09f9af494b49c28666223350f57a2f4f9ccade3f3b1d57c
3
+ metadata.gz: caab9fa9fc2bef074e4523e89122015a55d85572df00564956dc25553273f095
4
+ data.tar.gz: aa1638d95186e934c08cac4d5842c8e10c762b95e9db1f5f9e3ca3c4533dbde4
5
5
  SHA512:
6
- metadata.gz: a32dd3179963aac89bff4ca0197e80f73576188355b92984e51ee010522e34d7017ab6a2cac6eaf5ac865391b221d7aa619efdd8950727cac20c2e6d2b686e79
7
- data.tar.gz: fbd56c79155229b5900294f13b0ce1ce9390cd2260e678a83ef2b358d4ad8112ae6e4f257bc3380e4ed488b67ed838f80214ba16bb8431c002f85878c5989a33
6
+ metadata.gz: 82a534408c7557f0dd8b5a605d3c68da1d79d8dabaefb721608ff99a4fcb16e6e04815d5b2286fc50d87dce99c8170eebcef653e46d4b423f4048ffeccce0075
7
+ data.tar.gz: fdb5a29c0ccdb0dce1d60ea7853925154a1d82384fd2c720a46a612b2a20f173ce65f08f67349d6095e6f2ca8f14721d660c2b4a35ca77a3ce3e7e8c9fb12269
data/.codeclimate.yml CHANGED
@@ -1,4 +1,13 @@
1
1
  ---
2
+ checks:
3
+ argument-count:
4
+ config:
5
+ threshold: 6
6
+ method-count:
7
+ config:
8
+ threshold: 40
9
+ similar-code:
10
+ enabled: false
2
11
  engines:
3
12
  csslint:
4
13
  enabled: true
@@ -35,3 +44,6 @@ exclude_patterns:
35
44
  - public/javascripts/highlight.pack.js
36
45
  - public/javascripts/jquery*.js
37
46
  - public/js/bootstrap*.js
47
+ - public/javascripts/pagination.js
48
+ - public/javascripts/material-menu.js
49
+
@@ -0,0 +1,19 @@
1
+ name: Tests for Ruby 3.0 - these are hardcoded to succeed so every commit doesn't look like it's failing
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ sqlite:
7
+ if: "!contains(github.event.head_commit.message, '[ci-skip]')"
8
+ runs-on: "ubuntu-latest"
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby_version: ["3.0"]
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: ${{ matrix.ruby_version }}
18
+ - run: "bundle install"
19
+ - run: "bundle exec rake || true"
@@ -1,23 +1,36 @@
1
1
  name: Test
2
2
 
3
- on: push
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  sqlite:
7
+ if: "!contains(github.event.head_commit.message, '[ci-skip]')"
7
8
  runs-on: "ubuntu-latest"
8
9
  strategy:
10
+ fail-fast: false
9
11
  matrix:
10
12
  ruby_version: ["2.7"]
11
13
  steps:
12
14
  - uses: actions/checkout@v2
13
- - uses: actions/setup-ruby@v1
15
+ - uses: ruby/setup-ruby@v1
14
16
  with:
15
17
  ruby-version: ${{ matrix.ruby_version }}
16
18
  - run: "bundle install"
17
- - run: "bundle exec rake"
19
+ - name: "Install CodeClimate Test Reporter"
20
+ run: |
21
+ curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
22
+ chmod +x ./cc-test-reporter
23
+ - name: Tests
24
+ run: bundle exec rake
25
+ - name: Report test coverage
26
+ run: ./cc-test-reporter after-build --exit-code 0 || true
27
+ env:
28
+ CC_TEST_REPORTER_ID: dc2c30b67c9e2a5309e1aef699c30fdab55ba4f0e4f1beac029ba93e293835db
18
29
  postgres:
30
+ if: "!contains(github.event.head_commit.message, '[ci-skip]')"
19
31
  runs-on: "ubuntu-latest"
20
32
  strategy:
33
+ fail-fast: false
21
34
  matrix:
22
35
  ruby_version: ["2.5", "2.7"]
23
36
  services:
@@ -34,7 +47,7 @@ jobs:
34
47
  - 5432:5432
35
48
  steps:
36
49
  - uses: actions/checkout@v2
37
- - uses: actions/setup-ruby@v1
50
+ - uses: ruby/setup-ruby@v1
38
51
  with:
39
52
  ruby-version: ${{ matrix.ruby_version }}
40
53
  - run: "gem install bundler && bundle install"
@@ -45,8 +58,10 @@ jobs:
45
58
  DATABASE_ADAPTER: github_actions_postgres
46
59
  INSTALL_PG: "true"
47
60
  mysql:
61
+ if: "!contains(github.event.head_commit.message, '[ci-skip]')"
48
62
  runs-on: "ubuntu-latest"
49
63
  strategy:
64
+ fail-fast: false
50
65
  matrix:
51
66
  ruby_version: ["2.7"]
52
67
  steps:
data/.gitignore CHANGED
@@ -39,4 +39,6 @@ db/test/change_migration_strategy/pact_broker_database.sqlite3
39
39
  coverage
40
40
  db/test/backwards_compatibility/pids
41
41
  db/test/backwards_compatibility/pact_broker_database.sqlite3
42
- spec/examples.txt
42
+ spec/examples.txt
43
+ .approvals
44
+ regression/fixtures/approvals
data/.optic/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+
2
+ captures/
@@ -0,0 +1 @@
1
+ []
data/.optic/ignore ADDED
@@ -0,0 +1,14 @@
1
+ # Default Ignore Rules
2
+ # Learn to configure your own at https://useoptic.com/docs
3
+ OPTIONS *
4
+ HEAD *
5
+ GET (.*).htm
6
+ GET (.*).html
7
+ GET (.*).css
8
+ GET (.*).js
9
+ GET (.*).woff
10
+ GET (.*).png
11
+ GET (.*).jpg
12
+ GET (.*).jpeg
13
+ GET (.*).svg
14
+ GET (.*).gif
data/CHANGELOG.md CHANGED
@@ -1,3 +1,61 @@
1
+ <a name="v2.77.0"></a>
2
+ ### v2.77.0 (2021-02-11)
3
+
4
+ #### Features
5
+
6
+ * **webhooks**
7
+ * allow the http codes to be considered as "successful" to be configured. ([a84989b1](/../../commit/a84989b1))
8
+
9
+ * add duplicate columns to tags table to reduce joins ([5ca9de62](/../../commit/5ca9de62))
10
+ * set the branch in the seed data ([9a00ce6d](/../../commit/9a00ce6d))
11
+ * display version branch on index and matrix pages ([2057df7d](/../../commit/2057df7d))
12
+ * support creating version with branch (#371) ([5884a047](/../../commit/5884a047))
13
+ * sort tags on index and matrix pages and APIs by creation date ([91590718](/../../commit/91590718))
14
+ * sort consumer version tags by date in dashboard response ([f82ba1bc](/../../commit/f82ba1bc))
15
+
16
+ <a name="v2.76.2"></a>
17
+ ### v2.76.2 (2021-01-29)
18
+
19
+ #### Bug Fixes
20
+
21
+ * trigger one webhook for each pact publication that the verified content belongs to when using the 'pacts for verification' API (#378) ([114ccad0](/../../commit/114ccad0))
22
+
23
+ <a name="v2.76.1"></a>
24
+ ### v2.76.1 (2021-01-28)
25
+
26
+ #### Bug Fixes
27
+
28
+ * deduplicate wip pacts by content ([0af90776](/../../commit/0af90776))
29
+ * message when pending pact is verified successfully for the first time (#376) ([4fc69190](/../../commit/4fc69190))
30
+ * use base URL from rack env in UI ([5bf21324](/../../commit/5bf21324))
31
+
32
+ <a name="v2.76.0"></a>
33
+ ### v2.76.0 (2021-01-21)
34
+
35
+ #### Features
36
+
37
+ * **verification results**
38
+ * redirect requests for verification results to the HAL browser if requested in a web browser ([0f948de5](/../../commit/0f948de5))
39
+
40
+ <a name="v2.75.0"></a>
41
+ ### v2.75.0 (2021-01-18)
42
+
43
+ #### Features
44
+
45
+ * upgrade bootstrap (#370) ([a457c337](/../../commit/a457c337))
46
+ * add indexes to webhook_executions and triggered_webhooks tables ([b05e7dbe](/../../commit/b05e7dbe))
47
+
48
+ * **webhook**
49
+ * set read and open timeouts ([8b502c44](/../../commit/8b502c44))
50
+
51
+ #### Bug Fixes
52
+
53
+ * **ui**
54
+ * upgrade to jquery-3.5.1 to address vulnerabilities in jquery-3.3.1 ([de41b231](/../../commit/de41b231))
55
+
56
+ * **deps**
57
+ * upgrade redcarpet for CVE-2020-26298 ([b57aad32](/../../commit/b57aad32))
58
+
1
59
  <a name="v2.74.1"></a>
2
60
  ### v2.74.1 (2021-01-05)
3
61
 
data/DEVELOPER_SETUP.md CHANGED
@@ -36,7 +36,7 @@ Remember to rebuild the image if you change any of the gems or gem versions.
36
36
 
37
37
  ### With native install
38
38
 
39
- * You will need to install Ruby 2.5, and preferably a ruby version manager. I recommend using [chruby][chruby] and [ruby-install][ruby-install].
39
+ * You will need to install Ruby 2.7, and preferably a ruby version manager. I recommend using [chruby][chruby] and [ruby-install][ruby-install].
40
40
  * Install bundler (the Ruby gem dependency manager) `gem install bundler`
41
41
  * Check out the pact_broker repository and cd into it.
42
42
  * Run `bundle install`. If you have any gem conflict issues, run `bundle update`.
@@ -68,17 +68,34 @@ bundle exec rake
68
68
  # if you don't want to run the whole rake test suite, init the db first
69
69
  /home/init-db.sh
70
70
  ```
71
+
72
+ Running a mysql client in the mysql-tests container:
73
+
74
+ ```
75
+ mysql -hmysql -upact_broker -ppact_broker
76
+ ```
77
+
78
+ Running a postgresql client in the postgres-tests container:
79
+
80
+ ```
81
+ psql postgres://postgres:postgres@postgres/postgres
82
+ ```
83
+
71
84
  ## Running the tests
72
85
 
73
86
  * To run everything (specs, pact verifications, vulnerability scan...):
74
87
  ```sh
75
88
  bundle exec rake
76
89
  ```
90
+ * To set up the database (this is done automatically when running the default rake task, but if you want to run a different task without running the default task first, this must be run once beforehand):
91
+ ```sh
92
+ bundle exec rake db:prepare:test
93
+ ```
77
94
  * To run a smaller subset of the tests:
78
95
  ```sh
79
96
  bundle exec rake spec
80
97
  ```
81
- * To run the "quick tests" (skip the lengthy migration specs)
98
+ * To run the "quick tests" (skip the lengthy migration specs and db setup)
82
99
  ```sh
83
100
  bundle exec rake spec:quick
84
101
  ```
@@ -87,5 +104,56 @@ bundle exec rake
87
104
  bundle exec rspec path_to_your_spec.rb
88
105
  ```
89
106
 
107
+ ## Running the regression tests
108
+
109
+ The regression tests record a series of API requests/responses using a real exported database (not included in the git repository because of the size) and store the expectations in files using the Approvals gem. They allow you to make sure that the changes you have made have not made any (unexpected) changes to the interface.
110
+
111
+ The tests and files are stored in the [regression](regression) directory.
112
+
113
+ To run:
114
+
115
+ 1. Set up your local development environment as described above, making sure you have `INSTALL_PG=true` exported in your shell.
116
+
117
+ 1. Make sure you have the master branch checked out.
118
+
119
+ 1. Load an exported real database into a postgres docker image. The exported file must be in the pg dump format to use this script, and it must be located in the project root directory for it to be found via the mounted directory.
120
+
121
+ ```
122
+ script/docker/reload.sh <export>
123
+
124
+ ```
125
+ 1. Clear any previously generated approvals.
126
+
127
+ ```
128
+ regression/script/clear.sh
129
+ ```
130
+
131
+ 1. Run the tests. They will fail because there are no approval files yet.
132
+
133
+ ```
134
+ regression/script/run.sh
135
+ ```
136
+
137
+ 1. Approval all the things.
138
+
139
+ ```
140
+ regression/script/approval-all.sh
141
+ ```
142
+
143
+ 1. Run the tests again to make sure that the same results can be expected each time.
144
+
145
+ ```
146
+ regression/script/run.sh
147
+ ```
148
+
149
+ 1. Check out the feature branch (or enable the feature toggle)
150
+
151
+ 1. Run the tests again.
152
+ ```
153
+ regression/script/run.sh
154
+ ```
155
+
156
+ 1. If there is a diff, you can set `SHOW_REGRESSION_DIFF=true`, but the output is quite noisy, and you're probably better off using diff or diffmerge to view the differences.
157
+
90
158
  [chruby]: https://github.com/postmodern/chruby
91
159
  [ruby-install]: https://github.com/postmodern/ruby-install
data/Dockerfile CHANGED
@@ -15,6 +15,8 @@ RUN apk update \
15
15
  "sqlite>=3.28" \
16
16
  "tzdata>=2019" \
17
17
  "mariadb-dev>=10.3" \
18
+ "mysql-client>=10.3.25" \
19
+ "postgresql-client>=11.10" \
18
20
  && rm -rf /var/cache/apk/*
19
21
 
20
22
  RUN apk add --no-cache openssl less
data/ISSUES.md CHANGED
@@ -2,22 +2,30 @@
2
2
 
3
3
  ## Reproducing an issue
4
4
 
5
- In [script/reproduce-issue.rb](script/reproduce-issue.rb) you will find a fluent API that allows you to simulate client libraries interacting with the Pact Broker.
5
+ In [script/reproduce-issue.rb](script/reproduce-issue.rb) you will find an example fluent API script that allows you to simulate client libraries interacting with the Pact Broker.
6
6
 
7
- You can use it to easily reproduce issues.
7
+ You can use it to easily reproduce issues. You will need Docker and Docker Compose installed (but not Ruby).
8
8
 
9
9
  To use it:
10
10
 
11
- * Run the Pact Broker using the latest development code:
11
+ * Run the Pact Broker using a specific Pact Broker Docker image by setting the required tag for the pact-broker service in the docker-compose-issue-repro-with-pact-broker-docker-image.yml file.
12
12
 
13
13
  ```
14
- docker-compose -f docker-compose-issue-repro.yml up --build pact-broker
14
+ git clone git@github.com:pact-foundation/pact_broker.git
15
+ cd pact_broker
16
+
17
+ docker-compose -f docker-compose-issue-repro-with-pact-broker-docker-image.yml up pact-broker
18
+
19
+ # if needing webhooks - run this in a new window so the logs are clearer
20
+ docker-compose -f docker-compose-issue-repro-with-pact-broker-docker-image.yml up webhook-server
21
+
15
22
  ```
16
23
 
17
24
  * Run the reproduction script.
18
25
 
19
26
  ```
20
- docker-compose -f docker-compose-issue-repro.yml up repro-issue
27
+ # in a new shell
28
+ docker-compose -f docker-compose-issue-repro-with-pact-broker-docker-image.yml run repro-issue
21
29
  ```
22
30
 
23
31
  You can modify `script/reproduce-issue.rb` and then re-run it with the change applied.
data/README.md CHANGED
@@ -116,7 +116,7 @@ Use the HAL browser to view documentation as you browse.
116
116
 
117
117
  ### To have a play around on your local machine
118
118
 
119
- * Install ruby 2.2.0 or later and bundler >= 1.12.0
119
+ * Install Ruby and Bundler (check the automated tests to find the most recent version of Ruby and Bundler that are supported)
120
120
  * Windows users: get a Rails/Ruby installer from [RailsInstaller](http://railsinstaller.org/) and run it
121
121
  * unix users just use your package manager
122
122
  * Run `git clone git@github.com:pact-foundation/pact_broker.git && cd pact_broker/example`
data/config.ru CHANGED
@@ -26,6 +26,7 @@ app = PactBroker::App.new do | config |
26
26
  config.webhook_host_whitelist = [/.*/, "10.0.0.0/8"]
27
27
  config.webhook_scheme_whitelist = ['http', 'https']
28
28
  config.webhook_http_method_whitelist = ['GET', 'POST']
29
+ config.webhook_http_code_success = [200, 201, 202, 203, 204, 205, 206]
29
30
  #config.base_url = ENV['PACT_BROKER_BASE_URL']
30
31
 
31
32
  database_logger = PactBroker::DB::LogQuietener.new(config.logger)
data/config/database.yml CHANGED
@@ -17,7 +17,7 @@ test:
17
17
  username: postgres
18
18
  password: postgres
19
19
  host: localhost
20
- port: "5433"
20
+ port: "5432"
21
21
  docker_compose_postgres:
22
22
  adapter: postgres
23
23
  database: postgres
@@ -5,6 +5,29 @@ def head_pact_tags_v1(connection)
5
5
  Sequel[:lp][:consumer_id] => Sequel[:o][:consumer_id],
6
6
  Sequel[:lp][:provider_id] => Sequel[:o][:provider_id],
7
7
  Sequel[:cv][:order] => Sequel[:o][:latest_consumer_version_order]
8
- }, { table_alias: :o})
8
+ }, { table_alias: :o })
9
9
  .select(Sequel[:o][:tag_name].as(:name), Sequel[:lp][:pact_publication_id])
10
10
  end
11
+
12
+ def head_pact_tags_v2_rollback(connection, postgres)
13
+ if(postgres)
14
+ head_pact_tags_v1(connection).select_append(Sequel.lit("TIMESTAMP 'epoch'").as(:created_at))
15
+ else
16
+ head_pact_tags_v1(connection)
17
+ end
18
+ end
19
+
20
+ def head_pact_tags_v2(connection)
21
+ connection.from(Sequel.as(:latest_pact_publication_ids_for_consumer_versions, :lp))
22
+ .join(:versions,{ Sequel[:lp][:consumer_version_id] => Sequel[:cv][:id]}, { table_alias: :cv })
23
+ .join(:latest_tagged_pact_consumer_version_orders, {
24
+ Sequel[:lp][:consumer_id] => Sequel[:o][:consumer_id],
25
+ Sequel[:lp][:provider_id] => Sequel[:o][:provider_id],
26
+ Sequel[:cv][:order] => Sequel[:o][:latest_consumer_version_order]
27
+ }, { table_alias: :o } )
28
+ .join(:tags, {
29
+ Sequel[:tags][:version_id] => Sequel[:cv][:id],
30
+ Sequel[:tags][:name] => Sequel[:o][:tag_name]
31
+ })
32
+ .select(Sequel[:o][:tag_name].as(:name), Sequel[:lp][:pact_publication_id], Sequel[:tags][:created_at])
33
+ end
@@ -21,3 +21,14 @@ def latest_tagged_pact_consumer_version_orders_v3(connection)
21
21
  .join(:versions, { Sequel[:lp][:consumer_version_id] => Sequel[:cv][:id] }, { table_alias: :cv} )
22
22
  .join(:tags, { Sequel[:t][:version_id] => Sequel[:lp][:consumer_version_id] }, { table_alias: :t })
23
23
  end
24
+
25
+ def latest_tagged_pact_consumer_version_orders_v4(connection)
26
+ view = Sequel.as(:latest_pact_publication_ids_for_consumer_versions, :lp)
27
+ connection.from(view)
28
+ .select_group(
29
+ Sequel[:lp][:provider_id],
30
+ Sequel[:lp][:consumer_id],
31
+ Sequel[:t][:name].as(:tag_name))
32
+ .select_append{ max(version_order).as(latest_consumer_version_order) }
33
+ .join(:tags, { Sequel[:t][:version_id] => Sequel[:lp][:consumer_version_id] }, { table_alias: :t })
34
+ end
@@ -0,0 +1,6 @@
1
+ LATEST_TAGGED_PACT_PUBLICATIONS = "select lp.*, o.tag_name
2
+ from latest_pact_publications_by_consumer_versions lp
3
+ inner join latest_tagged_pact_consumer_version_orders o
4
+ on lp.consumer_id = o.consumer_id
5
+ and lp.provider_id = o.provider_id
6
+ and lp.consumer_version_order = latest_consumer_version_order"
@@ -51,3 +51,16 @@ LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V3 = "select
51
51
  on v.provider_version_id = pv.id
52
52
  where v.id in (select latest_verification_id from latest_verification_ids_for_pact_versions)
53
53
  group by pv.pacticipant_id, lpp.consumer_id, t.name"
54
+
55
+ LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V4 = "select
56
+ lpp.provider_id,
57
+ lpp.consumer_id,
58
+ t.name as consumer_version_tag_name,
59
+ max(lv.latest_verification_id) as latest_verification_id
60
+ from latest_verification_ids_for_pact_versions lv
61
+ join latest_pact_publication_ids_for_consumer_versions lpp
62
+ on lv.pact_version_id = lpp.pact_version_id
63
+ join tags t
64
+ on lpp.consumer_version_id = t.version_id
65
+ group by lpp.provider_id, lpp.consumer_id, t.name
66
+ "