Skip to content

Commit cf27ad8

Browse files
committed
feat: seed app with example data on first startup
1 parent 30af8fb commit cf27ad8

File tree

8 files changed

+245
-7
lines changed

8 files changed

+245
-7
lines changed

lib/pact_broker/app.rb

+22
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ def initialize &block
3333
yield configuration
3434
post_configure
3535
prepare_database
36+
load_configuration_from_database
37+
seed_example_data
3638
end
3739

3840
# Allows middleware to be inserted at the bottom of the shared middlware stack
@@ -92,6 +94,11 @@ def prepare_database
9294
PactBroker::Webhooks::Service.fail_retrying_triggered_webhooks
9395
end
9496

97+
def load_configuration_from_database
98+
require 'pact_broker/config/load'
99+
PactBroker::Config::Load.call(configuration)
100+
end
101+
95102
def configure_database_connection
96103
PactBroker::DB.connection = configuration.database_connection
97104
PactBroker::DB.connection.timezone = :utc
@@ -103,6 +110,21 @@ def configure_database_connection
103110
Sequel.typecast_timezone = :utc # If no timezone specified on dates going into the database, assume they are UTC
104111
end
105112

113+
def seed_example_data
114+
if configuration.seed_example_data && configuration.example_data_seeder
115+
logger.info "Seeding example data"
116+
configuration.example_data_seeder.call
117+
logger.info "Marking seed as done"
118+
configuration.seed_example_data = false
119+
require 'pact_broker/config/save'
120+
PactBroker::Config::Save.call(configuration, [:seed_example_data])
121+
else
122+
logger.info "Not seeding example data"
123+
end
124+
rescue StandardError => e
125+
logger.error "Error running example data seeder, #{e.class} #{e.message}", e
126+
end
127+
106128
def prepare_app
107129
configure_middleware
108130

lib/pact_broker/configuration.rb

+8-2
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@ class Configuration
2929
:webhook_http_method_whitelist,
3030
:webhook_scheme_whitelist,
3131
:webhook_host_whitelist,
32-
:base_equality_only_on_content_that_affects_verification_results
32+
:base_equality_only_on_content_that_affects_verification_results,
33+
:seed_example_data
3334
]
3435

35-
attr_accessor :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :use_hal_browser, :html_pact_renderer, :use_rack_protection
36+
attr_accessor :log_dir, :database_connection, :auto_migrate_db, :auto_migrate_db_data, :example_data_seeder, :seed_example_data, :use_hal_browser, :html_pact_renderer, :use_rack_protection
3637
attr_accessor :validate_database_connection_config, :enable_diagnostic_endpoints, :version_parser, :sha_generator
3738
attr_accessor :use_case_sensitive_resource_names, :order_versions_by_date
3839
attr_accessor :check_for_potential_duplicate_pacticipant_names
@@ -72,6 +73,11 @@ def self.default_configuration
7273
config.html_pact_renderer = default_html_pact_render
7374
config.version_parser = PactBroker::Versions::ParseSemanticVersion
7475
config.sha_generator = PactBroker::Pacts::GenerateSha
76+
config.seed_example_data = true
77+
config.example_data_seeder = lambda do
78+
require 'pact_broker/db/seed_example_data'
79+
PactBroker::DB::SeedExampleData.call
80+
end
7581
config.base_equality_only_on_content_that_affects_verification_results = true
7682
config.order_versions_by_date = true
7783
config.semver_formats = ["%M.%m.%p%s%d", "%M.%m", "%M"]

lib/pact_broker/db/seed/pact_1.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"consumer": {
3+
"name": "Zoo App"
4+
},
5+
"provider": {
6+
"name": "Animal Service"
7+
},
8+
"interactions": [
9+
{
10+
"description": "a request for an alligator",
11+
"providerState": "there is an alligator named Mary",
12+
"request": {
13+
"method": "get",
14+
"path": "/alligators/Mary",
15+
"headers": {
16+
"Accept": "application/json"
17+
}
18+
},
19+
"response": {
20+
"status": 200,
21+
"headers": {
22+
"Content-Type": "application/json;charset=utf-8"
23+
},
24+
"body": {
25+
"name": "Mary"
26+
}
27+
}
28+
}
29+
],
30+
"metadata": {
31+
"pactSpecification": {
32+
"version": "2.0.0"
33+
}
34+
}
35+
}

lib/pact_broker/db/seed/pact_2.json

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"consumer": {
3+
"name": "Zoo App"
4+
},
5+
"provider": {
6+
"name": "Animal Service"
7+
},
8+
"interactions": [
9+
{
10+
"description": "a request for an alligator",
11+
"providerState": "there is an alligator named Mary",
12+
"request": {
13+
"method": "get",
14+
"path": "/alligators/Mary",
15+
"headers": {
16+
"Accept": "application/json"
17+
}
18+
},
19+
"response": {
20+
"status": 200,
21+
"headers": {
22+
"Content-Type": "application/json;charset=utf-8"
23+
},
24+
"body": {
25+
"name": "Mary"
26+
},
27+
"matchingRules": {
28+
"$.body.name": {
29+
"match": "type"
30+
}
31+
}
32+
}
33+
}
34+
],
35+
"metadata": {
36+
"pactSpecification": {
37+
"version": "2.0.0"
38+
}
39+
}
40+
}

lib/pact_broker/db/seed/pact_3.json

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{
2+
"consumer": {
3+
"name": "Zoo App"
4+
},
5+
"provider": {
6+
"name": "Animal Service"
7+
},
8+
"interactions": [
9+
{
10+
"description": "a request for an alligator",
11+
"providerState": "there is an alligator named Mary",
12+
"request": {
13+
"method": "get",
14+
"path": "/alligators/Mary",
15+
"headers": {
16+
"Accept": "application/json"
17+
}
18+
},
19+
"response": {
20+
"status": 200,
21+
"headers": {
22+
"Content-Type": "application/json;charset=utf-8"
23+
},
24+
"body": {
25+
"name": "Mary"
26+
},
27+
"matchingRules": {
28+
"$.body.name": {
29+
"match": "type"
30+
}
31+
}
32+
}
33+
},
34+
{
35+
"description": "a request for an alligator",
36+
"providerState": "there is not an alligator named Mary",
37+
"request": {
38+
"method": "get",
39+
"path": "/alligators/Mary",
40+
"headers": {
41+
"Accept": "application/json"
42+
}
43+
},
44+
"response": {
45+
"status": 404,
46+
"headers": {
47+
}
48+
}
49+
},
50+
{
51+
"description": "a request for an alligator",
52+
"providerState": "an error occurs retrieving an alligator",
53+
"request": {
54+
"method": "get",
55+
"path": "/alligators/Mary",
56+
"headers": {
57+
"Accept": "application/json"
58+
}
59+
},
60+
"response": {
61+
"status": 500,
62+
"headers": {
63+
"Content-Type": "application/json;charset=utf-8"
64+
},
65+
"body": {
66+
"error": "Argh!!!"
67+
}
68+
}
69+
}
70+
],
71+
"metadata": {
72+
"pactSpecification": {
73+
"version": "2.0.0"
74+
}
75+
}
76+
}
+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
require 'pact_broker/test/test_data_builder'
2+
3+
module PactBroker
4+
module DB
5+
class SeedExampleData
6+
def self.call
7+
new.call
8+
end
9+
10+
def call
11+
PactBroker::Test::TestDataBuilder.new
12+
.create_consumer("Example App", created_at: days_ago(16))
13+
.create_provider("Example API", created_at: days_ago(16))
14+
.create_consumer_version("e15da45d3943bf10793a6d04cfb9f5dabe430fe2", created_at: days_ago(16))
15+
.create_consumer_version_tag("prod", created_at: days_ago(16))
16+
.create_consumer_version_tag("dev", created_at: days_ago(16))
17+
.create_pact(json_content: pact_1, created_at: days_ago(16))
18+
.create_verification(provider_version: "1315e0b1924cb6f42751f977789be3559373033a", success: false, execution_date: days_ago(15))
19+
.create_provider_version_tag("dev", created_at: days_ago(14))
20+
.create_verification(provider_version: "480e5aeb30467856ca995d0024d2c1800b0719e5", number: 2, execution_date: days_ago(14))
21+
.create_provider_version_tag("prod", created_at: days_ago(14))
22+
.create_provider_version_tag("dev", created_at: days_ago(14))
23+
.create_consumer_version("725c6ccb7cf7efc51b4394f9828585eea9c379d9", created_at: days_ago(7))
24+
.create_consumer_version_tag("feat-new-thing", created_at: days_ago(7))
25+
.create_pact(json_content: pact_2, created_at: days_ago(7))
26+
.create_consumer_version("7bd4d9173522826dc3e8704fd62dde0424f4c827", created_at: days_ago(1))
27+
.create_consumer_version_tag("dev", created_at: days_ago(1))
28+
.create_pact(json_content: pact_3, created_at: days_ago(1))
29+
.create_verification(provider_version: "4fdf20082263d4c5038355a3b734be1c0054d1e1", execution_date: days_ago(1))
30+
.create_provider_version_tag("dev", created_at: days_ago(1))
31+
end
32+
33+
def pact_1
34+
seed_data_file("pact_1.json")
35+
end
36+
37+
def pact_2
38+
seed_data_file("pact_2.json")
39+
end
40+
41+
def pact_3
42+
seed_data_file("pact_3.json")
43+
end
44+
45+
def seed_data_dir
46+
File.join(File.dirname(__FILE__), "seed")
47+
end
48+
49+
def seed_data_file(name)
50+
File.read(File.join(seed_data_dir, name))
51+
end
52+
53+
def days_ago(days)
54+
DateTime.now - days
55+
end
56+
end
57+
end
58+
end

lib/pact_broker/test/test_data_builder.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -189,18 +189,21 @@ def use_provider_version version_number
189189
def create_tag tag_name, params = {}
190190
params.delete(:comment)
191191
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @version)
192+
set_created_at_if_set params[:created_at], :tags, { name: @tag.name, version_id: @tag.version_id }
192193
self
193194
end
194195

195196
def create_consumer_version_tag tag_name, params = {}
196197
params.delete(:comment)
197198
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @consumer_version)
199+
set_created_at_if_set params[:created_at], :tags, { name: @tag.name, version_id: @tag.version_id }
198200
self
199201
end
200202

201203
def create_provider_version_tag tag_name, params = {}
202204
params.delete(:comment)
203205
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @provider_version)
206+
set_created_at_if_set params[:created_at], :tags, { name: @tag.name, version_id: @tag.version_id }
204207
self
205208
end
206209

@@ -343,18 +346,16 @@ def set_created_at_if_set created_at, table_name, selector
343346

344347
def default_json_content
345348
{
346-
"consumer" => {
349+
"consumer" => {
347350
"name" => "Condor"
348351
},
349-
"provider" => {
352+
"provider" => {
350353
"name" => "Pricing Service"
351354
},
352355
"interactions" => [],
353356
"random" => rand
354357
}.to_json
355358
end
356359
end
357-
358360
end
359361
end
360-

spec/service_consumers/pact_helper.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
require 'tasks/database'
77
require 'pact_broker/db'
88
PactBroker::DB.connection = PactBroker::Database.database = DB::PACT_BROKER_DB
9-
9+
PactBroker.configuration.seed_example_data = false
1010
require 'spec/support/database_cleaner'
1111
require 'pact_broker'
1212
require 'pact_broker/app'

0 commit comments

Comments
 (0)