pact_broker 0.0.9 → 0.0.10

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 (38) hide show
  1. data/CHANGELOG.md +14 -0
  2. data/Gemfile.lock +11 -9
  3. data/lib/pact_broker/api/decorators/base_decorator.rb +1 -1
  4. data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +24 -0
  5. data/lib/pact_broker/api/decorators/pact_collection_decorator.rb +3 -3
  6. data/lib/pact_broker/api/decorators/pact_decorator.rb +1 -1
  7. data/lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb +1 -1
  8. data/lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb +1 -1
  9. data/lib/pact_broker/api/decorators/tag_decorator.rb +19 -0
  10. data/lib/pact_broker/api/decorators.rb +2 -1
  11. data/lib/pact_broker/api/{decorators/pact_broker_urls.rb → pact_broker_urls.rb} +14 -1
  12. data/lib/pact_broker/api/resources/base_resource.rb +14 -1
  13. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  14. data/lib/pact_broker/api/resources/pact.rb +3 -9
  15. data/lib/pact_broker/api/resources/pacticipant.rb +8 -21
  16. data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
  17. data/lib/pact_broker/api/resources/tag.rb +44 -0
  18. data/lib/pact_broker/api.rb +2 -0
  19. data/lib/pact_broker/logging.rb +4 -0
  20. data/lib/pact_broker/models/tag.rb +5 -0
  21. data/lib/pact_broker/repositories/tag_repository.rb +25 -0
  22. data/lib/pact_broker/repositories/version_repository.rb +8 -0
  23. data/lib/pact_broker/repositories.rb +5 -0
  24. data/lib/pact_broker/services/pacticipant_service.rb +9 -9
  25. data/lib/pact_broker/services/tag_service.rb +25 -0
  26. data/lib/pact_broker/services.rb +5 -0
  27. data/lib/pact_broker/version.rb +1 -1
  28. data/pact_broker.gemspec +1 -1
  29. data/spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb +2 -2
  30. data/spec/lib/pact_broker/api/resources/tag_spec.rb +118 -0
  31. data/spec/lib/pact_broker/repositories/tag_repository_spec.rb +53 -0
  32. data/spec/lib/pact_broker/repositories/version_repository_spec.rb +38 -0
  33. data/spec/lib/pact_broker/services/tag_service_spec.rb +31 -0
  34. data/spec/service_consumers/pact_helper.rb +1 -0
  35. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +9 -0
  36. data/spec/spec_helper.rb +10 -0
  37. data/spec/support/provider_state_builder.rb +25 -0
  38. metadata +22 -9
data/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@ Do this to generate your change history
2
2
 
3
3
  $ git log --date=relative --pretty=format:' * %h - %s (%an, %ad)' 'package/pact-broker-0.0.PRODVERSION'..'package/pact-broker-0.0.NEWVERSION'
4
4
 
5
+ #### 0.0.10 (2014-03-24)
6
+
7
+ * 7aee2ae - Implemented version tagging (Beth, 2 days ago)
8
+ * cc78f92 - Added 'latest' pact url to pact representation in the 'latest pacts' response (Beth, 2 days ago)
9
+
10
+ #### 0.0.9 (2014-02-27)
11
+
12
+ * d07f4b7 - Using default gem publish tasks (Beth, 4 weeks ago)
13
+ * d60b7ee - Comment (Beth, 7 weeks ago)
14
+ * 836347c - Using local pacts (Beth, 7 weeks ago)
15
+ * a2cb2bb - Fixed bug querying mysql DB, rather than sqlite (Beth, 7 weeks ago)
16
+ * 9d5f83b - Using the to_json options to pass in the base_url instead of the nasty hack. (Beth, 4 months ago)
17
+ * adb6148 - Changed 'last' to 'latest' (Beth, 4 months ago)
18
+
5
19
  #### 0.0.8 (2013-11-18)
6
20
 
7
21
  * 6022baa - Changed name to title in list pacticipants response (Beth, 7 hours ago)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pact_broker (0.0.9)
4
+ pact_broker (0.0.10)
5
5
  httparty
6
6
  json
7
7
  roar
@@ -20,6 +20,7 @@ GEM
20
20
  ci_reporter (1.9.0)
21
21
  builder (>= 2.1.2)
22
22
  coderay (1.0.9)
23
+ colored (1.2)
23
24
  columnize (0.3.6)
24
25
  debugger (1.6.2)
25
26
  columnize (>= 0.3.1)
@@ -30,7 +31,7 @@ GEM
30
31
  diff-lcs (1.2.5)
31
32
  fakefs (0.4.3)
32
33
  find_a_port (1.0.1)
33
- httparty (0.12.0)
34
+ httparty (0.13.0)
34
35
  json (~> 1.8)
35
36
  multi_xml (>= 0.5.2)
36
37
  i18n (0.6.9)
@@ -41,8 +42,9 @@ GEM
41
42
  multi_xml (0.5.5)
42
43
  nokogiri (1.6.1)
43
44
  mini_portile (~> 0.5.0)
44
- pact (1.0.26)
45
+ pact (1.1.0.rc1)
45
46
  awesome_print (~> 1.1)
47
+ colored
46
48
  find_a_port (~> 1.0.1)
47
49
  json
48
50
  rack-test (~> 0.6.2)
@@ -59,11 +61,11 @@ GEM
59
61
  rack (>= 1.0)
60
62
  rake (10.0.4)
61
63
  randexp (0.1.7)
62
- representable (1.6.1)
64
+ representable (1.7.7)
63
65
  multi_json
64
66
  nokogiri
65
- roar (0.12.0)
66
- representable (~> 1.6.0)
67
+ roar (0.12.4)
68
+ representable (>= 1.6.0)
67
69
  rspec (2.14.1)
68
70
  rspec-core (~> 2.14.0)
69
71
  rspec-expectations (~> 2.14.0)
@@ -74,7 +76,7 @@ GEM
74
76
  rspec-fire (1.2.0)
75
77
  rspec (~> 2.11)
76
78
  rspec-mocks (2.14.4)
77
- sequel (4.7.0)
79
+ sequel (4.8.0)
78
80
  shotgun (0.9)
79
81
  rack (>= 1.0)
80
82
  simplecov (0.7.1)
@@ -82,7 +84,7 @@ GEM
82
84
  simplecov-html (~> 0.7.1)
83
85
  simplecov-html (0.7.1)
84
86
  slop (3.4.6)
85
- sqlite3 (1.3.8)
87
+ sqlite3 (1.3.9)
86
88
  thor (0.18.1)
87
89
  versionomy (0.4.4)
88
90
  blockenspiel (>= 0.4.5)
@@ -99,7 +101,7 @@ DEPENDENCIES
99
101
  ci_reporter
100
102
  debugger
101
103
  fakefs (~> 0.4)
102
- pact
104
+ pact (= 1.1.0.rc1)
103
105
  pact_broker!
104
106
  pry
105
107
  rake (~> 10.0.3)
@@ -1,6 +1,6 @@
1
1
  require 'roar/decorator'
2
2
  require 'roar/representer/json/hal'
3
- require 'pact_broker/api/decorators/pact_broker_urls'
3
+ require 'pact_broker/api/pact_broker_urls'
4
4
 
5
5
  module PactBroker
6
6
 
@@ -0,0 +1,24 @@
1
+ require_relative 'pact_decorator'
2
+
3
+ module PactBroker
4
+
5
+ module Api
6
+
7
+ module Decorators
8
+
9
+ class LatestPactDecorator < PactDecorator
10
+
11
+ links :self do | options |
12
+ [
13
+ {
14
+ href: latest_pact_url(options[:base_url], represented)
15
+ },{
16
+ href: pact_url(options[:base_url], represented)
17
+ }
18
+ ]
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,6 +1,6 @@
1
1
  require_relative 'base_decorator'
2
2
  require_relative 'version_decorator'
3
- require_relative 'pact_decorator'
3
+ require_relative 'latest_pact_decorator'
4
4
  require_relative 'representable_pact'
5
5
 
6
6
  module PactBroker
@@ -9,11 +9,11 @@ module PactBroker
9
9
 
10
10
  module Decorators
11
11
 
12
- class PactCollectionRepresenter < BaseDecorator
12
+ class PactCollectionDecorator < BaseDecorator
13
13
  include Roar::Representer::JSON::HAL
14
14
  include PactBroker::Api::PactBrokerUrls
15
15
 
16
- collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::PactRepresenter
16
+ collection :pacts, decorator_scope: true, :class => PactBroker::Models::Pact, :extend => PactBroker::Api::Decorators::LatestPactDecorator
17
17
 
18
18
  def pacts
19
19
  represented.collect{ | pact | create_representable_pact(pact) }
@@ -7,7 +7,7 @@ module PactBroker
7
7
 
8
8
  module Decorators
9
9
 
10
- class PactRepresenter < BaseDecorator
10
+ class PactDecorator < BaseDecorator
11
11
 
12
12
  property :consumer, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
13
13
  property :provider, :extend => PactBroker::Api::Decorators::PactPacticipantRepresenter, :embedded => true
@@ -1,4 +1,4 @@
1
- require_relative 'pact_broker_urls'
1
+ require 'pact_broker/api/pact_broker_urls'
2
2
  require_relative 'version_decorator'
3
3
  require_relative 'base_decorator'
4
4
 
@@ -1,5 +1,5 @@
1
1
  require 'roar/representer/json/hal'
2
- require_relative 'pact_broker_urls'
2
+ require 'pact_broker/api/pact_broker_urls'
3
3
  require_relative 'version_decorator'
4
4
 
5
5
  module Roar
@@ -0,0 +1,19 @@
1
+ require_relative 'base_decorator'
2
+ require_relative 'pact_pacticipant_decorator'
3
+
4
+ module PactBroker
5
+
6
+ module Api
7
+
8
+ module Decorators
9
+
10
+ class TagDecorator < BaseDecorator
11
+
12
+ link :self do | options |
13
+ tag_url(options[:base_url], represented)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,4 +3,5 @@ require 'pact_broker/api/decorators/pacticipant_collection_decorator'
3
3
  require 'pact_broker/api/decorators/version_decorator'
4
4
  require 'pact_broker/api/decorators/pact_collection_decorator'
5
5
  require 'pact_broker/api/decorators/pact_pacticipant_decorator'
6
- require 'pact_broker/api/decorators/pact_decorator'
6
+ require 'pact_broker/api/decorators/pact_decorator'
7
+ require 'pact_broker/api/decorators/tag_decorator'
@@ -23,7 +23,8 @@ module PactBroker
23
23
  end
24
24
 
25
25
  def pact_url base_url, pact
26
- "#{pactigration_base_url(base_url, pact)}/version/#{pact.consumer.version.number}"
26
+ representable_pact = representable_pact(pact)
27
+ "#{pactigration_base_url(base_url, representable_pact)}/version/#{representable_pact.consumer.version.number}"
27
28
  end
28
29
 
29
30
  def latest_pact_url base_url, pact
@@ -34,8 +35,20 @@ module PactBroker
34
35
  "#{base_url}/pacts/latest"
35
36
  end
36
37
 
38
+ def tags_url base_url, version
39
+ "#{version_url(base_url, version)}/tags"
40
+ end
41
+
42
+ def tag_url base_url, tag
43
+ "#{tags_url(base_url, tag.version)}/#{tag.name}"
44
+ end
45
+
37
46
  private
38
47
 
48
+ def representable_pact pact
49
+ Decorators::RepresentablePact === pact ? pact : Decorators::RepresentablePact.new(pact)
50
+ end
51
+
39
52
  def pactigration_base_url base_url, pact
40
53
  "#{base_url}/pact/provider/#{url_encode(pact.provider.name)}/consumer/#{url_encode(pact.consumer.name)}"
41
54
  end
@@ -1,13 +1,21 @@
1
1
  require 'webmachine'
2
2
  require 'pact_broker/services'
3
3
  require 'pact_broker/api/decorators'
4
+ require 'pact_broker/logging'
5
+ require 'pact_broker/api/pact_broker_urls'
4
6
 
5
7
  module PactBroker::Api
6
8
 
7
9
  module Resources
8
10
 
11
+
9
12
  class ErrorHandler
13
+
14
+ include PactBroker::Logging
15
+
10
16
  def self.handle_exception e, response
17
+ logger.error e
18
+ logger.error e.backtrace
11
19
  response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
12
20
  response.code = 500
13
21
  end
@@ -16,6 +24,7 @@ module PactBroker::Api
16
24
  class BaseResource < Webmachine::Resource
17
25
 
18
26
  include PactBroker::Services
27
+ include PactBroker::Api::PactBrokerUrls
19
28
 
20
29
  def identifier_from_path
21
30
  request.path_info.each_with_object({}) do | pair, hash|
@@ -23,13 +32,17 @@ module PactBroker::Api
23
32
  end
24
33
  end
25
34
 
26
- def request_base_url
35
+ def resource_url
27
36
  request.uri.to_s.gsub(/#{request.uri.path}$/,'')
28
37
  end
29
38
 
30
39
  def handle_exception e
31
40
  PactBroker::Api::Resources::ErrorHandler.handle_exception(e, response)
32
41
  end
42
+
43
+ def params
44
+ JSON.parse(request.body.to_s, symbolize_names: true)
45
+ end
33
46
  end
34
47
  end
35
48
  end
@@ -19,7 +19,7 @@ module PactBroker::Api
19
19
  end
20
20
 
21
21
  def generate_json pacts
22
- PactBroker::Api::Decorators::PactCollectionRepresenter.new(pacts).to_json(base_url: request_base_url)
22
+ PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(base_url: resource_url)
23
23
  end
24
24
 
25
25
  end
@@ -25,15 +25,9 @@ module PactBroker::Api
25
25
  end
26
26
 
27
27
  def from_json
28
- pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
29
- response.body = pact.json_content
30
- @manual_response_code = 201 if created
31
- end
32
-
33
- def finish_request
34
- if @manual_response_code
35
- response.code = @manual_response_code
36
- end
28
+ @pact, created = pact_service.create_or_update_pact(identifier_from_path.merge(:json_content => pact_content))
29
+ response.headers["Location"] = pact_url(resource_url, @pact) if created
30
+ response.body = to_json
37
31
  end
38
32
 
39
33
  def to_json
@@ -31,12 +31,13 @@ module PactBroker::Api
31
31
  end
32
32
 
33
33
  def from_json
34
- pacticipant, created = pacticipant_service.create_or_update_pacticipant(
35
- name: identifier_from_path[:name],
36
- repository_url: params[:repository_url]
37
- )
38
- @manual_response_code = 201 if created
39
- response.body = generate_json(pacticipant)
34
+ if @pacticipant
35
+ @pacticipant = pacticipant_service.update params.merge(name: identifier_from_path[:name])
36
+ else
37
+ @pacticipant = pacticipant_service.create params.merge(name: identifier_from_path[:name])
38
+ response.headers["Location"] = pacticipant_url(resource_url, @pacticipant)
39
+ end
40
+ response.body = to_json
40
41
  end
41
42
 
42
43
  def resource_exists?
@@ -44,22 +45,8 @@ module PactBroker::Api
44
45
  @pacticipant != nil
45
46
  end
46
47
 
47
- def finish_request
48
- if @manual_response_code
49
- response.code = @manual_response_code
50
- end
51
- end
52
-
53
48
  def to_json
54
- generate_json(@pacticipant)
55
- end
56
-
57
- def generate_json pacticipant
58
- PactBroker::Api::Decorators::PacticipantRepresenter.new(pacticipant).to_json(base_url: request_base_url)
59
- end
60
-
61
- def params
62
- JSON.parse(request.body.to_s)
49
+ PactBroker::Api::Decorators::PacticipantRepresenter.new(@pacticipant).to_json(base_url: resource_url)
63
50
  end
64
51
 
65
52
  end
@@ -19,7 +19,7 @@ module PactBroker::Api
19
19
  end
20
20
 
21
21
  def generate_json pacticipants
22
- PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url: request_base_url)
22
+ PactBroker::Api::Decorators::PacticipantCollectionRepresenter.new(pacticipants).to_json(base_url: resource_url)
23
23
  end
24
24
 
25
25
  end
@@ -0,0 +1,44 @@
1
+ require 'pact_broker/api/resources/base_resource'
2
+
3
+ module PactBroker::Api
4
+
5
+ module Resources
6
+
7
+ class Tag < BaseResource
8
+
9
+ def content_types_provided
10
+ [["application/hal+json", :to_json]]
11
+ end
12
+
13
+ def content_types_accepted
14
+ [["application/json", :from_json]]
15
+ end
16
+
17
+ def allowed_methods
18
+ ["GET","PUT"]
19
+ end
20
+
21
+ def from_json
22
+ unless @tag
23
+ @tag = tag_service.create identifier_from_path
24
+ response.headers["Location"] = tag_url(resource_url, @tag)
25
+ end
26
+ response.body = generate_json @tag
27
+ end
28
+
29
+ def resource_exists?
30
+ @tag = tag_service.find identifier_from_path
31
+ end
32
+
33
+ def to_json
34
+ generate_json(@tag)
35
+ end
36
+
37
+ def generate_json tag
38
+ PactBroker::Api::Decorators::TagDecorator.new(tag).to_json(base_url: resource_url)
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
@@ -3,6 +3,7 @@ require 'pact_broker/api/resources/latest_pact'
3
3
  require 'pact_broker/api/resources/latest_pacts'
4
4
  require 'pact_broker/api/resources/pacticipant'
5
5
  require 'pact_broker/api/resources/pacticipants'
6
+ require 'pact_broker/api/resources/tag'
6
7
  require 'pact_broker/api/resources/index'
7
8
 
8
9
  require 'webmachine/adapters/rack'
@@ -18,6 +19,7 @@ module PactBroker
18
19
  add ['pacts', 'latest'], Api::Resources::LatestPacts
19
20
  add ['pacticipants'], Api::Resources::Pacticipants
20
21
  add ['pacticipants', :name], Api::Resources::Pacticipant
22
+ add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number, 'tags', :tag_name], Api::Resources::Tag
21
23
  add [], Api::Resources::Index
22
24
  end
23
25
  end
@@ -12,6 +12,10 @@ module PactBroker
12
12
  base.extend(self)
13
13
  end
14
14
 
15
+ def logger= logger
16
+ @@logger = logger
17
+ end
18
+
15
19
  def logger
16
20
  @@logger ||= begin
17
21
  FileUtils.mkdir_p(LOG_DIR)
@@ -5,6 +5,11 @@ module PactBroker
5
5
  module Models
6
6
  class Tag < Sequel::Model
7
7
 
8
+ unrestrict_primary_key
9
+
10
+ associate(:many_to_one, :version, :class => "PactBroker::Models::Version", :key => :version_id, :primary_key => :id)
11
+
12
+
8
13
  end
9
14
  end
10
15
  end
@@ -0,0 +1,25 @@
1
+ require 'pact_broker/models/tag'
2
+
3
+ module PactBroker
4
+ module Repositories
5
+ class TagRepository
6
+
7
+
8
+ def create args
9
+ Models::Tag.new(name: args.fetch(:name), version: args.fetch(:version)).save
10
+ end
11
+
12
+ def find args
13
+ PactBroker::Models::Tag
14
+ .select(:tags__name, :tags__version_id)
15
+ .join(:versions, {id: :version_id})
16
+ .join(:pacticipants, {pacticipants__id: :versions__pacticipant_id})
17
+ .where(:tags__name => args.fetch(:tag_name))
18
+ .where(:versions__number => args.fetch(:pacticipant_version_number))
19
+ .where(:pacticipants__name => args.fetch(:pacticipant_name))
20
+ .single_record
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -9,6 +9,14 @@ module PactBroker
9
9
  PactBroker::Models::Version.where(number: number, pacticipant_id: pacticipant_id).single_record
10
10
  end
11
11
 
12
+ def find_by_pacticipant_name_and_number pacticipant_name, number
13
+ PactBroker::Models::Version
14
+ .where(number: number)
15
+ .join(:pacticipants, {id: :pacticipant_id})
16
+ .where(name: pacticipant_name)
17
+ .single_record
18
+ end
19
+
12
20
  def create args
13
21
  PactBroker.logger.info "Creating version #{args[:number]} for pacticipant_id=#{args[:pacticipant_id]}"
14
22
  PactBroker::Models::Version.new(number: args[:number], pacticipant_id: args[:pacticipant_id]).save
@@ -2,6 +2,7 @@ require 'pact_broker/models'
2
2
  require 'pact_broker/repositories/pacticipant_repository'
3
3
  require 'pact_broker/repositories/version_repository'
4
4
  require 'pact_broker/repositories/pact_repository'
5
+ require 'pact_broker/repositories/tag_repository'
5
6
 
6
7
  module PactBroker
7
8
  module Repositories
@@ -17,6 +18,10 @@ module PactBroker
17
18
  PactRepository.new
18
19
  end
19
20
 
21
+ def tag_repository
22
+ TagRepository.new
23
+ end
24
+
20
25
  extend self
21
26
  end
22
27
  end
@@ -24,16 +24,16 @@ module PactBroker
24
24
  end
25
25
  end
26
26
 
27
- def self.create_or_update_pacticipant params
28
- pacticipant = pacticipant_repository.find_by_name(params[:name])
29
- if pacticipant
30
- pacticipant.update(repository_url: params[:repository_url])
31
- return pacticipant, false
32
- else
33
- pacticipant = pacticipant_repository.create(name: params[:name], repository_url: params[:repository_url])
34
- return pacticipant, true
35
- end
27
+ def self.update params
28
+ pacticipant = pacticipant_repository.find_by_name(params.fetch(:name))
29
+ pacticipant.update(params)
30
+ pacticipant_repository.find_by_name(params.fetch(:name))
36
31
  end
32
+
33
+ def self.create params
34
+ pacticipant_repository.create(params)
35
+ end
36
+
37
37
  end
38
38
  end
39
39
  end
@@ -0,0 +1,25 @@
1
+ require 'pact_broker/repositories'
2
+
3
+ module PactBroker
4
+
5
+ module Services
6
+ module TagService
7
+
8
+ extend self
9
+
10
+ extend PactBroker::Repositories
11
+
12
+ def create args
13
+ pacticipant = pacticipant_repository.find_by_name_or_create args.fetch(:pacticipant_name)
14
+ version = version_repository.find_by_pacticipant_id_and_number_or_create pacticipant.id, args.fetch(:pacticipant_version_number)
15
+ tag_repository.create version: version, name: args.fetch(:tag_name)
16
+ end
17
+
18
+ def find args
19
+ tag_repository.find args
20
+ end
21
+
22
+ end
23
+ end
24
+
25
+ end
@@ -1,5 +1,6 @@
1
1
  require 'pact_broker/services/pact_service'
2
2
  require 'pact_broker/services/pacticipant_service'
3
+ require 'pact_broker/services/tag_service'
3
4
 
4
5
  module PactBroker
5
6
  module Services
@@ -10,5 +11,9 @@ module PactBroker
10
11
  def pacticipant_service
11
12
  PacticipantService
12
13
  end
14
+
15
+ def tag_service
16
+ TagService
17
+ end
13
18
  end
14
19
  end
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '0.0.9'
2
+ VERSION = '0.0.10'
3
3
  end
data/pact_broker.gemspec CHANGED
@@ -36,5 +36,5 @@ Gem::Specification.new do |gem|
36
36
  gem.add_development_dependency 'ci_reporter'
37
37
  gem.add_development_dependency 'simplecov'
38
38
  gem.add_development_dependency 'shotgun'
39
- gem.add_development_dependency 'pact'
39
+ gem.add_development_dependency 'pact', '1.1.0.rc1'
40
40
  end
@@ -5,7 +5,7 @@ require 'pact_broker/api/decorators'
5
5
 
6
6
  module PactBroker::Api::Decorators
7
7
 
8
- describe PactCollectionRepresenter do
8
+ describe PactCollectionDecorator do
9
9
 
10
10
  let(:pact) do
11
11
  provider = PactBroker::Models::Pacticipant.create(:name => 'Pricing Service')
@@ -16,7 +16,7 @@ module PactBroker::Api::Decorators
16
16
  end
17
17
 
18
18
  xit "should description" do
19
- puts PactCollectionRepresenter.new([pact]).to_json
19
+ puts PactCollectionDecorator.new([pact]).to_json
20
20
  end
21
21
  end
22
22
 
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/api/resources/tag'
3
+
4
+ module PactBroker
5
+ module Api
6
+
7
+ module Resources
8
+
9
+ describe Tag do
10
+
11
+ let(:tag) { double("PactBroker::Models::Tag") }
12
+ let(:tag_decorator) { instance_double("PactBroker::Api::Decorators::TagDecorator", :to_json => tag_json) }
13
+ let(:tag_json) { {"some" => "tag"}.to_json }
14
+ let(:tag_attributes) {
15
+ {
16
+ :pacticipant_name => "Condor",
17
+ :pacticipant_version_number => "1.3.0",
18
+ :tag_name => "prod"
19
+ }
20
+ }
21
+
22
+ describe "GET" do
23
+ before do
24
+ allow(Services::TagService).to receive(:find).and_return(tag)
25
+ allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
26
+ end
27
+
28
+ subject { get("/pacticipants/Condor/versions/1.3.0/tags/prod" ) }
29
+
30
+ context "when the tag exists" do
31
+
32
+ it "renders the tag" do
33
+ subject
34
+ expect(last_response.body).to eq tag_json
35
+ end
36
+
37
+ it "returns a success response" do
38
+ subject
39
+ expect(last_response).to be_successful
40
+ end
41
+
42
+ end
43
+
44
+ context "when the tag does not exist" do
45
+ let(:tag) { nil }
46
+
47
+ it "returns a 404" do
48
+ subject
49
+ expect(last_response.status).to eq 404
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "PUT" do
55
+
56
+ let(:tag_url) { 'http://example.org/tag/url'}
57
+
58
+ before do
59
+ allow_any_instance_of(PactBroker::Api::Resources::Tag).to receive(:tag_url).and_return(tag_url)
60
+ allow(Services::TagService).to receive(:find).and_return(tag)
61
+ allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
62
+ end
63
+
64
+ subject { put("/pacticipants/Condor/versions/1.3.0/tags/prod", nil, "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "application/json") }
65
+
66
+ it "returns a success response" do
67
+ subject
68
+ expect(last_response).to be_successful
69
+ end
70
+
71
+ context "when the tag already exists" do
72
+
73
+ it "returns a 200" do
74
+ subject
75
+ expect(last_response.status).to be 200
76
+ end
77
+
78
+ it "renders the tag" do
79
+ expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
80
+ subject
81
+ expect(last_response.body).to eq tag_json
82
+ end
83
+
84
+ end
85
+
86
+ context "when the tag does not exist" do
87
+ before do
88
+ allow(Services::TagService).to receive(:find).and_return(nil)
89
+ allow(Services::TagService).to receive(:create).and_return(tag)
90
+ end
91
+
92
+
93
+ it "creates the tag" do
94
+ expect(Services::TagService).to receive(:create).with(tag_attributes)
95
+ subject
96
+ end
97
+
98
+ it "returns a 201" do
99
+ subject
100
+ expect(last_response.status).to be 201
101
+ end
102
+
103
+ it "renders the tag" do
104
+ expect(tag_decorator).to receive(:to_json).with(base_url: "http://example.org")
105
+ subject
106
+ expect(last_response.body).to eq tag_json
107
+ end
108
+
109
+ end
110
+
111
+
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/repositories/tag_repository'
3
+
4
+ module PactBroker
5
+ module Repositories
6
+ describe TagRepository do
7
+
8
+ describe ".find" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+ let(:tag_name) { "prod" }
13
+
14
+ subject { TagRepository.new }
15
+ let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name} }
16
+ let(:find_tag) { subject.find options }
17
+
18
+ let!(:provider_state_builder) do
19
+ ProviderStateBuilder.new
20
+ .create_pacticipant("wrong_pacticipant")
21
+ .create_version(version_number)
22
+ .create_tag(tag_name) #Tag with wrong pacticipant
23
+ .create_pacticipant(pacticipant_name)
24
+ .create_version("2.0.0")
25
+ .create_tag(tag_name) # Tag with wrong version number
26
+ .create_version(version_number)
27
+ .create_tag("wrong tag") #Tag with wrong name
28
+ end
29
+
30
+ context "when the tag exists" do
31
+
32
+ before do
33
+ provider_state_builder.create_tag(tag_name) # Right tag!
34
+ end
35
+
36
+ it "returns the tag" do
37
+ expect(find_tag.name).to eq tag_name
38
+ expect(find_tag.version.number).to eq version_number
39
+ expect(find_tag.version.pacticipant.name).to eq pacticipant_name
40
+ end
41
+
42
+ end
43
+
44
+ context "when the tag does not exist" do
45
+ it "returns nil" do
46
+ expect(find_tag).to be_nil
47
+ end
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/repositories/version_repository'
3
+
4
+ module PactBroker
5
+ module Repositories
6
+ describe VersionRepository do
7
+
8
+ describe "#find_by_pacticipant_name_and_number" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+
13
+ subject { described_class.new.find_by_pacticipant_name_and_number pacticipant_name, version_number }
14
+
15
+ context "when the version exists" do
16
+ before do
17
+ ProviderStateBuilder.new.create_version_with_hierarchy "other_pacticipant", version_number
18
+ ProviderStateBuilder.new.create_version_with_hierarchy pacticipant_name, version_number
19
+ end
20
+
21
+ it "returns the version" do
22
+ expect(subject.number).to eq version_number
23
+ expect(subject.pacticipant.name).to eq pacticipant_name
24
+ end
25
+ end
26
+
27
+ context "when the version doesn't exist" do
28
+ it "returns nil" do
29
+ expect(subject).to be_nil
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+ require 'pact_broker/services/tag_service'
3
+
4
+ module PactBroker
5
+ module Services
6
+ describe TagService do
7
+
8
+ describe ".create" do
9
+
10
+ let(:pacticipant_name) { "test_pacticipant" }
11
+ let(:version_number) { "1.2.3" }
12
+ let(:tag_name) { "prod" }
13
+
14
+ let(:options) { {pacticipant_name: pacticipant_name, pacticipant_version_number: version_number, tag_name: tag_name}}
15
+ let(:provider_state_builder) { ProviderStateBuilder.new }
16
+
17
+ subject { TagService.create(options) }
18
+
19
+ # Naughty integration test... didn't seem much point unit testing this
20
+
21
+ it "creates the new tag" do
22
+ expect(subject.name).to eq tag_name
23
+ expect(subject.version.number).to eq version_number
24
+ expect(subject.version.pacticipant.name).to eq pacticipant_name
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -10,6 +10,7 @@ require 'pact_broker/api/resources/pact'
10
10
 
11
11
  Pact.configure do | config |
12
12
  config.logger.level = Logger::DEBUG
13
+ #config.diff_format = :plus_and_minus
13
14
  end
14
15
 
15
16
  Pact.service_provider "Pact Broker" do
@@ -54,6 +54,15 @@ Pact.provider_states_for "Pact Broker Client" do
54
54
  end
55
55
  end
56
56
 
57
+ provider_state "'Condor' exists in the pact-broker with version 1.3.0, tagged with 'prod'" do
58
+ set_up do
59
+ ProviderStateBuilder.new
60
+ .create_pacticipant("Condor")
61
+ .create_version('1.3.0')
62
+ .create_tag('prod')
63
+ end
64
+ end
65
+
57
66
  provider_state "'Condor' does not exist in the pact-broker" do
58
67
  no_op
59
68
  end
data/spec/spec_helper.rb CHANGED
@@ -4,7 +4,11 @@ RACK_ENV = 'test'
4
4
 
5
5
  $: << File.expand_path("../../", __FILE__)
6
6
 
7
+ require 'rack/test'
7
8
  require 'pact_broker/db'
9
+ require './spec/support/provider_state_builder'
10
+ require 'pact_broker/api'
11
+ require 'rspec/fire'
8
12
 
9
13
  RSpec.configure do | config |
10
14
  config.before :suite do
@@ -19,4 +23,10 @@ RSpec.configure do | config |
19
23
  DB::PACT_BROKER_DB[:pacticipants].truncate
20
24
  end
21
25
 
26
+ config.include Rack::Test::Methods
27
+ config.include RSpec::Fire
28
+
29
+ def app
30
+ PactBroker::API
31
+ end
22
32
  end
@@ -62,6 +62,31 @@ class ProviderStateBuilder
62
62
  PactBroker::Models::Pact.create(:consumer_version => version, :provider => provider)
63
63
  end
64
64
 
65
+ def create_version_with_hierarchy pacticipant_name, pacticipant_version
66
+ pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
67
+ PactBroker::Models::Version.create(:number => pacticipant_version, :pacticipant => pacticipant)
68
+ end
69
+
70
+ def create_tag_with_hierarchy pacticipant_name, pacticipant_version, tag_name
71
+ version = create_version_with_hierarchy pacticipant_name, pacticipant_version
72
+ PactBroker::Models::Tag.create(name: tag_name, version: version)
73
+ end
74
+
75
+ def create_pacticipant pacticipant_name
76
+ @pacticipant = PactBroker::Models::Pacticipant.create(:name => pacticipant_name)
77
+ self
78
+ end
79
+
80
+ def create_version version_number
81
+ @version = PactBroker::Models::Version.create(:number => version_number, :pacticipant => @pacticipant)
82
+ self
83
+ end
84
+
85
+ def create_tag tag_name
86
+ @tag = PactBroker::Models::Tag.create(name: tag_name, version: @version)
87
+ self
88
+ end
89
+
65
90
  private
66
91
 
67
92
  # def create_pacticipant name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-02-27 00:00:00.000000000 Z
14
+ date: 2014-03-24 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: httparty
@@ -258,17 +258,17 @@ dependencies:
258
258
  requirement: !ruby/object:Gem::Requirement
259
259
  none: false
260
260
  requirements:
261
- - - ! '>='
261
+ - - '='
262
262
  - !ruby/object:Gem::Version
263
- version: '0'
263
+ version: 1.1.0.rc1
264
264
  type: :development
265
265
  prerelease: false
266
266
  version_requirements: !ruby/object:Gem::Requirement
267
267
  none: false
268
268
  requirements:
269
- - - ! '>='
269
+ - - '='
270
270
  - !ruby/object:Gem::Version
271
- version: '0'
271
+ version: 1.1.0.rc1
272
272
  description: A server that stores and returns pact files generated by the pact gem.
273
273
  It enables head/prod cross testing of the consumer and provider projects.
274
274
  email:
@@ -299,14 +299,16 @@ files:
299
299
  - lib/pact_broker/api.rb
300
300
  - lib/pact_broker/api/decorators.rb
301
301
  - lib/pact_broker/api/decorators/base_decorator.rb
302
- - lib/pact_broker/api/decorators/pact_broker_urls.rb
302
+ - lib/pact_broker/api/decorators/latest_pact_decorator.rb
303
303
  - lib/pact_broker/api/decorators/pact_collection_decorator.rb
304
304
  - lib/pact_broker/api/decorators/pact_decorator.rb
305
305
  - lib/pact_broker/api/decorators/pact_pacticipant_decorator.rb
306
306
  - lib/pact_broker/api/decorators/pacticipant_collection_decorator.rb
307
307
  - lib/pact_broker/api/decorators/pacticipant_decorator.rb
308
308
  - lib/pact_broker/api/decorators/representable_pact.rb
309
+ - lib/pact_broker/api/decorators/tag_decorator.rb
309
310
  - lib/pact_broker/api/decorators/version_decorator.rb
311
+ - lib/pact_broker/api/pact_broker_urls.rb
310
312
  - lib/pact_broker/api/resources/base_resource.rb
311
313
  - lib/pact_broker/api/resources/index.rb
312
314
  - lib/pact_broker/api/resources/latest_pact.rb
@@ -314,6 +316,7 @@ files:
314
316
  - lib/pact_broker/api/resources/pact.rb
315
317
  - lib/pact_broker/api/resources/pacticipant.rb
316
318
  - lib/pact_broker/api/resources/pacticipants.rb
319
+ - lib/pact_broker/api/resources/tag.rb
317
320
  - lib/pact_broker/db.rb
318
321
  - lib/pact_broker/logging.rb
319
322
  - lib/pact_broker/models.rb
@@ -325,10 +328,12 @@ files:
325
328
  - lib/pact_broker/repositories.rb
326
329
  - lib/pact_broker/repositories/pact_repository.rb
327
330
  - lib/pact_broker/repositories/pacticipant_repository.rb
331
+ - lib/pact_broker/repositories/tag_repository.rb
328
332
  - lib/pact_broker/repositories/version_repository.rb
329
333
  - lib/pact_broker/services.rb
330
334
  - lib/pact_broker/services/pact_service.rb
331
335
  - lib/pact_broker/services/pacticipant_service.rb
336
+ - lib/pact_broker/services/tag_service.rb
332
337
  - lib/pact_broker/services/version_service.rb
333
338
  - lib/pact_broker/tasks.rb
334
339
  - lib/pact_broker/tasks/migration_task.rb
@@ -337,8 +342,12 @@ files:
337
342
  - pact_broker_client-pact_broker.json
338
343
  - spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
339
344
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
345
+ - spec/lib/pact_broker/api/resources/tag_spec.rb
340
346
  - spec/lib/pact_broker/models/order_versions_spec.rb
341
347
  - spec/lib/pact_broker/repositories/pact_repository_spec.rb
348
+ - spec/lib/pact_broker/repositories/tag_repository_spec.rb
349
+ - spec/lib/pact_broker/repositories/version_repository_spec.rb
350
+ - spec/lib/pact_broker/services/tag_service_spec.rb
342
351
  - spec/service_consumers/pact_helper.rb
343
352
  - spec/service_consumers/provider_states_for_pact_broker_client.rb
344
353
  - spec/spec_helper.rb
@@ -361,7 +370,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
361
370
  version: '0'
362
371
  segments:
363
372
  - 0
364
- hash: 615091496951534936
373
+ hash: -449205238157124147
365
374
  required_rubygems_version: !ruby/object:Gem::Requirement
366
375
  none: false
367
376
  requirements:
@@ -370,7 +379,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
379
  version: '0'
371
380
  segments:
372
381
  - 0
373
- hash: 615091496951534936
382
+ hash: -449205238157124147
374
383
  requirements: []
375
384
  rubyforge_project:
376
385
  rubygems_version: 1.8.23
@@ -380,8 +389,12 @@ summary: See description
380
389
  test_files:
381
390
  - spec/lib/pact_broker/api/decorators/pact_collection_decorator_spec.rb
382
391
  - spec/lib/pact_broker/api/decorators/representable_pact_spec.rb
392
+ - spec/lib/pact_broker/api/resources/tag_spec.rb
383
393
  - spec/lib/pact_broker/models/order_versions_spec.rb
384
394
  - spec/lib/pact_broker/repositories/pact_repository_spec.rb
395
+ - spec/lib/pact_broker/repositories/tag_repository_spec.rb
396
+ - spec/lib/pact_broker/repositories/version_repository_spec.rb
397
+ - spec/lib/pact_broker/services/tag_service_spec.rb
385
398
  - spec/service_consumers/pact_helper.rb
386
399
  - spec/service_consumers/provider_states_for_pact_broker_client.rb
387
400
  - spec/spec_helper.rb